You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.0 KiB
139 lines
4.0 KiB
<template> |
|
<div |
|
:class=" |
|
cn( |
|
'relative z-0 flex min-h-screen w-full flex-col items-center justify-center overflow-hidden rounded-md bg-slate-950', |
|
$props.class, |
|
) |
|
" |
|
> |
|
<div class="relative isolate z-0 flex w-full flex-1 scale-y-125 items-center justify-center"> |
|
<!-- Conic Gradient --> |
|
<div |
|
:style="{ |
|
backgroundImage: `conic-gradient(var(--conic-position), var(--tw-gradient-stops))`, |
|
}" |
|
class="animate-conic-gradient bg-gradient-conic absolute inset-auto right-1/2 h-56 w-60 overflow-visible from-cyan-500 via-transparent to-transparent text-white opacity-50 [--conic-position:from_70deg_at_center_top]" |
|
> |
|
<div |
|
class="absolute bottom-0 left-0 z-20 h-40 w-full bg-slate-950 [mask-image:linear-gradient(to_top,white,transparent)]" |
|
/> |
|
<div |
|
class="absolute bottom-0 left-0 z-20 h-full w-40 bg-slate-950 [mask-image:linear-gradient(to_right,white,transparent)]" |
|
/> |
|
</div> |
|
|
|
<div |
|
:style="{ |
|
backgroundImage: `conic-gradient(var(--conic-position), var(--tw-gradient-stops))`, |
|
}" |
|
class="animate-conic-gradient bg-gradient-conic absolute inset-auto left-1/2 h-56 w-60 from-transparent via-transparent to-cyan-500 text-white opacity-50 [--conic-position:from_290deg_at_center_top]" |
|
> |
|
<div |
|
class="absolute bottom-0 right-0 z-20 h-full w-40 bg-slate-950 [mask-image:linear-gradient(to_left,white,transparent)]" |
|
/> |
|
<div |
|
class="absolute bottom-0 right-0 z-20 h-40 w-full bg-slate-950 [mask-image:linear-gradient(to_top,white,transparent)]" |
|
/> |
|
</div> |
|
|
|
<div |
|
class="absolute top-1/2 h-48 w-full translate-y-12 scale-x-150 bg-slate-950 blur-2xl" |
|
></div> |
|
|
|
<div |
|
class="absolute top-1/2 z-50 h-48 w-full bg-transparent opacity-10 backdrop-blur-md" |
|
></div> |
|
|
|
<div |
|
class="absolute inset-auto z-50 h-36 w-[28rem] -translate-y-1/2 rounded-full bg-cyan-500 opacity-50 blur-3xl" |
|
></div> |
|
|
|
<!-- Spotlight --> |
|
<div |
|
class="animate-spotlight absolute inset-auto z-30 h-36 w-32 -translate-y-24 rounded-full bg-cyan-400 blur-2xl" |
|
></div> |
|
|
|
<!-- Glowing Line --> |
|
<div |
|
class="animate-glowing-line absolute inset-auto z-50 h-0.5 w-60 -translate-y-28 bg-cyan-400" |
|
></div> |
|
|
|
<div class="absolute inset-auto z-40 h-44 w-full translate-y-[-12.5rem] bg-slate-950"></div> |
|
</div> |
|
|
|
<div class="relative z-50 flex -translate-y-80 flex-col items-center px-5"> |
|
<slot /> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { computed, type HTMLAttributes } from 'vue' |
|
import { cn } from '@/lib/utils' |
|
interface LampEffectProps { |
|
delay?: number |
|
duration?: number |
|
class?: HTMLAttributes['class'] |
|
} |
|
|
|
const props = withDefaults(defineProps<LampEffectProps>(), { |
|
delay: 0.5, |
|
duration: 0.8, |
|
}) |
|
|
|
const durationInSeconds = computed(() => `${props.duration}s`) |
|
const delayInSeconds = computed(() => `${props.delay}s`) |
|
</script> |
|
|
|
<style scoped> |
|
/* Spotlight Animation */ |
|
.animate-spotlight { |
|
animation: spotlight-anim ease-in-out v-bind(durationInSeconds) forwards; |
|
animation-delay: v-bind(delayInSeconds); |
|
} |
|
|
|
/* Glowing Line Animation */ |
|
.animate-glowing-line { |
|
animation: glowing-line-anim ease-in-out v-bind(durationInSeconds) forwards; |
|
animation-delay: v-bind(delayInSeconds); |
|
} |
|
|
|
/* Conic Gradient Animation */ |
|
.animate-conic-gradient { |
|
animation: conic-gradient-anim ease-in-out v-bind(durationInSeconds) forwards; |
|
animation-delay: v-bind(delayInSeconds); |
|
} |
|
|
|
/* Keyframes for Spotlight */ |
|
@keyframes spotlight-anim { |
|
from { |
|
width: 8rem; |
|
} |
|
to { |
|
width: 16rem; |
|
} |
|
} |
|
|
|
/* Keyframes for Glowing Line */ |
|
@keyframes glowing-line-anim { |
|
from { |
|
width: 15rem; |
|
} |
|
to { |
|
width: 30rem; |
|
} |
|
} |
|
|
|
/* Keyframes for Conic Gradient */ |
|
@keyframes conic-gradient-anim { |
|
from { |
|
opacity: 0.5; |
|
width: 15rem; |
|
} |
|
to { |
|
opacity: 1; |
|
width: 30rem; |
|
} |
|
} |
|
</style>
|
|
|