akhaliq HF Staff commited on
Commit
f12802a
·
1 Parent(s): dc3d28d

Declutter interface for ultra-minimalist and mobile-friendly StepFun Studio design

Browse files
Files changed (3) hide show
  1. static/app.js +32 -42
  2. static/index.html +52 -141
  3. static/style.css +310 -447
static/app.js CHANGED
@@ -23,11 +23,11 @@ const dom = {
23
  temperatureSlider: document.getElementById("temperature-slider"),
24
  temperatureVal: document.getElementById("temperature-val"),
25
 
26
- // Sidebar drawers
27
- sidebarLeft: document.getElementById("sidebar-left"),
28
  sidebarRight: document.getElementById("sidebar-right"),
29
- btnToggleLeft: document.getElementById("btn-toggle-left"),
30
  btnToggleRight: document.getElementById("btn-toggle-right"),
 
31
 
32
  // Viewports
33
  studioDashboard: document.getElementById("studio-dashboard"),
@@ -48,17 +48,17 @@ const dom = {
48
  miniSendBtn: document.getElementById("mini-send-button"),
49
  miniSpinner: document.getElementById("mini-spinner"),
50
 
51
- // Core file upload console
52
  fileUploader: document.getElementById("file-uploader"),
53
  shelfList: document.getElementById("shelf-list"),
54
  dropZone: document.getElementById("drop-zone"),
55
 
56
- // Resets
57
- clearChatBtn: document.getElementById("clear-chat-button"),
58
  menuNewChat: document.getElementById("menu-new-chat"),
 
59
 
60
- // Showcase cards
61
- showcaseCards: document.querySelectorAll(".showcase-card")
62
  };
63
 
64
  // Markdown configuration
@@ -86,13 +86,10 @@ async function initializeApp() {
86
  appendSystemLog("Gradio Server connection is restricted.", true);
87
  }
88
 
89
- // 3. Register Sidebar Toggles
90
- dom.btnToggleLeft.addEventListener("click", () => {
91
- dom.sidebarLeft.classList.toggle("collapsed");
92
- });
93
- dom.btnToggleRight.addEventListener("click", () => {
94
- dom.sidebarRight.classList.toggle("collapsed");
95
- });
96
 
97
  // 4. Register Settings Listeners
98
  dom.apiKeyInput.addEventListener("input", (e) => {
@@ -121,7 +118,7 @@ async function initializeApp() {
121
  dom.temperatureVal.textContent = STATE.temperature.toFixed(1);
122
  });
123
 
124
- // 5. Register File Upload Anchors
125
  dom.studioUploadTrigger.addEventListener("click", () => dom.fileUploader.click());
126
  dom.miniUploadTrigger.addEventListener("click", () => dom.fileUploader.click());
127
  dom.dropZone.addEventListener("click", () => dom.fileUploader.click());
@@ -167,13 +164,13 @@ async function initializeApp() {
167
  });
168
 
169
  // 7. Resets
170
- dom.clearChatBtn.addEventListener("click", resetSandbox);
171
  dom.menuNewChat.addEventListener("click", resetSandbox);
 
172
 
173
- // 8. Recipe Recipes Console Setup
174
- dom.showcaseCards.forEach(card => {
175
- card.addEventListener("click", () => {
176
- const recipeType = card.getAttribute("data-recipe");
177
  loadRecipe(recipeType);
178
  });
179
  });
@@ -187,6 +184,17 @@ async function initializeApp() {
187
  });
188
  }
189
 
 
 
 
 
 
 
 
 
 
 
 
190
  // Handle File Select & Base64 Encoder
191
  function handleFileSelection(e) {
192
  processFiles(e.target.files);
@@ -302,24 +310,6 @@ function loadRecipe(recipeType) {
302
  size: "0.02 MB",
303
  base64: mockImageBase64
304
  });
305
- } else if (recipeType === "code") {
306
- promptText = "Review this dashboard interface design. Generate beautiful, fully responsive HTML structure styling using elegant flex grids to match it.";
307
- STATE.uploadedFiles.push({
308
- id: "recipe-dashboard",
309
- name: "dashboard_layout.png",
310
- type: "image/png",
311
- size: "0.02 MB",
312
- base64: mockImageBase64
313
- });
314
- } else if (recipeType === "receipt") {
315
- promptText = "Tabulate the items inside this receipt into a clean markdown table. Breakdown the tax and total, and perform a step-by-step reasoning calculation to check if the item sums match the total amount listed.";
316
- STATE.uploadedFiles.push({
317
- id: "recipe-receipt",
318
- name: "grocery_bill.jpg",
319
- type: "image/jpeg",
320
- size: "0.02 MB",
321
- base64: mockImageBase64
322
- });
323
  } else if (recipeType === "diagnostic") {
324
  promptText = "This is a recorded visual sequence of steps leading to a runtime exception crash. Provide a detailed reconstruction of the event timeline, summarize the diagnostic signals, and suggest an engineering hotfix.";
325
  STATE.uploadedFiles.push({
@@ -331,7 +321,7 @@ function loadRecipe(recipeType) {
331
  });
332
  }
333
 
334
- // Set value in BOTH text areas so that it works regardless of viewport state
335
  dom.studioPromptInput.value = promptText;
336
  dom.miniPromptInput.value = promptText;
337
 
@@ -356,7 +346,8 @@ async function triggerPromptSubmission(inputElement) {
356
 
357
  // Check credentials
358
  if (!STATE.apiKey && !dom.apiKeyInput.placeholder.includes("server env")) {
359
- appendSystemLog("StepFun API Key is required. Please set it in the Credentials settings card.", true);
 
360
  return;
361
  }
362
 
@@ -617,7 +608,6 @@ function resetSandbox() {
617
  }
618
 
619
  function appendSystemLog(message, isError = false) {
620
- // If chat container is hidden, we display a standard javascript alert or log it
621
  if (dom.chatThreadContainer.style.display === "none") {
622
  console.warn(`System Log: ${message}`);
623
  return;
 
23
  temperatureSlider: document.getElementById("temperature-slider"),
24
  temperatureVal: document.getElementById("temperature-val"),
25
 
26
+ // Sidebar Drawer and Overlay Elements (Mobile & Minimalist)
 
27
  sidebarRight: document.getElementById("sidebar-right"),
28
+ sidebarOverlay: document.getElementById("sidebar-overlay"),
29
  btnToggleRight: document.getElementById("btn-toggle-right"),
30
+ btnCloseDrawer: document.getElementById("btn-close-drawer"),
31
 
32
  // Viewports
33
  studioDashboard: document.getElementById("studio-dashboard"),
 
48
  miniSendBtn: document.getElementById("mini-send-button"),
49
  miniSpinner: document.getElementById("mini-spinner"),
50
 
51
+ // Core file upload elements
52
  fileUploader: document.getElementById("file-uploader"),
53
  shelfList: document.getElementById("shelf-list"),
54
  dropZone: document.getElementById("drop-zone"),
55
 
56
+ // Action Resets
 
57
  menuNewChat: document.getElementById("menu-new-chat"),
58
+ clearChatBtn: document.getElementById("clear-chat-button"),
59
 
60
+ // Showcase recipe chips
61
+ recipeChips: document.querySelectorAll(".recipe-chip")
62
  };
63
 
64
  // Markdown configuration
 
86
  appendSystemLog("Gradio Server connection is restricted.", true);
87
  }
88
 
89
+ // 3. Register Sidebar Drawer Slide Events (Drawer + Overlay)
90
+ dom.btnToggleRight.addEventListener("click", () => toggleSettingsDrawer(true));
91
+ dom.btnCloseDrawer.addEventListener("click", () => toggleSettingsDrawer(false));
92
+ dom.sidebarOverlay.addEventListener("click", () => toggleSettingsDrawer(false));
 
 
 
93
 
94
  // 4. Register Settings Listeners
95
  dom.apiKeyInput.addEventListener("input", (e) => {
 
118
  dom.temperatureVal.textContent = STATE.temperature.toFixed(1);
119
  });
120
 
121
+ // 5. Register File Upload Actions
122
  dom.studioUploadTrigger.addEventListener("click", () => dom.fileUploader.click());
123
  dom.miniUploadTrigger.addEventListener("click", () => dom.fileUploader.click());
124
  dom.dropZone.addEventListener("click", () => dom.fileUploader.click());
 
164
  });
165
 
166
  // 7. Resets
 
167
  dom.menuNewChat.addEventListener("click", resetSandbox);
168
+ dom.clearChatBtn.addEventListener("click", resetSandbox);
169
 
170
+ // 8. Recipe Chips Console Setup
171
+ dom.recipeChips.forEach(chip => {
172
+ chip.addEventListener("click", () => {
173
+ const recipeType = chip.getAttribute("data-recipe");
174
  loadRecipe(recipeType);
175
  });
176
  });
 
184
  });
185
  }
186
 
187
+ // Drawer Toggler Action
188
+ function toggleSettingsDrawer(open) {
189
+ if (open) {
190
+ dom.sidebarRight.classList.remove("collapsed");
191
+ dom.sidebarOverlay.classList.add("active");
192
+ } else {
193
+ dom.sidebarRight.classList.add("collapsed");
194
+ dom.sidebarOverlay.classList.remove("active");
195
+ }
196
+ }
197
+
198
  // Handle File Select & Base64 Encoder
199
  function handleFileSelection(e) {
200
  processFiles(e.target.files);
 
310
  size: "0.02 MB",
311
  base64: mockImageBase64
312
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  } else if (recipeType === "diagnostic") {
314
  promptText = "This is a recorded visual sequence of steps leading to a runtime exception crash. Provide a detailed reconstruction of the event timeline, summarize the diagnostic signals, and suggest an engineering hotfix.";
315
  STATE.uploadedFiles.push({
 
321
  });
322
  }
323
 
324
+ // Set value in BOTH text areas
325
  dom.studioPromptInput.value = promptText;
326
  dom.miniPromptInput.value = promptText;
327
 
 
346
 
347
  // Check credentials
348
  if (!STATE.apiKey && !dom.apiKeyInput.placeholder.includes("server env")) {
349
+ appendSystemLog("StepFun API Key is required. Please set it in the settings card drawer.", true);
350
+ toggleSettingsDrawer(true);
351
  return;
352
  }
353
 
 
608
  }
609
 
