Update app.py
Browse files
app.py
CHANGED
|
@@ -117,27 +117,89 @@ class AnyCoder:
|
|
| 117 |
"""Create the professional sidebar"""
|
| 118 |
|
| 119 |
# Model Selection
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
show_label=False,
|
| 130 |
-
elem_classes=["example-gallery"],
|
| 131 |
-
columns=2,
|
| 132 |
-
rows=3,
|
| 133 |
-
height="auto",
|
| 134 |
-
container=False
|
| 135 |
-
)
|
| 136 |
-
|
| 137 |
|
| 138 |
# Model info display
|
| 139 |
model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
|
| 140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
# Project Configuration
|
| 142 |
with gr.Group(elem_classes=["control-group"]):
|
| 143 |
gr.HTML('<div class="group-title">โ๏ธ Project Settings</div>')
|
|
@@ -159,17 +221,12 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 159 |
container=False
|
| 160 |
)
|
| 161 |
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
advanced_mode = gr.Checkbox(
|
| 169 |
-
label="Advanced Mode",
|
| 170 |
-
value=False,
|
| 171 |
-
info="Show advanced options"
|
| 172 |
-
)
|
| 173 |
|
| 174 |
# Input Sources
|
| 175 |
with gr.Group(elem_classes=["control-group"]):
|
|
@@ -189,39 +246,17 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 189 |
|
| 190 |
image_input = gr.Image(
|
| 191 |
label="Design Reference Image",
|
| 192 |
-
visible=False,
|
| 193 |
container=False
|
| 194 |
)
|
| 195 |
|
| 196 |
-
#
|
| 197 |
with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
|
| 198 |
-
gr.HTML('<div class="group-title"
|
| 199 |
-
|
| 200 |
-
with gr.Row():
|
| 201 |
-
enable_images = gr.Checkbox(label="Images", value=False, scale=1)
|
| 202 |
-
enable_videos = gr.Checkbox(label="Videos", value=False, scale=1)
|
| 203 |
-
enable_music = gr.Checkbox(label="Music", value=False, scale=1)
|
| 204 |
|
| 205 |
media_prompts = gr.Textbox(
|
| 206 |
label="Media Generation Prompts",
|
| 207 |
placeholder="Describe media to generate...",
|
| 208 |
lines=2,
|
| 209 |
-
visible=False,
|
| 210 |
-
container=False
|
| 211 |
-
)
|
| 212 |
-
|
| 213 |
-
# Quick Examples
|
| 214 |
-
with gr.Group(elem_classes=["control-group"]):
|
| 215 |
-
gr.HTML('<div class="group-title">๐ Quick Start</div>')
|
| 216 |
-
|
| 217 |
-
example_gallery = gr.Gallery(
|
| 218 |
-
value=[demo["title"] for demo in DEMO_LIST[:6]], # text only, no NoneType
|
| 219 |
-
label="Example Projects",
|
| 220 |
-
show_label=False,
|
| 221 |
-
elem_classes=["example-gallery"],
|
| 222 |
-
columns=2,
|
| 223 |
-
rows=3,
|
| 224 |
-
height="auto",
|
| 225 |
container=False
|
| 226 |
)
|
| 227 |
|
|
@@ -236,13 +271,14 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 236 |
)
|
| 237 |
|
| 238 |
with gr.Row():
|
| 239 |
-
import_btn = gr.Button("Import", variant="secondary",
|
| 240 |
-
import_status = gr.HTML("", visible=False)
|
| 241 |
|
| 242 |
# Store sidebar components for event handling
|
| 243 |
self.sidebar_components = {
|
| 244 |
'model_dropdown': model_dropdown,
|
| 245 |
'model_info': model_info,
|
|
|
|
| 246 |
'language_dropdown': language_dropdown,
|
| 247 |
'search_toggle': search_toggle,
|
| 248 |
'advanced_mode': advanced_mode,
|
|
@@ -251,32 +287,64 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 251 |
'image_input': image_input,
|
| 252 |
'advanced_controls': advanced_controls,
|
| 253 |
'enable_images': enable_images,
|
| 254 |
-
'
|
|
|
|
|
|
|
| 255 |
'enable_music': enable_music,
|
| 256 |
'media_prompts': media_prompts,
|
| 257 |
-
'
|
| 258 |
'import_url': import_url,
|
| 259 |
'import_btn': import_btn,
|
| 260 |
'import_status': import_status
|
| 261 |
}
|
| 262 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
# Show advanced controls when enabled
|
| 264 |
-
advanced_mode.change(
|
| 265 |
lambda checked: gr.update(visible=checked),
|
| 266 |
-
inputs=[advanced_mode],
|
| 267 |
-
outputs=[advanced_controls]
|
| 268 |
)
|
| 269 |
|
| 270 |
# Show media prompts when any media generation is enabled
|
| 271 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 272 |
checkbox.change(
|
| 273 |
lambda *args: gr.update(visible=any(args)),
|
| 274 |
-
inputs=
|
| 275 |
-
outputs=[media_prompts]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
)
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 280 |
|
| 281 |
def create_main_content(self, history, current_model):
|
| 282 |
"""Create the main content area"""
|
|
@@ -461,12 +529,13 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 461 |
]
|
| 462 |
)
|
| 463 |
|
| 464 |
-
#
|
| 465 |
-
self.sidebar_components['
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
|
|
|
| 470 |
|
| 471 |
def handle_generation(self, prompt, file, website_url, image, language,
|
| 472 |
enable_search, current_model_state, history_state, session_state):
|
|
@@ -513,14 +582,18 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 513 |
# Apply media generation if enabled
|
| 514 |
if any([
|
| 515 |
session_state.get('enable_images', False),
|
| 516 |
-
session_state.get('
|
|
|
|
|
|
|
| 517 |
session_state.get('enable_music', False)
|
| 518 |
]):
|
| 519 |
processed_code = apply_generated_media_to_html(
|
| 520 |
processed_code,
|
| 521 |
prompt,
|
| 522 |
enable_text_to_image=session_state.get('enable_images', False),
|
| 523 |
-
|
|
|
|
|
|
|
| 524 |
enable_text_to_music=session_state.get('enable_music', False),
|
| 525 |
session_id=session_id
|
| 526 |
)
|
|
@@ -788,15 +861,6 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 788 |
[] # history
|
| 789 |
)
|
| 790 |
|
| 791 |
-
def handle_example_select(self, evt: gr.SelectData):
|
| 792 |
-
"""Handle example selection from gallery"""
|
| 793 |
-
try:
|
| 794 |
-
if evt.index is not None and evt.index < len(DEMO_LIST):
|
| 795 |
-
return DEMO_LIST[evt.index]['description']
|
| 796 |
-
return ""
|
| 797 |
-
except Exception:
|
| 798 |
-
return ""
|
| 799 |
-
|
| 800 |
def get_model_info_html(self, model):
|
| 801 |
"""Generate HTML for model information"""
|
| 802 |
vision_badge = '<span class="feature-badge vision">๐๏ธ Vision</span>' if model.get('supports_vision') else ''
|
|
@@ -913,7 +977,7 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 913 |
}
|
| 914 |
|
| 915 |
.control-group {
|
| 916 |
-
margin-bottom:
|
| 917 |
background: white;
|
| 918 |
padding: 16px;
|
| 919 |
border-radius: 8px;
|
|
@@ -930,6 +994,26 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 930 |
gap: 8px;
|
| 931 |
}
|
| 932 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 933 |
.input-group {
|
| 934 |
background: white;
|
| 935 |
padding: 24px;
|
|
@@ -1069,11 +1153,6 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 1069 |
color: #92400e;
|
| 1070 |
}
|
| 1071 |
|
| 1072 |
-
.example-gallery {
|
| 1073 |
-
border-radius: 8px;
|
| 1074 |
-
border: 1px solid #e5e7eb;
|
| 1075 |
-
}
|
| 1076 |
-
|
| 1077 |
.preview-message {
|
| 1078 |
text-align: center;
|
| 1079 |
padding: 40px 20px;
|
|
@@ -1101,22 +1180,6 @@ with gr.Group(elem_classes=["control-group"]):
|
|
| 1101 |
color: #6b7280;
|
| 1102 |
}
|
| 1103 |
|
| 1104 |
-
/* Dark mode adjustments */
|
| 1105 |
-
.dark .sidebar {
|
| 1106 |
-
background: #1f2937;
|
| 1107 |
-
border-color: #374151;
|
| 1108 |
-
}
|
| 1109 |
-
|
| 1110 |
-
.dark .control-group {
|
| 1111 |
-
background: #111827;
|
| 1112 |
-
border-color: #374151;
|
| 1113 |
-
}
|
| 1114 |
-
|
| 1115 |
-
.dark .input-group {
|
| 1116 |
-
background: #111827;
|
| 1117 |
-
border-color: #374151;
|
| 1118 |
-
}
|
| 1119 |
-
|
| 1120 |
/* Responsive design */
|
| 1121 |
@media (max-width: 768px) {
|
| 1122 |
.header-content {
|
|
|
|
| 117 |
"""Create the professional sidebar"""
|
| 118 |
|
| 119 |
# Model Selection
|
| 120 |
+
with gr.Group(elem_classes=["control-group"]):
|
| 121 |
+
gr.HTML('<div class="group-title">๐ค AI Model</div>')
|
| 122 |
+
|
| 123 |
+
model_dropdown = gr.Dropdown(
|
| 124 |
+
choices=[f"{model['name']} ({model['category']})" for model in AVAILABLE_MODELS],
|
| 125 |
+
value=f"{DEFAULT_MODEL['name']} ({DEFAULT_MODEL['category']})",
|
| 126 |
+
label="Select Model",
|
| 127 |
+
container=False
|
| 128 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
|
| 130 |
# Model info display
|
| 131 |
model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
|
| 132 |
|
| 133 |
+
# Web Search Toggle
|
| 134 |
+
with gr.Group(elem_classes=["control-group"]):
|
| 135 |
+
search_toggle = gr.Checkbox(
|
| 136 |
+
label="๐ Web search",
|
| 137 |
+
value=False,
|
| 138 |
+
info="Include generated images in your outputs using Qwen image model",
|
| 139 |
+
container=False
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
# Media Generation Controls
|
| 143 |
+
with gr.Group(elem_classes=["control-group"]):
|
| 144 |
+
gr.HTML('<div class="group-title">๐จ Media Generation</div>')
|
| 145 |
+
|
| 146 |
+
enable_images = gr.Checkbox(
|
| 147 |
+
label="๐ผ๏ธ Generate Images (text โ image)",
|
| 148 |
+
value=False,
|
| 149 |
+
info="Include generated images in your outputs using Qwen image model",
|
| 150 |
+
container=False
|
| 151 |
+
)
|
| 152 |
+
|
| 153 |
+
enable_image_to_image = gr.Checkbox(
|
| 154 |
+
label="๐ผ๏ธ Image to Image (uses input image)",
|
| 155 |
+
value=False,
|
| 156 |
+
info="Transform your uploaded image using Qwen image/edit",
|
| 157 |
+
container=False
|
| 158 |
+
)
|
| 159 |
+
|
| 160 |
+
enable_image_to_video = gr.Checkbox(
|
| 161 |
+
label="๐ฌ Image to Video (uses input image)",
|
| 162 |
+
value=False,
|
| 163 |
+
info="Generate a short video from your uploaded image using Lightricks LTX-Video",
|
| 164 |
+
container=False
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
enable_text_to_video = gr.Checkbox(
|
| 168 |
+
label="๐ฌ Generate Video (text โ video)",
|
| 169 |
+
value=False,
|
| 170 |
+
info="Generate a short video directly from your prompt using WanAi/Wan2.2-TIZV-S8",
|
| 171 |
+
container=False
|
| 172 |
+
)
|
| 173 |
+
|
| 174 |
+
enable_music = gr.Checkbox(
|
| 175 |
+
label="๐ต Generate Music (text โ music)",
|
| 176 |
+
value=False,
|
| 177 |
+
info="Compose short music from your prompt using ElevenLabs Music",
|
| 178 |
+
container=False
|
| 179 |
+
)
|
| 180 |
+
|
| 181 |
+
# Model Information
|
| 182 |
+
with gr.Group(elem_classes=["control-group"]):
|
| 183 |
+
model_display = gr.HTML(
|
| 184 |
+
'<div class="model-name">Qwen3-Coder-4800-A535-Instruc</div>',
|
| 185 |
+
elem_classes=["model-display"]
|
| 186 |
+
)
|
| 187 |
+
|
| 188 |
+
# Quick Start Examples
|
| 189 |
+
with gr.Group(elem_classes=["control-group"]):
|
| 190 |
+
gr.HTML('<div class="group-title">๐ Quick Start</div>')
|
| 191 |
+
|
| 192 |
+
# Create buttons for each demo instead of gallery
|
| 193 |
+
quick_start_buttons = []
|
| 194 |
+
for demo in DEMO_LIST[:6]:
|
| 195 |
+
btn = gr.Button(
|
| 196 |
+
demo["title"],
|
| 197 |
+
variant="secondary",
|
| 198 |
+
size="sm",
|
| 199 |
+
elem_classes=["quick-start-btn"]
|
| 200 |
+
)
|
| 201 |
+
quick_start_buttons.append(btn)
|
| 202 |
+
|
| 203 |
# Project Configuration
|
| 204 |
with gr.Group(elem_classes=["control-group"]):
|
| 205 |
gr.HTML('<div class="group-title">โ๏ธ Project Settings</div>')
|
|
|
|
| 221 |
container=False
|
| 222 |
)
|
| 223 |
|
| 224 |
+
advanced_mode = gr.Checkbox(
|
| 225 |
+
label="Advanced Mode",
|
| 226 |
+
value=False,
|
| 227 |
+
info="Show advanced options",
|
| 228 |
+
container=False
|
| 229 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
|
| 231 |
# Input Sources
|
| 232 |
with gr.Group(elem_classes=["control-group"]):
|
|
|
|
| 246 |
|
| 247 |
image_input = gr.Image(
|
| 248 |
label="Design Reference Image",
|
|
|
|
| 249 |
container=False
|
| 250 |
)
|
| 251 |
|
| 252 |
+
# Advanced Controls (initially hidden)
|
| 253 |
with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
|
| 254 |
+
gr.HTML('<div class="group-title">๐ง Advanced Options</div>')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
|
| 256 |
media_prompts = gr.Textbox(
|
| 257 |
label="Media Generation Prompts",
|
| 258 |
placeholder="Describe media to generate...",
|
| 259 |
lines=2,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 260 |
container=False
|
| 261 |
)
|
| 262 |
|
|
|
|
| 271 |
)
|
| 272 |
|
| 273 |
with gr.Row():
|
| 274 |
+
import_btn = gr.Button("Import", variant="secondary", size="sm")
|
| 275 |
+
import_status = gr.HTML("", visible=False)
|
| 276 |
|
| 277 |
# Store sidebar components for event handling
|
| 278 |
self.sidebar_components = {
|
| 279 |
'model_dropdown': model_dropdown,
|
| 280 |
'model_info': model_info,
|
| 281 |
+
'model_display': model_display,
|
| 282 |
'language_dropdown': language_dropdown,
|
| 283 |
'search_toggle': search_toggle,
|
| 284 |
'advanced_mode': advanced_mode,
|
|
|
|
| 287 |
'image_input': image_input,
|
| 288 |
'advanced_controls': advanced_controls,
|
| 289 |
'enable_images': enable_images,
|
| 290 |
+
'enable_image_to_image': enable_image_to_image,
|
| 291 |
+
'enable_image_to_video': enable_image_to_video,
|
| 292 |
+
'enable_text_to_video': enable_text_to_video,
|
| 293 |
'enable_music': enable_music,
|
| 294 |
'media_prompts': media_prompts,
|
| 295 |
+
'quick_start_buttons': quick_start_buttons,
|
| 296 |
'import_url': import_url,
|
| 297 |
'import_btn': import_btn,
|
| 298 |
'import_status': import_status
|
| 299 |
}
|
| 300 |
|
| 301 |
+
# Setup sidebar event handlers
|
| 302 |
+
self.setup_sidebar_events(session_state)
|
| 303 |
+
|
| 304 |
+
def setup_sidebar_events(self, session_state):
|
| 305 |
+
"""Setup sidebar-specific event handlers"""
|
| 306 |
+
|
| 307 |
# Show advanced controls when enabled
|
| 308 |
+
self.sidebar_components['advanced_mode'].change(
|
| 309 |
lambda checked: gr.update(visible=checked),
|
| 310 |
+
inputs=[self.sidebar_components['advanced_mode']],
|
| 311 |
+
outputs=[self.sidebar_components['advanced_controls']]
|
| 312 |
)
|
| 313 |
|
| 314 |
# Show media prompts when any media generation is enabled
|
| 315 |
+
media_checkboxes = [
|
| 316 |
+
self.sidebar_components['enable_images'],
|
| 317 |
+
self.sidebar_components['enable_image_to_image'],
|
| 318 |
+
self.sidebar_components['enable_image_to_video'],
|
| 319 |
+
self.sidebar_components['enable_text_to_video'],
|
| 320 |
+
self.sidebar_components['enable_music']
|
| 321 |
+
]
|
| 322 |
+
|
| 323 |
+
for checkbox in media_checkboxes:
|
| 324 |
checkbox.change(
|
| 325 |
lambda *args: gr.update(visible=any(args)),
|
| 326 |
+
inputs=media_checkboxes,
|
| 327 |
+
outputs=[self.sidebar_components['media_prompts']]
|
| 328 |
+
)
|
| 329 |
+
|
| 330 |
+
# Update session state when media options change
|
| 331 |
+
for i, checkbox in enumerate(media_checkboxes):
|
| 332 |
+
checkbox.change(
|
| 333 |
+
self.update_media_settings,
|
| 334 |
+
inputs=[checkbox],
|
| 335 |
+
outputs=[session_state]
|
| 336 |
)
|
| 337 |
+
|
| 338 |
+
def update_media_settings(self, *checkbox_values):
|
| 339 |
+
"""Update media generation settings in session state"""
|
| 340 |
+
settings = {
|
| 341 |
+
'enable_images': checkbox_values[0] if len(checkbox_values) > 0 else False,
|
| 342 |
+
'enable_image_to_image': checkbox_values[1] if len(checkbox_values) > 1 else False,
|
| 343 |
+
'enable_image_to_video': checkbox_values[2] if len(checkbox_values) > 2 else False,
|
| 344 |
+
'enable_text_to_video': checkbox_values[3] if len(checkbox_values) > 3 else False,
|
| 345 |
+
'enable_music': checkbox_values[4] if len(checkbox_values) > 4 else False
|
| 346 |
+
}
|
| 347 |
+
return settings
|
| 348 |
|
| 349 |
def create_main_content(self, history, current_model):
|
| 350 |
"""Create the main content area"""
|
|
|
|
| 529 |
]
|
| 530 |
)
|
| 531 |
|
| 532 |
+
# Quick start button handlers
|
| 533 |
+
for i, btn in enumerate(self.sidebar_components['quick_start_buttons']):
|
| 534 |
+
if i < len(DEMO_LIST):
|
| 535 |
+
btn.click(
|
| 536 |
+
lambda demo_idx=i: DEMO_LIST[demo_idx]['description'],
|
| 537 |
+
outputs=[self.main_components['input_textbox']]
|
| 538 |
+
)
|
| 539 |
|
| 540 |
def handle_generation(self, prompt, file, website_url, image, language,
|
| 541 |
enable_search, current_model_state, history_state, session_state):
|
|
|
|
| 582 |
# Apply media generation if enabled
|
| 583 |
if any([
|
| 584 |
session_state.get('enable_images', False),
|
| 585 |
+
session_state.get('enable_image_to_image', False),
|
| 586 |
+
session_state.get('enable_image_to_video', False),
|
| 587 |
+
session_state.get('enable_text_to_video', False),
|
| 588 |
session_state.get('enable_music', False)
|
| 589 |
]):
|
| 590 |
processed_code = apply_generated_media_to_html(
|
| 591 |
processed_code,
|
| 592 |
prompt,
|
| 593 |
enable_text_to_image=session_state.get('enable_images', False),
|
| 594 |
+
enable_image_to_image=session_state.get('enable_image_to_image', False),
|
| 595 |
+
enable_image_to_video=session_state.get('enable_image_to_video', False),
|
| 596 |
+
enable_text_to_video=session_state.get('enable_text_to_video', False),
|
| 597 |
enable_text_to_music=session_state.get('enable_music', False),
|
| 598 |
session_id=session_id
|
| 599 |
)
|
|
|
|
| 861 |
[] # history
|
| 862 |
)
|
| 863 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 864 |
def get_model_info_html(self, model):
|
| 865 |
"""Generate HTML for model information"""
|
| 866 |
vision_badge = '<span class="feature-badge vision">๐๏ธ Vision</span>' if model.get('supports_vision') else ''
|
|
|
|
| 977 |
}
|
| 978 |
|
| 979 |
.control-group {
|
| 980 |
+
margin-bottom: 16px;
|
| 981 |
background: white;
|
| 982 |
padding: 16px;
|
| 983 |
border-radius: 8px;
|
|
|
|
| 994 |
gap: 8px;
|
| 995 |
}
|
| 996 |
|
| 997 |
+
.model-display {
|
| 998 |
+
background: #f3f4f6;
|
| 999 |
+
padding: 8px 12px;
|
| 1000 |
+
border-radius: 6px;
|
| 1001 |
+
border: 1px solid #d1d5db;
|
| 1002 |
+
}
|
| 1003 |
+
|
| 1004 |
+
.model-display .model-name {
|
| 1005 |
+
font-family: 'Monaco', 'Consolas', monospace;
|
| 1006 |
+
font-size: 0.85rem;
|
| 1007 |
+
color: #374151;
|
| 1008 |
+
}
|
| 1009 |
+
|
| 1010 |
+
.quick-start-btn {
|
| 1011 |
+
width: 100%;
|
| 1012 |
+
margin-bottom: 4px;
|
| 1013 |
+
text-align: left;
|
| 1014 |
+
justify-content: flex-start;
|
| 1015 |
+
}
|
| 1016 |
+
|
| 1017 |
.input-group {
|
| 1018 |
background: white;
|
| 1019 |
padding: 24px;
|
|
|
|
| 1153 |
color: #92400e;
|
| 1154 |
}
|
| 1155 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1156 |
.preview-message {
|
| 1157 |
text-align: center;
|
| 1158 |
padding: 40px 20px;
|
|
|
|
| 1180 |
color: #6b7280;
|
| 1181 |
}
|
| 1182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1183 |
/* Responsive design */
|
| 1184 |
@media (max-width: 768px) {
|
| 1185 |
.header-content {
|