<template> <div class="card" :style="styleObj"> <div class="card-borders"> <div class="border-top"></div> <div class="border-right"></div> <div class="border-bottom"></div> <div class="border-left"></div> </div> <div class="card-content"> <el-image :src="avatar" class="avatar"></el-image> <div class="username">{{ username }}</div> <div class="social-icons"> <a v-for="(item, index) in iconArray" :key="index" class="social-icon" :href="item.url" target="_blank" > <vab-icon :icon="['fas', item.icon]" /> </a> </div> </div> </div> </template> <script> export default { name: 'VabProfile', props: { styleObj: { type: Object, default: () => { return {} }, }, username: { type: String, default: '', }, avatar: { type: String, default: '', }, iconArray: { type: Array, default: () => { return [ { icon: 'bell', url: '' }, { icon: 'bookmark', url: '' }, { icon: 'cloud-sun', url: '' }, ] }, }, }, data() { return {} }, created() {}, mounted() {}, methods: {}, } </script> <style lang="scss" scoped> .card { --card-bg-color: hsl(240, 31%, 25%); --card-bg-color-transparent: hsla(240, 31%, 25%, 0.7); position: relative; width: 100%; height: 100%; .card-borders { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; .border-top { position: absolute; top: 0; width: 100%; height: 2px; background: var(--card-bg-color); transform: translateX(-100%); animation: slide-in-horizontal 0.8s cubic-bezier(0.645, 0.045, 0.355, 1) forwards; } .border-right { position: absolute; right: 0; width: 2px; height: 100%; background: var(--card-bg-color); transform: translateY(100%); animation: slide-in-vertical 0.8s cubic-bezier(0.645, 0.045, 0.355, 1) forwards; } .border-bottom { position: absolute; bottom: 0; width: 100%; height: 2px; background: var(--card-bg-color); transform: translateX(100%); animation: slide-in-horizontal-reverse 0.8s cubic-bezier(0.645, 0.045, 0.355, 1) forwards; } .border-left { position: absolute; top: 0; width: 2px; height: 100%; background: var(--card-bg-color); transform: translateY(-100%); animation: slide-in-vertical-reverse 0.8s cubic-bezier(0.645, 0.045, 0.355, 1) forwards; } } .card-content { display: flex; flex-direction: column; align-items: center; height: 100%; padding: 40px 0 40px 0; background: var(--card-bg-color-transparent); opacity: 0; transform: scale(0.6); animation: bump-in 0.5s 0.8s forwards; .avatar { width: 80px; height: 80px; border: 1px solid $base-color-white; border-radius: 50%; opacity: 0; transform: scale(0.6); animation: bump-in 0.5s 1s forwards; } .username { position: relative; margin-top: 20px; margin-bottom: 20px; font-size: 26px; color: transparent; letter-spacing: 2px; animation: fill-text-white 1.2s 2s forwards; &::before { position: absolute; top: 0; left: 0; width: 100%; height: 100%; color: black; content: ''; background: #35b9f1; transform: scaleX(0); transform-origin: left; animation: slide-in-out 1.2s 1.2s cubic-bezier(0.75, 0, 0, 1) forwards; } } .social-icons { display: flex; .social-icon { position: relative; display: flex; align-items: center; justify-content: center; width: 2.5em; height: 2.5em; margin: 0 15px; color: white; text-decoration: none; border-radius: 50%; @for $i from 1 through 3 { &:nth-child(#{$i}) { &::before { animation-delay: 2s + 0.1s * $i; } &::after { animation-delay: 2.1s + 0.1s * $i; } svg { animation-delay: 2.2s + 0.1s * $i; } } } &::before, &::after { position: absolute; top: 0; left: 0; width: 100%; height: 100%; content: ''; border-radius: inherit; transform: scale(0); } &::before { background: #f7f1e3; animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards; } &::after { background: #2c3e50; animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards; } svg { z-index: 99; transform: scale(0); animation: scale-in 0.5s cubic-bezier(0.75, 0, 0, 1) forwards; } } } } } @keyframes bump-in { 50% { transform: scale(1.05); } to { opacity: 1; transform: scale(1); } } @keyframes slide-in-horizontal { 50% { transform: translateX(0); } to { transform: translateX(100%); } } @keyframes slide-in-horizontal-reverse { 50% { transform: translateX(0); } to { transform: translateX(-100%); } } @keyframes slide-in-vertical { 50% { transform: translateY(0); } to { transform: translateY(-100%); } } @keyframes slide-in-vertical-reverse { 50% { transform: translateY(0); } to { transform: translateY(100%); } } @keyframes slide-in-out { 50% { transform: scaleX(1); transform-origin: left; } 50.1% { transform-origin: right; } 100% { transform: scaleX(0); transform-origin: right; } } @keyframes fill-text-white { to { color: white; } } @keyframes scale-in { to { transform: scale(1); } } </style>