quasar 2.7.1 → 2.7.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 (159) hide show
  1. package/dist/api/QDialog.json +6 -0
  2. package/dist/api/QPagination.json +1 -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 +2 -2
  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/svg-bootstrap-icons.umd.prod.js +1 -1
  23. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  24. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +2 -2
  29. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +2 -2
  35. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  39. package/dist/icon-set/themify.umd.prod.js +1 -1
  40. package/dist/lang/ar-TN.umd.prod.js +1 -1
  41. package/dist/lang/ar.umd.prod.js +1 -1
  42. package/dist/lang/az-Latn.umd.prod.js +1 -1
  43. package/dist/lang/bg.umd.prod.js +1 -1
  44. package/dist/lang/bn.umd.prod.js +1 -1
  45. package/dist/lang/ca.umd.prod.js +2 -2
  46. package/dist/lang/cs.umd.prod.js +1 -1
  47. package/dist/lang/da.umd.prod.js +1 -1
  48. package/dist/lang/de.umd.prod.js +1 -1
  49. package/dist/lang/el.umd.prod.js +1 -1
  50. package/dist/lang/en-GB.umd.prod.js +1 -1
  51. package/dist/lang/en-US.umd.prod.js +1 -1
  52. package/dist/lang/eo.umd.prod.js +1 -1
  53. package/dist/lang/es.umd.prod.js +1 -1
  54. package/dist/lang/et.umd.prod.js +1 -1
  55. package/dist/lang/eu.umd.prod.js +1 -1
  56. package/dist/lang/fa-IR.umd.prod.js +1 -1
  57. package/dist/lang/fa.umd.prod.js +1 -1
  58. package/dist/lang/fi.umd.prod.js +1 -1
  59. package/dist/lang/fr.umd.prod.js +1 -1
  60. package/dist/lang/gn.umd.prod.js +1 -1
  61. package/dist/lang/he.umd.prod.js +1 -1
  62. package/dist/lang/hr.umd.prod.js +1 -1
  63. package/dist/lang/hu.umd.prod.js +1 -1
  64. package/dist/lang/id.umd.prod.js +1 -1
  65. package/dist/lang/is.umd.prod.js +1 -1
  66. package/dist/lang/it.umd.prod.js +1 -1
  67. package/dist/lang/ja.umd.prod.js +1 -1
  68. package/dist/lang/km.umd.prod.js +1 -1
  69. package/dist/lang/ko-KR.umd.prod.js +2 -2
  70. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  71. package/dist/lang/kz.umd.prod.js +1 -1
  72. package/dist/lang/lt.umd.prod.js +1 -1
  73. package/dist/lang/lu.umd.prod.js +1 -1
  74. package/dist/lang/lv.umd.prod.js +1 -1
  75. package/dist/lang/ml.umd.prod.js +1 -1
  76. package/dist/lang/mm.umd.prod.js +1 -1
  77. package/dist/lang/ms.umd.prod.js +1 -1
  78. package/dist/lang/my.umd.prod.js +1 -1
  79. package/dist/lang/nb-NO.umd.prod.js +1 -1
  80. package/dist/lang/nl.umd.prod.js +1 -1
  81. package/dist/lang/pl.umd.prod.js +1 -1
  82. package/dist/lang/pt-BR.umd.prod.js +1 -1
  83. package/dist/lang/pt.umd.prod.js +1 -1
  84. package/dist/lang/ro.umd.prod.js +1 -1
  85. package/dist/lang/ru.umd.prod.js +1 -1
  86. package/dist/lang/sk.umd.prod.js +1 -1
  87. package/dist/lang/sl.umd.prod.js +1 -1
  88. package/dist/lang/sm.umd.prod.js +6 -0
  89. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  90. package/dist/lang/sr.umd.prod.js +1 -1
  91. package/dist/lang/sv.umd.prod.js +1 -1
  92. package/dist/lang/ta.umd.prod.js +1 -1
  93. package/dist/lang/th.umd.prod.js +1 -1
  94. package/dist/lang/tr.umd.prod.js +1 -1
  95. package/dist/lang/ug.umd.prod.js +1 -1
  96. package/dist/lang/uk.umd.prod.js +1 -1
  97. package/dist/lang/uz-Cyrl.umd.prod.js +6 -0
  98. package/dist/lang/uz-Latn.umd.prod.js +6 -0
  99. package/dist/lang/vi.umd.prod.js +1 -1
  100. package/dist/lang/zh-CN.umd.prod.js +1 -1
  101. package/dist/lang/zh-TW.umd.prod.js +1 -1
  102. package/dist/quasar.cjs.prod.js +2 -2
  103. package/dist/quasar.css +10 -3
  104. package/dist/quasar.esm.prod.js +2 -2
  105. package/dist/quasar.prod.css +1 -1
  106. package/dist/quasar.rtl.css +11 -3
  107. package/dist/quasar.rtl.prod.css +1 -1
  108. package/dist/quasar.sass +10 -4
  109. package/dist/quasar.umd.js +77 -55
  110. package/dist/quasar.umd.prod.js +2 -2
  111. package/dist/types/index.d.ts +8 -1
  112. package/dist/vetur/quasar-attributes.json +4 -0
  113. package/dist/vetur/quasar-tags.json +2 -1
  114. package/dist/web-types/web-types.json +12 -2
  115. package/icon-set/material-symbols-outlined.js +87 -87
  116. package/icon-set/material-symbols-outlined.mjs +87 -87
  117. package/icon-set/svg-ionicons-v6.js +14 -15
  118. package/icon-set/svg-ionicons-v6.mjs +14 -15
  119. package/icon-set/svg-material-symbols-outlined.js +151 -151
  120. package/icon-set/svg-material-symbols-outlined.mjs +151 -151
  121. package/lang/ca.js +31 -31
  122. package/lang/ca.mjs +31 -31
  123. package/lang/index.json +12 -0
  124. package/lang/ko-KR.js +21 -21
  125. package/lang/ko-KR.mjs +21 -21
  126. package/lang/sm.js +96 -0
  127. package/lang/sm.mjs +91 -0
  128. package/lang/uz-Cyrl.js +98 -0
  129. package/lang/uz-Cyrl.mjs +93 -0
  130. package/lang/uz-Latn.js +102 -0
  131. package/lang/uz-Latn.mjs +97 -0
  132. package/package.json +11 -11
  133. package/src/components/dialog/QDialog.js +3 -1
  134. package/src/components/dialog/QDialog.json +7 -0
  135. package/src/components/file/QFile.js +6 -1
  136. package/src/components/icon/QIcon.sass +3 -2
  137. package/src/components/img/QImg.sass +1 -0
  138. package/src/components/input/QInput.js +7 -1
  139. package/src/components/menu/__tests__/QMenu.spec.js +23 -23
  140. package/src/components/pagination/QPagination.json +1 -1
  141. package/src/components/scroll-area/QScrollArea.js +4 -2
  142. package/src/components/select/QSelect.js +28 -18
  143. package/src/components/select/__tests__/QSelect.spec.js +427 -451
  144. package/src/components/table/QTable.js +0 -1
  145. package/src/components/table/QTable.sass +1 -1
  146. package/src/components/timeline/QTimeline.sass +4 -0
  147. package/src/components/uploader/uploader-core.js +1 -0
  148. package/src/components/virtual-scroll/use-virtual-scroll.js +6 -1
  149. package/src/composables/private/__tests__/use-anchor.spec.js +6 -6
  150. package/src/composables/private/__tests__/use-field.spec.js +7 -7
  151. package/src/composables/private/__tests__/use-model-toggle.spec.js +18 -17
  152. package/src/composables/private/__tests__/use-transition.spec.js +5 -5
  153. package/src/composables/private/__tests__/use-validate.spec.js +4 -4
  154. package/src/composables/private/use-anchor.js +1 -1
  155. package/src/composables/private/use-field.js +1 -1
  156. package/src/composables/private/use-key-composition.js +10 -14
  157. package/src/directives/Ripple.js +5 -9
  158. package/src/utils/date.js +2 -2
  159. package/src/components/select/__tests__/WrapperOne.vue +0 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar",
