From f574955ad5b13f146369c22da928a17e7dd3bffa Mon Sep 17 00:00:00 2001 From: Jack Tanner Date: Thu, 25 Sep 2025 18:39:26 +0200 Subject: [PATCH 1/5] fix: husky install command --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 699fdfbd..c9cd077d 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "export": "cross-env BUILD_MODE=export next build", "export:dev": "cross-env BUILD_MODE=export next dev", "prompts": "node ./scripts/fetch-prompts.mjs", - "prepare": "husky install", + "prepare": "husky", "proxy-dev": "sh ./scripts/init-proxy.sh && proxychains -f ./scripts/proxychains.conf yarn dev" }, "dependencies": { @@ -81,4 +81,4 @@ "util": false, "assert": false } -} +} \ No newline at end of file From 7a429cf7a5cfb76e570132e2718c9676c7be6190 Mon Sep 17 00:00:00 2001 From: Jack Tanner Date: Thu, 25 Sep 2025 20:27:52 +0200 Subject: [PATCH 2/5] feat: changed fonts and colour scheme --- app/components/button.module.scss | 60 +++++++++++ app/components/chat.module.scss | 59 ++++++++++ app/components/home.module.scss | 81 ++++++++++++++ app/components/home.tsx | 20 +++- app/components/sidebar.tsx | 12 ++- app/constant.ts | 2 +- app/icons/tonomy-mini.svg | 24 +++++ app/icons/tonomy.svg | 46 ++++++++ app/layout.tsx | 29 ++--- app/locales/en.ts | 5 +- app/store/config.ts | 3 +- app/styles/globals.scss | 7 +- app/styles/tonomy.scss | 173 ++++++++++++++++++++++++++++++ 13 files changed, 493 insertions(+), 28 deletions(-) create mode 100644 app/icons/tonomy-mini.svg create mode 100644 app/icons/tonomy.svg create mode 100644 app/styles/tonomy.scss diff --git a/app/components/button.module.scss b/app/components/button.module.scss index e332df2d..09b818cc 100644 --- a/app/components/button.module.scss +++ b/app/components/button.module.scss @@ -81,3 +81,63 @@ margin-left: 5px; } } + +.shadow { + box-shadow: var(--card-shadow); +} + +.border { + border: var(--border-in-light); +} + +.icon-button-icon { + width: 16px; + height: 16px; + display: flex; + justify-content: center; + align-items: center; +} + +@media only screen and (max-width: 600px) { + .icon-button { + padding: 16px; + } +} + +.icon-button-text { + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &:not(:first-child) { + margin-left: 5px; + } +} + +// Tonomy brand enhancements for buttons +:global(.tonomy-blackmode) .icon-button { + /* Keep regular buttons neutral - only style primary buttons with color */ + + &.primary { + background: var(--tonomy-purple); + color: var(--tonomy-white); + border: 1px solid var(--tonomy-purple); + + &:hover { + background: var(--tonomy-pink); + border-color: var(--tonomy-pink); + } + + path { + fill: var(--tonomy-white) !important; + } + } +} + +// Tonomy brand typography +:global(.tonomy-blackmode) .icon-button-text { + font-family: 'Host Grotesk', sans-serif; + font-weight: 600; + letter-spacing: 0.02em; +} \ No newline at end of file diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss index bd462d10..7c894255 100644 --- a/app/components/chat.module.scss +++ b/app/components/chat.module.scss @@ -712,4 +712,63 @@ cursor: pointer; pointer-events: all; } +} + +// Tonomy brand enhancements for chat messages +:global(.tonomy-blackmode) { + + // Chat message bubbles - AI messages (left side) + .chat-message .chat-message-item { + background-color: var(--tonomy-deep-purple); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #E8E8E8; // Ensure text is white/light gray + + // Make markdown content white too + * { + color: #E8E8E8; + } + } + + // User messages (right side) - slightly different background + .chat-message-user .chat-message-item { + background-color: rgba(88, 51, 188, 0.15); // Subtle purple tint for user messages + border: 1px solid rgba(88, 51, 188, 0.3); + color: #E8E8E8; // Ensure text is white/light gray + + // Make markdown content white too + * { + color: #E8E8E8; + } + } + + // Chat message status text (typing indicator, etc.) + .chat-message-status { + color: #A0A0A0; // Muted gray for status text + } + + // Role names (model names, etc.) + .chat-message-role-name { + color: var(--tonomy-purple); // Only the model name gets brand color + font-family: 'Host Grotesk', sans-serif; + font-weight: 600; + } + + // Chat input actions styling + .chat-input-action { + background-color: rgba(88, 51, 188, 0.1); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #E8E8E8; + + &.selected { + background-color: rgba(88, 51, 188, 0.2); + border-color: var(--tonomy-purple); + } + } + + // Toast/scroll down button + .toast-content { + background-color: var(--tonomy-deep-purple); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #E8E8E8; + } } \ No newline at end of file diff --git a/app/components/home.module.scss b/app/components/home.module.scss index 06aea45b..1192af59 100644 --- a/app/components/home.module.scss +++ b/app/components/home.module.scss @@ -15,6 +15,14 @@ width: var(--window-width); height: var(--window-height); + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: var(--tonomy-deep-purple); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 20px 40px 0 rgba(9, 3, 26, 0.8); + /* Remove explicit text color - let it use default --black (light gray) */ + } } .container { @@ -72,6 +80,12 @@ } } } + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: var(--tonomy-deep-blue); + box-shadow: inset -2px 0px 2px 0px rgba(209, 84, 239, 0.1); + } } .sidebar-drag { @@ -165,12 +179,30 @@ font-size: 20px; font-weight: bold; animation: slide-in ease 0.3s; + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + font-family: 'Host Grotesk', sans-serif; + font-weight: 800; // Extra Bold + line-height: 1.0; + letter-spacing: 0.02em; + color: var(--tonomy-purple); // Use purple instead of pink for main title + } } .sidebar-sub-title { font-size: 12px; font-weight: 400; animation: slide-in ease 0.3s; + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + font-family: 'Host Grotesk', sans-serif; + font-weight: 600; // Semi Bold + line-height: 1.0; + letter-spacing: 0.02em; + /* Keep subtitle neutral - no color */ + } } .sidebar-body { @@ -191,14 +223,33 @@ border: 2px solid transparent; position: relative; content-visibility: auto; + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: rgba(88, 51, 188, 0.1); + border: 1px solid transparent; + transition: all 0.3s ease; + } } .chat-item:hover { background-color: var(--hover-color); + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: rgba(88, 51, 188, 0.2); + border-color: var(--tonomy-purple); + } } .chat-item-selected { border-color: var(--primary); + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + border-color: var(--tonomy-pink); + background: rgba(209, 84, 239, 0.1); + } } .chat-item-title { @@ -210,6 +261,15 @@ text-overflow: ellipsis; white-space: nowrap; animation: slide-in ease 0.3s; + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + font-family: 'Host Grotesk', sans-serif; + font-weight: 600; // Semi Bold + line-height: 1.3; + letter-spacing: 0; + /* Remove pink color - let it use default text color (light gray) */ + } } .chat-item-delete { @@ -365,6 +425,15 @@ width: 100%; } } + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: var(--tonomy-deep-blue); + + .loading-content-logo { + width: 80px; + } + } } @@ -378,6 +447,18 @@ padding: 4rem; text-align: center; + + // Tonomy brand enhancements + :global(.tonomy-blackmode) & { + background: var(--tonomy-deep-blue); + + p { + font-family: 'Host Grotesk', sans-serif; + font-weight: 400; + line-height: 1.3; + letter-spacing: 0; + } + } } .rtl-screen { diff --git a/app/components/home.tsx b/app/components/home.tsx index f9908a6f..f4872eea 100644 --- a/app/components/home.tsx +++ b/app/components/home.tsx @@ -16,6 +16,7 @@ import { import { ServiceWorkerMLCEngine } from "@mlc-ai/web-llm"; import MlcIcon from "../icons/mlc.svg"; +import TonomyIcon from "../icons/tonomy.svg"; import LoadingIcon from "../icons/three-dots.svg"; import Locale from "../locales"; @@ -34,8 +35,10 @@ export function Loading(props: { noLogo?: boolean }) { return (
{!props.noLogo && ( -
- +
+
)} @@ -72,11 +75,17 @@ export function useSwitchTheme() { useEffect(() => { document.body.classList.remove("light"); document.body.classList.remove("dark"); + document.body.classList.remove("tonomy-blackmode"); if (config.theme === "dark") { document.body.classList.add("dark"); } else if (config.theme === "light") { document.body.classList.add("light"); + } else if (config.theme === "tonomy-blackmode") { + document.body.classList.add("tonomy-blackmode"); + } else { + // Default to Tonomy blackmode theme for auto and any other case + document.body.classList.add("tonomy-blackmode"); } const metaDescriptionDark = document.querySelector( @@ -87,8 +96,11 @@ export function useSwitchTheme() { ); if (config.theme === "auto") { - metaDescriptionDark?.setAttribute("content", "#151515"); - metaDescriptionLight?.setAttribute("content", "#fafafa"); + metaDescriptionDark?.setAttribute("content", "#09031A"); + metaDescriptionLight?.setAttribute("content", "#1F1A2D"); + } else if (config.theme === "tonomy-blackmode") { + metaDescriptionDark?.setAttribute("content", "#09031A"); + metaDescriptionLight?.setAttribute("content", "#09031A"); } else { const themeColor = getCSSVar("--theme-color"); metaDescriptionDark?.setAttribute("content", themeColor); diff --git a/app/components/sidebar.tsx b/app/components/sidebar.tsx index fdc87682..d7c9631b 100644 --- a/app/components/sidebar.tsx +++ b/app/components/sidebar.tsx @@ -7,6 +7,7 @@ import SettingsIcon from "../icons/gear.svg"; import GithubIcon from "../icons/github.svg"; import InternetIcon from "../icons/internet.svg"; import MlcIcon from "../icons/mlc.svg"; +import TonomyIcon from "../icons/tonomy.svg"; import AddIcon from "../icons/add.svg"; import DeleteIcon from "../icons/delete.svg"; import TemplateIcon from "../icons/chat.svg"; @@ -14,6 +15,7 @@ import DragIcon from "../icons/drag.svg"; import LightIcon from "../icons/light.svg"; import DarkIcon from "../icons/dark.svg"; import AutoIcon from "../icons/auto.svg"; +import TonomyMiniIcon from "../icons/tonomy-mini.svg"; import Locale from "../locales"; @@ -147,7 +149,7 @@ export function SideBar(props: { className?: string }) { const { theme } = config; function nextTheme() { - const themes = [Theme.Auto, Theme.Light, Theme.Dark]; + const themes = [Theme.TonomyBlackmode, Theme.Auto, Theme.Light, Theme.Dark]; const themeIndex = themes.indexOf(theme); const nextIndex = (themeIndex + 1) % themes.length; const nextTheme = themes[nextIndex]; @@ -169,8 +171,8 @@ export function SideBar(props: { className?: string }) {
{Locale.Title}
{Locale.Subtitle}
-
- +
+
@@ -232,7 +234,9 @@ export function SideBar(props: { className?: string }) { - {theme === Theme.Auto ? ( + {theme === Theme.TonomyBlackmode ? ( + + ) : theme === Theme.Auto ? ( ) : theme === Theme.Light ? ( diff --git a/app/constant.ts b/app/constant.ts index fa6a86e0..5745aaaf 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -2,7 +2,7 @@ import { prebuiltAppConfig } from "@mlc-ai/web-llm"; import { ModelRecord } from "./client/api"; import { getQuantization, getSize } from "./utils"; -export const OWNER = "mlc-ai"; +export const OWNER = "theblockstalk"; export const REPO = "web-llm-chat"; export const WEBLLM_HOME_URL = "https://webllm.mlc.ai"; export const REPO_URL = `https://github.com/${OWNER}/${REPO}`; diff --git a/app/icons/tonomy-mini.svg b/app/icons/tonomy-mini.svg new file mode 100644 index 00000000..02474c04 --- /dev/null +++ b/app/icons/tonomy-mini.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/icons/tonomy.svg b/app/icons/tonomy.svg new file mode 100644 index 00000000..7fe0c411 --- /dev/null +++ b/app/icons/tonomy.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TONOMY + \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index f58c04c0..8a69a17b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,20 +7,21 @@ import { type Metadata } from "next"; export const metadata: Metadata = { metadataBase: new URL("https://chat.webllm.ai"), - title: "WebLLM Chat", + title: "Tonomy Chat", description: - "Chat with AI large language models running natively in your browser. Enjoy private, server-free, seamless AI conversations.", + "Privacy-first AI assistant powered by Tonomy. Chat with AI language models running securely in your browser with complete data sovereignty.", keywords: [ - "WebLLM", + "Tonomy", "AI chat", - "machine learning", + "privacy-first", "browser AI", "language model", - "no server", + "decentralized", + "data sovereignty", ], - authors: [{ name: "WebLLM Team" }], - publisher: "WebLLM", - creator: "WebLLM", + authors: [{ name: "Tonomy" }], + publisher: "Tonomy", + creator: "Tonomy", robots: "index, follow", viewport: { width: "device-width", @@ -28,20 +29,20 @@ export const metadata: Metadata = { maximumScale: 1, }, themeColor: [ - { media: "(prefers-color-scheme: light)", color: "#fafafa" }, - { media: "(prefers-color-scheme: dark)", color: "#151515" }, + { media: "(prefers-color-scheme: light)", color: "#1F1A2D" }, + { media: "(prefers-color-scheme: dark)", color: "#09031A" }, ], appleWebApp: { - title: "WebLLM Chat", + title: "Tonomy Shadow Chat", statusBarStyle: "default", }, openGraph: { type: "website", url: "https://chat.webllm.ai", - title: "WebLLM Chat", + title: "Tonomy Shadow Chat", description: - "Chat with AI large language models running natively in your browser", - siteName: "WebLLM Chat", + "Privacy-first AI assistant powered by Tonomy - Chat with complete data sovereignty", + siteName: "Tonomy Shadow Chat", images: [ { url: "https://chat.webllm.ai/mlc-logo.png", diff --git a/app/locales/en.ts b/app/locales/en.ts index 9f08dbdb..41c76a9c 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -3,8 +3,8 @@ import { SubmitKey } from "../store/config"; // if you are adding a new translation, please use PartialLocaleType instead of LocaleType const en = { - Title: "WebLLM Chat", - Subtitle: "AI Models Running in Browser", + Title: "Tonomy Shadow Chat", + Subtitle: "Privacy-First AI Assistant", WIP: "Coming Soon...", ChatItem: { ChatItemCount: (count: number) => `${count} messages`, @@ -50,6 +50,7 @@ const en = { auto: "Auto", light: "Light Theme", dark: "Dark Theme", + "tonomy-blackmode": "Tonomy Blackmode", }, QuickPrompt: "Quick Prompts", Clear: "Clear Context", diff --git a/app/store/config.ts b/app/store/config.ts index 416734bb..96eaadf8 100644 --- a/app/store/config.ts +++ b/app/store/config.ts @@ -22,6 +22,7 @@ export enum Theme { Auto = "auto", Dark = "dark", Light = "light", + TonomyBlackmode = "tonomy-blackmode", } export enum CacheType { @@ -106,7 +107,7 @@ export const DEFAULT_CONFIG: ConfigType = { submitKey: SubmitKey.Enter, avatar: "1f603", fontSize: 14, - theme: Theme.Auto, + theme: Theme.TonomyBlackmode, tightBorder: false, sendPreviewBubble: true, enableAutoGenerateTitle: true, diff --git a/app/styles/globals.scss b/app/styles/globals.scss index 1ba2ce27..2f4621cf 100644 --- a/app/styles/globals.scss +++ b/app/styles/globals.scss @@ -1,5 +1,6 @@ @import "./animation.scss"; @import "./window.scss"; +@import "./tonomy.scss"; @mixin light { --theme: light; @@ -64,7 +65,7 @@ } :root { - @include light; + @include tonomy-blackmode; --window-width: 90vw; --window-height: 90vh; @@ -94,10 +95,12 @@ } } +@import url('https://fonts.googleapis.com/css2?family=Host+Grotesk:wght@300;400;500;600;700;800&display=swap'); + html { height: var(--full-height); - font-family: "Noto Sans", "SF Pro SC", "SF Pro Text", "SF Pro Icons", + font-family: "Host Grotesk", "Noto Sans", "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } diff --git a/app/styles/tonomy.scss b/app/styles/tonomy.scss new file mode 100644 index 00000000..539762b4 --- /dev/null +++ b/app/styles/tonomy.scss @@ -0,0 +1,173 @@ +// Tonomy Brand Colors - Blackmode Theme + +@mixin tonomy-blackmode { + --theme: tonomy-blackmode; + + /* Primary Colors */ + --tonomy-pink: #D154EF; + --tonomy-purple: #5833BC; + + /* Accent Colors */ + --tonomy-cyan: #0FCFE8; + --tonomy-green: #76E598; + + /* Neutral Colors */ + --tonomy-deep-blue: #09031A; + --tonomy-deep-purple: #1F1A2D; + --tonomy-white: #FFFFFF; + + /* Gradients */ + --tonomy-main-gradient: linear-gradient(135deg, var(--tonomy-pink) 0%, var(--tonomy-purple) 100%); + --tonomy-pink-gradient: linear-gradient(135deg, var(--tonomy-pink) 0%, rgba(209, 84, 239, 0) 100%); + --tonomy-purple-gradient: linear-gradient(135deg, var(--tonomy-purple) 0%, rgba(88, 51, 188, 0) 100%); + --tonomy-cyan-fade: linear-gradient(135deg, var(--tonomy-cyan) 0%, rgba(15, 207, 232, 0) 100%); + --tonomy-green-fade: linear-gradient(135deg, var(--tonomy-green) 0%, rgba(118, 229, 152, 0) 100%); + + /* Mapped colors for existing variables */ + --white: var(--tonomy-deep-purple); + --black: #E8E8E8; + /* Light gray for main text, not pink */ + --gray: var(--tonomy-deep-blue); + --light-gray: #A0A0A0; + /* Muted gray for secondary text */ + --primary: var(--tonomy-purple); + /* Only use purple for accents/highlights */ + --second: var(--tonomy-deep-purple); + --hover-color: rgba(88, 51, 188, 0.1); + /* Much more subtle hover */ + --bar-color: rgba(255, 255, 255, 0.1); + /* Keep scrollbars neutral */ + --theme-color: var(--tonomy-deep-blue); + --mlc-icon-color: var(--tonomy-white); + + /* Shadows with dark theme adjustments */ + --shadow: 0 20px 40px 0 rgba(9, 3, 26, 0.8); + --card-shadow: 0 4px 8px 0 rgba(9, 3, 26, 0.4); + + /* Borders */ + --border-in-light: 1px solid rgba(255, 255, 255, 0.1); + /* Much more subtle borders */ + --border-in-dark: 1px solid rgba(255, 255, 255, 0.2); + + /* SVG filter adjustments */ + div:not(.no-dark)>svg { + filter: brightness(0) saturate(100%) invert(79%) sepia(59%) saturate(6482%) hue-rotate(278deg) brightness(94%) contrast(91%); + } +} + +.tonomy-blackmode { + @include tonomy-blackmode; +} + +/* Typography styles following Tonomy brand guidelines */ +.tonomy-headline { + font-family: 'Host Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + font-weight: 800; + /* Extra Bold */ + line-height: 1.0; + /* 100% */ + letter-spacing: 0.02em; + /* 2% */ +} + +.tonomy-subheadline { + font-family: 'Host Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + font-weight: 600; + /* Semi Bold */ + line-height: 1.0; + /* 100% */ + letter-spacing: 0.02em; + /* 2% */ +} + +.tonomy-body { + font-family: 'Host Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + font-weight: 400; + /* Regular */ + line-height: 1.3; + /* 130% */ + letter-spacing: 0; +} + +/* Gradient text utilities */ +.tonomy-gradient-text { + background: var(--tonomy-main-gradient); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +.tonomy-pink-text { + color: var(--tonomy-pink); +} + +.tonomy-purple-text { + color: var(--tonomy-purple); +} + +.tonomy-cyan-accent { + color: var(--tonomy-cyan); +} + +.tonomy-green-accent { + color: var(--tonomy-green); +} + +/* Background utilities */ +.tonomy-deep-blue-bg { + background-color: var(--tonomy-deep-blue); +} + +.tonomy-deep-purple-bg { + background-color: var(--tonomy-deep-purple); +} + +.tonomy-gradient-bg { + background: var(--tonomy-main-gradient); +} + +/* Component-specific Tonomy styling */ +.tonomy-container { + background: var(--tonomy-deep-purple); + border: 1px solid rgba(209, 84, 239, 0.2); + color: var(--tonomy-pink); +} + +.tonomy-sidebar { + background: var(--tonomy-deep-blue); + border-right: 1px solid rgba(209, 84, 239, 0.1); +} + +.tonomy-chat-item { + background: rgba(88, 51, 188, 0.1); + border: 1px solid transparent; + transition: all 0.3s ease; + + &:hover { + background: rgba(88, 51, 188, 0.2); + border-color: var(--tonomy-purple); + } +} + +.tonomy-button { + background: var(--tonomy-purple); + color: var(--tonomy-white); + border: 1px solid var(--tonomy-purple); + + &:hover { + background: var(--tonomy-pink); + border-color: var(--tonomy-pink); + } +} + +.tonomy-input { + background: var(--tonomy-deep-purple); + border: 1px solid rgba(209, 84, 239, 0.3); + color: var(--tonomy-pink); + + &:focus { + border-color: var(--tonomy-purple); + box-shadow: 0 0 0 2px rgba(88, 51, 188, 0.2); + } +} \ No newline at end of file From 84c0d9dbb8933c0448ba497863c335bcdac6aaa3 Mon Sep 17 00:00:00 2001 From: Jack Tanner Date: Thu, 25 Sep 2025 20:37:54 +0200 Subject: [PATCH 3/5] feat: using Tonomy logo --- app/components/emoji.tsx | 4 ++-- app/components/home.tsx | 9 ++++++-- app/components/sidebar.tsx | 12 ++++++---- app/icons/tonomy-mini.svg | 24 ------------------- app/icons/tonomy.svg | 46 ------------------------------------- public/favicon.ico | Bin 15086 -> 15406 bytes public/tonomy-logo.png | Bin 0 -> 53967 bytes 7 files changed, 17 insertions(+), 78 deletions(-) delete mode 100644 app/icons/tonomy-mini.svg delete mode 100644 app/icons/tonomy.svg create mode 100644 public/tonomy-logo.png diff --git a/app/components/emoji.tsx b/app/components/emoji.tsx index a7d64f11..26502388 100644 --- a/app/components/emoji.tsx +++ b/app/components/emoji.tsx @@ -6,7 +6,7 @@ import EmojiPicker, { import { Model } from "../store"; -import MlcIcon from "../icons/mlc.svg"; +import Image from "next/image"; export function getEmojiUrl(unified: string, style: EmojiStyle) { // Whoever owns this Content Delivery Network (CDN), I am using your CDN to serve emojis @@ -35,7 +35,7 @@ export function Avatar(props: { model?: Model; avatar?: string }) { if (props.model) { return (
- + Tonomy
); } diff --git a/app/components/home.tsx b/app/components/home.tsx index f4872eea..45d313d5 100644 --- a/app/components/home.tsx +++ b/app/components/home.tsx @@ -16,8 +16,8 @@ import { import { ServiceWorkerMLCEngine } from "@mlc-ai/web-llm"; import MlcIcon from "../icons/mlc.svg"; -import TonomyIcon from "../icons/tonomy.svg"; import LoadingIcon from "../icons/three-dots.svg"; +import Image from "next/image"; import Locale from "../locales"; import { getCSSVar, useMobileScreen } from "../utils"; @@ -38,7 +38,12 @@ export function Loading(props: { noLogo?: boolean }) {
- + Tonomy Logo
)} diff --git a/app/components/sidebar.tsx b/app/components/sidebar.tsx index d7c9631b..9c14331b 100644 --- a/app/components/sidebar.tsx +++ b/app/components/sidebar.tsx @@ -7,7 +7,6 @@ import SettingsIcon from "../icons/gear.svg"; import GithubIcon from "../icons/github.svg"; import InternetIcon from "../icons/internet.svg"; import MlcIcon from "../icons/mlc.svg"; -import TonomyIcon from "../icons/tonomy.svg"; import AddIcon from "../icons/add.svg"; import DeleteIcon from "../icons/delete.svg"; import TemplateIcon from "../icons/chat.svg"; @@ -15,7 +14,7 @@ import DragIcon from "../icons/drag.svg"; import LightIcon from "../icons/light.svg"; import DarkIcon from "../icons/dark.svg"; import AutoIcon from "../icons/auto.svg"; -import TonomyMiniIcon from "../icons/tonomy-mini.svg"; +import Image from "next/image"; import Locale from "../locales"; @@ -172,7 +171,7 @@ export function SideBar(props: { className?: string }) {
{Locale.Subtitle}
- + Tonomy
@@ -235,7 +234,12 @@ export function SideBar(props: { className?: string }) { icon={ <> {theme === Theme.TonomyBlackmode ? ( - + Tonomy ) : theme === Theme.Auto ? ( ) : theme === Theme.Light ? ( diff --git a/app/icons/tonomy-mini.svg b/app/icons/tonomy-mini.svg deleted file mode 100644 index 02474c04..00000000 --- a/app/icons/tonomy-mini.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/icons/tonomy.svg b/app/icons/tonomy.svg deleted file mode 100644 index 7fe0c411..00000000 --- a/app/icons/tonomy.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TONOMY - \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico index a9a640f63ad1d851bf3e2b5fe240d6dc08e14cdd..f6fe1264b796ee94d98c2cdfd8610fcbc7e52857 100644 GIT binary patch literal 15406 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 literal 15086 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 F{{Z#LOu_&F diff --git a/public/tonomy-logo.png b/public/tonomy-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b96dd2cf571eefd5e40c7aa5b3398636f5adacdf GIT binary patch literal 53967 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 Date: Thu, 25 Sep 2025 20:49:05 +0200 Subject: [PATCH 4/5] feat: removed unused features --- app/components/chat.tsx | 2 +- app/components/sidebar.tsx | 12 ++++++------ app/constant.ts | 2 +- app/store/config.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/components/chat.tsx b/app/components/chat.tsx index a363a18a..9d99fcb7 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -937,7 +937,7 @@ function _Chat() { : -1; const autoFocus = !isMobileScreen; // wont auto focus on mobile screen - const showMaxIcon = !isMobileScreen; + const showMaxIcon = false; //!isMobileScreen; useCommand({ fill: setUserInput, diff --git a/app/components/sidebar.tsx b/app/components/sidebar.tsx index 9c14331b..33ad9ea5 100644 --- a/app/components/sidebar.tsx +++ b/app/components/sidebar.tsx @@ -175,7 +175,7 @@ export function SideBar(props: { className?: string }) { -
+ {/*
} text={shouldNarrow ? undefined : Locale.Template.Name} @@ -194,7 +194,7 @@ export function SideBar(props: { className?: string }) { }} shadow /> -
+
*/}
} shadow />
-
+ {/* -
+
*/} + {/*
@@ -252,7 +252,7 @@ export function SideBar(props: { className?: string }) { onClick={nextTheme} shadow /> -
+
*/}
Date: Thu, 25 Sep 2025 21:15:32 +0200 Subject: [PATCH 5/5] feat: changed browser tab title and logo --- app/layout.tsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index 8a69a17b..29777119 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,7 +7,7 @@ import { type Metadata } from "next"; export const metadata: Metadata = { metadataBase: new URL("https://chat.webllm.ai"), - title: "Tonomy Chat", + title: "Tonomy Shadow Chat", description: "Privacy-first AI assistant powered by Tonomy. Chat with AI language models running securely in your browser with complete data sovereignty.", keywords: [ @@ -45,22 +45,22 @@ export const metadata: Metadata = { siteName: "Tonomy Shadow Chat", images: [ { - url: "https://chat.webllm.ai/mlc-logo.png", + url: "https://chat.tonomy.io/tonomy-logo.png", width: 360, height: 360, - alt: "WebLLM Chat - Browser-based AI conversation", + alt: "Tonomy Shadow Chat - Browser-based AI conversation", }, ], }, twitter: { card: "summary_large_image", - title: "WebLLM Chat", + title: "Tonomy Shadow Chat", description: "Chat with AI large language models running natively in your browser", - images: ["https://chat.webllm.ai/mlc-logo.png"], + images: ["https://chat.tonomy.io/tonomy-logo.png"], }, alternates: { - canonical: "https://chat.webllm.ai", + canonical: "https://chat.tonomy.io", }, }; @@ -114,6 +114,7 @@ export default function RootLayout({ sizes="16x16" href="/favicon-16x16.png" /> + @@ -124,7 +125,7 @@ export default function RootLayout({ __html: JSON.stringify({ "@context": "https://schema.org", "@type": "WebApplication", - name: "WebLLM Chat", + name: "Tonomy Shadow Chat", url: "https://chat.webllm.ai", description: "Chat with AI large language models running natively in your browser. Enjoy private, server-free, seamless AI conversations.",