610
  function appendSystemLog(message, isError = false) {
 
611
  if (dom.chatThreadContainer.style.display === "none") {
612
  console.warn(`System Log: ${message}`);
613
  return;
static/index.html CHANGED
@@ -3,11 +3,11 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>StepFun Studio - Multimodal Playground</title>
7
  <!-- Google Fonts -->
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
- <link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&family=Inter:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700;800&display=swap" rel="stylesheet">
11
  <!-- Highlight.js for Code Highlighting -->
12
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css">
13
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
@@ -19,76 +19,43 @@
19
  <body>
20
  <div class="app-container">
21
 
22
- <!-- Left Sidebar: Menu Navigation -->
23
- <aside class="sidebar-left" id="sidebar-left">
24
- <div class="sidebar-brand">
25
- <div class="brand-logo">
26
- <svg viewBox="0 0 100 100" width="28" height="28" fill="currentColor">
 
27
  <circle cx="50" cy="50" r="46" fill="#111827"/>
28
  <path d="M35 30 C35 30, 48 40, 48 55 C48 70, 35 70, 35 70" stroke="#ffffff" stroke-width="8" stroke-linecap="round" fill="none"/>
29
  <circle cx="62" cy="50" r="7" fill="#ffffff"/>
30
  </svg>
31
- <span class="brand-name">StepFun</span>
32
  </div>
33
- </div>
34
-
35
- <nav class="sidebar-menu">
36
- <a href="#" class="menu-item active" id="menu-new-chat">
37
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4z"></path></svg>
38
- <span>New Chat</span>
39
- </a>
40
- <a href="#" class="menu-item">
41
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
42
- <span>search</span>
43
- </a>
44
- <a href="#" class="menu-item">
45
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="9"></rect><rect x="14" y="3" width="7" height="5"></rect><rect x="14" y="12" width="7" height="9"></rect><rect x="3" y="16" width="7" height="5"></rect></svg>
46
- <span>Showcase Library</span>
47
- </a>
48
- <a href="#" class="menu-item">
49
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path></svg>
50
- <span>My Assets</span>
51
- </a>
52
- <a href="#" class="menu-item">
53
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
54
- <span>Playground</span>
55
- </a>
56
- <div class="menu-separator"></div>
57
- <a href="#" class="menu-item">
58
- <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1"></circle><circle cx="19" cy="12" r="1"></circle><circle cx="5" cy="12" r="1"></circle></svg>
59
- <span>More</span>
60
- </a>
61
- </nav>
62
- </aside>
63
-
64
- <!-- Main Content Area -->
65
- <main class="main-workspace">
66
- <!-- Top Navigation Bar -->
67
- <header class="workspace-header">
68
- <button class="icon-toggle-btn" id="btn-toggle-left" title="Toggle Navigation Sidebar">
69
- <svg viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="9" y1="3" x2="9" y2="21"></line></svg>
70
- </button>
71
- <div class="header-model-title">
72
- <span class="studio-badge">Studio</span>
73
- <span class="model-name">step-3.7-flash</span>
74
  </div>
75
- <button class="icon-toggle-btn" id="btn-toggle-right" title="Toggle Settings Sidebar">
76
- <svg viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="15" y1="3" x2="15" y2="21"></line></svg>
77
- </button>
78
  </header>
79
 
80
- <!-- Interactive Workspace Content -->
81
  <div class="workspace-viewport">
82
 
83
- <!-- 1. EMPTY CHAT / STUDIO DASHBOARD (Matches Screenshot) -->
84
  <div class="studio-dashboard" id="studio-dashboard">
85
  <h2 class="welcome-heading">Hello, welcome to Studio</h2>
86
 
87
- <!-- Central Search/Input Console -->
88
  <div class="console-box">
89
- <textarea id="studio-prompt-input" placeholder="Describe the task you want to verify, or start with the showcase below..."></textarea>
90
 
91
- <!-- Upload preview shelf internally -->
92
  <div class="inner-shelf-preview" id="inner-shelf-preview"></div>
93
 
94
  <div class="console-action-row">
@@ -97,70 +64,40 @@
97
  </button>
98
 
99
  <button class="circle-btn-send" id="studio-send-button" title="Send Task">
100
- <svg viewBox="0 0 24 24" width="16" height="16" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"></line><polyline points="5 12 12 5 19 12"></polyline></svg>
101
  <div class="spinner-light" id="studio-spinner" style="display: none;"></div>
102
  </button>
103
  </div>
104
  </div>
105
 
106
- <!-- Showcase Section -->
107
  <div class="showcase-section">
108
- <div class="showcase-header">
109
- <h3>Showcase</h3>
110
- <a href="#" class="view-all-link">View all <span>&rsaquo;</span></a>
111
- </div>
112
-
113
- <div class="showcase-cards-grid">
114
- <div class="showcase-card" data-recipe="whiteboard">
115
- <div class="card-icon-container">
116
- <svg viewBox="0 0 24 24" width="16" height="16" stroke="#3b82f6" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
117
- </div>
118
- <h4 class="card-title">Global AI Funding Quarterly Report - Series A Radar</h4>
119
- <p class="card-desc">Create a single-page HTML real-time dashboard for "Global AI Funding Series A".</p>
120
- <button class="card-action-btn">Try it</button>
121
- </div>
122
-
123
- <div class="showcase-card" data-recipe="code">
124
- <div class="card-icon-container">
125
- <svg viewBox="0 0 24 24" width="16" height="16" stroke="#3b82f6" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
126
- </div>
127
- <h4 class="card-title">China's New Energy Vehicle Q1 Sales Report</h4>
128
- <p class="card-desc">Create a one-page HTML report titled "In-depth Observation of China's New Energy..."</p>
129
- <button class="card-action-btn">Try it</button>
130
- </div>
131
-
132
- <div class="showcase-card" data-recipe="receipt">
133
- <div class="card-icon-container">
134
- <svg viewBox="0 0 24 24" width="16" height="16" stroke="#3b82f6" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
135
- </div>
136
- <h4 class="card-title">ALS Family Handbook: Living with Time</h4>
137
- <p class="card-desc">Create a fictional patient education platform called "Mingyan Doctors and Patients..."</p>
138
- <button class="card-action-btn">Try it</button>
139
  </div>
140
-
141
- <div class="showcase-card" data-recipe="diagnostic">
142
- <div class="card-icon-container">
143
- <svg viewBox="0 0 24 24" width="16" height="16" stroke="#3b82f6" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
144
- </div>
145
- <h4 class="card-title">In-depth analysis of NVIDIA's Q1 financial report</h4>
146
- <p class="card-desc">In-depth analysis of NVIDIA's Q1 FY2026 financial report: core financial metrics table...</p>
147
- <button class="card-action-btn">Try it</button>
148
  </div>
149
  </div>
150
  </div>
151
  </div>
152
 
153
- <!-- 2. ACTIVE CHAT THREAD (Hidden initially) -->
154
  <div class="chat-thread-container" id="chat-thread-container" style="display: none;">
155
  <div class="chat-messages-feed" id="chat-messages-feed">
156
  <!-- Message bubbles populate dynamically -->
157
  </div>
158
 
159
- <!-- Bottom fixed mini-input panel -->
160
  <div class="chat-mini-footer">
161
  <div class="console-box mini">
162
  <textarea id="mini-prompt-input" rows="1" placeholder="Reply or ask anything..."></textarea>
163
  <div class="mini-shelf-preview" id="mini-shelf-preview"></div>
 
164
  <div class="console-action-row">
165
  <button class="circle-btn-action" id="mini-upload-trigger" title="Attach Media File">
166
  <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
@@ -177,39 +114,38 @@
177
  </div>
178
  </main>
179
 
180
- <!-- Right Sidebar: Configuration Cards & Multimodal Shelf (Matches right blocks) -->
181
- <aside class="sidebar-right" id="sidebar-right">
 
 
 
182
  <input type="file" id="file-uploader" accept="image/*,video/*" multiple style="display: none;">
183
 
184
  <div class="right-sidebar-header">
185
- <h3>Workspace Settings</h3>
186
- <button id="clear-chat-button" class="btn-clear-chat" title="Clear Context Logs">
187
- <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>
188
- <span>Reset Chat</span>
189
  </button>
190
  </div>
191
 
192
  <div class="sidebar-right-content">
193
-
194
- <!-- Credentials Card -->
195
  <div class="right-block-card">
196
  <div class="card-block-header">
197
  <span class="block-title">Credentials</span>
198
- <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="block-icon"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
199
  </div>
200
  <div class="password-wrapper">
201
- <input type="password" id="api-key-input" placeholder="Enter key or uses server env..." autocomplete="off">
202
  <button type="button" id="toggle-key-visibility" class="visibility-toggle" title="Show/Hide">
203
  <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg>
204
  </button>
205
  </div>
206
  </div>
207
 
208
- <!-- Parameters Card -->
209
  <div class="right-block-card">
210
  <div class="card-block-header">
211
  <span class="block-title">Reasoning Mode</span>
212
- <div class="recommend-tag">recommend</div>
213
  </div>
214
  <div class="effort-picker">
215
  <label class="effort-pill">
@@ -225,37 +161,12 @@
225
  <span>High</span>
226
  </label>
227
  </div>
228
- <span class="block-tip">Controls the computational budget for Step 3.7 Flash's thought processes.</span>
229
- </div>
230
-
231
- <!-- Generation Limits Card -->
232
- <div class="right-block-card">
233
- <div class="card-block-header">
234
- <span class="block-title">Generation Limits</span>
235
- <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="block-icon"><polygon points="12 2 2 7 12 12 22 7 12 2"></polygon><polyline points="2 17 12 22 22 17"></polyline><polyline points="2 12 12 17 22 12"></polyline></svg>
236
- </div>
237
- <div class="slider-row">
238
- <label for="max-tokens-slider">Max Output Tokens</label>
239
- <span class="slider-val" id="max-tokens-val">2048</span>
240
- </div>
241
- <input type="range" id="max-tokens-slider" min="256" max="8192" step="256" value="2048">
242
-
243
- <div class="slider-row" style="margin-top: 14px;">
244
- <label for="temperature-slider">Temperature</label>
245
- <span class="slider-val" id="temperature-val">0.7</span>
246
- </div>
247
- <input type="range" id="temperature-slider" min="0.0" max="1.5" step="0.1" value="0.7">
248
  </div>
249
 
250
- <!-- Active Shelf uploads Card -->
251
  <div class="right-block-card flex-1-card">
252
  <div class="card-block-header">
253
- <span class="block-title">Multimodal Shelf</span>
254
- <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="block-icon"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>
255
- </div>
256
- <div class="drag-upload-zone" id="drop-zone">
257
- <svg viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>
258
- <p>Drag files or <span>browse</span></p>
259
  </div>
260
  <div class="shelf-list" id="shelf-list">
261
  <div class="empty-shelf-text">No active attachments loaded. Upload images or video clips.</div>
@@ -266,14 +177,14 @@
266
  <div class="right-sidebar-footer">
267
  <div class="status-indicator-group">
268
  <span class="status-dot online"></span>
269
- <span>Server Queued</span>
270
  </div>
271
  </div>
272
  </aside>
273
 
274
  </div>
275
 
276
- <!-- Gradio Client JS library connection -->
277
  <script type="module" src="/static/app.js"></script>
278
  </body>
279
  </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>StepFun Studio</title>
7
  <!-- Google Fonts -->
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&family=Inter:wght@400;500;600;700&family=Outfit:wght@500;600;700&display=swap" rel="stylesheet">
11
  <!-- Highlight.js for Code Highlighting -->
12
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css">
13
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
 
19
  <body>
20
  <div class="app-container">
21
 
22
+ <!-- Main Workspace (Full width, no left sidebar) -->
23
+ <main class="main-workspace">
24
+ <!-- Top Navigation Bar -->
25
+ <header class="workspace-header">
26
+ <div class="header-brand">
27
+ <svg viewBox="0 0 100 100" width="24" height="24" fill="currentColor">
28
  <circle cx="50" cy="50" r="46" fill="#111827"/>
29
  <path d="M35 30 C35 30, 48 40, 48 55 C48 70, 35 70, 35 70" stroke="#ffffff" stroke-width="8" stroke-linecap="round" fill="none"/>
30
  <circle cx="62" cy="50" r="7" fill="#ffffff"/>
31
  </svg>
32
+ <span class="brand-name">StepFun Studio</span>
33
  </div>
34
+
35
+ <div class="header-actions">
36
+ <button class="header-btn" id="menu-new-chat" title="New Chat">
37
+ <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4z"></path></svg>
38
+ <span>New Chat</span>
39
+ </button>
40
+ <button class="header-btn" id="btn-toggle-right" title="Settings">
41
+ <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
42
+ <span>Settings</span>
43
+ </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  </div>
 
 
 
45
  </header>
46
 
47
+ <!-- Workspace Viewport -->
48
  <div class="workspace-viewport">
49
 
50
+ <!-- 1. EMPTY CHAT / STUDIO DASHBOARD -->
51
  <div class="studio-dashboard" id="studio-dashboard">
52
  <h2 class="welcome-heading">Hello, welcome to Studio</h2>
53
 
54
+ <!-- Central Console Box -->
55
  <div class="console-box">
56
+ <textarea id="studio-prompt-input" rows="2" placeholder="Describe the task you want to verify, or start with the showcase below..."></textarea>
57
 
58
+ <!-- Upload preview shelf inside console -->
59
  <div class="inner-shelf-preview" id="inner-shelf-preview"></div>
60
 
61
  <div class="console-action-row">
 
64
  </button>
65
 
66
  <button class="circle-btn-send" id="studio-send-button" title="Send Task">
67
+ <svg viewBox="0 0 24 24" width="14" height="14" stroke="#ffffff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"></line><polyline points="5 12 12 5 19 12"></polyline></svg>
68
  <div class="spinner-light" id="studio-spinner" style="display: none;"></div>
69
  </button>
70
  </div>
71
  </div>
72
 
73
+ <!-- Showcase Section (Decluttered: only 2 compact chips) -->
74
  <div class="showcase-section">
75
+ <h3 class="showcase-title">Try these tasks</h3>
76
+ <div class="showcase-chips-row">
77
+ <div class="recipe-chip" data-recipe="whiteboard">
78
+ <span class="chip-icon">🖼️</span>
79
+ <span class="chip-text">Analyze Whiteboard Gantt</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  </div>
81
+ <div class="recipe-chip" data-recipe="diagnostic">
82
+ <span class="chip-icon">🎬</span>
83
+ <span class="chip-text">Diagnose Video Logs</span>
 
 
 
 
 
84
  </div>
85
  </div>
86
  </div>
87
  </div>
88
 
89
+ <!-- 2. ACTIVE CHAT THREAD -->
90
  <div class="chat-thread-container" id="chat-thread-container" style="display: none;">
91
  <div class="chat-messages-feed" id="chat-messages-feed">
92
  <!-- Message bubbles populate dynamically -->
93
  </div>
94
 
95
+ <!-- Bottom Reply bar -->
96
  <div class="chat-mini-footer">
97
  <div class="console-box mini">
98
  <textarea id="mini-prompt-input" rows="1" placeholder="Reply or ask anything..."></textarea>
99
  <div class="mini-shelf-preview" id="mini-shelf-preview"></div>
100
+
101
  <div class="console-action-row">
102
  <button class="circle-btn-action" id="mini-upload-trigger" title="Attach Media File">
103
  <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
 
114
  </div>
115
  </main>
116
 
117
+ <!-- Sidebar Overlay backdrop for mobile -->
118
+ <div class="sidebar-overlay" id="sidebar-overlay"></div>
119
+
120
+ <!-- Right Settings Drawer (Collapsed by default, slides on top of main area) -->
121
+ <aside class="sidebar-right collapsed" id="sidebar-right">
122
  <input type="file" id="file-uploader" accept="image/*,video/*" multiple style="display: none;">
123
 
124
  <div class="right-sidebar-header">
125
+ <h3>Settings</h3>
126
+ <button class="circle-btn-action close-drawer" id="btn-close-drawer">
127
+ <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
 
128
  </button>
129
  </div>
130
 
131
  <div class="sidebar-right-content">
132
+ <!-- Credentials -->
 
133
  <div class="right-block-card">
134
  <div class="card-block-header">
135
  <span class="block-title">Credentials</span>
 
136
  </div>
137
  <div class="password-wrapper">
138
+ <input type="password" id="api-key-input" placeholder="Enter key or use server env..." autocomplete="off">
139
  <button type="button" id="toggle-key-visibility" class="visibility-toggle" title="Show/Hide">
140
  <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg>
141
  </button>
142
  </div>
143
  </div>
144
 
145
+ <!-- Reasoning mode -->
146
  <div class="right-block-card">
147
  <div class="card-block-header">
148
  <span class="block-title">Reasoning Mode</span>
 
149
  </div>
150
  <div class="effort-picker">
151
  <label class="effort-pill">
 
161
  <span>High</span>
162
  </label>
163
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  </div>
165
 
166
+ <!-- Upload Shelf -->
167
  <div class="right-block-card flex-1-card">
168
  <div class="card-block-header">
169
+ <span class="block-title">Attached Media</span>
 
 
 
 
 
170
  </div>
171
  <div class="shelf-list" id="shelf-list">
172
  <div class="empty-shelf-text">No active attachments loaded. Upload images or video clips.</div>
 
177
  <div class="right-sidebar-footer">
178
  <div class="status-indicator-group">
179
  <span class="status-dot online"></span>
180
+ <span>Step 3.7 Flash Connected</span>
181
  </div>
182
  </div>
183
  </aside>
184
 
185
  </div>
186
 
187
+ <!-- Gradio Client JS connection -->
188
  <script type="module" src="/static/app.js"></script>
189
  </body>
190
  </html>
static/style.css CHANGED
@@ -1,25 +1,22 @@
1
- /* StepFun Studio Premium Light Theme Design System */
2
  :root {
3
  --bg-primary: #f8f9fa;
4
  --bg-workspace: #f8f9fa;
5
  --bg-card: #ffffff;
6
  --bg-sidebar: #ffffff;
7
- --bg-input: #ffffff;
8
 
9
  --border-color: #e5e7eb;
10
  --border-light: #f1f2f4;
11
  --border-focus: #111827;
12
 
13
- --accent-blue: #3b82f6;
14
  --accent-blue-bg: #eff6ff;
15
 
16
  --text-primary: #111827;
17
  --text-secondary: #4b5563;
18
  --text-muted: #9ca3af;
19
- --danger: #f43f5e;
20
 
21
- --btn-dark-bg: #111827;
22
- --btn-dark-hover: #1f2937;
23
  --btn-light-bg: #f3f4f6;
24
  --btn-light-hover: #e5e7eb;
25
 
@@ -27,18 +24,18 @@
27
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
28
  --font-mono: 'Fira Code', monospace;
29
 
30
- --transition-smooth: all 0.2s ease-in-out;
31
  --border-radius-sm: 8px;
32
  --border-radius-md: 12px;
33
  --border-radius-lg: 16px;
34
  --border-radius-pill: 100px;
35
 
36
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
37
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04), 0 2px 4px -1px rgba(0, 0, 0, 0.02);
38
- --shadow-lg: 0 10px 30px -10px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.02);
39
  }