3
- "version": "2.7.1",
3
+ "version": "2.7.4",
4
4
  "description": "Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time",
5
5
  "main": "dist/quasar.cjs.prod.js",
6
6
  "module": "dist/quasar.esm.prod.js",
@@ -30,7 +30,7 @@
30
30
  "lint": "eslint --ext .js,.vue src dev",
31
31
  "lint-fix": "eslint --ext .js,.vue src dev --fix",
32
32
  "test:component": "cd ./dev && cypress open-ct && cd ..",
33
- "test:component:ci": "cd ./dev && cypress run-ct && cd ..",
33
+ "test:component:ci": "cd ./dev && cypress run-ct --record --parallel && cd ..",
34
34
  "test:create": "node ./test/cypress/helpers/create-spec.js -c"
35
35
  },
36
36
  "repository": {
@@ -65,25 +65,25 @@
65
65
  },
66
66
  "homepage": "https://quasar.dev",
67
67
  "devDependencies": {
68
- "@quasar/app-vite": "^1.0.0-beta.5",
68
+ "@quasar/app-vite": "^1.0.1",
69
69
  "@quasar/extras": "^1.12.0",
70
70
  "@quasar/quasar-app-extension-testing-e2e-cypress": "^4.1.2",
71
71
  "@rollup/plugin-node-resolve": "^11.2.1",
72
72
  "@rollup/plugin-replace": "^2.3.3",
73
- "autoprefixer": "^10.4.4",
73
+ "autoprefixer": "^10.4.7",
74
74
  "babel-preset-es2015-rollup": "^3.0.0",
75
75
  "cli-highlight": "^2.1.11",
76
- "cssnano": "^5.1.4",
77
- "diff": "^5.0.0",
76
+ "cssnano": "^5.1.12",
77
+ "diff": "^5.1.0",
78
78
  "eslint": "^7.4.0",
79
79
  "eslint-config-standard": "^17.0.0",
80
- "eslint-plugin-import": "^2.19.1",
81
- "eslint-plugin-n": "^15.0.0",
82
- "eslint-plugin-promise": "^6.0.0",
83
80
  "eslint-friendly-formatter": "^4.0.1",
84
81
  "eslint-plugin-cypress": "^2.12.1",
82
+ "eslint-plugin-import": "^2.19.1",
83
+ "eslint-plugin-n": "^15.0.0",
85
84
  "eslint-plugin-no-only-tests": "^2.6.0",
86
85
  "eslint-plugin-node": "^11.1.0",
86
+ "eslint-plugin-promise": "^6.0.0",
87
87
  "eslint-plugin-vue": "^8.0.0",
88
88
  "fast-glob": "^3.2.7",
89
89
  "module-alias": "^2.2.2",
@@ -95,8 +95,8 @@
95
95
  "rollup": "^2.34.0",
96
96
  "table": "^6.0.4",
97
97
  "uglify-es": "^3.3.9",
98
- "vue": "^3.0.0",
99
- "vue-router": "^4.0.0",
98
+ "vue": "^3.2.37",
99
+ "vue-router": "^4.0.16",
100
100
  "yargs": "^17.3.0"
101
101
  },
