Skip to content

Commit 73606ee

Browse files
Unify artifact generation progress UI
1 parent c900836 commit 73606ee

25 files changed

Lines changed: 1178 additions & 452 deletions

packages/frontend/src/App.css

Lines changed: 78 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
position: relative;
33
width: 100vw;
44
height: 100vh;
5-
padding: 18px;
5+
padding: 16px;
66
overflow: hidden;
7-
background: linear-gradient(180deg, #fbfbfc 0%, var(--main-bg) 100%);
7+
background: linear-gradient(180deg, color-mix(in srgb, var(--main-bg) 92%, var(--card-bg)) 0%, var(--main-bg) 100%);
88
}
99

1010
.sidebar-overlay {
@@ -20,9 +20,9 @@
2020

2121
.sidebar-drawer {
2222
position: absolute;
23-
top: 18px;
24-
left: 18px;
25-
bottom: 18px;
23+
top: 16px;
24+
left: 16px;
25+
bottom: 16px;
2626
z-index: 30;
2727
transform: translateX(calc(-100% - 28px)) scale(0.985);
2828
opacity: 0;
@@ -35,14 +35,20 @@
3535
opacity: 1;
3636
}
3737

38+
.sidebar-drawer.is-persistent {
39+
z-index: 5;
40+
transform: translateX(0) scale(1);
41+
opacity: 1;
42+
}
43+
3844
.app-sidebar-panel {
3945
display: flex;
4046
flex-direction: column;
4147
height: 100%;
42-
background: linear-gradient(180deg, #ffffff 0%, var(--sidebar-bg) 100%);
43-
border: 1px solid color-mix(in srgb, var(--sidebar-border) 88%, #ffffff);
44-
border-radius: 28px;
45-
box-shadow: 0 20px 48px rgba(15, 23, 42, 0.1);
48+
background: linear-gradient(180deg, var(--card-bg) 0%, var(--sidebar-bg) 100%);
49+
border: 1px solid color-mix(in srgb, var(--sidebar-border) 88%, var(--card-bg));
50+
border-radius: 18px;
51+
box-shadow: 0 12px 28px rgba(15, 23, 42, 0.08);
4652
backdrop-filter: blur(14px);
4753
overflow: hidden;
4854
}
@@ -67,6 +73,15 @@
6773
z-index: 1;
6874
height: 100%;
6975
min-height: 0;
76+
transition: margin-left 0.24s var(--ease-out-expo);
77+
}
78+
79+
.app-shell.has-persistent-sidebar.is-sidebar-expanded .workspace-shell {
80+
margin-left: 318px;
81+
}
82+
83+
.app-shell.has-persistent-sidebar.is-sidebar-collapsed .workspace-shell {
84+
margin-left: 110px;
7085
}
7186

7287
.workspace-shell-glow {
@@ -123,7 +138,7 @@
123138
padding: 0 11px;
124139
border-radius: 999px;
125140
border: 1px solid color-mix(in srgb, var(--border-color) 86%, transparent);
126-
background: #ffffff;
141+
background: var(--card-bg);
127142
color: var(--main-text);
128143
display: inline-flex;
129144
align-items: center;
@@ -146,6 +161,16 @@
146161
box-shadow: 0 10px 20px rgba(15, 23, 42, 0.06);
147162
}
148163

164+
.workspace-shell-btn:focus-visible,
165+
.workspace-toolbar-btn:focus-visible,
166+
.workspace-mobile-switch-btn:focus-visible,
167+
.chat-rail-action-btn:focus-visible,
168+
.chat-rail-collapsed-bar:focus-visible {
169+
outline: none;
170+
border-color: color-mix(in srgb, var(--accent) 36%, var(--border-color));
171+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);
172+
}
173+
149174
.workspace-stage-kicker {
150175
display: inline-flex;
151176
align-items: center;
@@ -206,21 +231,21 @@
206231
min-width: 0;
207232
min-height: 0;
208233
overflow: hidden;
209-
border-radius: 24px;
210-
border: 1px solid color-mix(in srgb, var(--panel-border) 82%, #ffffff);
211-
background: linear-gradient(180deg, #ffffff 0%, color-mix(in srgb, var(--main-bg) 68%, #ffffff) 100%);
212-
box-shadow: 0 12px 28px rgba(15, 23, 42, 0.05);
234+
border-radius: 16px;
235+
border: 1px solid color-mix(in srgb, var(--panel-border) 82%, var(--card-bg));
236+
background: linear-gradient(180deg, var(--card-bg) 0%, color-mix(in srgb, var(--main-bg) 68%, var(--card-bg)) 100%);
237+
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.045);
213238
}
214239

215240
.workspace-main-toolbar {
216241
display: flex;
217242
align-items: center;
218243
justify-content: space-between;
219244
gap: 10px;
220-
min-height: 42px;
221-
padding: 7px 10px;
245+
min-height: 44px;
246+
padding: 8px 10px;
222247
border-bottom: 1px solid color-mix(in srgb, var(--panel-border) 88%, transparent);
223-
background: linear-gradient(180deg, #ffffff 0%, color-mix(in srgb, var(--main-bg) 84%, #ffffff) 100%);
248+
background: linear-gradient(180deg, var(--card-bg) 0%, color-mix(in srgb, var(--main-bg) 84%, var(--card-bg)) 100%);
224249
}
225250

226251
.workspace-main-toolbar-copy,
@@ -263,7 +288,7 @@
263288
}
264289

265290
.workspace-mobile-switch-btn.is-active {
266-
background: #ffffff;
291+
background: var(--card-bg);
267292
color: var(--main-text);
268293
box-shadow: 0 6px 14px rgba(15, 23, 42, 0.06);
269294
}
@@ -305,7 +330,7 @@
305330
padding: 0 12px;
306331
border-radius: 999px;
307332
border: 1px solid color-mix(in srgb, var(--border-color) 86%, transparent);
308-
background: #ffffff;
333+
background: var(--card-bg);
309334
color: var(--main-text);
310335
display: inline-flex;
311336
align-items: center;
@@ -379,15 +404,15 @@
379404
min-width: 0;
380405
min-height: 0;
381406
overflow: hidden;
382-
border-radius: 22px;
383-
border: 1px solid color-mix(in srgb, var(--card-border) 82%, #ffffff);
384-
background: linear-gradient(180deg, #ffffff 0%, color-mix(in srgb, var(--main-bg) 72%, #ffffff) 100%);
385-
box-shadow: 0 12px 28px rgba(15, 23, 42, 0.05);
407+
border-radius: 16px;
408+
border: 1px solid color-mix(in srgb, var(--card-border) 82%, var(--card-bg));
409+
background: linear-gradient(180deg, var(--card-bg) 0%, color-mix(in srgb, var(--main-bg) 72%, var(--card-bg)) 100%);
410+
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.045);
386411
transition: box-shadow 0.24s ease, border-color 0.2s ease;
387412
}
388413

389414
.chat-rail-card:hover {
390-
box-shadow: 0 16px 32px rgba(15, 23, 42, 0.06);
415+
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.055);
391416
}
392417

393418
.chat-rail-header {
@@ -398,7 +423,7 @@
398423
min-height: 44px;
399424
padding: 7px 11px;
400425
border-bottom: 1px solid color-mix(in srgb, var(--border-color) 88%, transparent);
401-
background: linear-gradient(180deg, #ffffff 0%, color-mix(in srgb, var(--main-bg) 84%, #ffffff) 100%);
426+
background: linear-gradient(180deg, var(--card-bg) 0%, color-mix(in srgb, var(--main-bg) 84%, var(--card-bg)) 100%);
402427
}
403428

404429
.chat-rail-header-copy,
@@ -460,7 +485,7 @@
460485
padding: 0 9px;
461486
border-radius: 999px;
462487
border: 1px solid color-mix(in srgb, var(--border-color) 86%, transparent);
463-
background: #ffffff;
488+
background: var(--card-bg);
464489
color: var(--main-text);
465490
display: inline-flex;
466491
align-items: center;
@@ -490,8 +515,8 @@
490515
gap: 10px;
491516
width: 100%;
492517
border-radius: 18px;
493-
border: 1px solid color-mix(in srgb, var(--card-border) 82%, #ffffff);
494-
background: linear-gradient(180deg, #ffffff 0%, color-mix(in srgb, var(--main-bg) 74%, #ffffff) 100%);
518+
border: 1px solid color-mix(in srgb, var(--card-border) 82%, var(--card-bg));
519+
background: linear-gradient(180deg, var(--card-bg) 0%, color-mix(in srgb, var(--main-bg) 74%, var(--card-bg)) 100%);
495520
color: var(--main-text);
496521
box-shadow: 0 10px 22px rgba(15, 23, 42, 0.05);
497522
cursor: pointer;
@@ -537,6 +562,31 @@
537562
transform: none;
538563
}
539564

565+
body.dark-theme .app-shell {
566+
background: linear-gradient(180deg, color-mix(in srgb, var(--main-bg) 92%, #111827) 0%, var(--main-bg) 100%);
567+
}
568+
569+
body.dark-theme .app-sidebar-panel,
570+
body.dark-theme .workspace-main-card,
571+
body.dark-theme .chat-rail-card {
572+
background: linear-gradient(180deg, color-mix(in srgb, var(--panel-bg) 94%, #1f2937) 0%, var(--panel-bg) 100%);
573+
border-color: color-mix(in srgb, var(--panel-border) 82%, transparent);
574+
box-shadow: 0 10px 26px rgba(0, 0, 0, 0.24);
575+
}
576+
577+
body.dark-theme .workspace-main-toolbar,
578+
body.dark-theme .chat-rail-header {
579+
background: linear-gradient(180deg, color-mix(in srgb, var(--panel-bg) 96%, #1f2937) 0%, var(--panel-bg) 100%);
580+
}
581+
582+
body.dark-theme .workspace-shell-btn,
583+
body.dark-theme .workspace-toolbar-btn,
584+
body.dark-theme .chat-rail-action-btn,
585+
body.dark-theme .chat-rail-collapsed-icon {
586+
background: color-mix(in srgb, var(--panel-bg) 86%, #1f2937);
587+
border-color: color-mix(in srgb, var(--border-color) 86%, transparent);
588+
}
589+
540590
@keyframes workspace-rise {
541591
from {
542592
opacity: 0;

packages/frontend/src/App.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ function App() {
8989
)
9090
const showWorkspacePanel = !isMobileLayout || mobileWorkspaceView === 'workspace'
9191
const showAssistantPanel = !chatCollapsed && (!isMobileLayout || mobileWorkspaceView === 'assistant')
92+
const isPersistentSidebar = !isMobileLayout
9293

9394
const toggleSidebarCollapse = () => {
9495
setSidebarCollapsed((current) => !current)
@@ -144,7 +145,11 @@ function App() {
144145
useEffect(() => {
145146
if (typeof window === 'undefined') return
146147
const updateMobileLayout = () => {
147-
setIsMobileLayout(window.innerWidth <= 900)
148+
const nextIsMobileLayout = window.innerWidth <= 900
149+
setIsMobileLayout(nextIsMobileLayout)
150+
if (!nextIsMobileLayout) {
151+
setSidebarOpen(false)
152+
}
148153
}
149154
updateMobileLayout()
150155
window.addEventListener('resize', updateMobileLayout)
@@ -312,8 +317,8 @@ function App() {
312317
)
313318

314319
return (
315-
<div className="app-shell">
316-
{sidebarOpen && (
320+
<div className={`app-shell ${isPersistentSidebar ? 'has-persistent-sidebar' : ''} ${sidebarCollapsed ? 'is-sidebar-collapsed' : 'is-sidebar-expanded'}`}>
321+
{sidebarOpen && isMobileLayout && (
317322
<button
318323
type="button"
319324
className="sidebar-overlay"
@@ -323,7 +328,7 @@ function App() {
323328
)}
324329

325330
<aside
326-
className={`sidebar-drawer ${sidebarOpen ? 'is-open' : ''} ${sidebarCollapsed ? 'is-collapsed' : 'is-expanded'}`}
331+
className={`sidebar-drawer ${sidebarOpen || isPersistentSidebar ? 'is-open' : ''} ${isPersistentSidebar ? 'is-persistent' : ''} ${sidebarCollapsed ? 'is-collapsed' : 'is-expanded'}`}
327332
style={{ width: sidebarCollapsed ? '96px' : '304px' }}
328333
>
329334
<div className="app-sidebar-panel">
@@ -354,7 +359,13 @@ function App() {
354359
<button
355360
type="button"
356361
className="workspace-shell-btn"
357-
onClick={() => setSidebarOpen(true)}
362+
onClick={() => {
363+
if (isPersistentSidebar) {
364+
toggleSidebarCollapse()
365+
} else {
366+
setSidebarOpen(true)
367+
}
368+
}}
358369
aria-label={t('app.openNavigation')}
359370
>
360371
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">

0 commit comments

Comments
 (0)