From 5e465b6326e6aecb1fa3c0cc64947ee528abcd0e Mon Sep 17 00:00:00 2001 From: Ma Date: Wed, 18 Mar 2026 16:02:45 +0800 Subject: [PATCH] =?UTF-8?q?style(studio):=20fix=20spacing=20=E2=80=94=20ge?= =?UTF-8?q?nerous=20padding,=20centered=20content,=20breathing=20room?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sidebar: 200px→220px, generous logo area (pt-7 pb-6), wider item padding Main area: max-w-4xl→max-w-3xl, px-6→px-10, py-8→py-12 Empty state: min-h-[60vh] vertical centering, larger ornament spacing Chat bar: centered to max-w-3xl matching content, py-2.5→py-3.5 Header strip: px-4→px-8, h-11→h-12 Book cards: px-5→px-6, py-4→py-5 All borders softened to /20-/30 opacity for subtlety --- .../brainstorm/33312-1773817943/.server-info | 1 - .../33312-1773817943/.server-stopped | 1 + .../brainstorm/33312-1773817943/.server.log | 1 + packages/studio/src/App.tsx | 25 +++----- packages/studio/src/components/ChatBar.tsx | 64 ++++++++++--------- packages/studio/src/components/Sidebar.tsx | 44 ++++++------- packages/studio/src/pages/Dashboard.tsx | 14 ++-- 7 files changed, 73 insertions(+), 77 deletions(-) delete mode 100644 .superpowers/brainstorm/33312-1773817943/.server-info create mode 100644 .superpowers/brainstorm/33312-1773817943/.server-stopped diff --git a/.superpowers/brainstorm/33312-1773817943/.server-info b/.superpowers/brainstorm/33312-1773817943/.server-info deleted file mode 100644 index 2c7dfdbc..00000000 --- a/.superpowers/brainstorm/33312-1773817943/.server-info +++ /dev/null @@ -1 +0,0 @@ -{"type":"server-started","port":60485,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:60485","screen_dir":"/Users/majunxian/Desktop/PyProject/inkos-studio/.superpowers/brainstorm/33312-1773817943"} diff --git a/.superpowers/brainstorm/33312-1773817943/.server-stopped b/.superpowers/brainstorm/33312-1773817943/.server-stopped new file mode 100644 index 00000000..cfba4ed1 --- /dev/null +++ b/.superpowers/brainstorm/33312-1773817943/.server-stopped @@ -0,0 +1 @@ +{"reason":"owner process exited","timestamp":1773820583908} diff --git a/.superpowers/brainstorm/33312-1773817943/.server.log b/.superpowers/brainstorm/33312-1773817943/.server.log index 322ecda4..7b889eb2 100644 --- a/.superpowers/brainstorm/33312-1773817943/.server.log +++ b/.superpowers/brainstorm/33312-1773817943/.server.log @@ -1,3 +1,4 @@ {"type":"server-started","port":60485,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:60485","screen_dir":"/Users/majunxian/Desktop/PyProject/inkos-studio/.superpowers/brainstorm/33312-1773817943"} {"type":"screen-added","file":"/Users/majunxian/Desktop/PyProject/inkos-studio/.superpowers/brainstorm/33312-1773817943/layout-concept.html"} {"type":"screen-added","file":"/Users/majunxian/Desktop/PyProject/inkos-studio/.superpowers/brainstorm/33312-1773817943/layout-refined.html"} +{"type":"server-stopped","reason":"owner process exited"} diff --git a/packages/studio/src/App.tsx b/packages/studio/src/App.tsx index ae884cb8..f9f372de 100644 --- a/packages/studio/src/App.tsx +++ b/packages/studio/src/App.tsx @@ -41,12 +41,9 @@ export function App() { document.documentElement.classList.toggle("dark", isDark); }, [isDark]); - // Check if language has been set useEffect(() => { if (project) { - setLanguageSet(!!project.language && project.language !== "zh" ? true : true); - // For now, always consider language "set" — the selector is for first-time experience - // In a real implementation, we'd check a "hasCompletedSetup" flag + setLanguageSet(true); } }, [project]); @@ -63,42 +60,38 @@ export function App() { toLogs: () => setRoute({ page: "logs" }), }; - // Derive active page for sidebar highlighting const activePage = route.page === "book" || route.page === "chapter" || route.page === "truth" || route.page === "analytics" ? `book:${(route as { bookId: string }).bookId}` : route.page; - // Language selector for first-time setup if (languageSet === null) { - return
; // Loading + return
; } return (
- {/* Sidebar */} - {/* Main area + Chat bar */}
- {/* Header strip */} -
+ {/* Thin utility strip — pushed inward */} +
{sse.connected && ( - + {t("nav.connected")} )}
- {/* Scrollable main content */} + {/* Scrollable main — centered with generous inset */}
-
+
{route.page === "dashboard" && } {route.page === "book" && } {route.page === "book-create" && } @@ -111,7 +104,7 @@ export function App() {
- {/* Chat bar - always at bottom */} + {/* Chat bar — inset to match content width */}
diff --git a/packages/studio/src/components/ChatBar.tsx b/packages/studio/src/components/ChatBar.tsx index 01acba81..40c3928e 100644 --- a/packages/studio/src/components/ChatBar.tsx +++ b/packages/studio/src/components/ChatBar.tsx @@ -118,38 +118,40 @@ export function ChatBar({ t, sse }: { : "Tell InkOS what to do..."; return ( -
+
{/* Expanded message area */} {expanded && messages.length > 0 && ( -
- {messages.map((msg, i) => ( -
- {msg.role === "user" && } - {msg.content} -
- ))} - {loading && !messages.some((m) => m.content.startsWith("⋯")) && ( -
- )} +
+
+ {messages.map((msg, i) => ( +
+ {msg.role === "user" && } + {msg.content} +
+ ))} + {loading && !messages.some((m) => m.content.startsWith("⋯")) && ( +
+ )} +
)} - {/* Input bar */} -
+ {/* Input bar — centered to match main content */} +
e.key === "Enter" && handleSubmit()} placeholder={chatPlaceholder} disabled={loading} - className="w-full bg-transparent text-[13px] text-foreground placeholder:text-muted-foreground/30 focus:outline-none disabled:opacity-50" + className="w-full bg-transparent text-[13px] text-foreground placeholder:text-muted-foreground/25 focus:outline-none disabled:opacity-50" />
-
+
{expanded && messages.length > 0 && ( @@ -175,7 +177,7 @@ export function ChatBar({ t, sse }: { diff --git a/packages/studio/src/components/Sidebar.tsx b/packages/studio/src/components/Sidebar.tsx index 07cab634..16cdf7f3 100644 --- a/packages/studio/src/components/Sidebar.tsx +++ b/packages/studio/src/components/Sidebar.tsx @@ -27,36 +27,36 @@ export function Sidebar({ nav, activePage, t }: { const { data: daemon } = useApi<{ running: boolean }>("/daemon"); return ( -