102
102
  "vetur": {
@@ -47,6 +47,7 @@ export default createComponent({
47
47
 
48
48
  persistent: Boolean,
49
49
  autoClose: Boolean,
50
+ allowFocusOutside: Boolean,
50
51
 
51
52
  noEscDismiss: Boolean,
52
53
  noBackdropDismiss: Boolean,
@@ -351,7 +352,8 @@ export default createComponent({
351
352
  function onFocusChange (evt) {
352
353
  // the focus is not in a vue child component
353
354
  if (
354
- portalIsAccessible.value === true
355
+ props.allowFocusOutside !== true
356
+ && portalIsAccessible.value === true
355
357
  && childHasFocus(innerRef.value, evt.target) !== true
356
358
  ) {
357
359
  focus('[tabindex]:not([tabindex="-1"])')
@@ -92,6 +92,13 @@
92
92
  "desc": "Do not shake up the Dialog to catch user's attention",
93
93
  "category": "behavior",
94
94
  "addedIn": "v2.1.1"
95
+ },
96
+
97
+ "allow-focus-outside": {
98
+ "type": "Boolean",
99
+ "desc": "Allow elements outside of the Dialog to be focusable; By default, for accessibility reasons, QDialog does not allow outer focus",
100
+ "category": "behavior",
101
+ "addedIn": "v2.7.2"
95
102
  }
96
103
  },
97
104
 
@@ -103,6 +103,11 @@ export default createComponent({
103
103
  disabled: state.editable.value !== true
104
104
  }))
105
105
 
106
+ const fieldClass = computed(() =>
107
+ 'q-file q-field--auto-height'
108
+ + (dnd.value === true ? ' q-file--dnd' : '')
109
+ )
110
+
106
111
  const isAppending = computed(() =>
107
112
  props.multiple === true && props.append === true
108
113
  )
@@ -235,7 +240,7 @@ export default createComponent({
235
240
  }
236
241
 
237
242
  Object.assign(state, {
238
- fieldClass: { value: 'q-file q-field--auto-height' },
243
+ fieldClass,
239
244
  emitValue,
240
245
  hasValue,
241
246
  inputRef,
@@ -2,6 +2,7 @@
2
2
  line-height: 1
3
3
  width: 1em
4
4
  height: 1em
5
+ flex-shrink: 0
5
6
  letter-spacing: normal
6
7
  text-transform: none
7
8
  white-space: nowrap
@@ -21,8 +22,8 @@
21
22
 
22
23
  > svg,
23
24
  > img
24
- width: 1em
25
- height: 1em
25
+ width: 100%
26
+ height: 100%
26
27
 
27
28
  .q-icon,
28
29
  .material-icons,
@@ -10,6 +10,7 @@
10
10
 
11
11
  &__container
12
12
  border-radius: inherit
13
+ font-size: 0
13
14
 
14
15
  &__image
15
16
  border-radius: inherit
@@ -208,7 +208,7 @@ export default createComponent({
208
208
  }
209
209
 
210
210
  function onInput (e) {
211
- if (!e || !e.target || e.target.qComposing === true) {
211
+ if (!e || !e.target) {
212
212
  return
213
213
  }
214
214
 
@@ -219,6 +219,12 @@ export default createComponent({
219
219
 
220
220
  const val = e.target.value
221
221
 
222
+ if (e.target.qComposing === true) {
223
+ temp.value = val
224
+
225
+ return
226
+ }
227
+
222
228
  if (hasMask.value === true) {
223
229
  updateMaskValue(val, false, e.inputType)
224
230
  }
@@ -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
  }
@@ -24,6 +24,8 @@ const panOpts = {
24
24
  mouseAllDir: true
25
25
  }
26
26
 
27
+ const getMinThumbSize = size => (size >= 250 ? 50 : Math.ceil(size / 5))
28
+
27
29
  export default createComponent({
28
30
  name: 'QScrollArea',
29
31
 
@@ -115,7 +117,7 @@ export default createComponent({
115
117
  Math.round(
116
118
  between(
117
119
  container.vertical.value * container.vertical.value / scroll.vertical.size.value,
118
- 50,
120
+ getMinThumbSize(container.vertical.value),
119
121
  container.vertical.value
120
122
  )
121
123
  )
@@ -157,7 +159,7 @@ export default createComponent({
157
159
  Math.round(
158
160
  between(
159
161
  container.horizontal.value * container.horizontal.value / scroll.horizontal.size.value,
160
- 50,
162
+ getMinThumbSize(container.horizontal.value),
161
163
  container.horizontal.value
162
164
  )
163
165
  )
@@ -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
  ],
@@ -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 = {
@@ -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
  }
@@ -1426,10 +1438,8 @@ export default createComponent({
1426
1438
  showPopup,
1427
1439
 
1428
1440
  floatingLabel: computed(() =>
1429
- (props.hideSelected === true
1430
- ? inputValue.value.length > 0
1431
- : hasValue.value === true
1432
- )
1441
+ (props.hideSelected !== true && hasValue.value === true)
1442
+ || inputValue.value.length > 0
1433
1443
  || fieldValueIsFilled(props.displayValue)
1434
1444
  ),
1435
1445