feat: Added placeholder avatar
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
<template>
|
||||
<div class="relative">
|
||||
<img :class="avatarClasses" :src="img" :alt="alt">
|
||||
<div v-if="!img" :class="avatarPlaceholderWrapperClasses">
|
||||
<svg v-if="!initials" :class="avatarPlaceholderClasses" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
<div v-else :class="avatarPlaceholderInitialsClasses">{{ initials }}</div>
|
||||
</div>
|
||||
<img v-else :class="avatarClasses" :src="img" :alt="alt">
|
||||
<span v-if="status" :class="avatarDotClasses" :data-pos="statusPosition"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -43,8 +49,12 @@ const props = defineProps({
|
||||
type: String as PropType<AvatarStatusPosition>,
|
||||
default: 'top-right',
|
||||
},
|
||||
initials: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
})
|
||||
|
||||
const { avatarClasses, avatarDotClasses } = useAvatarClasses(toRefs(props))
|
||||
const { avatarClasses, avatarDotClasses, avatarPlaceholderClasses, avatarPlaceholderWrapperClasses, avatarPlaceholderInitialsClasses } = useAvatarClasses(toRefs(props))
|
||||
|
||||
</script>
|
||||
|
||||
@@ -34,6 +34,17 @@ const avatarStatusDotPositionClasses: Record<avatarDotIndicatorPositionClasses,
|
||||
'bottom-left-default': '-bottom-1.5 left-0 transform -translate-x-1/2 ',
|
||||
}
|
||||
|
||||
const avatarPlaceholderDefaultClasses = 'absolute w-auto h-auto text-gray-400'
|
||||
const avatarPlaceholderWrapperDefaultClasses = 'inline-flex overflow-hidden relative justify-center items-center bg-gray-100 dark:bg-gray-600'
|
||||
const avatarPlaceholderInitialsDefaultClasses = 'font-medium text-gray-600 dark:text-gray-300'
|
||||
const avatarPlaceholderSizes = {
|
||||
xs: 'bottom-0',
|
||||
sm: 'bottom-0',
|
||||
md: '-bottom-1',
|
||||
lg: '-bottom-2',
|
||||
xl: '-bottom-4',
|
||||
}
|
||||
|
||||
export type UseAvatarClassesProps = {
|
||||
status: Ref<AvatarStatus>
|
||||
bordered: Ref<boolean>
|
||||
@@ -48,6 +59,9 @@ export type UseAvatarClassesProps = {
|
||||
export function useAvatarClasses(props: UseAvatarClassesProps): {
|
||||
avatarClasses: Ref<string>
|
||||
avatarDotClasses: Ref<string>
|
||||
avatarPlaceholderClasses: Ref<string>
|
||||
avatarPlaceholderWrapperClasses: Ref<string>
|
||||
avatarPlaceholderInitialsClasses: Ref<string>
|
||||
} {
|
||||
|
||||
const avatarClasses = computed<string>(() => {
|
||||
@@ -67,12 +81,32 @@ export function useAvatarClasses(props: UseAvatarClassesProps): {
|
||||
avatarStatusDotPositionClasses[avatarType as avatarDotIndicatorPositionClasses],
|
||||
)
|
||||
})
|
||||
// TODO: Placeholder
|
||||
const avatarPlaceholderClasses = computed<string>(() => {
|
||||
return classNames(
|
||||
avatarPlaceholderDefaultClasses,
|
||||
avatarPlaceholderSizes[props.size.value],
|
||||
)
|
||||
})
|
||||
const avatarPlaceholderWrapperClasses = computed<string>(() => {
|
||||
return classNames(
|
||||
avatarPlaceholderWrapperDefaultClasses,
|
||||
avatarSizeClasses[props.size.value],
|
||||
avatarTypeClasses[props.rounded.value ? 'rounded' : 'default'],
|
||||
)
|
||||
})
|
||||
const avatarPlaceholderInitialsClasses = computed<string>(() => {
|
||||
return classNames(
|
||||
avatarPlaceholderInitialsDefaultClasses,
|
||||
)
|
||||
})
|
||||
// TODO: Avatar Initials
|
||||
|
||||
return {
|
||||
avatarClasses,
|
||||
avatarDotClasses,
|
||||
avatarPlaceholderClasses,
|
||||
avatarPlaceholderWrapperClasses,
|
||||
avatarPlaceholderInitialsClasses,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user