From 4703b6884a7146ccd7c393d858c6bf765f619385 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Sun, 27 Nov 2022 11:13:39 +0800 Subject: [PATCH] feat: improve dialog --- components/help/HelpPreview.vue | 16 +++++- components/modal/ModalContainer.vue | 4 +- components/modal/ModalDialog.vue | 79 +++++++++++++++++++++-------- components/nav/NavBottom.vue | 2 +- components/nav/NavSide.vue | 4 +- composables/dialog.ts | 4 ++ composables/screen.ts | 5 ++ layouts/default.vue | 2 +- 8 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 composables/screen.ts diff --git a/components/help/HelpPreview.vue b/components/help/HelpPreview.vue index 71bf9c11..7e5035aa 100644 --- a/components/help/HelpPreview.vue +++ b/components/help/HelpPreview.vue @@ -6,6 +6,10 @@ interface Team { mastodon: string } +const emit = defineEmits<{ + (event: 'close'): void +}>() + const teams: Team[] = [ { github: 'antfu', @@ -35,7 +39,11 @@ const teams: Team[] = [ diff --git a/components/modal/ModalContainer.vue b/components/modal/ModalContainer.vue index 7d89eb84..777fa115 100644 --- a/components/modal/ModalContainer.vue +++ b/components/modal/ModalContainer.vue @@ -16,8 +16,8 @@ import { - - + + diff --git a/components/modal/ModalDialog.vue b/components/modal/ModalDialog.vue index 40f3f640..b028aed0 100644 --- a/components/modal/ModalDialog.vue +++ b/components/modal/ModalDialog.vue @@ -11,8 +11,12 @@ const { const { modelValue } = defineModel<{ modelValue: boolean + closeButton?: boolean }>() +let isVisible = $ref(modelValue.value) +let isOut = $ref(!modelValue.value) + const positionClass = computed(() => { switch (type) { case 'dialog': @@ -30,24 +34,32 @@ const positionClass = computed(() => { } }) -const transform = computed(() => { - switch (type) { - case 'bottom': - return 'translateY(100%)' - case 'top': - return 'translateY(-100%)' - case 'left': - return 'translateX(-100%)' - case 'right': - return 'translateX(100%)' - default: - return '' +const transformClass = computed(() => { + if (isOut) { + switch (type) { + case 'dialog': + return 'op0' + case 'bottom': + return 'translate-y-[100%]' + case 'top': + return 'translate-y-[100%]' + case 'left': + return 'translate-x-[-100%]' + case 'right': + return 'translate-x-[100%]' + default: + return '' + } } }) const target = ref(null) const { activate, deactivate } = useFocusTrap(target) +function close() { + modelValue.value = false +} + watchEffect(() => { if (modelValue) activate() @@ -55,29 +67,52 @@ watchEffect(() => { deactivate() }) -let init = $ref(modelValue) -watchOnce(modelValue, () => { - init = true +useEventListener('keydown', (e: KeyboardEvent) => { + if (!modelValue.value) + return + if (e.key === 'Escape') { + close() + e.preventDefault() + } }) + +watch(modelValue, async (v) => { + if (v) { + isOut = true + isVisible = true + setTimeout(() => { + isOut = false + }, 10) + } + else { + isOut = true + } +}) + +function onTransitionEnd() { + if (!modelValue.value) + isVisible = false +} diff --git a/components/nav/NavBottom.vue b/components/nav/NavBottom.vue index ac81989a..7ca403f6 100644 --- a/components/nav/NavBottom.vue +++ b/components/nav/NavBottom.vue @@ -3,7 +3,7 @@