Render branding as a static logo to avoid continuous redraws and mouse-driven visual effects.
61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
import { RGBA, TextAttributes } from "@opentui/core"
|
|
import { For, type JSX } from "solid-js"
|
|
import { tint, useTheme } from "../context/theme"
|
|
import { logo } from "../logo"
|
|
|
|
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
|
|
return Array.from(line).map((char) => {
|
|
if (char === "_") {
|
|
return (
|
|
<text fg={fg} bg={shadow} attributes={attrs} selectable={false}>
|
|
{" "}
|
|
</text>
|
|
)
|
|
}
|
|
if (char === "^") {
|
|
return (
|
|
<text fg={fg} bg={shadow} attributes={attrs} selectable={false}>
|
|
▀
|
|
</text>
|
|
)
|
|
}
|
|
if (char === "~") {
|
|
return (
|
|
<text fg={shadow} attributes={attrs} selectable={false}>
|
|
▀
|
|
</text>
|
|
)
|
|
}
|
|
if (char === ",") {
|
|
return (
|
|
<text fg={shadow} attributes={attrs} selectable={false}>
|
|
▄
|
|
</text>
|
|
)
|
|
}
|
|
return (
|
|
<text fg={fg} attributes={attrs} selectable={false}>
|
|
{char}
|
|
</text>
|
|
)
|
|
})
|
|
}
|
|
|
|
return (
|
|
<box>
|
|
<For each={logo.left}>
|
|
{(line, index) => (
|
|
<box flexDirection="row" gap={1}>
|
|
<box flexDirection="row">{renderLine(line, theme.textMuted, false)}</box>
|
|
<box flexDirection="row">{renderLine(logo.right[index()], theme.text, true)}</box>
|
|
</box>
|
|
)}
|
|
</For>
|
|
</box>
|
|
)
|
|
}
|