Skip to content

Commit b7d2fee

Browse files
committed
Merge branch 'master' into next
2 parents 4f91476 + 8c67ee0 commit b7d2fee

File tree

14 files changed

+90
-24
lines changed

14 files changed

+90
-24
lines changed

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313
}
1414
},
1515
"npmClient": "pnpm",
16-
"version": "3.10.5"
16+
"version": "3.10.7"
1717
}

packages/api-generator/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@vuetify/api-generator",
33
"type": "module",
4-
"version": "3.10.5",
4+
"version": "3.10.7",
55
"private": true,
66
"description": "",
77
"scripts": {

packages/docs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "A Vue.js project",
55
"private": true,
66
"author": "John Leider <john@vuetifyjs.com>",
7-
"version": "3.10.5",
7+
"version": "3.10.7",
88
"repository": {
99
"type": "git",
1010
"url": "git+https://github.com/vuetifyjs/vuetify.git",

packages/vuetify/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vuetify",
33
"description": "Vue Material Component Framework",
4-
"version": "3.10.5",
4+
"version": "3.10.7",
55
"author": {
66
"name": "John Leider",
77
"email": "john@vuetifyjs.com"

packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ export const VAutocomplete = genericComponent<new <
535535
modelValue={ isSelected }
536536
ripple={ false }
537537
tabindex="-1"
538+
onClick={ (event: MouseEvent) => event.preventDefault() }
538539
/>
539540
) : undefined }
540541

packages/vuetify/src/components/VAutocomplete/__tests__/VAutocomplete.spec.browser.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ describe('VAutocomplete', () => {
649649
})
650650

651651
await userEvent.click(element)
652-
await expect(screen.findByRole('listbox')).resolves.toBeDisplayed()
652+
await expect.poll(() => screen.findByRole('listbox')).toBeDisplayed()
653653

654654
await userEvent.click(screen.getAllByRole('option')[0])
655655
await rerender({ items: ['Foo', 'Bar', 'test', 'test 2'] })

packages/vuetify/src/components/VCombobox/VCombobox.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,9 @@ export const VCombobox = genericComponent<new <
371371
}
372372
function onAfterLeave () {
373373
if (isFocused.value) {
374-
isPristine.value = true
375374
vTextFieldRef.value?.focus()
376375
}
376+
isPristine.value = true
377377
_searchLock.value = null
378378
}
379379
/** @param set - null means toggle */
@@ -582,6 +582,7 @@ export const VCombobox = genericComponent<new <
582582
modelValue={ isSelected }
583583
ripple={ false }
584584
tabindex="-1"
585+
onClick={ (event: MouseEvent) => event.preventDefault() }
585586
/>
586587
) : undefined }
587588

packages/vuetify/src/components/VFileInput/VFileInput.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,11 @@ export const VFileInput = genericComponent<VFileInputSlots>()({
295295
...slots,
296296
default: ({
297297
props: { class: fieldClass, ...slotProps },
298+
controlRef,
298299
}) => (
299300
<>
300301
<input
301-
ref={ inputRef }
302+
ref={ val => inputRef.value = controlRef.value = val as HTMLInputElement }
302303
type="file"
303304
accept={ inputAccept }
304305
readonly={ isReadonly.value }

packages/vuetify/src/components/VMenu/VMenu.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,16 @@ export const VMenu = genericComponent<OverlaySlots>()({
109109
})
110110
onDeactivated(() => isActive.value = false)
111111

112+
let focusTrapSuppressed = false
113+
let focusTrapSuppressionTimeout = -1
114+
115+
async function onPointerdown () {
116+
focusTrapSuppressed = true
117+
focusTrapSuppressionTimeout = window.setTimeout(() => {
118+
focusTrapSuppressed = false
119+
}, 100)
120+
}
121+
112122
async function onFocusIn (e: FocusEvent) {
113123
const before = e.relatedTarget as HTMLElement | null
114124
const after = e.target as HTMLElement | null
@@ -119,27 +129,38 @@ export const VMenu = genericComponent<OverlaySlots>()({
119129
isActive.value &&
120130
before !== after &&
121131
overlay.value?.contentEl &&
122-
// We're the topmost menu
123-
overlay.value?.globalTop &&
132+
// We're the menu without open submenus or overlays
133+
overlay.value?.localTop &&
124134
// It isn't the document or the menu body
125135
![document, overlay.value.contentEl].includes(after!) &&
126136
// It isn't inside the menu body
127137
!overlay.value.contentEl.contains(after)
128138
) {
129-
const focusable = focusableChildren(overlay.value.contentEl)
130-
focusable[0]?.focus()
139+
if (focusTrapSuppressed) {
140+
if (!props.openOnHover && !overlay.value.activatorEl?.contains(after)) {
141+
isActive.value = false
142+
}
143+
} else {
144+
const focusable = focusableChildren(overlay.value.contentEl)
145+
focusable[0]?.focus()
146+
147+
document.removeEventListener('pointerdown', onPointerdown)
148+
}
131149
}
132150
}
133151

134152
watch(isActive, val => {
135153
if (val) {
136154
parent?.register()
137155
if (IN_BROWSER && !props.disableInitialFocus) {
156+
document.addEventListener('pointerdown', onPointerdown)
138157
document.addEventListener('focusin', onFocusIn, { once: true })
139158
}
140159
} else {
141160
parent?.unregister()
142161
if (IN_BROWSER) {
162+
clearTimeout(focusTrapSuppressionTimeout)
163+
document.removeEventListener('pointerdown', onPointerdown)
143164
document.removeEventListener('focusin', onFocusIn)
144165
}
145166
}

packages/vuetify/src/components/VSelect/VSelect.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ export const VSelect = genericComponent<new <
496496
modelValue={ isSelected }
497497
ripple={ false }
498498
tabindex="-1"
499+
onClick={ (event: MouseEvent) => event.preventDefault() }
499500
/>
500501
) : undefined }
501502

0 commit comments

Comments
 (0)