From 8587c5a7e1641fd3b509753c90cc57e0776a2141 Mon Sep 17 00:00:00 2001 From: lukemaj Date: Fri, 25 Sep 2026 14:15:39 +0200 Subject: [PATCH] feat(web): show Chromeria as the product name in the web UI The sidebar wordmark, setup screen, assistant author heading, link-target and theme labels, splash screen and boot error still said "T3 Code". They now read APP_BASE_NAME, whose browser fallback is "Chromeria", and the T3 glyph renders the Chromeria obelisk icon. Co-Authored-By: Claude Opus 5.5 (1M context) --- apps/web/index.html | 6 +++--- apps/web/public/chromeria-mark.png | Bin 0 -> 27277 bytes apps/web/src/bootstrap.test.ts | 4 ++-- apps/web/src/branding.test.ts | 4 ++-- apps/web/src/branding.ts | 3 ++- apps/web/src/components/T3Wordmark.tsx | 9 ++++----- .../src/components/chat/MessagesTimeline.tsx | 3 ++- .../src/components/onboarding/WelcomeWizard.tsx | 7 ++++--- .../settings/IntegrationsSettings.tsx | 3 ++- .../components/settings/ThemePreviewCircles.tsx | 3 ++- .../src/components/sidebar/SidebarChrome.tsx | 5 +++-- apps/web/src/lib/bootError.ts | 6 ++++-- 12 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 apps/web/public/chromeria-mark.png diff --git a/apps/web/index.html b/apps/web/index.html index c2d164742402..038699eb7bcd 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -477,13 +477,13 @@ cursor: pointer; } - T3 Code (Alpha) + Chromeria
-
- +
+
diff --git a/apps/web/public/chromeria-mark.png b/apps/web/public/chromeria-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..582443e77b560c89cdfd98091dd447448598b523 GIT binary patch literal 27277 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 u>^pq4;~*N>SRmm5(TZk`GN0000 { await import("./bootstrap"); await vi.dynamicImportSettled(); - expect(bootShell?.text).toContain("T3 Code could not load."); + expect(bootShell?.text).toContain("Chromeria could not load."); const reloadButton = bootShell?.children[0]?.children.find( (element) => element.tagName === "button", ); @@ -78,7 +78,7 @@ describe("app startup failures", () => { showBootError(new Error("internal module path")); - expect(bootShell?.text).toContain("T3 Code could not load."); + expect(bootShell?.text).toContain("Chromeria could not load."); expect(bootShell?.text.includes("internal module path")).toBe(dev); }); diff --git a/apps/web/src/branding.test.ts b/apps/web/src/branding.test.ts index e1c87bcf0595..ff2746fbbbb9 100644 --- a/apps/web/src/branding.test.ts +++ b/apps/web/src/branding.test.ts @@ -47,7 +47,7 @@ describe("branding", () => { expect(branding.HOSTED_APP_CHANNEL).toBe("nightly"); expect(branding.HOSTED_APP_CHANNEL_LABEL).toBe("Nightly"); expect(branding.APP_STAGE_LABEL).toBe("Nightly"); - expect(branding.APP_DISPLAY_NAME).toBe("T3 Code (Nightly)"); + expect(branding.APP_DISPLAY_NAME).toBe("Chromeria (Nightly)"); }); it("does not label the latest hosted app channel", async () => { @@ -58,7 +58,7 @@ describe("branding", () => { expect(branding.HOSTED_APP_CHANNEL).toBe("latest"); expect(branding.HOSTED_APP_CHANNEL_LABEL).toBe("Latest"); expect(branding.APP_STAGE_LABEL).toBe("Latest"); - expect(branding.APP_DISPLAY_NAME).toBe("T3 Code"); + expect(branding.APP_DISPLAY_NAME).toBe("Chromeria"); }); it("ignores unknown hosted app channels", async () => { diff --git a/apps/web/src/branding.ts b/apps/web/src/branding.ts index 7fc57cf0d03f..310a9000323a 100644 --- a/apps/web/src/branding.ts +++ b/apps/web/src/branding.ts @@ -16,7 +16,8 @@ export const HOSTED_APP_CHANNEL = hostedAppChannel === "latest" || hostedAppChannel === "nightly" ? hostedAppChannel : null; export const HOSTED_APP_CHANNEL_LABEL = HOSTED_APP_CHANNEL === "nightly" ? "Nightly" : HOSTED_APP_CHANNEL === "latest" ? "Latest" : null; -export const APP_BASE_NAME = injectedDesktopAppBranding?.baseName ?? "T3 Code"; +// Chromeria (toolboxmd fork): browser clients without desktop branding. +export const APP_BASE_NAME = injectedDesktopAppBranding?.baseName ?? "Chromeria"; export const APP_STAGE_LABEL = injectedDesktopAppBranding?.stageLabel ?? HOSTED_APP_CHANNEL_LABEL ?? diff --git a/apps/web/src/components/T3Wordmark.tsx b/apps/web/src/components/T3Wordmark.tsx index d0882a5dd61e..898348f54da6 100644 --- a/apps/web/src/components/T3Wordmark.tsx +++ b/apps/web/src/components/T3Wordmark.tsx @@ -1,12 +1,11 @@ import type { SVGProps } from "react"; +// Chromeria (toolboxmd fork): the product mark is the Chromeria obelisk icon, +// served from apps/web/public. Callers size it by height like the T3 glyph. export function T3Wordmark(props: SVGProps) { return ( - - + + ); } diff --git a/apps/web/src/components/chat/MessagesTimeline.tsx b/apps/web/src/components/chat/MessagesTimeline.tsx index 20b8438fbc1c..1d271c5735d1 100644 --- a/apps/web/src/components/chat/MessagesTimeline.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.tsx @@ -107,6 +107,7 @@ import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import type { Root, RootContent } from "mdast"; import { T3Wordmark } from "../T3Wordmark"; +import { APP_BASE_NAME } from "../../branding"; import { BotIcon, BrainIcon, @@ -2355,7 +2356,7 @@ function AssistantTimelineRow({ row }: { row: Extract
- T3 Code + {APP_BASE_NAME} document.getElementById("onboarding-pairing-url") ?? true} > +
- Code + {APP_BASE_NAME}
} diff --git a/apps/web/src/components/settings/IntegrationsSettings.tsx b/apps/web/src/components/settings/IntegrationsSettings.tsx index f77cfcc25768..74c0bf83c8e7 100644 --- a/apps/web/src/components/settings/IntegrationsSettings.tsx +++ b/apps/web/src/components/settings/IntegrationsSettings.tsx @@ -1,5 +1,6 @@ import { DeviceHostUpdates } from "../device/DeviceHostUpdates"; import { DeviceToolVersions } from "../device/DeviceToolVersions"; +import { APP_BASE_NAME } from "../../branding"; import { useScopedSettings, useUpdateScopedSettings } from "./useScopedSettings"; import { ScopedSwitch } from "./ScopedSwitch"; import { DeviceHostsSettings } from "./DeviceHostsSettings"; @@ -561,7 +562,7 @@ function BrowserRecordingFrameRateSetting({ disabled }: { readonly disabled: boo const LINK_TARGET_LABELS: Readonly> = { system: "Your default browser", - app: "T3 Code", + app: APP_BASE_NAME, }; function BrowserLinkTargetSetting({ disabled }: { readonly disabled: boolean }) { diff --git a/apps/web/src/components/settings/ThemePreviewCircles.tsx b/apps/web/src/components/settings/ThemePreviewCircles.tsx index 65e5270e60b6..2956582f9a6b 100644 --- a/apps/web/src/components/settings/ThemePreviewCircles.tsx +++ b/apps/web/src/components/settings/ThemePreviewCircles.tsx @@ -5,6 +5,7 @@ import { THEME_PREVIEW_RENDER_SPECS, } from "@t3tools/shared/themePreview"; import { cn } from "../../lib/utils"; +import { APP_BASE_NAME } from "../../branding"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; import { getThemeColorsForMode, @@ -58,7 +59,7 @@ const STANDARD_THEME_PREVIEW_COLORS: Record< export const STANDARD_THEME_CARDS: ReadonlyArray = [ { id: "default", - label: "T3 Code", + label: APP_BASE_NAME, previews: (["light", "dark"] as const).map((mode) => ({ mode, colors: STANDARD_THEME_PREVIEW_COLORS[mode], diff --git a/apps/web/src/components/sidebar/SidebarChrome.tsx b/apps/web/src/components/sidebar/SidebarChrome.tsx index c956ab0a63c8..49ff5b51e63b 100644 --- a/apps/web/src/components/sidebar/SidebarChrome.tsx +++ b/apps/web/src/components/sidebar/SidebarChrome.tsx @@ -7,6 +7,7 @@ import { useEnvironmentIdentificationMode } from "../../hooks/useSettings"; import { cn } from "../../lib/utils"; import { useEnvironments } from "../../state/environments"; import { T3Wordmark } from "../T3Wordmark"; +import { APP_BASE_NAME } from "../../branding"; import { resolveEnvironmentIdentificationPillLabel, resolveSidebarStageBackdropVariant, @@ -90,14 +91,14 @@ function SidebarBrand({ onBackdrop }: { onBackdrop: boolean }) { > {/* Center the visible capitals, without the font's ascender/descender space. */} - + - Code + {APP_BASE_NAME} diff --git a/apps/web/src/lib/bootError.ts b/apps/web/src/lib/bootError.ts index 697c8e9d8d72..e5a5fb2fd39d 100644 --- a/apps/web/src/lib/bootError.ts +++ b/apps/web/src/lib/bootError.ts @@ -1,6 +1,8 @@ +import { APP_BASE_NAME } from "../branding"; + /** Shows startup failures before React can replace the boot splash. */ export function showBootError(error: unknown) { - console.error("T3 Code failed to start.", error); + console.error(`${APP_BASE_NAME} failed to start.`, error); const bootShell = document.getElementById("boot-shell"); if (!bootShell) return; @@ -9,7 +11,7 @@ export function showBootError(error: unknown) { content.setAttribute("role", "alert"); const message = document.createElement("p"); - message.textContent = "T3 Code could not load."; + message.textContent = `${APP_BASE_NAME} could not load.`; content.append(message); if (import.meta.env.DEV && error instanceof Error) {