mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-28 02:40:35 +01:00
feat(Slideover): handle top and bottom side (#1834)
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<TransitionRoot as="template" :appear="appear" :show="isOpen" @after-leave="onAfterLeave">
|
<TransitionRoot as="template" :appear="appear" :show="isOpen" @after-leave="onAfterLeave">
|
||||||
<HDialog :class="[ui.wrapper, { 'justify-end': side === 'right' }]" v-bind="attrs" @close="close">
|
<HDialog :class="[ui.wrapper, { 'justify-end': side === 'right' }, { 'items-end': side === 'bottom' }]" v-bind="attrs" @close="close">
|
||||||
<TransitionChild v-if="overlay" as="template" :appear="appear" v-bind="ui.overlay.transition">
|
<TransitionChild v-if="overlay" as="template" :appear="appear" v-bind="ui.overlay.transition">
|
||||||
<div :class="[ui.overlay.base, ui.overlay.background]" />
|
<div :class="[ui.overlay.base, ui.overlay.background]" />
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild as="template" :appear="appear" v-bind="transitionClass">
|
<TransitionChild as="template" :appear="appear" v-bind="transitionClass">
|
||||||
<HDialogPanel :class="[ui.base, ui.width, ui.background, ui.ring, ui.padding]">
|
<HDialogPanel :class="[ui.base, sideType === 'horizontal' ? [ui.width, 'h-full'] : [ui.height, 'w-full'], ui.background, ui.ring, ui.padding]">
|
||||||
<slot />
|
<slot />
|
||||||
</HDialogPanel>
|
</HDialogPanel>
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
@@ -46,9 +46,9 @@ export default defineComponent({
|
|||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
side: {
|
side: {
|
||||||
type: String as PropType<'left' | 'right'>,
|
type: String as PropType<'left' | 'right' | 'top' | 'bottom'>,
|
||||||
default: 'right',
|
default: 'right',
|
||||||
validator: (value: string) => ['left', 'right'].includes(value)
|
validator: (value: string) => ['left', 'right', 'top', 'bottom'].includes(value)
|
||||||
},
|
},
|
||||||
overlay: {
|
overlay: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -89,14 +89,52 @@ export default defineComponent({
|
|||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let enterFrom, leaveTo
|
||||||
|
switch (props.side) {
|
||||||
|
case 'left':
|
||||||
|
enterFrom = ui.value.translate.left
|
||||||
|
leaveTo = ui.value.translate.left
|
||||||
|
break
|
||||||
|
case 'right':
|
||||||
|
enterFrom = ui.value.translate.right
|
||||||
|
leaveTo = ui.value.translate.right
|
||||||
|
break
|
||||||
|
case 'top':
|
||||||
|
enterFrom = ui.value.translate.top
|
||||||
|
leaveTo = ui.value.translate.top
|
||||||
|
break
|
||||||
|
case 'bottom':
|
||||||
|
enterFrom = ui.value.translate.bottom
|
||||||
|
leaveTo = ui.value.translate.bottom
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
enterFrom = ui.value.translate.right
|
||||||
|
leaveTo = ui.value.translate.right
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...ui.value.transition,
|
...ui.value.transition,
|
||||||
enterFrom: props.side === 'left' ? ui.value.translate.left : ui.value.translate.right,
|
enterFrom,
|
||||||
enterTo: ui.value.translate.base,
|
enterTo: ui.value.translate.base,
|
||||||
leaveFrom: ui.value.translate.base,
|
leaveFrom: ui.value.translate.base,
|
||||||
leaveTo: props.side === 'left' ? ui.value.translate.left : ui.value.translate.right
|
leaveTo
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
const sideType = computed(() => {
|
||||||
|
switch (props.side) {
|
||||||
|
case 'left':
|
||||||
|
return 'horizontal'
|
||||||
|
case 'right':
|
||||||
|
return 'horizontal'
|
||||||
|
case 'top':
|
||||||
|
return 'vertical'
|
||||||
|
case 'bottom':
|
||||||
|
return 'vertical'
|
||||||
|
default:
|
||||||
|
return 'right'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
function close (value: boolean) {
|
function close (value: boolean) {
|
||||||
if (props.preventClose) {
|
if (props.preventClose) {
|
||||||
@@ -121,9 +159,10 @@ export default defineComponent({
|
|||||||
attrs,
|
attrs,
|
||||||
isOpen,
|
isOpen,
|
||||||
transitionClass,
|
transitionClass,
|
||||||
|
sideType,
|
||||||
onAfterLeave,
|
onAfterLeave,
|
||||||
close
|
close
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
@@ -20,10 +20,13 @@ export default {
|
|||||||
padding: '',
|
padding: '',
|
||||||
shadow: 'shadow-xl',
|
shadow: 'shadow-xl',
|
||||||
width: 'w-screen max-w-md',
|
width: 'w-screen max-w-md',
|
||||||
|
height: 'h-screen max-h-96',
|
||||||
translate: {
|
translate: {
|
||||||
base: 'translate-x-0',
|
base: 'translate-x-0',
|
||||||
left: '-translate-x-full rtl:translate-x-full',
|
left: '-translate-x-full rtl:translate-x-full',
|
||||||
right: 'translate-x-full rtl:-translate-x-full'
|
right: 'translate-x-full rtl:-translate-x-full',
|
||||||
|
top: '-translate-y-full',
|
||||||
|
bottom: 'translate-y-full'
|
||||||
},
|
},
|
||||||
// Syntax for `<TransitionRoot>` component https://headlessui.com/vue/transition#basic-example
|
// Syntax for `<TransitionRoot>` component https://headlessui.com/vue/transition#basic-example
|
||||||
transition: {
|
transition: {
|
||||||
|
|||||||
Reference in New Issue
Block a user