Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions docs/content/docs/components/dialog.md
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,38 @@ When providing an icon (or font icon), remember to label it correctly for screen
</template>
```

### Close using slot props

Alternatively, you can use the `close` method provided by the `DialogRoot` slot props to programmatically close the dialog.

```vue line=4,8,16-20
<script setup>
import { DialogContent, DialogOverlay, DialogPortal, DialogRoot, DialogTrigger } from 'reka-ui'
</script>

<template>
<DialogRoot v-slot="{ close }">
<DialogTrigger>Open</DialogTrigger>
<DialogPortal>
<DialogOverlay />
<DialogContent>
<form>
<!-- some inputs -->
<button type="submit" @click="close">
Submit
</button>
</form>
</DialogContent>
<DialogFooter>
<button type="submit" @click="close">
Submit
</button>
</DialogFooter>
</DialogPortal>
</DialogRoot>
</template>
```

### Keyboard Interactions

<KeyboardTable
Expand Down
5 changes: 5 additions & 0 deletions docs/content/meta/DialogRoot.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,10 @@
'name': 'open',
'description': '<p>Current open state</p>\n',
'type': 'boolean'
},
{
'name': 'close',
'description': '<p>Close the dialog</p>\n',
'type': '() => void'
}
]" />
7 changes: 6 additions & 1 deletion packages/core/src/Dialog/DialogRoot.vue
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ defineSlots<{
default?: (props: {
/** Current open state */
open: typeof open.value
/** Close the dialog */
close: () => void
}) => any
}>()

Expand Down Expand Up @@ -88,5 +90,8 @@ provideDialogRootContext({
</script>

<template>
<slot :open="open" />
<slot
:open="open"
:close="() => open = false"
/>
</template>
90 changes: 90 additions & 0 deletions packages/core/src/Dialog/story/DialogProgrammaticClose.story.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<script setup lang="ts">
import { DialogContent, DialogOverlay, DialogRoot, DialogTrigger } from '..'
</script>

<template>
<Story
title="Dialog/ProgrammaticClose"
:layout="{ type: 'single', iframe: true }"
>
<Variant title="default">
<div class="h-[300vh]">
<DialogRoot
v-slot="{ close }"
>
<DialogTrigger>
<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
>
Open A
</button>
</DialogTrigger>
<DialogOverlay class="bg-blackA9 fixed inset-0" />
<DialogContent
class="fixed top-[50%] left-[50%] max-h-[85vh] w-[90vw] max-w-[450px] translate-x-[-50%] translate-y-[-50%] rounded-[6px] bg-white p-[25px]"
>
<h1>Dialog A</h1>

<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
@click="close"
>
Close A
</button>
</DialogContent>
</DialogRoot>
</div>
</Variant>

<Variant title="Nested">
<div class="h-[300vh]">
<DialogRoot
v-slot="{ close: closeA }"
>
<DialogTrigger>
<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
>
Open A
</button>
</DialogTrigger>
<DialogOverlay class="bg-blackA9 fixed inset-0" />
<DialogContent
class="fixed top-[50%] left-[50%] max-h-[85vh] w-[90vw] max-w-[450px] translate-x-[-50%] translate-y-[-50%] rounded-[6px] bg-white p-[25px]"
>
<h1>Dialog A</h1>

<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
@click="closeA"
>
Close A
</button>

<DialogRoot v-slot="{ close: closeB }">
<DialogTrigger>
<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
>
Open B
</button>
</DialogTrigger>
<DialogOverlay class="bg-blackA9 fixed inset-0" />
<DialogContent
class="fixed top-[50%] left-[50%] max-h-[85vh] w-[90vw] max-w-[450px] translate-x-[-50%] translate-y-[-50%] rounded-[6px] bg-white p-[25px]"
>
<h1>Dialog B</h1>
<button
class="text-black9 bg-blackA9 hover:bg-blackA10 rounded-[4px] text-white p-2"
@click="closeB"
>
Close B
</button>
</DialogContent>
</DialogRoot>
</DialogContent>
</DialogRoot>
</div>
</Variant>
</Story>
</template>