import { icon } from "@mariozechner/mini-lit"; import { LitElement } from "lit"; import { property, state } from "lit/decorators.js"; import { html } from "lit/html.js"; import { Check, Copy } from "lucide"; import { i18n } from "../utils/i18n.js"; export class ConsoleBlock extends LitElement { @property() content: string = ""; @property() variant: "default" | "error" = "default"; @state() private copied = false; protected override createRenderRoot(): HTMLElement | DocumentFragment { return this; } override connectedCallback(): void { super.connectedCallback(); this.style.display = "block"; } private async copy() { try { await navigator.clipboard.writeText(this.content || ""); this.copied = true; setTimeout(() => { this.copied = false; }, 1500); } catch (e) { console.error("Copy failed", e); } } override updated() { // Auto-scroll to bottom on content changes const container = this.querySelector(".console-scroll") as HTMLElement | null; if (container) { container.scrollTop = container.scrollHeight; } } override render() { const isError = this.variant === "error"; const textClass = isError ? "text-destructive" : "text-foreground"; return html`
${i18n("console")}
${this.content || ""}
`; } } // Register custom element if (!customElements.get("console-block")) { customElements.define("console-block", ConsoleBlock); }