Newer
Older
vmk-ui-kit / src / vue / components / GnAvatar.js
/**
 * GnAvatar - Avatar with initials, image, icon and status indicator.
 */

import { defineComponent, h, computed } from "vue";
import { cx, iconNode } from "../utils.js";

export default defineComponent({
	name: "GnAvatar",
	props: {
		src: { type: String, default: "" },
		alt: { type: String, default: "" },
		initials: { type: String, default: "" },
		icon: { type: String, default: "" },
		size: { type: String, default: "md" },
		variant: { type: String, default: "mint" },
		status: { type: String, default: "" },
		square: { type: Boolean, default: false }
	},
	setup(props, { slots }) {
		const classes = computed(() => cx("avatar", `avatar-${props.size}`, `avatar-${props.variant}`, {
			"avatar-square": props.square
		}));

		const content = computed(() => {
			if (slots.default) return slots.default();
			if (props.src) return h("img", { src: props.src, alt: props.alt });
			if (props.icon) return iconNode(props.icon);
			return props.initials?.slice(0, 2).toUpperCase();
		});

		const statusClass = () => {
			switch (props.status) {
				case "offline": return "is-offline";
				case "busy": return "is-busy";
				case "away": return "is-away";
				case "danger": return "is-danger";
				default: return "";
			}
		};

		return () => h("span", { class: classes.value }, [
			content.value,
			props.status && h("span", { class: cx("avatar-status", statusClass()) })
		]);
	}
});