mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-02-01 12:47:57 +01:00
chore(preset): handle Modal / Slideover transitions
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
:appear="appear"
|
:appear="appear"
|
||||||
v-bind="overlayTransition"
|
v-bind="overlayTransition"
|
||||||
>
|
>
|
||||||
<div class="fixed inset-0 transition-opacity" :class="overlayClass" />
|
<div class="fixed inset-0 transition-opacity" :class="overlayBackgroundClass" />
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<div :class="wrapperClass">
|
<div :class="wrapperClass">
|
||||||
@@ -78,9 +78,13 @@ const props = defineProps({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
},
|
},
|
||||||
overlayClass: {
|
overlayBackgroundClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default: () => $ui.modal.overlay
|
default: () => $ui.modal.overlay.background
|
||||||
|
},
|
||||||
|
overlayTransitionClass: {
|
||||||
|
type: Object,
|
||||||
|
default: () => $ui.modal.overlay.transition
|
||||||
},
|
},
|
||||||
shadowClass: {
|
shadowClass: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -101,6 +105,10 @@ const props = defineProps({
|
|||||||
transition: {
|
transition: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
|
},
|
||||||
|
transitionClass: {
|
||||||
|
type: Object,
|
||||||
|
default: () => $ui.modal.transition
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -131,14 +139,7 @@ const overlayTransition = computed(() => {
|
|||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return props.overlayTransitionClass
|
||||||
enter: 'ease-out duration-300',
|
|
||||||
enterFrom: 'opacity-0',
|
|
||||||
enterTo: 'opacity-100',
|
|
||||||
leave: 'ease-in duration-200',
|
|
||||||
leaveFrom: 'opacity-100',
|
|
||||||
leaveTo: 'opacity-0'
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const modalTransition = computed(() => {
|
const modalTransition = computed(() => {
|
||||||
@@ -146,14 +147,7 @@ const modalTransition = computed(() => {
|
|||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return props.transitionClass
|
||||||
enter: 'ease-out duration-300',
|
|
||||||
enterFrom: 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95',
|
|
||||||
enterTo: 'opacity-100 translate-y-0 sm:scale-100',
|
|
||||||
leave: 'ease-in duration-200',
|
|
||||||
leaveFrom: 'opacity-100 translate-y-0 sm:scale-100',
|
|
||||||
leaveTo: 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95'
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
function close (value: boolean) {
|
function close (value: boolean) {
|
||||||
|
|||||||
@@ -8,25 +8,20 @@
|
|||||||
@close="isOpen = false"
|
@close="isOpen = false"
|
||||||
>
|
>
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
|
v-if="overlay"
|
||||||
as="template"
|
as="template"
|
||||||
enter="transition-opacity ease-linear duration-300"
|
v-bind="overlayTransitionClass"
|
||||||
enter-from="opacity-0"
|
|
||||||
enter-to="opacity-100"
|
|
||||||
leave="transition-opacity ease-linear duration-300"
|
|
||||||
leave-from="opacity-100"
|
|
||||||
leave-to="opacity-0"
|
|
||||||
>
|
>
|
||||||
<div class="fixed inset-0 transition-opacity" :class="overlayClass" />
|
<div class="fixed inset-0 transition-opacity" :class="overlayBackgroundClass" />
|
||||||
</TransitionChild>
|
</TransitionChild>
|
||||||
|
|
||||||
<TransitionChild
|
<TransitionChild
|
||||||
as="template"
|
as="template"
|
||||||
enter="transition ease-in-out duration-300 transform"
|
|
||||||
:enter-from="side === 'left' ? '-translate-x-full' : 'translate-x-full'"
|
:enter-from="side === 'left' ? '-translate-x-full' : 'translate-x-full'"
|
||||||
enter-to="translate-x-0"
|
enter-to="translate-x-0"
|
||||||
leave="transition ease-in-out duration-300 transform"
|
|
||||||
leave-from="translate-x-0"
|
leave-from="translate-x-0"
|
||||||
:leave-to="side === 'left' ? '-translate-x-full' : 'translate-x-full'"
|
:leave-to="side === 'left' ? '-translate-x-full' : 'translate-x-full'"
|
||||||
|
v-bind="transitionClass"
|
||||||
>
|
>
|
||||||
<DialogPanel :class="slideoverClass">
|
<DialogPanel :class="slideoverClass">
|
||||||
<div v-if="$slots.header" :class="headerClass">
|
<div v-if="$slots.header" :class="headerClass">
|
||||||
@@ -64,9 +59,17 @@ const props = defineProps({
|
|||||||
type: String,
|
type: String,
|
||||||
default: () => $ui.slideover.background
|
default: () => $ui.slideover.background
|
||||||
},
|
},
|
||||||
overlayClass: {
|
overlay: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
overlayBackgroundClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default: () => $ui.slideover.overlay
|
default: () => $ui.slideover.overlay.background
|
||||||
|
},
|
||||||
|
overlayTransitionClass: {
|
||||||
|
type: Object,
|
||||||
|
default: () => $ui.slideover.overlay.transition
|
||||||
},
|
},
|
||||||
widthClass: {
|
widthClass: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -75,8 +78,13 @@ const props = defineProps({
|
|||||||
headerClass: {
|
headerClass: {
|
||||||
type: String,
|
type: String,
|
||||||
default: () => $ui.slideover.header
|
default: () => $ui.slideover.header
|
||||||
|
},
|
||||||
|
transitionClass: {
|
||||||
|
type: Object,
|
||||||
|
default: () => $ui.slideover.transition
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue'])
|
const emit = defineEmits(['update:modelValue'])
|
||||||
|
|
||||||
const isOpen: WritableComputedRef<boolean> = computed({
|
const isOpen: WritableComputedRef<boolean> = computed({
|
||||||
|
|||||||
@@ -253,12 +253,30 @@ export default (variantColors: string[]) => {
|
|||||||
container: 'flex min-h-full items-end sm:items-center justify-center p-4 sm:p-0 text-center',
|
container: 'flex min-h-full items-end sm:items-center justify-center p-4 sm:p-0 text-center',
|
||||||
base: 'relative inline-block align-bottom text-left overflow-hidden transform transition-all sm:my-8 sm:align-middle w-full',
|
base: 'relative inline-block align-bottom text-left overflow-hidden transform transition-all sm:my-8 sm:align-middle w-full',
|
||||||
background: 'u-bg-white',
|
background: 'u-bg-white',
|
||||||
overlay: 'bg-gray-500/75 dark:bg-gray-600/75',
|
overlay: {
|
||||||
|
background: 'bg-gray-500/75 dark:bg-gray-600/75',
|
||||||
|
transition: {
|
||||||
|
enter: 'ease-out duration-300',
|
||||||
|
enterFrom: 'opacity-0',
|
||||||
|
enterTo: 'opacity-100',
|
||||||
|
leave: 'ease-in duration-200',
|
||||||
|
leaveFrom: 'opacity-100',
|
||||||
|
leaveTo: 'opacity-0'
|
||||||
|
}
|
||||||
|
},
|
||||||
border: '',
|
border: '',
|
||||||
ring: '',
|
ring: '',
|
||||||
rounded: 'rounded-lg',
|
rounded: 'rounded-lg',
|
||||||
shadow: 'shadow-xl',
|
shadow: 'shadow-xl',
|
||||||
width: 'sm:max-w-lg'
|
width: 'sm:max-w-lg',
|
||||||
|
transition: {
|
||||||
|
enter: 'ease-out duration-300',
|
||||||
|
enterFrom: 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95',
|
||||||
|
enterTo: 'opacity-100 translate-y-0 sm:scale-100',
|
||||||
|
leave: 'ease-in duration-200',
|
||||||
|
leaveFrom: 'opacity-100 translate-y-0 sm:scale-100',
|
||||||
|
leaveTo: 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const container = {
|
const container = {
|
||||||
@@ -402,11 +420,25 @@ export default (variantColors: string[]) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const slideover = {
|
const slideover = {
|
||||||
overlay: 'bg-gray-500/75 dark:bg-gray-600/75',
|
overlay: {
|
||||||
|
background: 'bg-gray-500/75 dark:bg-gray-600/75',
|
||||||
|
transition: {
|
||||||
|
enter: 'ease-in-out duration-500',
|
||||||
|
enterFrom: 'opacity-0',
|
||||||
|
enterTo: 'opacity-100',
|
||||||
|
leave: 'ease-in-out duration-500',
|
||||||
|
leaveFrom: 'opacity-100',
|
||||||
|
leaveTo: 'opacity-0'
|
||||||
|
}
|
||||||
|
},
|
||||||
base: 'relative flex-1 flex flex-col w-full focus:outline-none',
|
base: 'relative flex-1 flex flex-col w-full focus:outline-none',
|
||||||
background: 'u-bg-white',
|
background: 'u-bg-white',
|
||||||
width: 'max-w-md',
|
width: 'max-w-md',
|
||||||
header: 'flex items-center justify-between flex-shrink-0 px-4 sm:px-6 h-16 border-b u-border-gray-200'
|
header: 'flex items-center justify-between flex-shrink-0 px-4 sm:px-6 h-16 border-b u-border-gray-200',
|
||||||
|
transition: {
|
||||||
|
enter: 'transform transition ease-in-out duration-500 sm:duration-700',
|
||||||
|
leave: 'transform transition ease-in-out duration-500 sm:duration-700'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const notification = {
|
const notification = {
|
||||||
|
|||||||
Reference in New Issue
Block a user