diff --git a/packages/radix-vue/src/Dialog/Dialog.test.ts b/packages/radix-vue/src/Dialog/Dialog.test.ts index dddb04740..f4ad5f804 100644 --- a/packages/radix-vue/src/Dialog/Dialog.test.ts +++ b/packages/radix-vue/src/Dialog/Dialog.test.ts @@ -23,7 +23,7 @@ const NoLabelDialogTest = defineComponent({ const UndefinedDescribedByDialog = defineComponent({ components: { DialogRoot, DialogTrigger, DialogOverlay, DialogContent, DialogClose, DialogTitle }, - template: ` + template: ` ${OPEN_TEXT} @@ -128,6 +128,10 @@ describe('given a default Dialog', () => { it('should close the content', () => { expect(document.body.innerHTML).not.toContain(closeButton.innerHTML) }) + + it('should focus trigger', async () => { + expect(document.activeElement).toBe(trigger.element) + }) }) }) }) diff --git a/packages/radix-vue/src/Dialog/DialogContentImpl.vue b/packages/radix-vue/src/Dialog/DialogContentImpl.vue index e472f8071..8bcc688da 100644 --- a/packages/radix-vue/src/Dialog/DialogContentImpl.vue +++ b/packages/radix-vue/src/Dialog/DialogContentImpl.vue @@ -52,6 +52,10 @@ rootContext.descriptionId ||= useId(undefined, 'radix-vue-dialog-description') onMounted(() => { rootContext.contentElement = contentElement + + // Preserve the `DialogTrigger` element in case it was triggered programmatically + if (document.activeElement !== document.body) + rootContext.triggerElement.value = document.activeElement as HTMLElement }) // eslint-disable-next-line n/prefer-global/process diff --git a/packages/radix-vue/src/Dialog/DialogTrigger.vue b/packages/radix-vue/src/Dialog/DialogTrigger.vue index 041bea7ac..94c5b684d 100644 --- a/packages/radix-vue/src/Dialog/DialogTrigger.vue +++ b/packages/radix-vue/src/Dialog/DialogTrigger.vue @@ -18,7 +18,7 @@ const { forwardRef, currentElement } = useForwardExpose() rootContext.contentId ||= useId(undefined, 'radix-vue-dialog-content') onMounted(() => { - rootContext.triggerElement = currentElement + rootContext.triggerElement.value = currentElement.value }) diff --git a/packages/radix-vue/src/Dialog/story/DialogExternalTrigger.story.vue b/packages/radix-vue/src/Dialog/story/DialogExternalTrigger.story.vue new file mode 100644 index 000000000..e60d7a39c --- /dev/null +++ b/packages/radix-vue/src/Dialog/story/DialogExternalTrigger.story.vue @@ -0,0 +1,62 @@ + + + diff --git a/packages/radix-vue/src/Dialog/story/DialogWithDropdown.story.vue b/packages/radix-vue/src/Dialog/story/DialogWithDropdown.story.vue index 36d0a55ad..982ac9582 100644 --- a/packages/radix-vue/src/Dialog/story/DialogWithDropdown.story.vue +++ b/packages/radix-vue/src/Dialog/story/DialogWithDropdown.story.vue @@ -12,7 +12,7 @@ import DropdownMenu from '../../DropdownMenu/story/_DropdownMenu.vue'