IC-Custom / app /stylesheets.py
Yaowei222's picture
Initial commit
12edc27
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Centralized CSS and JS for the IC-Custom app UI.
Expose helpers:
- get_css(): return a single CSS string for gradio Blocks(css=...)
- get_js(): return an JS for gradio.
"""
def get_css() -> str:
return r"""
/* Global Optimization Effects - No Layout Changes */
/* Apple-style segmented control for radio buttons */
#customization_mode_radio .wrap, #input_mask_mode_radio .wrap, #seg_ref_mode_radio .wrap {
display: flex;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
gap: 0;
background: rgba(255, 255, 255, 0.8);
border: 1px solid var(--neutral-200);
border-radius: 10px;
padding: 3px;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.08);
}
#customization_mode_radio .wrap label, #input_mask_mode_radio .wrap label, #seg_ref_mode_radio .wrap label {
display: flex;
flex: 1;
justify-content: center;
align-items: center;
margin: 0;
padding: 10px 16px;
box-sizing: border-box;
border-radius: 7px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: transparent;
border: none;
font-weight: 500;
font-size: 0.9rem;
color: var(--text-secondary);
cursor: pointer;
position: relative;
white-space: nowrap;
min-width: 0;
}
/* Hide the actual radio input */
#customization_mode_radio .wrap label input[type="radio"],
#input_mask_mode_radio .wrap label input[type="radio"],
#seg_ref_mode_radio .wrap label input[type="radio"] {
display: none;
}
/* Hover states */
#customization_mode_radio .wrap label:hover,
#input_mask_mode_radio .wrap label:hover,
#seg_ref_mode_radio .wrap label:hover {
background: rgba(14, 165, 233, 0.1);
color: var(--primary-blue);
}
/* Selected state with smooth background */
#customization_mode_radio .wrap label:has(input[type="radio"]:checked),
#input_mask_mode_radio .wrap label:has(input[type="radio"]:checked),
#seg_ref_mode_radio .wrap label:has(input[type="radio"]:checked) {
background: var(--primary-blue);
color: white;
font-weight: 600;
box-shadow: 0 2px 6px rgba(14, 165, 233, 0.25);
transform: none;
}
/* Fallback for browsers that don't support :has() */
#customization_mode_radio .wrap label input[type="radio"]:checked + *,
#input_mask_mode_radio .wrap label input[type="radio"]:checked + *,
#seg_ref_mode_radio .wrap label input[type="radio"]:checked + * {
color: white;
}
#customization_mode_radio .wrap:has(input[type="radio"]:checked) label:has(input[type="radio"]:checked),
#input_mask_mode_radio .wrap:has(input[type="radio"]:checked) label:has(input[type="radio"]:checked),
#seg_ref_mode_radio .wrap:has(input[type="radio"]:checked) label:has(input[type="radio"]:checked) {
background: var(--primary-blue);
}
/* Active state */
#customization_mode_radio .wrap label:active,
#input_mask_mode_radio .wrap label:active,
#seg_ref_mode_radio .wrap label:active {
transform: scale(0.98);
}
/* Elegant header styling */
.elegant-header {
text-align: center;
margin: 0 0 2rem 0;
padding: 0;
}
.header-content {
display: inline-block;
padding: 1.8rem 2.5rem;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.1) 0%,
rgba(255, 255, 255, 0.05) 100%);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 20px;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow:
0 8px 32px rgba(15, 23, 42, 0.04),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
transition: all 0.4s ease;
position: relative;
overflow: hidden;
}
.header-content::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent,
rgba(255, 255, 255, 0.1),
transparent);
transition: left 0.6s ease;
}
.header-content:hover::before {
left: 100%;
}
.header-content:hover {
transform: translateY(-2px);
box-shadow:
0 12px 40px rgba(15, 23, 42, 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
border-color: rgba(14, 165, 233, 0.2);
}
/* Main title styling */
.main-title {
margin: 0 0 0.8rem 0;
font-size: 2.4rem;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
.title-icon {
font-size: 2.2rem;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
}
.title-text {
background: linear-gradient(135deg, #0ea5e9 0%, #06b6d4 50%, #10b981 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-shadow: none;
position: relative;
}
/* Subtitle styling */
.subtitle {
margin: 0 0 1.2rem 0;
font-size: 1rem;
color: #64748b;
font-weight: 500;
letter-spacing: 0.025em;
opacity: 0.9;
}
/* Header badges container */
.header-badges {
display: flex;
justify-content: center;
gap: 0.8rem;
flex-wrap: wrap;
}
/* Individual badge links */
.badge-link {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.5rem 1rem;
background: rgba(255, 255, 255, 0.15);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
color: #475569;
text-decoration: none;
font-weight: 500;
font-size: 0.9rem;
transition: all 0.3s ease;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
position: relative;
overflow: hidden;
}
.badge-link::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: var(--primary-gradient);
transition: left 0.3s ease;
z-index: -1;
}
.badge-link:hover::before {
left: 0;
}
.badge-link:hover {
transform: translateY(-2px);
color: white;
border-color: transparent;
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
}
.badge-icon {
font-size: 1rem;
opacity: 0.8;
}
.badge-text {
font-weight: 600;
}
/* Getting Started Guide Styling */
.getting-started-container {
padding: 1.5rem;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.15);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
box-shadow: 0 4px 16px rgba(15, 23, 42, 0.06);
}
.guide-header {
text-align: center;
margin-bottom: 1.5rem;
}
.guide-title {
color: var(--text-primary);
margin: 0 0 0.5rem 0;
font-size: 1.2rem;
font-weight: 700;
}
.guide-subtitle {
color: var(--text-muted);
margin: 0;
font-size: 0.9rem;
opacity: 0.9;
}
/* Info card */
.info-card {
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
padding: 1rem;
margin-bottom: 1.2rem;
border-left: 3px solid var(--primary-blue);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
transition: all 0.3s ease;
}
.info-card:hover {
background: rgba(255, 255, 255, 0.5);
transform: translateX(2px);
}
.info-content {
color: var(--text-secondary);
font-size: 0.9rem;
line-height: 1.5;
}
.brand-name {
color: var(--primary-blue);
font-weight: 700;
}
/* Mode badges */
.mode-badge {
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-size: 0.8rem;
font-weight: 600;
margin: 0 0.2rem;
transition: all 0.2s ease;
}
.mode-badge.position-aware {
background: var(--badge-blue-bg);
color: var(--badge-blue-text);
}
.mode-badge.position-free {
background: var(--badge-green-bg);
color: var(--badge-green-text);
}
/* Step cards */
.step-card {
background: rgba(255, 255, 255, 0.4);
border-radius: 8px;
padding: 1rem;
margin-bottom: 1.2rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.step-card::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
transition: all 0.3s ease;
}
.step-card.common-steps::before {
background: var(--neutral-500);
}
.step-card.position-aware-steps::before {
background: var(--position-aware-blue);
}
.step-card.position-free-steps::before {
background: var(--position-free-purple);
}
.step-card:hover {
background: rgba(255, 255, 255, 0.5);
transform: translateX(2px);
}
.step-header {
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.75rem;
display: flex;
align-items: center;
font-size: 0.95rem;
}
.step-number {
color: white;
border-radius: 50%;
width: 24px;
height: 24px;
display: inline-flex;
align-items: center;
justify-content: center;
margin-right: 0.5rem;
font-size: 0.75rem;
font-weight: 700;
}
.common-steps .step-number {
background: var(--neutral-500);
}
.position-aware-steps .step-number {
background: var(--position-aware-blue);
}
.position-free-steps .step-number {
background: var(--position-free-purple);
}
.step-list {
margin: 0;
padding-left: 1.2rem;
font-size: 0.85rem;
color: var(--text-secondary);
line-height: 1.6;
}
.step-list li {
margin-bottom: 0.4rem;
position: relative;
}
.step-list li:last-child {
margin-bottom: 0;
}
/* Run buttons */
.run-button {
padding: 0.2rem 0.5rem;
border-radius: 4px;
font-weight: 600;
font-size: 0.8rem;
color: white;
transition: all 0.2s ease;
}
.run-button.position-aware {
background: var(--position-aware-blue);
}
.run-button.position-free {
background: var(--position-free-purple);
}
/* Tips card */
.tips-card {
background: rgba(241, 245, 249, 0.6);
border-radius: 8px;
padding: 0.8rem;
border-left: 3px solid var(--neutral-400);
margin-bottom: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
transition: all 0.3s ease;
}
.tips-card:hover {
background: rgba(241, 245, 249, 0.8);
transform: translateX(2px);
}
.tips-content {
font-size: 0.8rem;
color: var(--text-tips);
line-height: 1.5;
}
/* Key hints */
.key-hint {
background: var(--kbd-bg);
color: var(--kbd-text);
padding: 0.1rem 0.3rem;
border-radius: 3px;
font-size: 0.75em;
border: 1px solid var(--kbd-border);
font-family: monospace;
font-weight: 500;
transition: all 0.2s ease;
}
.key-hint:hover {
background: var(--primary-blue);
color: white;
border-color: var(--primary-blue);
}
/* Final message */
.final-message {
padding: 0.8rem;
background: var(--bg-final);
border-radius: 8px;
text-align: center;
transition: all 0.3s ease;
}
.final-message:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.1);
}
.final-text {
color: var(--text-final);
font-weight: 600;
font-size: 0.85rem;
}
/* Legacy header badge styling for backward compatibility */
.header-badge {
background: var(--primary-gradient);
color: white;
padding: 0.5rem 1rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.9rem;
transition: all 0.3s ease;
box-shadow: 0 1px 3px rgba(14, 165, 233, 0.2);
display: inline-block;
}
.header-badge:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(14, 165, 233, 0.3);
text-decoration: none;
}
/* Accordion styling matching getting_started */
.gradio-accordion {
border: 1px solid rgba(14, 165, 233, 0.2);
border-radius: 8px;
overflow: visible !important; /* Allow dropdown to overflow */
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%);
}
/* Ensure accordion content area allows dropdown overflow */
.gradio-accordion .wrap {
overflow: visible !important;
}
.gradio-accordion > .label-wrap {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%);
border-bottom: 1px solid rgba(14, 165, 233, 0.2);
padding: 1rem 1.5rem;
font-weight: 600;
color: var(--text-primary);
}
/* Minimal dropdown styling - let Gradio handle positioning naturally */
#aspect_ratio_dropdown {
border-radius: 8px;
}
/* COMPLETELY REMOVE all dropdown styling - let Gradio handle everything */
/* This was causing the dropdown to display as a text block instead of options */
/* DO NOT style .gradio-dropdown globally - causes functionality issues */
/* Slider styling matching theme */
.gradio-slider {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 8px !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
padding: 12px !important;
}
.gradio-slider:hover {
border-color: rgba(14, 165, 233, 0.3) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.15) !important;
}
/* Slider input styling */
.gradio-slider input[type="range"] {
background: transparent !important;
}
.gradio-slider input[type="range"]::-webkit-slider-track {
background: rgba(14, 165, 233, 0.2) !important;
border-radius: 4px !important;
}
.gradio-slider input[type="range"]::-webkit-slider-thumb {
background: var(--primary-blue) !important;
border: 2px solid white !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.3) !important;
}
/* Checkbox styling matching theme */
.gradio-checkbox {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 8px !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
padding: 8px 12px !important;
}
/* Specific styling for identified components */
#aspect_ratio_dropdown,
#text_prompt,
#move_to_center_checkbox,
#use_bg_preservation_checkbox {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 8px !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
}
/* Removed specific aspect_ratio_dropdown styling to avoid conflicts */
#aspect_ratio_dropdown:hover,
#text_prompt:hover,
#move_to_center_checkbox:hover,
#use_bg_preservation_checkbox:hover {
border-color: rgba(14, 165, 233, 0.3) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.15) !important;
}
/* Textbox specific styling */
#text_prompt textarea {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 8px !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
}
/* Color variables matching getting_started section exactly */
:root {
/* Primary colors from getting_started */
--primary-blue: #0ea5e9;
--primary-blue-secondary: #06b6d4;
--primary-green: #10b981;
--primary-gradient: linear-gradient(135deg, #0ea5e9 0%, #06b6d4 50%, #10b981 100%);
/* Mode-specific colors from getting_started */
--position-aware-blue: #3b82f6;
--position-free-purple: #8b5cf6;
/* Badge colors from getting_started */
--badge-blue-bg: #dbeafe;
--badge-blue-text: #1e40af;
--badge-green-bg: #dcfce7;
--badge-green-text: #166534;
/* Neutral colors from getting_started */
--neutral-50: #f8fafc;
--neutral-100: #f1f5f9;
--neutral-200: #e2e8f0;
--neutral-300: #cbd5e1;
--neutral-400: #94a3b8;
--neutral-500: #64748b;
--neutral-600: #475569;
--neutral-700: #334155;
--neutral-800: #1e293b;
/* Text colors from getting_started */
--text-primary: #1e293b;
--text-secondary: #4b5563;
--text-muted: #64748b;
--text-tips: #475569;
--text-final: #0c4a6e;
/* Background colors from getting_started */
--bg-primary: white;
--bg-secondary: #f8fafc;
--bg-tips: #f1f5f9;
--bg-final: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);
/* Keyboard hint styles from getting_started */
--kbd-bg: #e2e8f0;
--kbd-text: #475569;
--kbd-border: #cbd5e1;
}
/* Global smooth transitions - exclude dropdowns */
*:not(.gradio-dropdown):not(.gradio-dropdown *) {
transition: all 0.2s ease;
}
/* Focus states using getting_started primary blue - exclude dropdowns */
button:focus,
input:not(.gradio-dropdown input):focus,
select:not(.gradio-dropdown select):focus,
textarea:not(.gradio-dropdown textarea):focus {
outline: none;
box-shadow: 0 0 0 2px rgba(14, 165, 233, 0.3);
}
/* Subtle hover effects for interactive elements - exclude dropdowns */
button:not(.gradio-dropdown button):hover {
transform: translateY(-1px);
}
/* Global text styling matching getting_started */
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: var(--text-secondary);
background-color: var(--bg-secondary);
}
/* Enhanced form element styling - exclude dropdowns from global styling */
input:not(.gradio-dropdown input),
textarea:not(.gradio-dropdown textarea),
select:not(.gradio-dropdown select) {
border-radius: 8px;
border: 1px solid rgba(14, 165, 233, 0.2);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
color: var(--text-primary);
transition: all 0.3s ease;
padding: 12px 16px;
font-size: 0.95rem;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
}
input:not(.gradio-dropdown input):focus,
textarea:not(.gradio-dropdown textarea):focus,
select:not(.gradio-dropdown select):focus {
border-color: var(--primary-blue);
box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1), 0 2px 8px rgba(14, 165, 233, 0.15);
background: linear-gradient(135deg, rgba(255, 255, 255, 1) 0%, rgba(240, 249, 255, 0.98) 100%);
outline: none;
transform: translateY(-1px);
}
input:not(.gradio-dropdown input):hover,
textarea:not(.gradio-dropdown textarea):hover,
select:not(.gradio-dropdown select):hover {
border-color: rgba(14, 165, 233, 0.3);
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.12);
}
/* Textbox specific styling */
.gradio-textbox {
border-radius: 12px;
overflow: hidden;
}
.gradio-textbox textarea {
border-radius: 12px;
resize: vertical;
min-height: 44px;
}
/* Scrollbar styling matching getting_started */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: var(--neutral-100);
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: var(--neutral-400);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--primary-blue);
}
/* Enhanced button styling with Apple-style refinement */
button {
border-radius: 8px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid var(--neutral-200);
position: relative;
overflow: hidden;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
/* Button hover glow effect */
button::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
background: radial-gradient(circle, rgba(14, 165, 233, 0.1) 0%, transparent 70%);
transition: all 0.4s ease;
transform: translate(-50%, -50%);
pointer-events: none;
}
button:hover::after {
width: 200px;
height: 200px;
}
/* Primary button using unified primary blue */
button[variant="primary"] {
background: var(--primary-blue);
border-color: var(--primary-blue);
color: white;
box-shadow: 0 2px 6px rgba(14, 165, 233, 0.2);
}
button[variant="primary"]:hover {
background: #0284c7;
border-color: #0284c7;
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
transform: translateY(-1px);
}
/* Secondary buttons */
button[variant="secondary"], .secondary-button {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%);
border: 1px solid rgba(14, 165, 233, 0.2);
color: var(--text-secondary);
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
}
button[variant="secondary"]:hover, .secondary-button:hover {
background: var(--primary-blue);
border-color: var(--primary-blue);
color: white;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.25);
}
/* VLM buttons with subtle, elegant styling */
#vlm_generate_btn, #vlm_polish_btn {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
color: var(--text-secondary) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
font-weight: 500;
border-radius: 8px;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
#vlm_generate_btn::before, #vlm_polish_btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(14, 165, 233, 0.1), transparent);
transition: left 0.5s ease;
}
#vlm_generate_btn:hover::before, #vlm_polish_btn:hover::before {
left: 100%;
}
#vlm_generate_btn:hover, #vlm_polish_btn:hover {
background: var(--primary-blue) !important;
border-color: var(--primary-blue) !important;
color: white !important;
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.25);
transform: translateY(-1px);
}
#vlm_generate_btn:active, #vlm_polish_btn:active {
transform: translateY(0px);
box-shadow: 0 2px 6px rgba(14, 165, 233, 0.2);
}
/* Enhanced image styling with fixed dimensions for consistency */
.gradio-image, .gradio-imageeditor {
height: 300px !important;
width: 100% !important;
padding: 0 !important;
margin: 0 !important;
}
.gradio-image img,
.gradio-imageeditor img {
height: 300px !important;
width: 100% !important;
object-fit: contain !important;
border-radius: 8px;
transition: all 0.3s ease;
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.1);
}
.gradio-image img:hover,
.gradio-imageeditor img:hover {
transform: scale(1.02);
box-shadow: 0 4px 16px rgba(15, 23, 42, 0.15);
}
/* Gallery CSS - contained adaptive layout with theme colors */
#mask_gallery, #result_gallery, .custom-gallery {
overflow: visible !important; /* Allow progress indicator to show */
position: relative !important;
width: 100% !important;
height: auto !important;
max-height: 75vh !important;
min-height: 300px !important;
display: flex !important;
flex-direction: column !important;
padding: 6px !important;
margin: 0 !important;
border-radius: 12px !important;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
}
/* Gallery containers with contained but flexible display */
#mask_gallery .gradio-gallery, #result_gallery .gradio-gallery {
width: 100% !important;
height: auto !important;
min-height: 280px !important;
max-height: 70vh !important;
padding: 8px !important;
overflow: auto !important;
display: flex !important;
flex-direction: column !important;
border-radius: 8px !important;
}
/* Only hide specific duplicate elements that cause the problem */
#mask_gallery > div > div:nth-child(n+2),
#result_gallery > div > div:nth-child(n+2) {
display: none !important;
}
/* Alternative: hide duplicate grid structures only */
#mask_gallery .gradio-gallery:nth-child(n+2),
#result_gallery .gradio-gallery:nth-child(n+2) {
display: none !important;
}
/* Ensure timing and status elements are NOT hidden by the above rules */
#result_gallery .status,
#result_gallery .timer,
#result_gallery [class*="time"],
#result_gallery [class*="status"],
#result_gallery [class*="duration"],
#result_gallery .gradio-status,
#result_gallery .gradio-timer,
#result_gallery .gradio-info,
#result_gallery [data-testid*="timer"],
#result_gallery [data-testid*="status"] {
display: block !important;
visibility: visible !important;
opacity: 1 !important;
position: relative !important;
z-index: 1000 !important;
}
/* Gallery images - contained adaptive display */
#mask_gallery img, #result_gallery img {
width: 100% !important;
height: auto !important;
max-width: 100% !important;
max-height: 60vh !important;
object-fit: contain !important;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.1);
display: block !important;
margin: 0 auto !important;
}
/* Main preview image styling - contained but responsive */
#mask_gallery .preview-image, #result_gallery .preview-image {
width: 100% !important;
height: auto !important;
max-width: 100% !important;
max-height: 55vh !important;
border-radius: 12px;
box-shadow: 0 4px 16px rgba(15, 23, 42, 0.15);
object-fit: contain !important;
display: block !important;
margin: 0 auto !important;
}
/* Gallery content wrappers - ensure no height constraints */
#mask_gallery .gradio-gallery > div,
#result_gallery .gradio-gallery > div {
width: 100% !important;
height: auto !important;
min-height: auto !important;
max-height: none !important;
overflow: visible !important;
}
/* Gallery image containers - remove any height limits */
#mask_gallery .image-container,
#result_gallery .image-container,
#mask_gallery [data-testid="image"],
#result_gallery [data-testid="image"] {
width: 100% !important;
height: auto !important;
max-height: none !important;
overflow: visible !important;
}
/* Controlled gallery wrapper elements */
#mask_gallery .image-wrapper,
#result_gallery .image-wrapper {
max-height: 60vh !important;
overflow: hidden !important;
}
/* Specific targeting for Gradio's internal gallery elements */
#mask_gallery .grid-wrap,
#result_gallery .grid-wrap,
#mask_gallery .preview-wrap,
#result_gallery .preview-wrap {
height: auto !important;
max-height: 65vh !important;
overflow: auto !important;
border-radius: 8px !important;
}
/* Ensure gallery grids are properly sized within container */
#mask_gallery .grid,
#result_gallery .grid {
height: auto !important;
max-height: 60vh !important;
display: grid !important;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)) !important;
gap: 8px !important;
align-items: start !important;
overflow: auto !important;
padding: 4px !important;
}
/* Custom scrollbar for gallery */
#mask_gallery .gradio-gallery::-webkit-scrollbar,
#result_gallery .gradio-gallery::-webkit-scrollbar,
#mask_gallery .grid::-webkit-scrollbar,
#result_gallery .grid::-webkit-scrollbar {
width: 6px;
height: 6px;
}
#mask_gallery .gradio-gallery::-webkit-scrollbar-track,
#result_gallery .gradio-gallery::-webkit-scrollbar-track,
#mask_gallery .grid::-webkit-scrollbar-track,
#result_gallery .grid::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.1);
border-radius: 3px;
}
#mask_gallery .gradio-gallery::-webkit-scrollbar-thumb,
#result_gallery .gradio-gallery::-webkit-scrollbar-thumb,
#mask_gallery .grid::-webkit-scrollbar-thumb,
#result_gallery .grid::-webkit-scrollbar-thumb {
background: var(--neutral-400);
border-radius: 3px;
}
#mask_gallery .gradio-gallery::-webkit-scrollbar-thumb:hover,
#result_gallery .gradio-gallery::-webkit-scrollbar-thumb:hover,
#mask_gallery .grid::-webkit-scrollbar-thumb:hover,
#result_gallery .grid::-webkit-scrollbar-thumb:hover {
background: var(--primary-blue);
}
/* Thumbnail navigation styling in preview mode */
#mask_gallery .thumbnail, #result_gallery .thumbnail {
opacity: 0.7;
transition: opacity 0.3s ease;
border-radius: 6px;
}
#mask_gallery .thumbnail:hover, #result_gallery .thumbnail:hover,
#mask_gallery .thumbnail.selected, #result_gallery .thumbnail.selected {
opacity: 1;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.3);
}
/* Improved layout spacing and organization */
#glass_card .gradio-row {
gap: 16px !important;
margin-bottom: 6px !important;
}
#glass_card .gradio-column {
gap: 10px !important;
}
/* Better section spacing with theme colors */
#glass_card .gradio-group {
margin-bottom: 6px !important;
padding: 10px !important;
border-radius: 8px !important;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(240, 249, 255, 0.9) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.15) !important;
box-shadow: 0 1px 3px rgba(14, 165, 233, 0.05) !important;
transition: all 0.3s ease !important;
overflow: visible !important; /* Allow dropdown to overflow */
}
#glass_card .gradio-group:hover {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border-color: rgba(14, 165, 233, 0.25) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.12) !important;
/* transform removed to prevent layout shift that hides dropdown */
}
/* Enhanced button styling for improved UX */
button[variant="secondary"] {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
color: var(--text-secondary) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
transition: all 0.3s ease !important;
}
button[variant="secondary"]:hover {
background: var(--primary-blue) !important;
border-color: var(--primary-blue) !important;
color: white !important;
transform: translateY(-1px) !important;
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.25) !important;
}
/* Markdown header improvements */
.gradio-markdown h1, .gradio-markdown h2, .gradio-markdown h3 {
color: var(--text-primary) !important;
font-weight: 600 !important;
margin-bottom: 8px !important;
margin-top: 4px !important;
}
/* Radio button container improvements */
#customization_mode_radio, #input_mask_mode_radio, #seg_ref_mode_radio {
margin-bottom: 0px !important;
margin-top: 0px !important;
}
/* Reduce space between markdown headers and subsequent components */
.gradio-markdown + .gradio-group {
margin-top: 1px !important;
}
.gradio-markdown + .gradio-image,
.gradio-markdown + .gradio-imageeditor,
.gradio-markdown + .gradio-textbox,
.gradio-markdown + .gradio-gallery {
margin-top: 1px !important;
}
/* Specific spacing adjustments for numbered sections */
.gradio-markdown:has(h1), .gradio-markdown:has(h2), .gradio-markdown:has(h3) {
margin-bottom: 2px !important;
}
/* Remove padding from image and gallery containers */
.gradio-image, .gradio-imageeditor, .gradio-gallery {
padding: 0 !important;
margin: 0 !important;
}
/* Image container styling with theme colors */
.gradio-image, .gradio-imageeditor {
border-radius: 12px;
overflow: hidden;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
transition: all 0.3s ease;
}
.gradio-image:hover, .gradio-imageeditor:hover {
border-color: var(--primary-blue) !important;
box-shadow: 0 4px 16px rgba(14, 165, 233, 0.15) !important;
transform: translateY(-1px);
}
/* Image upload area styling */
.gradio-image .upload-container,
.gradio-imageeditor .upload-container,
.gradio-image > div,
.gradio-imageeditor > div {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 12px !important;
}
/* Image upload placeholder styling */
.gradio-image .upload-text,
.gradio-imageeditor .upload-text,
.gradio-image [data-testid="upload-text"],
.gradio-imageeditor [data-testid="upload-text"] {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
color: var(--text-secondary) !important;
}
/* Image preview area */
.gradio-image .image-container,
.gradio-imageeditor .image-container,
.gradio-image .preview-container,
.gradio-imageeditor .preview-container {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border-radius: 12px !important;
}
/* Specific targeting for image upload areas */
.gradio-image .wrap,
.gradio-imageeditor .wrap,
.gradio-image .block,
.gradio-imageeditor .block {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
border-radius: 12px !important;
}
/* Image drop zone styling */
.gradio-image .drop-zone,
.gradio-imageeditor .drop-zone,
.gradio-image .upload-area,
.gradio-imageeditor .upload-area {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 2px dashed rgba(14, 165, 233, 0.3) !important;
border-radius: 12px !important;
}
/* Force override any white backgrounds in image components */
.gradio-image *,
.gradio-imageeditor * {
background-color: transparent !important;
}
.gradio-image .gradio-image,
.gradio-imageeditor .gradio-imageeditor {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
}
/* Specific styling for Reference Image and Target Images */
#reference_image,
#target_image_1,
#target_image_2 {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 1px solid rgba(14, 165, 233, 0.2) !important;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1) !important;
border-radius: 12px !important;
}
#reference_image *,
#target_image_1 *,
#target_image_2 * {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border-radius: 12px !important;
}
/* Upload area for specific image components */
#reference_image .upload-container,
#target_image_1 .upload-container,
#target_image_2 .upload-container,
#reference_image .drop-zone,
#target_image_1 .drop-zone,
#target_image_2 .drop-zone {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%) !important;
border: 2px dashed rgba(14, 165, 233, 0.3) !important;
border-radius: 12px !important;
}
/* Hover effects for specific image components */
#reference_image:hover,
#target_image_1:hover,
#target_image_2:hover {
border-color: var(--primary-blue) !important;
box-shadow: 0 4px 16px rgba(14, 165, 233, 0.15) !important;
transform: translateY(-1px);
}
/* Group styling matching getting_started white cards */
.group, .gradio-group {
border-radius: 8px;
background: var(--bg-primary);
border: 1px solid var(--neutral-200);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
/* Subtle page background with theme colors */
body, .gradio-container {
background: linear-gradient(135deg, #f8fafc 0%, #f0f9ff 50%, #f8fafc 100%);
min-height: 100vh;
}
/* Global glass container with subtle Apple-style gradient */
#global_glass_container {
position: relative;
border-radius: 20px;
padding: 16px;
margin: 12px auto;
max-width: 1400px;
background: linear-gradient(145deg,
rgba(248, 250, 252, 0.98),
rgba(241, 245, 249, 0.95));
box-shadow:
0 20px 40px rgba(15, 23, 42, 0.08),
0 8px 24px rgba(15, 23, 42, 0.06),
inset 0 1px 0 rgba(255, 255, 255, 0.9);
border: 1px solid rgba(226, 232, 240, 0.7);
transition: all 0.3s ease;
overflow: visible !important; /* Allow dropdown to overflow */
}
/* Subtle gradient overlay for Apple effect */
#global_glass_container::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 250px;
background: linear-gradient(135deg,
rgba(14, 165, 233, 0.08) 0%,
rgba(6, 182, 212, 0.06) 25%,
rgba(16, 185, 129, 0.08) 50%,
rgba(139, 92, 246, 0.06) 75%,
rgba(14, 165, 233, 0.08) 100%);
background-size: 300% 300%;
animation: subtleGradientShift 15s ease-in-out infinite;
pointer-events: none;
z-index: 0;
}
@keyframes subtleGradientShift {
0%, 100% {
background-position: 0% 50%;
opacity: 0.8;
}
50% {
background-position: 100% 50%;
opacity: 1;
}
}
/* Ensure content is above the gradient overlay */
#global_glass_container > * {
position: relative;
z-index: 1;
}
/* Hover effect for global container - transform disabled to avoid dropdown reposition */
#global_glass_container:hover {
/* transform: translateY(-2px); */
box-shadow:
0 25px 50px rgba(15, 23, 42, 0.08),
0 12px 30px rgba(15, 23, 42, 0.06),
inset 0 1px 0 rgba(255, 255, 255, 0.9);
border-color: rgba(226, 232, 240, 0.8);
}
/* Subtle border highlight for global container */
#global_glass_container::before {
content: "";
position: absolute;
inset: 0;
border-radius: 20px;
padding: 1px;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.8),
rgba(226, 232, 240, 0.4),
rgba(255, 255, 255, 0.6),
rgba(226, 232, 240, 0.3)
);
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
z-index: 0;
}
/* Inner glassmorphism container with theme colors */
#glass_card {
position: relative;
border-radius: 16px;
padding: 16px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.6) 0%, rgba(240, 249, 255, 0.5) 100%);
box-shadow:
0 8px 24px rgba(14, 165, 233, 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.7);
border: 1px solid rgba(14, 165, 233, 0.2);
margin-bottom: 12px;
transition: all 0.3s ease;
overflow: visible !important; /* Allow dropdown to overflow */
}
#glass_card:hover {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.7) 0%, rgba(240, 249, 255, 0.6) 100%);
border-color: rgba(14, 165, 233, 0.3);
box-shadow:
0 12px 32px rgba(14, 165, 233, 0.12),
inset 0 1px 0 rgba(255, 255, 255, 0.8);
}
/* Subtle inner border gradient for liquid glass feel */
#glass_card::before {
content: "";
position: absolute;
inset: 0;
border-radius: 16px;
padding: 1px;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.6),
rgba(226, 232, 240, 0.2));
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
/* Preserve the airy layout inside the cards */
#global_glass_container .gradio-column { gap: 12px; }
#glass_card .gradio-row { gap: 16px; }
#glass_card .gradio-column { gap: 12px; }
#glass_card .gradio-group { margin: 8px 0; }
/* Text selection matching getting_started colors */
::selection {
background: var(--badge-blue-bg);
color: var(--badge-blue-text);
}
/* Placeholder styling */
::placeholder {
color: var(--text-muted);
opacity: 0.8;
}
/* Improved error state styling */
.error {
border-color: #ef4444 !important;
box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.1) !important;
}
/* Success state using getting_started green */
.success-state {
border-color: var(--primary-green) !important;
box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.1) !important;
}
/* Label styling */
.gradio-label {
color: var(--text-primary);
font-weight: 600;
}
/* Markdown content styling */
.markdown-body {
color: var(--text-secondary);
line-height: 1.6;
}
.markdown-body h1, .markdown-body h2, .markdown-body h3 {
color: var(--text-primary);
}
/* Step indicators styling */
.gradio-markdown h1, .gradio-markdown h2, .gradio-markdown h3,
.gradio-markdown p {
margin: 0.25rem 0;
}
/* Enhanced step indicators with numbers */
.gradio-markdown:contains("1."), .gradio-markdown:contains("2."),
.gradio-markdown:contains("3."), .gradio-markdown:contains("4."),
.gradio-markdown:contains("5."), .gradio-markdown:contains("6."),
.gradio-markdown:contains("7.") {
position: relative;
padding-left: 2.5rem;
color: var(--text-primary);
font-weight: 600;
}
/* Specific button styling */
#undo_btnSEG, #dilate_btn, #erode_btn, #bounding_box_btn {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(240, 249, 255, 0.95) 100%);
border: 1px solid rgba(14, 165, 233, 0.2);
color: var(--text-secondary);
font-weight: 500;
padding: 8px 16px;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(14, 165, 233, 0.1);
transition: all 0.3s ease;
}
#undo_btnSEG:hover, #dilate_btn:hover, #erode_btn:hover, #bounding_box_btn:hover {
background: var(--primary-blue);
border-color: var(--primary-blue);
color: white;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
}
/* Submit button enhanced styling - unified with primary blue */
button[variant="primary"], .gradio-button.primary {
background: var(--primary-blue);
border-color: var(--primary-blue);
color: white;
font-weight: 600;
font-size: 1rem;
padding: 12px 24px;
box-shadow: 0 4px 16px rgba(14, 165, 233, 0.25);
transition: all 0.3s ease;
}
button[variant="primary"]:hover, .gradio-button.primary:hover {
background: #0284c7;
border-color: #0284c7;
box-shadow: 0 6px 20px rgba(14, 165, 233, 0.4);
transform: translateY(-2px);
}
/* Improved button states */
button:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
box-shadow: none !important;
}
button:disabled::after {
display: none;
}
button.processing {
background: var(--neutral-400) !important;
border-color: var(--neutral-400) !important;
cursor: wait;
animation: processingPulse 2s ease-in-out infinite;
}
@keyframes processingPulse {
0%, 100% { opacity: 0.8; }
50% { opacity: 1; }
}
/* Responsive improvements */
@media (max-width: 768px) {
.header-content {
padding: 1.2rem 1.8rem;
margin: 0 1rem;
}
.main-title {
font-size: 2rem;
}
.title-icon {
font-size: 1.8rem;
}
.subtitle {
font-size: 0.9rem;
}
.header-badges {
gap: 0.6rem;
}
.badge-link {
padding: 0.4rem 0.8rem;
font-size: 0.85rem;
}
.header-badge {
padding: 0.4rem 0.8rem;
font-size: 0.85rem;
}
/* Getting Started responsive */
.getting-started-container {
padding: 1rem;
margin: 0 0.5rem;
}
.guide-title {
font-size: 1.1rem;
}
.guide-subtitle {
font-size: 0.85rem;
}
.step-card {
padding: 0.8rem;
margin-bottom: 1rem;
}
.step-header {
font-size: 0.9rem;
}
.step-number {
width: 22px;
height: 22px;
font-size: 0.7rem;
}
.step-list {
font-size: 0.8rem;
padding-left: 1rem;
}
.tips-card {
padding: 0.6rem;
}
.tips-content {
font-size: 0.75rem;
}
.final-message {
padding: 0.6rem;
}
.final-text {
font-size: 0.8rem;
}
button {
min-height: 44px;
}
input, textarea, select {
min-height: 44px;
}
/* Mobile optimization for subtle effects */
#global_glass_container {
padding: 16px;
margin: 8px;
border-radius: 16px;
}
#global_glass_container::after {
height: 180px;
animation-duration: 18s;
}
#glass_card {
padding: 20px;
margin: 10px;
border-radius: 12px;
}
#glass_card .gradio-row { gap: 12px; }
#glass_card .gradio-column { gap: 12px; }
}
/* Ensure gallery works properly in all screen sizes */
@media (min-width: 1200px) {
#mask_gallery .gradio-gallery, #result_gallery .gradio-gallery {
min-height: 300px !important;
max-height: 80vh !important;
}
.responsive-gallery .grid-container {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)) !important;
}
}
/* Fix for gallery duplicate content issue - ensure clean display */
#mask_gallery > div > div:nth-child(n+2),
#result_gallery > div > div:nth-child(n+2) {
display: none !important;
}
#mask_gallery .gradio-gallery:nth-child(n+2),
#result_gallery .gradio-gallery:nth-child(n+2) {
display: none !important;
}
"""