diff --git a/docs/UI_MODERNIZATION_AUDIT.md b/docs/UI_MODERNIZATION_AUDIT.md index 05f589f..dca6b8d 100644 --- a/docs/UI_MODERNIZATION_AUDIT.md +++ b/docs/UI_MODERNIZATION_AUDIT.md @@ -1,6 +1,6 @@ # Cortex UI modernization audit -**Status:** UI modernization implementation complete for this slice; dedicated image-editor affordances removed; native package rebuilt and startup-verified +**Status:** UI modernization follow-up complete; dedicated image-editor affordances and preset prompt cards removed; native package rebuilt and startup-verified **Scope:** Every user-facing frontend surface, not a cosmetic theme pass ## What was audited @@ -18,7 +18,7 @@ primary problems were structural: | Area | Finding | Modernization outcome | | --- | --- | --- | | Workspace shell | The top bar conveyed almost no context and the sidebar was a loose list of text. | A clear workspace header, local-runtime status, product identity, conversation count, and a deliberate sidebar footer establish hierarchy. | -| Conversation canvas | A new chat opened into a large, empty dark region. | A compact new-thread orientation gives the canvas a clear starting point without turning it into a marketing screen. | +| Conversation canvas | A new chat opened into a large, empty dark region, then introduced generic preset prompts. | A quiet new-thread orientation gives the canvas context while leaving the user in control of the first message. | | Composer | The input was visually stranded in a full-width bottom strip. | The composer is now a centered, elevated input island with integrated local-model context, state feedback, and responsive sizing. | | Conversation controls | Saved chats, rename, and delete controls had weak grouping and feedback. | The list uses active/hover/focus states, reveal-on-focus actions, and purposeful confirmation dialogs. | | Settings and submenus | Settings read as a large collection of unrelated boxes. | Text-led categories, descriptive labels, and a unified detail pane make settings read like a native control surface. | @@ -53,7 +53,8 @@ opaque background service. runtime state, conversation navigation, and better destructive-action dialogs. - `frontend/src/components/ChatPage.tsx` adds the intentional blank-chat launch surface and docks the composer as part of the conversation canvas. It does - not advertise image transformation or image generation. + not advertise image transformation, image generation, or preset prompt + suggestions. - `frontend/src/components/MessageComposer.tsx` integrates local-model context into the composer island. - `frontend/src/components/SettingsPanel.tsx` turns settings into a structured @@ -77,7 +78,7 @@ This slice passed the release checks: 44 component tests in a single worker, 6 browser-level flows, typecheck, lint, production build, a fresh Windows package build, and a packaged launch with `GET /api/v1/health/ready` returning HTTP 200. The production bundle contains no dedicated image-transform UI -labels or selectors. +labels or selectors, and no preset starter-card selectors or labels. During the audit, the existing packaged executable exposed a separate native startup defect: Uvicorn's default console formatter dereferenced `sys.stderr` diff --git a/frontend/src/components/ChatPage.test.tsx b/frontend/src/components/ChatPage.test.tsx index 2f593ce..69bc645 100644 --- a/frontend/src/components/ChatPage.test.tsx +++ b/frontend/src/components/ChatPage.test.tsx @@ -61,14 +61,14 @@ function renderChat(api: CortexApi, threadId = "thread-a") { describe("ChatPage composer integration", () => { afterEach(() => window.sessionStorage.clear()); - it("turns a blank conversation into a useful starting surface", async () => { - const user = userEvent.setup(); + it("keeps a blank conversation free of preset prompt suggestions", async () => { renderChat(chatApi()); await screen.findByRole("heading", { name: "New thread" }); - await user.click(screen.getByRole("button", { name: /Think through a decision/i })); - expect(screen.getByLabelText("Message Cortex")).toHaveValue("Help me think through a decision step by step."); + expect(screen.queryByText("Think through a decision")).not.toBeInTheDocument(); + expect(screen.queryByText("Check a calculation")).not.toBeInTheDocument(); + expect(screen.getByLabelText("Message Cortex")).toHaveValue(""); }); it("retains the exact draft if generation acceptance fails", async () => { diff --git a/frontend/src/components/ChatPage.tsx b/frontend/src/components/ChatPage.tsx index 11c796e..4e90da8 100644 --- a/frontend/src/components/ChatPage.tsx +++ b/frontend/src/components/ChatPage.tsx @@ -391,16 +391,6 @@ export function ChatPage({
Ask a question or check a calculation using the model on this device.
-