From d8e9779678ae812dfb2aca6429dcbdd8cd07ebc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Tue, 9 Jun 2026 21:57:47 -0400 Subject: [PATCH] Add a motion system: feedback, overlays, and view transitions Every interactive control now acknowledges input: buttons and icon buttons press down (scale on :active) and ease their hover states, nav items, menu rows, segmented controls, cards, table rows, and inputs transition over shared motion tokens (120/200/280ms, ease-out curves). Dialogs and popovers enter with a short rise + fade over a fading backdrop; switching routes and onboarding steps plays a quiet view entrance keyed on the route/step. State pills cross-fade their tones as runs progress. All motion collapses under prefers-reduced-motion. PRODUCT.md captures the register and design principles guiding this. --- .../src/renderer/src/app/Onboarding.tsx | 64 ++++++++++--------- .../src/renderer/src/overlays.css | 26 +++++++- .../src/renderer/src/shared/Shell.tsx | 4 +- AgentCompany-New/src/renderer/src/styles.css | 40 +++++++++++- .../src/renderer/src/styles/components.css | 30 +++++++-- 5 files changed, 124 insertions(+), 40 deletions(-) diff --git a/AgentCompany-New/src/renderer/src/app/Onboarding.tsx b/AgentCompany-New/src/renderer/src/app/Onboarding.tsx index d8d2a4c9..9d566adb 100644 --- a/AgentCompany-New/src/renderer/src/app/Onboarding.tsx +++ b/AgentCompany-New/src/renderer/src/app/Onboarding.tsx @@ -168,37 +168,39 @@ export function Onboarding({
- {step === "welcome" && ( - setStep("provider")} /> - )} - {step === "provider" && ( - validateProvider(draft, availableProviders), "company")} - /> - )} - {step === "company" && ( - validateCompany(draft), "mode")} - /> - )} - {step === "mode" && ( - setStep("mission")} /> - )} - {step === "mission" && ( - - )} +
+ {step === "welcome" && ( + setStep("provider")} /> + )} + {step === "provider" && ( + validateProvider(draft, availableProviders), "company")} + /> + )} + {step === "company" && ( + validateCompany(draft), "mode")} + /> + )} + {step === "mode" && ( + setStep("mission")} /> + )} + {step === "mission" && ( + + )} +
{error &&
{error}
} diff --git a/AgentCompany-New/src/renderer/src/overlays.css b/AgentCompany-New/src/renderer/src/overlays.css index e66aeedf..c1324c45 100644 --- a/AgentCompany-New/src/renderer/src/overlays.css +++ b/AgentCompany-New/src/renderer/src/overlays.css @@ -6,6 +6,7 @@ display: grid; place-items: center; padding: 24px; + animation: backdrop-enter var(--motion-fast) var(--ease-out); } .modal { width: min(520px, 100%); @@ -16,6 +17,15 @@ background: var(--panel); box-shadow: 0 20px 60px rgba(9, 9, 11, 0.18); padding: 20px; + animation: overlay-enter var(--motion-base) var(--ease-out-expo); +} +@keyframes backdrop-enter { + from { opacity: 0; } + to { opacity: 1; } +} +@keyframes overlay-enter { + from { opacity: 0; transform: translateY(8px) scale(0.98); } + to { opacity: 1; transform: none; } } .modal-title { margin: 0 0 14px; font-size: 16px; font-weight: 620; letter-spacing: -0.01em; } .modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; } @@ -74,8 +84,11 @@ color: var(--text-3); background: var(--panel); font-size: 11px; + transition: color var(--motion-base) var(--ease-out), border-color var(--motion-base) var(--ease-out); } .step-chip.active { color: var(--text-1); border-color: var(--text-1); } +/* One onboarding step entering after the previous one leaves. */ +.step-view { animation: view-enter var(--motion-base) var(--ease-out-expo); } .form-grid { display: grid; gap: 14px; } .option-grid { display: grid; gap: 8px; } .option-card { @@ -86,8 +99,13 @@ text-align: left; cursor: pointer; width: 100%; + transition: + border-color var(--motion-fast) var(--ease-out), + box-shadow var(--motion-fast) var(--ease-out), + transform var(--motion-fast) var(--ease-out); } -.option-card:hover { border-color: var(--border-strong); } +.option-card:hover { border-color: var(--border-strong); box-shadow: var(--shadow-sm); } +.option-card:active { transform: scale(0.99); } .option-card.active { border-color: var(--text-1); box-shadow: inset 0 0 0 1px var(--text-1); } .option-card .opt-title { font-size: 13.5px; font-weight: 540; } .option-card .opt-sub { font-size: 12px; color: var(--text-3); margin-top: 4px; } @@ -116,6 +134,11 @@ display: flex; flex-direction: column; gap: 1px; + animation: menu-enter var(--motion-fast) var(--ease-out-expo); +} +@keyframes menu-enter { + from { opacity: 0; transform: translateY(-3px) scale(0.99); } + to { opacity: 1; transform: none; } } .popover-panel.end { right: 0; } .popover-panel.start { left: 0; } @@ -138,6 +161,7 @@ font-size: 13px; text-align: left; width: 100%; + transition: background var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); } .menu-row:hover { background: var(--hover); color: var(--text-1); } .menu-row.active { background: var(--panel-3); color: var(--text-1); font-weight: 540; } diff --git a/AgentCompany-New/src/renderer/src/shared/Shell.tsx b/AgentCompany-New/src/renderer/src/shared/Shell.tsx index 417a9128..e221b57c 100644 --- a/AgentCompany-New/src/renderer/src/shared/Shell.tsx +++ b/AgentCompany-New/src/renderer/src/shared/Shell.tsx @@ -151,7 +151,9 @@ export function Shell({
- {children} + +
{children}
+