Newer
Older
vmk-ui-kit / src / vue / components / GnVerificationCard.js
@Eugene Sukhodolskiy Eugene Sukhodolskiy 19 hours ago 3 KB so many changes
/**
 * GnVerificationCard — verification status panel.
 *
 * Figma: Characteristics Container.
 *
 * @typedef {Object} GnVerificationCardProps
 * @property {string} title
 * @property {string} [status='verified'] - verified | warning | danger
 * @property {string} [statusText='']
 * @property {Array<{label:string,icon?:string,checked?:boolean}>} [items=[]]
 * @property {string} [body='']
 * @property {string} [cta='']
 * @property {Function} [onCta]
 * @property {Object} [notice] - { title, text, action, onAction }
 * @property {string} [timestamp='']
 */

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

export default defineComponent({
	name: "GnVerificationCard",
	inheritAttrs: false,
	props: {
		title: { type: String, required: true },
		status: { type: String, default: "verified" },
		statusText: { type: String, default: "" },
		items: { type: Array, default: () => [] },
		body: { type: String, default: "" },
		cta: { type: String, default: "" },
		notice: { type: Object, default: null },
		timestamp: { type: String, default: "" }
	},
	emits: ["cta", "notice-action"],
	setup(props, { attrs, slots, emit }) {
		const statusMap = {
			verified: "ph-check-circle",
			warning: "ph-warning-circle",
			danger: "ph-warning-circle"
		};

		return () => h("article", {
			...attrs,
			class: cx("verification-card", `verification-card--${props.status}`, attrs.class)
		}, [
			h("div", { class: "verification-card__header" }, [
				h("h3", { class: "verification-card__title" }, slots.title?.() || props.title),
				(props.statusText || slots.status) && h("span", { class: "verification-card__status" }, [
					iconNode(statusMap[props.status] || "ph-check-circle"),
					slots.status?.() || props.statusText
				])
			]),
			(props.items.length || slots.items) && h("ul", { class: "verification-card__list" }, [
				props.items.map(item => h("li", { class: "verification-card__item" }, [
					iconNode(item.icon || (item.checked !== false ? "ph-check-circle" : "ph-warning-circle")),
					item.label
				])),
				slots.items?.()
			]),
			(props.body || slots.body) && h("div", { class: "verification-card__body" }, slots.body?.() || props.body),
			(props.cta || slots.cta) && h("div", { class: "verification-card__cta" }, [
				h("button", {
					class: cx("btn", "btn-secondary", "btn-sm"),
					type: "button",
					onClick: () => emit("cta")
				}, slots.cta?.() || props.cta)
			]),
			(props.notice || slots.notice) && h("div", { class: "verification-card__notice" }, [
				props.notice?.title && h("h4", { class: "verification-card__notice-title" }, props.notice.title),
				props.notice?.text && h("p", { class: "verification-card__notice-text" }, props.notice.text),
				props.notice?.action && h("button", {
					class: "verification-card__notice-action",
					type: "button",
					onClick: () => emit("notice-action", props.notice)
				}, [
					props.notice.action,
					iconNode("ph-chevron-right")
				]),
				slots.notice?.()
			]),
			(props.timestamp || slots.timestamp) && h("footer", { class: "verification-card__footer" }, slots.timestamp?.() || props.timestamp)
		]);
	}
});