import type { Component, DefaultTextStyle, MarkdownTheme } from "@mariozechner/pi-tui"; import { Markdown } from "@mariozechner/pi-tui"; import { addOsc8Hyperlinks, extractUrls } from "../osc8-hyperlinks.js"; /** * Wrapper around pi-tui's Markdown component that adds OSC 8 terminal * hyperlinks to rendered output, making URLs clickable even when broken * across multiple lines by word wrapping. */ export class HyperlinkMarkdown implements Component { private inner: Markdown; private urls: string[]; constructor( text: string, paddingX: number, paddingY: number, theme: MarkdownTheme, options?: DefaultTextStyle, ) { this.inner = new Markdown(text, paddingX, paddingY, theme, options); this.urls = extractUrls(text); } render(width: number): string[] { return addOsc8Hyperlinks(this.inner.render(width), this.urls); } setText(text: string): void { this.inner.setText(text); this.urls = extractUrls(text); } invalidate(): void { this.inner.invalidate(); } }