Newer
Older
vmk-ui-kit / src / vue / components / GnLoader.js
/**
 * GnLoader - Loading state indicator.
 */

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

export default defineComponent({
	name: "GnLoader",
	props: {
		type: { type: String, default: "spin" },
		size: { type: String, default: "md" },
		label: { type: String, default: "Loading" },
		block: { type: Boolean, default: false }
	},
	setup(props) {
		const sizeClass = ["sm", "md", "lg"].includes(props.size) ? `loader-${props.size}` : "loader-md";
		const typeClass = ["spin", "dots", "bar"].includes(props.type) ? `loader-${props.type}` : "loader-spin";

		return () => {
			const indicator = h("span", {
				class: cx("loader", sizeClass, typeClass),
				role: props.type === "bar" ? "progressbar" : "status",
				"aria-label": props.label
			}, [
				props.type === "spin" && h("span", { class: "loader-spin" }),
				props.type === "dots" && [1, 2, 3].map(() => h("span")),
				props.type === "bar" && h("span")
			]);

			if(props.block) {
				return h("div", { class: "loader-block" }, [
					indicator,
					h("span", props.label)
				]);
			}

			return indicator;
		};
	}
});