40
 
41
- /* Reset & Global Styling */
42
  * {
43
  margin: 0;
44
  padding: 0;
@@ -57,10 +54,10 @@ body {
57
  -webkit-font-smoothing: antialiased;
58
  }
59
 
60
- /* Scrollbar customization */
61
  ::-webkit-scrollbar {
62
- width: 5px;
63
- height: 5px;
64
  }
65
 
66
  ::-webkit-scrollbar-track {
@@ -76,7 +73,7 @@ body {
76
  background: #cbd5e1;
77
  }
78
 
79
- /* Flex Container Layout */
80
  .app-container {
81
  display: flex;
82
  height: 100vh;
@@ -85,30 +82,31 @@ body {
85
  position: relative;
86
  }
87
 
88
- /* Left Sidebar Menu (Matches screenshot left list) */
89
- .sidebar-left {
90
- width: 240px;
91
- background-color: var(--bg-sidebar);
92
- border-right: 1px solid var(--border-color);
93
  display: flex;
94
  flex-direction: column;
95
  height: 100%;
96
- flex-shrink: 0;
97
- transition: var(--transition-smooth);
98
- z-index: 100;
99
- }
100
-
101
- .sidebar-left.collapsed {
102
- width: 0;
103
  overflow: hidden;
104
- border-right: none;
 
105
  }
106
 
107
- .sidebar-brand {
108
- padding: 24px 20px;
 
 
 
 
 
 
 
 
109
  }
110
 
111
- .brand-logo {
112
  display: flex;
113
  align-items: center;
114
  gap: 10px;
@@ -116,114 +114,44 @@ body {
116
 
117
  .brand-name {
118
  font-family: var(--font-heading);
119
- font-size: 18px;
120
  font-weight: 700;
121
  letter-spacing: -0.3px;
122
  color: var(--text-primary);
123
  }
124
 
125
- .sidebar-menu {
126
- flex: 1;
127
  display: flex;
128
- flex-direction: column;
129
- padding: 10px 12px;
130
- gap: 4px;
131
  }
132
 
133
- .menu-item {
 
134
  display: flex;
135
  align-items: center;
136
- gap: 12px;
137
- padding: 10px 14px;
 
138
  border-radius: var(--border-radius-sm);
139
  color: var(--text-secondary);
140
- text-decoration: none;
 
141
  font-weight: 500;
142
- font-size: 13.5px;
143
- transition: var(--transition-smooth);
144
- }
145
-
146
- .menu-item:hover {
147
- background-color: var(--btn-light-bg);
148
- color: var(--text-primary);
149
- }
150
-
151
- .menu-item.active {
152
- background-color: var(--btn-light-bg);
153
- color: var(--text-primary);
154
- font-weight: 600;
155
- }
156
-
157
- .menu-separator {
158
- height: 1px;
159
- background-color: var(--border-light);
160
- margin: 8px 14px;
161
- }
162
-
163
- /* Main content workspace */
164
- .main-workspace {
165
- flex: 1;
166
- display: flex;
167
- flex-direction: column;
168
- height: 100%;
169
- background-color: var(--bg-workspace);
170
- overflow: hidden;
171
- position: relative;
172
- }
173
-
174
- /* Header bar */
175
- .workspace-header {
176
- height: 56px;
177
- border-bottom: 1px solid var(--border-color);
178
- background-color: var(--bg-sidebar);
179
- display: flex;
180
- align-items: center;
181
- justify-content: space-between;
182
- padding: 0 16px;
183
- z-index: 10;
184
- }
185
-
186
- .icon-toggle-btn {
187
- background: transparent;
188
- border: none;
189
- color: var(--text-secondary);
190
  cursor: pointer;
191
- padding: 6px;
192
- border-radius: var(--border-radius-sm);
193
- display: flex;
194
- align-items: center;
195
- justify-content: center;
196
  transition: var(--transition-smooth);
 
197
  }
198
 
199
- .icon-toggle-btn:hover {
200
  background-color: var(--btn-light-bg);
201
  color: var(--text-primary);
202
  }
203
 
204
- .header-model-title {
205
- display: flex;
206
- align-items: center;
207
- gap: 8px;
208
- }
209
-
210
- .studio-badge {
211
- background-color: #f3f4f6;
212
- color: #4b5563;
213
- font-size: 11px;
214
- font-weight: 600;
215
- padding: 1px 6px;
216
- border-radius: 4px;
217
- font-family: var(--font-heading);
218
- }
219
-
220
- .model-name {
221
- font-size: 13px;
222
- font-family: var(--font-mono);
223
- color: var(--text-secondary);
224
  }
225
 
226
- /* Viewport structure */
227
  .workspace-viewport {
228
  flex: 1;
229
  overflow-y: auto;
@@ -231,12 +159,12 @@ body {
231
  flex-direction: column;
232
  }
233
 
234
- /* 1. Studio Dashboard Styling (Matches Screenshot perfectly) */
235
  .studio-dashboard {
236
- max-width: 800px;
237
  width: 100%;
238
- margin: 0 auto;
239
- padding: 60px 24px;
240
  display: flex;
241
  flex-direction: column;
242
  align-items: center;
@@ -244,31 +172,32 @@ body {
244
 
245
  .welcome-heading {
246
  font-family: var(--font-heading);
247
- font-size: 32px;
248
  font-weight: 600;
249
  color: var(--text-primary);
250
- margin-bottom: 30px;
251
- letter-spacing: -0.5px;
252
  text-align: center;
253
  }
254
 
255
- /* Central Search/Prompt Console Box */
256
  .console-box {
257
  width: 100%;
258
  background-color: var(--bg-card);
259
  border: 1px solid var(--border-color);
260
  border-radius: var(--border-radius-lg);
261
- box-shadow: var(--shadow-lg);
262
- padding: 16px 20px;
263
  display: flex;
264
  flex-direction: column;
265
- gap: 12px;
266
  transition: var(--transition-smooth);
267
- margin-bottom: 48px;
268
  }
269
 
270
  .console-box:focus-within {
271
  border-color: var(--border-focus);
 
272
  }
273
 
274
  .console-box textarea {
@@ -277,10 +206,10 @@ body {
277
  outline: none;
278
  resize: none;
279
  font-family: var(--font-body);
280
- font-size: 15px;
281
  color: var(--text-primary);
282
  background: transparent;
283
- line-height: 1.5;
284
  min-height: 50px;
285
  }
286
 
@@ -288,28 +217,27 @@ body {
288
  color: var(--text-muted);
289
  }
290
 
291
- /* Inside console drawer for attachments */
292
  .inner-shelf-preview,
293
  .mini-shelf-preview {
294
  display: flex;
295
  flex-wrap: wrap;
296
- gap: 8px;
297
- padding-bottom: 4px;
298
  }
299
 
300
- /* Console Footer Row containing circle buttons */
301
  .console-action-row {
302
  display: flex;
303
  justify-content: space-between;
304
  align-items: center;
305
  border-top: 1px solid var(--border-light);
306
- padding-top: 12px;
307
  }
308
 
309
- /* Action button (e.g. + Circle) */
310
  .circle-btn-action {
311
- width: 32px;
312
- height: 32px;
313
  border-radius: 50%;
314
  border: 1px solid var(--border-color);
315
  background: transparent;
@@ -319,18 +247,18 @@ body {
319
  align-items: center;
320
  justify-content: center;
321
  transition: var(--transition-smooth);
 
322
  }
323
 
324
  .circle-btn-action:hover {
325
  background-color: var(--btn-light-bg);
326
  color: var(--text-primary);
327
- border-color: var(--btn-light-hover);
328
  }
329
 
330
- /* Send button (e.g. Up-Arrow inside dark circle) */
331
  .circle-btn-send {
332
- width: 32px;
333
- height: 32px;
334
  border-radius: 50%;
335
  border: none;
336
  background-color: #1f2937;
@@ -340,120 +268,65 @@ body {
340
  align-items: center;
341
  justify-content: center;
342
  transition: var(--transition-smooth);
 
343
  }
344
 
345
  .circle-btn-send:hover {
346
  background-color: #111827;
347
- transform: scale(1.05);
348
- }
349
-
350
- .circle-btn-send:active {
351
- transform: scale(0.95);
352
  }
353
 
354
- /* Showcase Grid Layout (Matches Screenshot grid) */
355
  .showcase-section {
356
  width: 100%;
357
  }
358
 
359
- .showcase-header {
360
- display: flex;
361
- justify-content: space-between;
362
- align-items: center;
363
- margin-bottom: 16px;
364
- }
365
-
366
- .showcase-header h3 {
367
- font-family: var(--font-heading);
368
- font-size: 15px;
369
- font-weight: 600;
370
- color: var(--text-primary);
371
- }
372
-
373
- .view-all-link {
374
- font-size: 12px;
375
  color: var(--text-secondary);
376
- text-decoration: none;
 
377
  font-weight: 500;
378
  }
379
 
380
- .view-all-link:hover {
381
- color: var(--text-primary);
382
- }
383
-
384
- .showcase-cards-grid {
385
- display: grid;
386
- grid-template-columns: 1fr 1fr;
387
- gap: 16px;
388
- width: 100%;
389
- }
390
-
391
- /* Showcase Card item (StepFun mockup style) */
392
- .showcase-card {
393
- background-color: var(--bg-card);
394
- border: 1px solid var(--border-color);
395
- border-radius: var(--border-radius-md);
396
- padding: 20px;
397
  display: flex;
398
- flex-direction: column;
399
- transition: var(--transition-smooth);
400
- position: relative;
401
- cursor: pointer;
402
- }
403
-
404
- .showcase-card:hover {
405
- box-shadow: var(--shadow-lg);
406
- border-color: #d1d5db;
407
  }
408
 
409
- .card-icon-container {
410
- width: 32px;
411
- height: 32px;
412
- border-radius: var(--border-radius-sm);
413
- background-color: var(--accent-blue-bg);
414
  display: flex;
415
  align-items: center;
416
- justify-content: center;
417
- margin-bottom: 14px;
 
 
 
 
 
 
 
 
 
418
  }
419
 
420
- .card-title {
421
- font-family: var(--font-heading);
422
- font-size: 13px;
423
- font-weight: 700;
424
- line-height: 1.4;
425
  color: var(--text-primary);
426
- margin-bottom: 6px;
427
- }
428
-
429
- .card-desc {
430
- font-size: 11.5px;
431
- color: var(--text-secondary);
432
- line-height: 1.4;
433
- margin-bottom: 20px;
434
- flex: 1;
435
  }
436
 
437
- /* Black pill button on bottom left */
438
- .card-action-btn {
439
- align-self: flex-start;
440
- background-color: var(--btn-dark-bg);
441
- color: #ffffff;
442
- border: none;
443
- padding: 6px 16px;
444
- border-radius: var(--border-radius-pill);
445
- font-size: 11px;
446
- font-weight: 600;
447
- cursor: pointer;
448
- transition: var(--transition-smooth);
449
  }
450
 
451
- .card-action-btn:hover {
452
- background-color: var(--btn-dark-hover);
453
- transform: translateY(-1px);
454
  }
455
 
456
- /* 2. Active Chat thread view styling */
457
  .chat-thread-container {
458
  flex: 1;
459
  display: flex;
@@ -465,22 +338,22 @@ body {
465
  .chat-messages-feed {
466
  flex: 1;
467
  overflow-y: auto;
468
- padding: 30px;
469
  display: flex;
470
  flex-direction: column;
471
- gap: 28px;
472
- max-width: 800px;
473
  width: 100%;
474
  margin: 0 auto;
475
  }
476
 
477
- /* Chat bubble aesthetics */
478
  .message-bubble {
479
  display: flex;
480
  flex-direction: column;
481
- gap: 6px;
482
- max-width: 85%;
483
- animation: slideUp 0.3s ease-out;
484
  }
485
 
486
  .message-bubble.user {
@@ -490,10 +363,11 @@ body {
490
  .message-bubble.assistant {
491
  align-self: flex-start;
492
  width: 100%;
 
493
  }
494
 
495
  .message-meta {
496
- font-size: 11px;
497
  color: var(--text-muted);
498
  font-weight: 600;
499
  margin: 0 4px;
@@ -504,10 +378,10 @@ body {
504
  }
505
 
506
  .message-body {
507
- padding: 14px 18px;
508
  border-radius: var(--border-radius-md);
509
- font-size: 14.5px;
510
- line-height: 1.6;
511
  box-shadow: var(--shadow-sm);
512
  }
513
 
@@ -525,13 +399,13 @@ body {
525
  border-bottom-left-radius: 4px;
526
  }
527
 
528
- /* Thumbnail Attachments inside bubbles */
529
  .bubble-attachments {
530
  display: grid;
531
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
532
- gap: 8px;
533
- margin-top: 10px;
534
- max-width: 400px;
535
  }
536
 
537
  .bubble-attachment-card {
@@ -559,32 +433,31 @@ body {
559
  color: #fff;
560
  font-size: 8px;
561
  text-align: center;
562
- padding: 2px;
563
  font-family: var(--font-mono);
564
  }
565
 
566
- /* Collagen Thoughts Box for reasoning steps */
567
  .thought-container {
568
- margin-bottom: 14px;
569
  border: 1px solid var(--border-color);
570
  border-radius: var(--border-radius-sm);
571
  overflow: hidden;
572
- background-color: #fafbfc;
573
  }
574
 
575
  .thought-header {
576
  display: flex;
577
  justify-content: space-between;
578
  align-items: center;
579
- padding: 8px 12px;
580
- background-color: #f3f4f6;
581
  cursor: pointer;
582
  user-select: none;
583
  transition: var(--transition-smooth);
584
  }
585
 
586
  .thought-header:hover {
587
- background-color: #e5e7eb;
588
  }
589
 
590
  .thought-title-group {
@@ -592,19 +465,19 @@ body {
592
  align-items: center;
593
  gap: 6px;
594
  font-family: var(--font-heading);
595
- font-size: 11.5px;
596
  font-weight: 600;
597
  color: var(--text-secondary);
598
  }
599
 
600
  .thought-timer {
601
  font-family: var(--font-mono);
602
- font-size: 10px;
603
  color: var(--text-muted);
604
  }
605
 
606
  .thought-toggle-icon {
607
- font-size: 10px;
608
  color: var(--text-secondary);
609
  transition: transform 0.2s ease;
610
  }
@@ -614,14 +487,14 @@ body {
614
  }
615
 
616
  .thought-content {
617
- padding: 12px 14px;
618
  font-family: var(--font-mono);
619
- font-size: 12px;
620
  color: var(--text-secondary);
621
  background-color: #ffffff;
622
  border-top: 1px solid var(--border-color);
623
  white-space: pre-wrap;
624
- max-height: 200px;
625
  overflow-y: auto;
626
  }
627
 
@@ -629,22 +502,22 @@ body {
629
  display: none;
630
  }
631
 
632
- /* Markdown tags within chat response body */
633
  .markdown-body h1,
634
  .markdown-body h2,
635
  .markdown-body h3 {
636
- margin-top: 14px;
637
- margin-bottom: 6px;
638
  font-family: var(--font-heading);
639
  font-weight: 600;
640
  }
641
 
642
- .markdown-body h1 { font-size: 16px; border-bottom: 1px solid var(--border-light); padding-bottom: 2px; }
643
- .markdown-body h2 { font-size: 14.5px; }
644
- .markdown-body h3 { font-size: 13px; }
645
 
646
  .markdown-body p {
647
- margin-bottom: 8px;
648
  }
649
 
650
  .markdown-body p:last-child {
@@ -653,15 +526,15 @@ body {
653
 
654
  .markdown-body code {
655
  font-family: var(--font-mono);
656
- font-size: 11.5px;
657
  background-color: var(--btn-light-bg);
658
- padding: 2px 5px;
659
  border-radius: 4px;
660
  color: var(--accent-blue);
661
  }
662
 
663
  .markdown-body pre {
664
- margin: 12px 0;
665
  border-radius: var(--border-radius-sm);
666
  overflow: hidden;
667
  border: 1px solid var(--border-color);
@@ -669,7 +542,7 @@ body {
669
 
670
  .markdown-body pre code {
671
  display: block;
672
- padding: 12px;
673
  overflow-x: auto;
674
  background-color: #0f172a !important;
675
  color: #e2e8f0;
@@ -678,14 +551,14 @@ body {
678
  .markdown-body table {
679
  width: 100%;
680
  border-collapse: collapse;
681
- margin: 12px 0;
682
- font-size: 12.5px;
683
  }
684
 
685
  .markdown-body th,
686
  .markdown-body td {
687
  border: 1px solid var(--border-color);
688
- padding: 6px 10px;
689
  text-align: left;
690
  }
691
 
@@ -694,42 +567,65 @@ body {
694
  font-weight: 600;
695
  }
696
 
697
- /* Chat Bottom Mini Input bar */
698
  .chat-mini-footer {
699
- padding: 16px 24px;
700
  background-color: var(--bg-workspace);
701
  border-top: 1px solid var(--border-color);
702
  }
703
 
704
  .chat-mini-footer .console-box {
705
- max-width: 800px;
706
  margin: 0 auto;
707
- box-shadow: var(--shadow-md);
708
- padding: 10px 16px;
709
  border-radius: var(--border-radius-md);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
710
  }
711
 
712
- /* Right Sidebar: Settings (Matches Right Mockup blocks) */
 
 
 
 
 
713
  .sidebar-right {
 
 
 
 
714
  width: 320px;
715
  background-color: var(--bg-sidebar);
716
  border-left: 1px solid var(--border-color);
717
  display: flex;
718
  flex-direction: column;
719
- height: 100%;
720
- flex-shrink: 0;
721
- transition: var(--transition-smooth);
722
- z-index: 100;
723
  }
724
 
725
  .sidebar-right.collapsed {
726
- width: 0;
727
- overflow: hidden;
728
- border-left: none;
729
  }
730
 
731
  .right-sidebar-header {
732
- padding: 16px 20px;
733
  border-bottom: 1px solid var(--border-color);
734
  display: flex;
735
  justify-content: space-between;
@@ -738,54 +634,41 @@ body {
738
 
739
  .right-sidebar-header h3 {
740
  font-family: var(--font-heading);
741
- font-size: 14px;
742
  font-weight: 600;
743
  color: var(--text-primary);
744
  }
745
 
746
- .btn-clear-chat {
747
- background: transparent;
748
- border: 1px solid var(--border-color);
749
- color: var(--text-secondary);
750
- padding: 5px 10px;
751
- border-radius: var(--border-radius-sm);
752
- font-size: 11px;
753
- font-weight: 500;
754
- cursor: pointer;
755
- display: flex;
756
- align-items: center;
757
- gap: 4px;
758
- transition: var(--transition-smooth);
759
  }
760
 
761
- .btn-clear-chat:hover {
762
- background-color: var(--btn-light-bg);
763
- color: var(--text-primary);
764
  }
765
 
766
  .sidebar-right-content {
767
  flex: 1;
768
  overflow-y: auto;
769
- padding: 20px;
770
  display: flex;
771
  flex-direction: column;
772
- gap: 16px;
773
  }
774
 
775
- /* Card Block Design (Right cards in screenshot) */
776
  .right-block-card {
777
  background-color: var(--bg-card);
778
  border: 1px solid var(--border-color);
779
  border-radius: var(--border-radius-md);
780
- padding: 16px;
781
  display: flex;
782
  flex-direction: column;
783
- gap: 12px;
784
  }
785
 
786
  .flex-1-card {
787
  flex: 1;
788
- min-height: 200px;
789
  }
790
 
791
  .card-block-header {
@@ -796,42 +679,20 @@ body {
796
 
797
  .block-title {
798
  font-family: var(--font-heading);
799
- font-size: 12.5px;
800
- font-weight: 700;
801
  color: var(--text-primary);
802
  }
803
 
804
- .block-icon {
805
- color: var(--text-muted);
806
- }
807
-
808
- .block-tip {
809
- font-size: 10.5px;
810
- color: var(--text-secondary);
811
- line-height: 1.3;
812
- }
813
-
814
- /* Small recommend Pill tag */
815
- .recommend-tag {
816
- font-size: 9px;
817
- font-weight: 700;
818
- text-transform: uppercase;
819
- background-color: #f3f4f6;
820
- color: #4b5563;
821
- padding: 1px 6px;
822
- border-radius: 4px;
823
- border: 1px solid #e5e7eb;
824
- }
825
-
826
- /* Settings Inputs inside cards */
827
  input[type="password"] {
828
  width: 100%;
829
- background-color: #fafafa;
830
  border: 1px solid var(--border-color);
831
  border-radius: var(--border-radius-sm);
832
  color: var(--text-primary);
833
- padding: 8px 12px;
834
- font-size: 12.5px;
835
  font-family: var(--font-body);
836
  transition: var(--transition-smooth);
837
  }
@@ -849,18 +710,17 @@ input[type="password"]:focus {
849
  }
850
 
851
  .password-wrapper input {
852
- padding-right: 36px;
853
  }
854
 
855
  .visibility-toggle {
856
  position: absolute;
857
- right: 8px;
858
  background: transparent;
859
  border: none;
860
  color: var(--text-muted);
861
  cursor: pointer;
862
  padding: 4px;
863
- border-radius: 4px;
864
  display: flex;
865
  align-items: center;
866
  }
@@ -869,12 +729,12 @@ input[type="password"]:focus {
869
  color: var(--text-primary);
870
  }
871
 
872
- /* Choice Picker Pills */
873
  .effort-picker {
874
  display: flex;
875
- background-color: #fafafa;
876
  border: 1px solid var(--border-color);
877
- padding: 3px;
878
  border-radius: var(--border-radius-sm);
879
  gap: 2px;
880
  }
@@ -895,8 +755,8 @@ input[type="password"]:focus {
895
 
896
  .effort-pill span {
897
  display: block;
898
- padding: 6px 0;
899
- font-size: 11.5px;
900
  font-weight: 500;
901
  border-radius: 4px;
902
  color: var(--text-secondary);
@@ -911,108 +771,39 @@ input[type="password"]:focus {
911
 
912
  .effort-pill:hover span:not(input:checked + span) {
913
  color: var(--text-primary);
914
- background-color: rgba(0,0,0,0.03);
915
- }
916
-
917
- /* Slider Controls */
918
- .slider-row {
919
- display: flex;
920
- justify-content: space-between;
921
- align-items: center;
922
- font-size: 11.5px;
923
- font-weight: 500;
924
- }
925
-
926
- .slider-val {
927
- font-family: var(--font-mono);
928
- color: var(--accent-blue);
929
- font-size: 11px;
930
- }
931
-
932
- input[type="range"] {
933
- -webkit-appearance: none;
934
- width: 100%;
935
- height: 3px;
936
- background: #e5e7eb;
937
- border-radius: 2px;
938
- outline: none;
939
- }
940
-
941
- input[type="range"]::-webkit-slider-thumb {
942
- -webkit-appearance: none;
943
- appearance: none;
944
- width: 12px;
945
- height: 12px;
946
- border-radius: 50%;
947
- background: #111827;
948
- cursor: pointer;
949
- transition: var(--transition-smooth);
950
- }
951
-
952
- input[type="range"]::-webkit-slider-thumb:hover {
953
- transform: scale(1.15);
954
- }
955
-
956
- /* Multimodal Shelf Uploader & chip logs */
957
- .drag-upload-zone {
958
- border: 1.5px dashed var(--border-color);
959
- border-radius: var(--border-radius-sm);
960
- padding: 16px;
961
- text-align: center;
962
- cursor: pointer;
963
- background: #fafafa;
964
- transition: var(--transition-smooth);
965
- display: flex;
966
- flex-direction: column;
967
- align-items: center;
968
- gap: 6px;
969
- color: var(--text-secondary);
970
- }
971
-
972
- .drag-upload-zone:hover {
973
- border-color: var(--border-focus);
974
- background: #fbfbfb;
975
- }
976
-
977
- .drag-upload-zone p {
978
- font-size: 12px;
979
- }
980
-
981
- .drag-upload-zone p span {
982
- font-weight: 600;
983
- text-decoration: underline;
984
  }
985
 
 
986
  .shelf-list {
987
  display: flex;
988
  flex-direction: column;
989
- gap: 8px;
990
  overflow-y: auto;
991
  }
992
 
993
  .empty-shelf-text {
994
- font-size: 11px;
995
  color: var(--text-muted);
996
  text-align: center;
997
- padding: 10px 0;
998
  font-style: italic;
999
  }
1000
 
1001
  .media-chip {
1002
  display: flex;
1003
  align-items: center;
1004
- background-color: #fafafa;
1005
  border: 1px solid var(--border-color);
1006
  border-radius: var(--border-radius-sm);
1007
- padding: 6px 10px;
1008
- gap: 10px;
1009
  transition: var(--transition-smooth);
1010
- position: relative;
1011
  }
1012
 
1013
  .media-chip-preview {
1014
- width: 28px;
1015
- height: 28px;
1016
  border-radius: 4px;
1017
  object-fit: cover;
1018
  background-color: #eaeaea;
@@ -1020,7 +811,7 @@ input[type="range"]::-webkit-slider-thumb:hover {
1020
  display: flex;
1021
  align-items: center;
1022
  justify-content: center;
1023
- font-size: 12px;
1024
  }
1025
 
1026
  .media-chip-preview img {
@@ -1035,7 +826,7 @@ input[type="range"]::-webkit-slider-thumb:hover {
1035
  }
1036
 
1037
  .media-chip-name {
1038
- font-size: 11px;
1039
  font-weight: 500;
1040
  white-space: nowrap;
1041
  overflow: hidden;
@@ -1044,10 +835,10 @@ input[type="range"]::-webkit-slider-thumb:hover {
1044
  }
1045
 
1046
  .media-chip-meta {
1047
- font-size: 9.5px;
1048
  color: var(--text-muted);
1049
  display: flex;
1050
- gap: 6px;
1051
  }
1052
 
1053
  .media-chip-remove {
@@ -1055,20 +846,18 @@ input[type="range"]::-webkit-slider-thumb:hover {
1055
  border: none;
1056
  color: var(--text-muted);
1057
  cursor: pointer;
1058
- padding: 4px;
1059
- border-radius: 4px;
1060
  display: flex;
1061
  }
1062
 
1063
  .media-chip-remove:hover {
1064
  color: var(--danger);
1065
- background-color: #fee2e2;
1066
  }
1067
 
1068
- /* Quick Shelf Attachment Thumbnail inside textarea */
1069
  .quick-preview-item {
1070
- width: 36px;
1071
- height: 36px;
1072
  border-radius: var(--border-radius-sm);
1073
  border: 1px solid var(--border-color);
1074
  overflow: hidden;
@@ -1084,31 +873,30 @@ input[type="range"]::-webkit-slider-thumb:hover {
1084
 
1085
  .quick-preview-badge {
1086
  position: absolute;
1087
- top: 2px;
1088
- right: 2px;
1089
  background-color: var(--accent-blue);
1090
- width: 8px;
1091
- height: 8px;
1092
  border-radius: 50%;
1093
  }
1094
 
1095
- /* Right Sidebar Footer indicator */
1096
  .right-sidebar-footer {
1097
- padding: 12px 20px;
1098
  border-top: 1px solid var(--border-color);
1099
  }
1100
 
1101
  .status-indicator-group {
1102
  display: flex;
1103
  align-items: center;
1104
- gap: 8px;
1105
- font-size: 11px;
1106
  color: var(--text-secondary);
1107
  }
1108
 
1109
  .status-dot {
1110
- width: 6px;
1111
- height: 6px;
1112
  border-radius: 50%;
1113
  }
1114
 
@@ -1118,10 +906,10 @@ input[type="range"]::-webkit-slider-thumb:hover {
1118
 
1119
  /* Loading animations */
1120
  .spinner-light {
1121
- width: 14px;
1122
- height: 14px;
1123
- border: 2px solid rgba(255, 255, 255, 0.2);
1124
- border-top: 2px solid #ffffff;
1125
  border-radius: 50%;
1126
  animation: spin 0.8s linear infinite;
1127
  }
@@ -1132,6 +920,81 @@ input[type="range"]::-webkit-slider-thumb:hover {
1132
  }
1133
 
1134
  @keyframes slideUp {
1135
- from { opacity: 0; transform: translateY(10px); }
1136
  to { opacity: 1; transform: translateY(0); }
1137
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* StepFun Studio Ultra-Minimalist & Mobile-Friendly Style Sheet */
2
  :root {
3
  --bg-primary: #f8f9fa;
4
  --bg-workspace: #f8f9fa;
5
  --bg-card: #ffffff;
6
  --bg-sidebar: #ffffff;
 
7
 
8
  --border-color: #e5e7eb;
9
  --border-light: #f1f2f4;
10
  --border-focus: #111827;
11
 
12
+ --accent-blue: #2563eb;
13
  --accent-blue-bg: #eff6ff;
14
 
15
  --text-primary: #111827;
16
  --text-secondary: #4b5563;
17
  --text-muted: #9ca3af;
18
+ --danger: #ef4444;
19
 
 
 
20
  --btn-light-bg: #f3f4f6;
21
  --btn-light-hover: #e5e7eb;
22
 
 
24
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
  --font-mono: 'Fira Code', monospace;
26
 
27
+ --transition-smooth: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
28
  --border-radius-sm: 8px;
29
  --border-radius-md: 12px;
30
  --border-radius-lg: 16px;
31
  --border-radius-pill: 100px;
32
 
33
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
34
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.03), 0 2px 4px -1px rgba(0, 0, 0, 0.01);
35
+ --shadow-lg: 0 10px 30px -10px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02);
36
  }
37
 
38
+ /* Reset Rules */
39
  * {
40
  margin: 0;
41
  padding: 0;
 
54
  -webkit-font-smoothing: antialiased;
55
  }
56
 
57
+ /* Custom Scrollbars */
58
  ::-webkit-scrollbar {
59
+ width: 4px;
60
+ height: 4px;
61
  }
62
 
63
  ::-webkit-scrollbar-track {
 
73
  background: #cbd5e1;
74
  }
75
 
76
+ /* Parent container */
77
  .app-container {
78
  display: flex;
79
  height: 100vh;
 
82
  position: relative;
83
  }
84
 
85
+ /* Main Workspace taking 100vw */
86
+ .main-workspace {
87
+ flex: 1;
 
 
88
  display: flex;
89
  flex-direction: column;
90
  height: 100%;
91
+ background-color: var(--bg-workspace);
 
 
 
 
 
 
92
  overflow: hidden;
93
+ position: relative;
94
+ width: 100%;
95
  }
96
 
97
+ /* Clean Header Bar */
98
+ .workspace-header {
99
+ height: 56px;
100
+ border-bottom: 1px solid var(--border-color);
101
+ background-color: var(--bg-card);
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: space-between;
105
+ padding: 0 20px;
106
+ z-index: 10;
107
  }
108
 
109
+ .header-brand {
110
  display: flex;
111
  align-items: center;
112
  gap: 10px;
 
114
 
115
  .brand-name {
116
  font-family: var(--font-heading);
117
+ font-size: 15px;
118
  font-weight: 700;
119
  letter-spacing: -0.3px;
120
  color: var(--text-primary);
121
  }
122
 
123
+ .header-actions {
 
124
  display: flex;
125
+ gap: 8px;
 
 
126
  }
127
 
128
+ /* Simplified Header Buttons */
129
+ .header-btn {
130
  display: flex;
131
  align-items: center;
132
+ gap: 6px;
133
+ background-color: transparent;
134
+ border: 1px solid var(--border-color);
135
  border-radius: var(--border-radius-sm);
136
  color: var(--text-secondary);
137
+ padding: 6px 12px;
138
+ font-size: 12.5px;
139
  font-weight: 500;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  cursor: pointer;
 
 
 
 
 
141
  transition: var(--transition-smooth);
142
+ outline: none;
143
  }
144
 
145
+ .header-btn:hover {
146
  background-color: var(--btn-light-bg);
147
  color: var(--text-primary);
148
  }
149
 
150
+ .header-btn svg {
151
+ flex-shrink: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  }
153
 
154
+ /* Viewport Layout */
155
  .workspace-viewport {
156
  flex: 1;
157
  overflow-y: auto;
 
159
  flex-direction: column;
160
  }
161
 
162
+ /* Studio Dashboard (Empty state) */
163
  .studio-dashboard {
164
+ max-width: 640px;
165
  width: 100%;
166
+ margin: auto;
167
+ padding: 40px 20px;
168
  display: flex;
169
  flex-direction: column;
170
  align-items: center;
 
172
 
173
  .welcome-heading {
174
  font-family: var(--font-heading);
175
+ font-size: 26px;
176
  font-weight: 600;
177
  color: var(--text-primary);
178
+ margin-bottom: 24px;
179
+ letter-spacing: -0.4px;
180
  text-align: center;
181
  }
182
 
183
+ /* Console Container Box */
184
  .console-box {
185
  width: 100%;
186
  background-color: var(--bg-card);
187
  border: 1px solid var(--border-color);
188
  border-radius: var(--border-radius-lg);
189
+ box-shadow: var(--shadow-md);
190
+ padding: 12px 16px;
191
  display: flex;
192
  flex-direction: column;
193
+ gap: 10px;
194
  transition: var(--transition-smooth);
195
+ margin-bottom: 36px;
196
  }
197
 
198
  .console-box:focus-within {
199
  border-color: var(--border-focus);
200
+ box-shadow: var(--shadow-lg);
201
  }
202
 
203
  .console-box textarea {
 
206
  outline: none;
207
  resize: none;
208
  font-family: var(--font-body);
209
+ font-size: 14.5px;
210
  color: var(--text-primary);
211
  background: transparent;
212
+ line-height: 1.45;
213
  min-height: 50px;
214
  }
215
 
 
217
  color: var(--text-muted);
218
  }
219
 
220
+ /* Inner preview shelf inside console drawer */
221
  .inner-shelf-preview,
222
  .mini-shelf-preview {
223
  display: flex;
224
  flex-wrap: wrap;
225
+ gap: 6px;
226
+ padding-bottom: 2px;
227
  }
228
 
 
229
  .console-action-row {
230
  display: flex;
231
  justify-content: space-between;
232
  align-items: center;
233
  border-top: 1px solid var(--border-light);
234
+ padding-top: 10px;
235
  }
236
 
237
+ /* Action button circle */
238
  .circle-btn-action {
239
+ width: 28px;
240
+ height: 28px;
241
  border-radius: 50%;
242
  border: 1px solid var(--border-color);
243
  background: transparent;
 
247
  align-items: center;
248
  justify-content: center;
249
  transition: var(--transition-smooth);
250
+ outline: none;
251
  }
252
 
253
  .circle-btn-action:hover {
254
  background-color: var(--btn-light-bg);
255
  color: var(--text-primary);
 
256
  }
257
 
258
+ /* Send button dark circle */
259
  .circle-btn-send {
260
+ width: 28px;
261
+ height: 28px;
262
  border-radius: 50%;
263
  border: none;
264
  background-color: #1f2937;
 
268
  align-items: center;
269
  justify-content: center;
270
  transition: var(--transition-smooth);
271
+ outline: none;
272
  }
273
 
274
  .circle-btn-send:hover {
275
  background-color: #111827;
 
 
 
 
 
276
  }
277
 
278
+ /* Ultra-minimal Showcase chips (Decluttered) */
279
  .showcase-section {
280
  width: 100%;
281
  }
282
 
283
+ .showcase-title {
284
+ font-size: 12.5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  color: var(--text-secondary);
286
+ margin-bottom: 12px;
287
+ text-align: center;
288
  font-weight: 500;
289
  }
290
 
291
+ .showcase-chips-row {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  display: flex;
293
+ gap: 10px;
294
+ justify-content: center;
295
+ flex-wrap: wrap;
 
 
 
 
 
 
296
  }
297
 
298
+ .recipe-chip {
 
 
 
 
299
  display: flex;
300
  align-items: center;
301
+ gap: 8px;
302
+ padding: 8px 16px;
303
+ border-radius: var(--border-radius-pill);
304
+ background-color: var(--bg-card);
305
+ border: 1px solid var(--border-color);
306
+ cursor: pointer;
307
+ transition: var(--transition-smooth);
308
+ font-size: 12px;
309
+ font-weight: 500;
310
+ color: var(--text-secondary);
311
+ box-shadow: var(--shadow-sm);
312
  }
313
 
314
+ .recipe-chip:hover {
315
+ background-color: var(--btn-light-bg);
316
+ border-color: #cbd5e1;
 
 
317
  color: var(--text-primary);
318
+ transform: translateY(-1px);
 
 
 
 
 
 
 
 
319
  }
320
 
321
+ .recipe-chip:active {
322
+ transform: translateY(0);
 
 
 
 
 
 
 
 
 
 
323
  }
324
 
325
+ .chip-icon {
326
+ font-size: 14px;
 
327
  }
328
 
329
+ /* Chat thread viewport */
330
  .chat-thread-container {
331
  flex: 1;
332
  display: flex;
 
338
  .chat-messages-feed {
339
  flex: 1;
340
  overflow-y: auto;
341
+ padding: 24px;
342
  display: flex;
343
  flex-direction: column;
344
+ gap: 24px;
345
+ max-width: 680px;
346
  width: 100%;
347
  margin: 0 auto;
348
  }
349
 
350
+ /* Message bubbles */
351
  .message-bubble {
352
  display: flex;
353
  flex-direction: column;
354
+ gap: 4px;
355
+ max-width: 90%;
356
+ animation: slideUp 0.25s ease-out;
357
  }
358
 
359
  .message-bubble.user {
 
363
  .message-bubble.assistant {
364
  align-self: flex-start;
365
  width: 100%;
366
+ max-width: 100%;
367
  }
368
 
369
  .message-meta {
370
+ font-size: 10px;
371
  color: var(--text-muted);
372
  font-weight: 600;
373
  margin: 0 4px;
 
378
  }
379
 
380
  .message-body {
381
+ padding: 10px 14px;
382
  border-radius: var(--border-radius-md);
383
+ font-size: 13.5px;
384
+ line-height: 1.5;
385
  box-shadow: var(--shadow-sm);
386
  }
387
 
 
399
  border-bottom-left-radius: 4px;
400
  }
401
 
402
+ /* Bubble attachments grid */
403
  .bubble-attachments {
404
  display: grid;
405
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
406
+ gap: 6px;
407
+ margin-top: 8px;
408
+ max-width: 320px;
409
  }
410
 
411
  .bubble-attachment-card {
 
433
  color: #fff;
434
  font-size: 8px;
435
  text-align: center;
436
+ padding: 1px;
437
  font-family: var(--font-mono);
438
  }
439
 
440
+ /* Collapsible Thoughts nodes */
441
  .thought-container {
442
+ margin-bottom: 12px;
443
  border: 1px solid var(--border-color);
444
  border-radius: var(--border-radius-sm);
445
  overflow: hidden;
 
446
  }
447
 
448
  .thought-header {
449
  display: flex;
450
  justify-content: space-between;
451
  align-items: center;
452
+ padding: 6px 10px;
453
+ background-color: #f9fafb;
454
  cursor: pointer;
455
  user-select: none;
456
  transition: var(--transition-smooth);
457
  }
458
 
459
  .thought-header:hover {
460
+ background-color: #f3f4f6;
461
  }
462
 
463
  .thought-title-group {
 
465
  align-items: center;
466
  gap: 6px;
467
  font-family: var(--font-heading);
468
+ font-size: 11px;
469
  font-weight: 600;
470
  color: var(--text-secondary);
471
  }
472
 
473
  .thought-timer {
474
  font-family: var(--font-mono);
475
+ font-size: 9.5px;
476
  color: var(--text-muted);
477
  }
478
 
479
  .thought-toggle-icon {
480
+ font-size: 9px;
481
  color: var(--text-secondary);
482
  transition: transform 0.2s ease;
483
  }
 
487
  }
488
 
489
  .thought-content {
490
+ padding: 10px 12px;
491
  font-family: var(--font-mono);
492
+ font-size: 11.5px;
493
  color: var(--text-secondary);
494
  background-color: #ffffff;
495
  border-top: 1px solid var(--border-color);
496
  white-space: pre-wrap;
497
+ max-height: 150px;
498
  overflow-y: auto;
499
  }
500
 
 
502
  display: none;
503
  }
504
 
505
+ /* Markdown typography rendering inside bubbles */
506
  .markdown-body h1,
507
  .markdown-body h2,
508
  .markdown-body h3 {
509
+ margin-top: 12px;
510
+ margin-bottom: 4px;
511
  font-family: var(--font-heading);
512
  font-weight: 600;
513
  }
514
 
515
+ .markdown-body h1 { font-size: 14.5px; border-bottom: 1px solid var(--border-light); padding-bottom: 2px; }
516
+ .markdown-body h2 { font-size: 13.5px; }
517
+ .markdown-body h3 { font-size: 12.5px; }
518
 
519
  .markdown-body p {
520
+ margin-bottom: 6px;
521
  }
522
 
523
  .markdown-body p:last-child {
 
526
 
527
  .markdown-body code {
528
  font-family: var(--font-mono);
529
+ font-size: 11px;
530
  background-color: var(--btn-light-bg);
531
+ padding: 2px 4px;
532
  border-radius: 4px;
533
  color: var(--accent-blue);
534
  }
535
 
536
  .markdown-body pre {
537
+ margin: 10px 0;
538
  border-radius: var(--border-radius-sm);
539
  overflow: hidden;
540
  border: 1px solid var(--border-color);
 
542
 
543
  .markdown-body pre code {
544
  display: block;
545
+ padding: 10px;
546
  overflow-x: auto;
547
  background-color: #0f172a !important;
548
  color: #e2e8f0;
 
551
  .markdown-body table {
552
  width: 100%;
553
  border-collapse: collapse;
554
+ margin: 10px 0;
555
+ font-size: 12px;
556
  }
557
 
558
  .markdown-body th,
559
  .markdown-body td {
560
  border: 1px solid var(--border-color);
561
+ padding: 6px 8px;
562
  text-align: left;
563
  }
564
 
 
567
  font-weight: 600;
568
  }
569
 
570
+ /* Reply footer box */
571
  .chat-mini-footer {
572
+ padding: 12px 20px;
573
  background-color: var(--bg-workspace);
574
  border-top: 1px solid var(--border-color);
575
  }
576
 
577
  .chat-mini-footer .console-box {
578
+ max-width: 680px;
579
  margin: 0 auto;
580
+ box-shadow: var(--shadow-sm);
581
+ padding: 8px 12px;
582
  border-radius: var(--border-radius-md);
583
+ margin-bottom: 0;
584
+ }
585
+
586
+ /* Backdrop Overlay for mobile Settings slide */
587
+ .sidebar-overlay {
588
+ position: absolute;
589
+ top: 0;
590
+ left: 0;
591
+ right: 0;
592
+ bottom: 0;
593
+ background-color: rgba(0, 0, 0, 0.2);
594
+ backdrop-filter: blur(1.5px);
595
+ z-index: 990;
596
+ opacity: 0;
597
+ pointer-events: none;
598
+ transition: opacity 0.2s ease;
599
  }
600
 
601
+ .sidebar-overlay.active {
602
+ opacity: 1;
603
+ pointer-events: auto;
604
+ }
605
+
606
+ /* Collapsible Right settings Drawer */
607
  .sidebar-right {
608
+ position: absolute;
609
+ top: 0;
610
+ right: 0;
611
+ bottom: 0;
612
  width: 320px;
613
  background-color: var(--bg-sidebar);
614
  border-left: 1px solid var(--border-color);
615
  display: flex;
616
  flex-direction: column;
617
+ z-index: 1000;
618
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
619
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.03);
620
+ transform: translateX(0);
621
  }
622
 
623
  .sidebar-right.collapsed {
624
+ transform: translateX(100%);
 
 
625
  }
626
 
627
  .right-sidebar-header {
628
+ padding: 14px 20px;
629
  border-bottom: 1px solid var(--border-color);
630
  display: flex;
631
  justify-content: space-between;
 
634
 
635
  .right-sidebar-header h3 {
636
  font-family: var(--font-heading);
637
+ font-size: 13.5px;
638
  font-weight: 600;
639
  color: var(--text-primary);
640
  }
641
 
642
+ .close-drawer {
643
+ border-color: transparent !important;
 
 
 
 
 
 
 
 
 
 
 
644
  }
645
 
646
+ .close-drawer:hover {
647
+ background-color: var(--btn-light-bg) !important;
 
648
  }
649
 
650
  .sidebar-right-content {
651
  flex: 1;
652
  overflow-y: auto;
653
+ padding: 16px;
654
  display: flex;
655
  flex-direction: column;
656
+ gap: 14px;
657
  }
658
 
 
659
  .right-block-card {
660
  background-color: var(--bg-card);
661
  border: 1px solid var(--border-color);
662
  border-radius: var(--border-radius-md);
663
+ padding: 14px;
664
  display: flex;
665
  flex-direction: column;
666
+ gap: 10px;
667
  }
668
 
669
  .flex-1-card {
670
  flex: 1;
671
+ min-height: 180px;
672
  }
673
 
674
  .card-block-header {
 
679
 
680
  .block-title {
681
  font-family: var(--font-heading);
682
+ font-size: 12px;
683
+ font-weight: 600;
684
  color: var(--text-primary);
685
  }
686
 
687
+ /* Password Toggle and Credentials field */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
688
  input[type="password"] {
689
  width: 100%;
690
+ background-color: #f9fafb;
691
  border: 1px solid var(--border-color);
692
  border-radius: var(--border-radius-sm);
693
  color: var(--text-primary);
694
+ padding: 7px 10px;
695
+ font-size: 12px;
696
  font-family: var(--font-body);
697
  transition: var(--transition-smooth);
698
  }
 
710
  }
711
 
712
  .password-wrapper input {
713
+ padding-right: 32px;
714
  }
715
 
716
  .visibility-toggle {
717
  position: absolute;
718
+ right: 6px;
719
  background: transparent;
720
  border: none;
721
  color: var(--text-muted);
722
  cursor: pointer;
723
  padding: 4px;
 
724
  display: flex;
725
  align-items: center;
726
  }
 
729
  color: var(--text-primary);
730
  }
731
 
732
+ /* Effort Radio Buttons Pills */
733
  .effort-picker {
734
  display: flex;
735
+ background-color: #f9fafb;
736
  border: 1px solid var(--border-color);
737
+ padding: 2.5px;
738
  border-radius: var(--border-radius-sm);
739
  gap: 2px;
740
  }
 
755
 
756
  .effort-pill span {
757
  display: block;
758
+ padding: 5px 0;
759
+ font-size: 11px;
760
  font-weight: 500;
761
  border-radius: 4px;
762
  color: var(--text-secondary);
 
771
 
772
  .effort-pill:hover span:not(input:checked + span) {
773
  color: var(--text-primary);
774
+ background-color: rgba(0,0,0,0.02);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
775
  }
776
 
777
+ /* Uploader & Media chips settings list */
778
  .shelf-list {
779
  display: flex;
780
  flex-direction: column;
781
+ gap: 6px;
782
  overflow-y: auto;
783
  }
784
 
785
  .empty-shelf-text {
786
+ font-size: 10.5px;
787
  color: var(--text-muted);
788
  text-align: center;
789
+ padding: 8px 0;
790
  font-style: italic;
791
  }
792
 
793
  .media-chip {
794
  display: flex;
795
  align-items: center;
796
+ background-color: #f9fafb;
797
  border: 1px solid var(--border-color);
798
  border-radius: var(--border-radius-sm);
799
+ padding: 5px 8px;
800
+ gap: 8px;
801
  transition: var(--transition-smooth);
 
802
  }
803
 
804
  .media-chip-preview {
805
+ width: 24px;
806
+ height: 24px;
807
  border-radius: 4px;
808
  object-fit: cover;
809
  background-color: #eaeaea;
 
811
  display: flex;
812
  align-items: center;
813
  justify-content: center;
814
+ font-size: 10px;
815
  }
816
 
817
  .media-chip-preview img {
 
826
  }
827
 
828
  .media-chip-name {
829
+ font-size: 10.5px;
830
  font-weight: 500;
831
  white-space: nowrap;
832
  overflow: hidden;
 
835
  }
836
 
837
  .media-chip-meta {
838
+ font-size: 9px;
839
  color: var(--text-muted);
840
  display: flex;
841
+ gap: 4px;
842
  }
843
 
844
  .media-chip-remove {
 
846
  border: none;
847
  color: var(--text-muted);
848
  cursor: pointer;
849
+ padding: 3px;
 
850
  display: flex;
851
  }
852
 
853
  .media-chip-remove:hover {
854
  color: var(--danger);
 
855
  }
856
 
857
+ /* Attachment preview thumbnail inside input fields */
858
  .quick-preview-item {
859
+ width: 32px;
860
+ height: 32px;
861
  border-radius: var(--border-radius-sm);
862
  border: 1px solid var(--border-color);
863
  overflow: hidden;
 
873
 
874
  .quick-preview-badge {
875
  position: absolute;
876
+ top: 1.5px;
877
+ right: 1.5px;
878
  background-color: var(--accent-blue);
879
+ width: 6px;
880
+ height: 6px;
881
  border-radius: 50%;
882
  }
883
 
 
884
  .right-sidebar-footer {
885
+ padding: 10px 16px;
886
  border-top: 1px solid var(--border-color);
887
  }
888
 
889
  .status-indicator-group {
890
  display: flex;
891
  align-items: center;
892
+ gap: 6px;
893
+ font-size: 10.5px;
894
  color: var(--text-secondary);
895
  }
896
 
897
  .status-dot {
898
+ width: 5px;
899
+ height: 5px;
900
  border-radius: 50%;
901
  }
902
 
 
906
 
907
  /* Loading animations */
908
  .spinner-light {
909
+ width: 12px;
910
+ height: 12px;
911
+ border: 1.5px solid rgba(255, 255, 255, 0.2);
912
+ border-top: 1.5px solid #ffffff;
913
  border-radius: 50%;
914
  animation: spin 0.8s linear infinite;
915
  }
 
920
  }
921
 
922
  @keyframes slideUp {
923
+ from { opacity: 0; transform: translateY(8px); }
924
  to { opacity: 1; transform: translateY(0); }
925
  }
926
+
927
+ /* ==========================================================================
928
+ Responsive & Mobile Design Rules
929
+ ========================================================================== */
930
+
931
+ /* Drawer behavior on Tablet and Desktop */
932
+ @media (min-width: 641px) {
933
+ .sidebar-right.collapsed {
934
+ transform: translateX(100%);
935
+ }
936
+
937
+ /* When settings are open, we can optionally squeeze the workspace */
938
+ .app-container:not(.settings-collapsed) .main-workspace {
939
+ /* Only apply if you want layout shifting. Slicing over is cleaner! */
940
+ }
941
+ }
942
+
943
+ /* Ultra-mobile scaling details (screens < 640px) */
944
+ @media (max-width: 640px) {
945
+ body {
946
+ font-size: 13.5px;
947
+ }
948
+
949
+ .workspace-header {
950
+ padding: 0 16px;
951
+ }
952
+
953
+ /* Header action labels hidden, only icons visible */
954
+ .header-btn span {
955
+ display: none;
956
+ }
957
+
958
+ .header-btn {
959
+ padding: 8px;
960
+ }
961
+
962
+ /* Settings slides covers 100% width on mobile */
963
+ .sidebar-right {
964
+ width: 100% !important;
965
+ border-left: none;
966
+ }
967
+
968
+ .studio-dashboard {
969
+ padding: 30px 16px;
970
+ }
971
+
972
+ .welcome-heading {
973
+ font-size: 22px;
974
+ margin-bottom: 20px;
975
+ }
976
+
977
+ /* Chat thread viewport layout */
978
+ .chat-messages-feed {
979
+ padding: 16px;
980
+ gap: 18px;
981
+ }
982
+
983
+ .message-body {
984
+ padding: 9px 12px;
985
+ font-size: 13px;
986
+ }
987
+
988
+ .message-bubble {
989
+ max-width: 95%;
990
+ }
991
+
992
+ .chat-mini-footer {
993
+ padding: 10px 12px;
994
+ }
995
+
996
+ .recipe-chip {
997
+ padding: 6px 12px;
998
+ font-size: 11.5px;
999
+ }
1000
+ }