/** * Icon CTA Button Component * Full-width button with icon and text, supports primary (purple) and secondary (gray) variants * Extends the CTA button pattern with icon support */ import { cartIcon } from "../icons/cart-icon.js"; import { ebookIcon } from "../icons/ebook-icon.js"; class IconCtaButton extends HTMLElement { static get observedAttributes() { return ["href", "variant", "icon"]; } constructor() { super(); this.attachShadow({ mode: "open" }); } connectedCallback() { this.render(); this.setupEventListeners(); } attributeChangedCallback() { if (this.shadowRoot) { this.render(); this.setupEventListeners(); } } setupEventListeners() { const button = this.shadowRoot?.querySelector(".icon-cta-button"); if (button && !this.hasAttribute("href")) { button.addEventListener("click", () => { this.dispatchEvent( new CustomEvent("button-click", { bubbles: true, composed: true, }) ); }); } } get href() { return this.getAttribute("href") || ""; } get variant() { return this.getAttribute("variant") || "primary"; // 'primary' or 'secondary' } get icon() { return this.getAttribute("icon") || ""; // 'cart', 'ebook', or empty } getIconHtml() { const isPrimary = this.variant === "primary"; const iconColor = isPrimary ? "#ffffff" : "currentColor"; switch (this.icon) { case "cart": return cartIcon({ size: 20, color: iconColor }); case "ebook": return ebookIcon({ size: 20, color: iconColor }); default: return ""; } } render() { const isLink = this.hasAttribute("href") && this.href; const tag = isLink ? "a" : "button"; const hrefAttr = isLink ? `href="${this.href}"` : ""; const typeAttr = isLink ? "" : 'type="button"'; const isPrimary = this.variant === "primary"; const iconHtml = this.getIconHtml(); this.shadowRoot.innerHTML = ` <${tag} class="icon-cta-button ${isPrimary ? "primary" : "secondary"}" ${hrefAttr} ${typeAttr} > ${iconHtml ? `${iconHtml}` : ""} `; } } customElements.define("icon-cta-button", IconCtaButton);