From f0f0bc0dc0a3be07e78ec47ab74869c0ff41afac Mon Sep 17 00:00:00 2001
From: Dayuan Jiang <34411969+DayuanJiang@users.noreply.github.com>
Date: Sat, 10 Oct 2026 08:22:36 +0900
Subject: [PATCH] feat(ui): tidy the start screen and the chat panel details
(#962)
Start screen
- The five examples are one row of picture tiles (title under the picture); the old cards cut their descriptions off with an ellipsis
- "Open .drawio file" leaves the example grid and sits with "Start with a blank canvas" below it, both as outlined buttons
- The "Paper to diagram" example gets a thumbnail of its result (public/paper_demo.svg) like the other four
- The caption says what happens: examples use saved answers, so they appear at once and do not call the AI
- Shorter lede
Chat panel
- The version card's ">" icon button becomes a "Show XML" text link in the summary line; the summary runs under the title row, so Undo is the card's only button
- Settings uses the gear icon; new diagram uses a file-plus icon instead of the pen that reads as "edit"
- The message box has the same side padding as the message column
Copy
- The model picker says "Server model" instead of "Default" when the server's model is in use
- The theme description no longer claims the diagram always stays on a white sheet (the canvas follows the theme)
- en, zh, ja and zh-Hant dictionaries updated together
---
components/chat/chat-panel.tsx | 10 ++--
components/chat/lobby-hero.tsx | 74 +++++++++++++-----------------
components/chat/tool-activity.tsx | 52 ++++++++++-----------
components/model-selector.tsx | 4 +-
components/workspace/workspace.tsx | 4 +-
lib/i18n/dictionaries/en.json | 8 ++--
lib/i18n/dictionaries/ja.json | 8 ++--
lib/i18n/dictionaries/zh-Hant.json | 8 ++--
lib/i18n/dictionaries/zh.json | 8 ++--
public/paper_demo.svg | 1 +
10 files changed, 84 insertions(+), 93 deletions(-)
create mode 100644 public/paper_demo.svg
diff --git a/components/chat/chat-panel.tsx b/components/chat/chat-panel.tsx
index 4ad8b395..e37c8cad 100644
--- a/components/chat/chat-panel.tsx
+++ b/components/chat/chat-panel.tsx
@@ -1,10 +1,10 @@
import {
ChevronDown,
Download,
+ FilePlus,
MessageSquareDashed,
PanelRightClose,
- Settings2,
- SquarePen,
+ Settings,
} from "lucide-react"
import { useRef } from "react"
import { DevXmlSimulator } from "@/components/dev-xml-simulator"
@@ -139,14 +139,14 @@ export function ChatPanel({
disabled={engine.isBusy}
data-testid="new-chat-button"
>
-
+ openSettings()}
data-testid="settings-button"
>
-
+
{!mobile && (
)}
-
+
0 &&
diff --git a/components/chat/lobby-hero.tsx b/components/chat/lobby-hero.tsx
index ec168246..542612fd 100644
--- a/components/chat/lobby-hero.tsx
+++ b/components/chat/lobby-hero.tsx
@@ -18,14 +18,18 @@ interface Example {
file?: { path: string; name: string; type: string }
}
+/** Secondary start buttons: outlined, so they read as clickable */
+const startButtonClass =
+ "inline-flex h-8 items-center gap-1.5 rounded-lg border border-border bg-card px-3 text-[13px] text-foreground transition-colors hover:bg-accent [&_svg]:text-muted-foreground"
+
async function loadExampleFile(file: NonNullable) {
const response = await fetch(getAssetUrl(file.path))
const blob = await response.blob()
return new File([blob], file.name, { type: file.type })
}
-/** One start-screen choice: a small picture, a title and one line */
-function ExampleCard({
+/** One start-screen example: a small picture over its title */
+function ExampleTile({
onClick,
title,
description,
@@ -35,6 +39,7 @@ function ExampleCard({
}: {
onClick: () => void
title: string
+ /** Shown as the tooltip: the title alone names the example */
description: string
picture: React.ReactNode
/** An icon on a tinted tile instead of a diagram on paper */
@@ -45,24 +50,20 @@ function ExampleCard({
)
@@ -92,6 +93,7 @@ export function LobbyHero({
key: "paper",
title: dict.examples.paperToDiagram,
description: dict.examples.paperDescription,
+ image: "/paper_demo.svg",
prompt: "Summarize this paper as a diagram",
file: {
path: "/chain-of-thought.txt",
@@ -185,10 +187,12 @@ export function LobbyHero({
placeholder={t.placeholder}
/>
+ {/* Examples: one row of tiles; the ways to bring your own
+ diagram follow as a separate group */}