From 725802efa655c84b695c93fab4e31185bae6af46 Mon Sep 17 00:00:00 2001 From: "will.anderson" Date: Fri, 21 Aug 2026 15:55:55 -0500 Subject: [PATCH] feat(brand): render Neuron wordmark in TUI via kitty/iTerm2 graphics with ASCII fallback --- bun.lock | 36 +++++++++---------- package.json | 6 ++-- packages/plugin/package.json | 6 ++-- packages/tui/src/assets/neuron-wordmark.png | Bin 0 -> 27159 bytes packages/tui/src/component/logo.tsx | 38 +++++++++++++++++++- packages/tui/src/types/assets.d.ts | 4 +++ 6 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 packages/tui/src/assets/neuron-wordmark.png create mode 100644 packages/tui/src/types/assets.d.ts diff --git a/bun.lock b/bun.lock index 79d2df0fad..21fd01c20f 100644 --- a/bun.lock +++ b/bun.lock @@ -688,9 +688,9 @@ "typescript": "catalog:", }, "peerDependencies": { - "@opentui/core": ">=0.4.5", - "@opentui/keymap": ">=0.4.5", - "@opentui/solid": ">=0.4.5", + "@opentui/core": ">=0.5.6", + "@opentui/keymap": ">=0.5.6", + "@opentui/solid": ">=0.5.6", }, "optionalPeers": [ "@opentui/core", @@ -1082,9 +1082,9 @@ "@npmcli/arborist": "9.4.0", "@octokit/rest": "22.0.0", "@openauthjs/openauth": "0.0.0-20250322224806", - "@opentui/core": "0.4.5", - "@opentui/keymap": "0.4.5", - "@opentui/solid": "0.4.5", + "@opentui/core": "0.5.6", + "@opentui/keymap": "0.5.6", + "@opentui/solid": "0.5.6", "@pierre/diffs": "1.2.10", "@playwright/test": "1.59.1", "@sentry/solid": "10.36.0", @@ -2006,27 +2006,27 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], - "@opentui/core": ["@opentui/core@0.4.5", "", { "dependencies": { "bun-ffi-structs": "0.2.4", "diff": "9.0.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.4.5", "@opentui/core-darwin-x64": "0.4.5", "@opentui/core-linux-arm64": "0.4.5", "@opentui/core-linux-arm64-musl": "0.4.5", "@opentui/core-linux-x64": "0.4.5", "@opentui/core-linux-x64-musl": "0.4.5", "@opentui/core-win32-arm64": "0.4.5", "@opentui/core-win32-x64": "0.4.5" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-JsgRTPkA6e+Vxmumxai6SElOSlRQkbzNKHlCfemlArRiLhfC1IZ9RXJo2QH4xSu+uBOWAM90uss73/pPlkdEig=="], + "@opentui/core": ["@opentui/core@0.5.6", "", { "dependencies": { "bun-ffi-structs": "0.3.1", "diff": "9.0.0", "marked": "17.0.1", "string-width": "7.2.0", "strip-ansi": "7.1.2" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.5.6", "@opentui/core-darwin-x64": "0.5.6", "@opentui/core-linux-arm64": "0.5.6", "@opentui/core-linux-arm64-musl": "0.5.6", "@opentui/core-linux-x64": "0.5.6", "@opentui/core-linux-x64-musl": "0.5.6", "@opentui/core-win32-arm64": "0.5.6", "@opentui/core-win32-x64": "0.5.6" }, "peerDependencies": { "web-tree-sitter": "0.25.10" } }, "sha512-e38H1VceXoSSOEYmhUeHDE3F3LHXn/sFEZ6NhbXkbYdrkdV+1MMTgEkGZJ9I5fHhBlJdGJ1LDTPw8V0ZSUXSyQ=="], - "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.4.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8KUG0oRidnR+oW1RSZJ72/PhZLl+qRRMk5U/mieF4c0SJ5V3tYACpBZAKzQfHNd1f7QzD8FHZct1lPpQgtmkWg=="], + "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-g/OOSSXuFlpLOhLHm8w8MsMh1oGVYlQ7QuW8l6oqG9KIkOg4hkYN5eFnpe6Px1p6cNCw5NOC+198WwdcKhQncg=="], - "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.4.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-R2bocsg55gwjOqCp/MWFgFYzRmsduKegB6nzgFAPCvAD/L5Jf30xpWJWFlSg3x8vxe1L9WJ84dfqa4M7mZZ3wA=="], + "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-4+z7/CaV27u9JpdooMa6oRIpLwsaA5j1a2xz7Xzm8oWhakeKGZnW0wUJAfStn/sks3NK5tUpF+eKHa9oawGiEw=="], - "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-R4MZ25a4CzOAGVjW9aj1hUfzQGVfCJwrwBDbNs2SXaIvzcZqkxCVtU4FoQ5LsaD0j/BdNQVg2CIfFkFsm1fDuQ=="], + "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-RAiRmosbg7DH4+ZuXRMjEmQmDAWhcRpuQKQ6bGL76nUd6wl/CufBiD7il/FQMQyUGzmQQH0Hu+pVQLz+kAkNJw=="], - "@opentui/core-linux-arm64-musl": ["@opentui/core-linux-arm64-musl@0.4.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ieqdyKI6EIYPalYAETB2wsdP83hr5Ifi+dFnBFUmdEEFHsoKwBmn2S7bsTOYlX7Bg03F4/YPIg+IvRpeC+cUJw=="], + "@opentui/core-linux-arm64-musl": ["@opentui/core-linux-arm64-musl@0.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-cMdxhADkuJW0Nkn7pTB43q5Djg4Ch5i3hlC4iLOVkbOgvckKqz8xJHdl7fuqVs8g5LaadGBmZqdlFKjXIMKl2g=="], - "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-SNyuQoxMKI1vuJhgxSSW96adWM6LqFl2SoS3GM4tGeneGOanVVG2Y06PvlytXvF4cKik97t0rqkVMRetmOs93w=="], + "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-gzlNauPg5UT5UnWiSIlONRwKnkNA6fjN8SyRGlT3SGvcAox+vT2WeP6TwoJSM6pq5H5MF/tlY+REIqc/ZMGJtQ=="], - "@opentui/core-linux-x64-musl": ["@opentui/core-linux-x64-musl@0.4.5", "", { "os": "linux", "cpu": "x64" }, "sha512-mKVKcIcPiSVVZZsdPSBoWwoa2/TCeQAaMDeHF7PFw2kt5bTXZPP7xxWfRQLCNIcA1eaGl59UuwUWHDR2Ve548Q=="], + "@opentui/core-linux-x64-musl": ["@opentui/core-linux-x64-musl@0.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-vb5mn1i1s8/3lp03O6lX3190eN+iVCZxXOl9qCO5BTCXWtFztyIkp5YDad3/20SptcOHcLPKDiRGWNmSkYBrkQ=="], - "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.4.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-GHTTsqeR45q2Iek9Rb7ty+x/hAKn2jZ1ujlCgPR8LBKyF7h0E1dNFryoZ7ehMc3kJndP1sKn836IemKFqxuDdQ=="], + "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-FTSpFrNyuh4k2Z3+KeLVLlryFpe89ZyQcqBE0XcmtgiU3RlXuoMPSj2TtRekukR/FaWw9toDBfWokiQjOJGjrA=="], - "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.4.5", "", { "os": "win32", "cpu": "x64" }, "sha512-Y8T/yXCDGagRGiQrtmuB6AhRcPucKFs/Dre3v8kJwNYqDccI4FzUPKclZ7djfmRZNjl7JUqPhZZP/PwDpQocMg=="], + "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-rWplkCuHX0OxVi7bO8dAVPttzPpCgmz6Bsu1XCm4ErPAhZOofRd5FbeW2+pC71AbLOKicSwI7lQ4mhGCNaweaA=="], - "@opentui/keymap": ["@opentui/keymap@0.4.5", "", { "dependencies": { "@opentui/core": "0.4.5" }, "peerDependencies": { "@opentui/react": "0.4.5", "@opentui/solid": "0.4.5", "react": ">=19.2.0", "solid-js": "1.9.12" }, "optionalPeers": ["@opentui/react", "@opentui/solid", "react", "solid-js"] }, "sha512-S1wzKHhF70zT6bH+VBFY+lSeTImLcIFW28JNQiME8MoPcy6KGPs7rKFSHrb/U7P8rsTJeRfW5A4d1Cy6PKodDg=="], + "@opentui/keymap": ["@opentui/keymap@0.5.6", "", { "dependencies": { "@opentui/core": "0.5.6" }, "peerDependencies": { "@opentui/react": "0.5.6", "@opentui/solid": "0.5.6", "react": ">=19.2.0", "solid-js": "1.9.12" }, "optionalPeers": ["@opentui/react", "@opentui/solid", "react", "solid-js"] }, "sha512-1lR1aFRSgHCwN31YOHDQQVSqz1YNN7DsoIvWHjEiQJ12kTxHg9G7Q1HHFJttM838RWsNOvW6gBAhOr403VL8rg=="], - "@opentui/solid": ["@opentui/solid@0.4.5", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.4.5", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-B0RSkXnrtPVfEJOX+Hj+axjLJ3lzbG1BZw5I7Pvb9OPp48Vzg2cW2a3cSa86/q48ndLt647i/XwFPIw/jqnI5g=="], + "@opentui/solid": ["@opentui/solid@0.5.6", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.5.6", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-kxmrQS31sgziW/qZDuFYuiT3CvcUQg9ZQA1qKCEb5mBoInur4fnECOdTaM2S8c3cidcV0z2yu41NP1Dypkl+BQ=="], "@oslojs/asn1": ["@oslojs/asn1@1.0.0", "", { "dependencies": { "@oslojs/binary": "1.0.0" } }, "sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA=="], @@ -3216,7 +3216,7 @@ "builder-util-runtime": ["builder-util-runtime@9.7.0", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw=="], - "bun-ffi-structs": ["bun-ffi-structs@0.2.4", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-AJzsqoVFs1KBbJbWHIYrVZLDC3NhTqqh25awRXqzoLzmBAKr5oqk6+CwuYHAekKx+VBCYVohBoKuRq40dV+TYg=="], + "bun-ffi-structs": ["bun-ffi-structs@0.3.1", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-3gM7PpVWLyrwxWjcilSiGuhWanhZivvo6l0u573NziPH6f/gwk6McbaYgn7oJWov6pKGRTDbrg94W5DcJsKTtQ=="], "bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="], diff --git a/package.json b/package.json index 33b9afd849..2f7c501742 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,9 @@ "@octokit/rest": "22.0.0", "@hono/standard-validator": "0.2.0", "@hono/zod-validator": "0.4.2", - "@opentui/core": "0.4.5", - "@opentui/keymap": "0.4.5", - "@opentui/solid": "0.4.5", + "@opentui/core": "0.5.6", + "@opentui/keymap": "0.5.6", + "@opentui/solid": "0.5.6", "@tanstack/solid-virtual": "3.13.32", "@shikijs/stream": "4.2.0", "ulid": "3.0.1", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index bbf256415e..2081cd504b 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -27,9 +27,9 @@ "zod": "catalog:" }, "peerDependencies": { - "@opentui/core": ">=0.4.5", - "@opentui/keymap": ">=0.4.5", - "@opentui/solid": ">=0.4.5" + "@opentui/core": ">=0.5.6", + "@opentui/keymap": ">=0.5.6", + "@opentui/solid": ">=0.5.6" }, "peerDependenciesMeta": { "@opentui/core": { diff --git a/packages/tui/src/assets/neuron-wordmark.png b/packages/tui/src/assets/neuron-wordmark.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7e2596ebbf1f41d426d00bd0741ec16f640c29 GIT binary patch literal 27159 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 literal 0 HcmV?d00001 diff --git a/packages/tui/src/component/logo.tsx b/packages/tui/src/component/logo.tsx index db8e8dc716..0f47d76ea8 100644 --- a/packages/tui/src/component/logo.tsx +++ b/packages/tui/src/component/logo.tsx @@ -1,10 +1,32 @@ +import { useRenderer } from "@opentui/solid" +import { createSignal, For, onMount, type JSX } from "solid-js" import { RGBA, TextAttributes } from "@opentui/core" -import { For, type JSX } from "solid-js" import { tint, useTheme } from "../context/theme" import { logo } from "../logo" +import wordmark from "../assets/neuron-wordmark.png" with { type: "file" } +// The wordmark PNG renders through the Kitty graphics protocol (or iTerm2 +// OSC 1337) when the terminal supports it; otherwise we fall back to the +// block-letter ASCII logo. export function Logo() { const { theme } = useTheme() + const renderer = useRenderer() + const [useImage, setImage] = createSignal(false) + const [imageFailed, setImageFailed] = createSignal(false) + + onMount(() => { + // capability info lands asynchronously after startup; only trust an + // explicit positive detection + const caps = (renderer as { capabilities?: { kitty_graphics?: boolean; iterm2?: boolean } }).capabilities + if (caps?.kitty_graphics || caps?.iterm2) { + setImage(true) + return + } + const onCaps = (next: { kitty_graphics?: boolean; iterm2?: boolean }) => { + if (next?.kitty_graphics || next?.iterm2) setImage(true) + } + renderer.on("capabilities", onCaps) + }) const renderLine = (line: string, fg: RGBA, bold: boolean): JSX.Element[] => { const shadow = tint(theme.background, fg, 0.25) @@ -46,6 +68,20 @@ export function Logo() { }) } + if (useImage() && !imageFailed()) { + return ( + + setImageFailed(true)} + /> + + ) + } + return ( diff --git a/packages/tui/src/types/assets.d.ts b/packages/tui/src/types/assets.d.ts new file mode 100644 index 0000000000..af542823a9 --- /dev/null +++ b/packages/tui/src/types/assets.d.ts @@ -0,0 +1,4 @@ +declare module "*.png" { + const src: string + export default src +}