From 092930e1764c0310852cb9f4c88a233baf71931c Mon Sep 17 00:00:00 2001 From: yanweidong Date: Sun, 19 Jul 2026 19:28:48 +0800 Subject: [PATCH] style: apply workbench visual system --- .../workbench/ProjectWorkbench.test.ts | 8 + apps/web/src/index.css | 273 ++++++++++-------- 2 files changed, 158 insertions(+), 123 deletions(-) diff --git a/apps/web/src/features/workbench/ProjectWorkbench.test.ts b/apps/web/src/features/workbench/ProjectWorkbench.test.ts index 61e15b1..f2b6e72 100644 --- a/apps/web/src/features/workbench/ProjectWorkbench.test.ts +++ b/apps/web/src/features/workbench/ProjectWorkbench.test.ts @@ -24,6 +24,14 @@ describe('ProjectWorkbench', () => { expect(screen.getByText('Ops Dashboard')).toBeInTheDocument(); }); + it('marks active channel with aria-pressed', async () => { + render(ProjectWorkbench, { props: { currentUser: { account: 'david@example.com' } } }); + + await fireEvent.click(screen.getByRole('button', { name: 'Work Plan 8' })); + + expect(screen.getByRole('button', { name: 'Work Plan 8' })).toHaveAttribute('aria-pressed', 'true'); + }); + it('shows inspected task details in the inspector', async () => { render(ProjectWorkbench, { props: { currentUser: { account: 'david@example.com' } } }); const inspector = screen.getByLabelText('Object inspector'); diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 7a1e945..5a9f932 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -1,165 +1,192 @@ :root { - color: #202124; - background: #f6f7f9; - font-family: - Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + color: #18181b; + background: #f4f4f5; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.5; + --background: #f4f4f5; + --panel: #ffffff; + --panel-muted: #fafafa; + --border: #d4d4d8; + --text: #18181b; + --muted: #71717a; + --primary: #0f7ae5; + --primary-strong: #0969c8; + --success: #15803d; + --danger: #b91c1c; + --radius: 8px; } -* { - box-sizing: border-box; -} +* { box-sizing: border-box; } +body { margin: 0; min-width: 320px; min-height: 100vh; } +button, input, textarea, select { font: inherit; } +button { cursor: pointer; } +button:focus-visible, input:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; } -body { - margin: 0; - min-width: 320px; +.login-page { min-height: 100vh; -} - -button, -input, -textarea, -select { - font: inherit; -} - -.shell { display: grid; - grid-template-columns: 280px 1fr; - min-height: 100vh; + place-items: center; + padding: 24px; + background: var(--background); } -.sidebar { - border-right: 1px solid #d9dde3; - background: #ffffff; +.login-panel { + width: min(420px, 100%); + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--panel); padding: 24px; } -.sidebar h1 { - margin: 0 0 24px; - font-size: 24px; -} - -.workspace { +.server-login, +.login-heading, +.channel-page, +.object-inspector, +.channel-sidebar { display: grid; - gap: 24px; - padding: 24px; + gap: 12px; } -.connection-status, -.selection-status { - margin: 12px 0 0; - color: #5f6673; - font-size: 13px; +.server-login input, +.search-box input { + width: 100%; + border: 1px solid var(--border); + border-radius: 6px; + padding: 9px 10px; + background: white; } -.server-login { +.server-login button, +.primary-action { + border: 1px solid var(--primary); + border-radius: 6px; + background: var(--primary); + color: white; + padding: 9px 12px; +} + +.workbench-shell { + min-height: 100vh; + display: grid; + grid-template-rows: 64px 1fr; +} + +.workspace-topbar { + display: grid; + grid-template-columns: 160px minmax(240px, 1fr) auto; + align-items: center; + gap: 16px; + border-bottom: 1px solid var(--border); + background: var(--panel); + padding: 0 16px; +} + +.workbench-body { + min-height: 0; + display: grid; + grid-template-columns: 76px 280px minmax(0, 1fr) 320px; +} + +.project-rail, +.channel-sidebar, +.object-inspector { + border-right: 1px solid var(--border); + background: var(--panel); +} + +.project-rail { + display: grid; + align-content: start; + gap: 10px; + padding: 12px; +} + +.project-rail button { + min-width: 48px; + min-height: 48px; + border: 1px solid var(--border); + border-radius: 999px; + background: var(--panel-muted); +} + +.project-rail button.active, +.channel-group button.active { + border-color: var(--primary); + color: var(--primary); + background: #eff6ff; +} + +.channel-sidebar, +.object-inspector, +.channel-stage { + padding: 16px; + overflow: auto; +} + +.channel-group, +.recent-sessions, +.task-list, +.record-list { display: grid; gap: 8px; } -.server-login label { - font-size: 13px; - color: #4b5563; -} - -.server-login input { +.channel-group button, +.recent-sessions button, +.task-card, +.record-row, +.cron-row { width: 100%; - border: 1px solid #c7ccd4; - border-radius: 6px; - padding: 9px 10px; + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--panel); + padding: 10px 12px; } -.server-login button { - border: 1px solid #1f2937; - border-radius: 6px; - background: #1f2937; - color: white; - padding: 9px 10px; - cursor: pointer; -} - -.dashboard-grid { +.task-card, +.record-row, +.cron-row { display: grid; - grid-template-columns: repeat(4, minmax(160px, 1fr)); + grid-template-columns: auto 1fr auto; gap: 12px; -} - -.dashboard-metric { - border: 1px solid #d9dde3; - border-radius: 8px; - background: white; - padding: 16px; -} - -.dashboard-metric span { - display: block; - color: #5f6673; - font-size: 14px; -} - -.dashboard-metric strong { - display: block; - margin-top: 8px; - font-size: 28px; -} - -.inbox-review { - display: grid; - gap: 12px; -} - -.inbox-review h2 { - margin: 0; - font-size: 18px; -} - -.suggestions { - display: grid; - gap: 10px; -} - -.suggestion { - display: grid; - grid-template-columns: 20px 1fr; - gap: 10px; align-items: start; - border: 1px solid #d9dde3; - border-radius: 8px; - background: white; - padding: 12px; } -.suggestion-body { +.task-card.completed { + color: var(--muted); + background: var(--panel-muted); +} + +.inspector-tabs { display: grid; + grid-template-columns: repeat(3, 1fr); gap: 4px; } -.suggestion-body small { - color: #5f6673; +.inspector-tabs button[aria-selected='true'] { + border-color: var(--primary); + color: var(--primary); } -.suggestions button { - justify-self: start; - border: 1px solid #1f2937; - border-radius: 6px; - background: #1f2937; - color: white; - padding: 9px 12px; - cursor: pointer; -} +@media (max-width: 920px) { + .workspace-topbar { + grid-template-columns: 1fr; + height: auto; + padding: 12px; + } -@media (max-width: 760px) { - .shell { + .workbench-shell { + grid-template-rows: auto 1fr; + } + + .workbench-body { grid-template-columns: 1fr; } - .sidebar { + .project-rail, + .channel-sidebar, + .object-inspector { border-right: 0; - border-bottom: 1px solid #d9dde3; - } - - .dashboard-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); + border-bottom: 1px solid var(--border); } }