import { TextAttributes, RGBA } from "@opentui/core"
import { For, type JSX } from "solid-js"
import { useTheme, tint } from "@tui/context/theme"
import { logo, marks } from "@/cli/logo"
// Shadow markers (rendered chars in parens):
// _ = full shadow cell (space with bg=shadow)
// ^ = letter top, shadow bottom (▀ with fg=letter, bg=shadow)
// ~ = shadow top only (▀ with fg=shadow)
const SHADOW_MARKER = new RegExp(`[${marks}]`)
export function Logo() {
const { theme } = useTheme()
const renderLine = (line: string, fg: RGBA, bold: boolean): JSX.Element[] => {
const shadow = tint(theme.background, fg, 0.25)
const attrs = bold ? TextAttributes.BOLD : undefined
const elements: JSX.Element[] = []
let i = 0
while (i < line.length) {
const rest = line.slice(i)
const markerIndex = rest.search(SHADOW_MARKER)
if (markerIndex === -1) {
elements.push(
{rest}
,
)
break
}
if (markerIndex > 0) {
elements.push(
{rest.slice(0, markerIndex)}
,
)
}
const marker = rest[markerIndex]
switch (marker) {
case "_":
elements.push(
{" "}
,
)
break
case "^":
elements.push(
▀
,
)
break
case "~":
elements.push(
▀
,
)
break
}
i += markerIndex + 1
}
return elements
}
return (
{(line, index) => (
{renderLine(line, theme.textMuted, false)}
{renderLine(logo.right[index()], theme.text, true)}
)}
)
}