Spaces:
Sleeping
Sleeping
| /* ============================================================ | |
| ALEMBIC — Polished App Builder UI | |
| Light mode, inspired by Linear/Vercel/Stripe 2026 aesthetics | |
| Fonts: General Sans (display/body) + JetBrains Mono (code/tags) | |
| ============================================================ */ | |
| /* Visually hidden but stays in DOM for JS clicks */ | |
| .sr-only-btn { | |
| position: absolute ; | |
| width: 1px ; | |
| height: 1px ; | |
| padding: 0 ; | |
| margin: -1px ; | |
| overflow: hidden ; | |
| clip: rect(0, 0, 0, 0) ; | |
| white-space: nowrap ; | |
| border: 0 ; | |
| } | |
| :root { | |
| --bg-page: #f8f9fc; | |
| --bg-surface: #ffffff; | |
| --bg-muted: #f1f3f9; | |
| --bg-elevated: #ffffff; | |
| --border: #e2e5ef; | |
| --border-focus: #6366f1; | |
| --border-hover: #c7cad9; | |
| --text-primary: #0f1729; | |
| --text-secondary: #4b5563; | |
| --text-muted: #9ca3af; | |
| --text-link: #4f46e5; | |
| --accent: #4f46e5; | |
| --accent-hover: #4338ca; | |
| --accent-light: #eef2ff; | |
| --accent-gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); | |
| --success: #10b981; | |
| --success-bg: #d1fae5; | |
| --tag-bg: #f1f3f9; | |
| --tag-text: #4b5563; | |
| --tag-active-bg: #4f46e5; | |
| --tag-active-text: #ffffff; | |
| --font-display: 'General Sans', -apple-system, BlinkMacSystemFont, sans-serif; | |
| --font-body: 'General Sans', -apple-system, BlinkMacSystemFont, sans-serif; | |
| --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace; | |
| --radius-sm: 6px; | |
| --radius-md: 10px; | |
| --radius-lg: 14px; | |
| --radius-xl: 20px; | |
| --radius-full: 9999px; | |
| --shadow-xs: 0 1px 2px rgba(0,0,0,0.04); | |
| --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04); | |
| --shadow-md: 0 4px 12px rgba(0,0,0,0.07); | |
| --shadow-lg: 0 8px 24px rgba(0,0,0,0.09); | |
| } | |
| /* ============================================================ | |
| BASE RESET — VIEWPORT LOCKED | |
| ============================================================ */ | |
| html, body { | |
| margin: 0; | |
| padding: 0; | |
| min-height: 100%; | |
| background: var(--bg-page) ; | |
| overflow-x: hidden ; | |
| } | |
| body, .gradio-container { | |
| background: var(--bg-page) ; | |
| color: var(--text-primary) ; | |
| font-family: var(--font-body) ; | |
| } | |
| .gradio-container { | |
| max-width: 100% ; | |
| padding: 0 ; | |
| min-height: 100% ; | |
| overflow-x: hidden ; | |
| display: flex ; | |
| flex-direction: column ; | |
| } | |
| gradio-app { | |
| background: var(--bg-page) ; | |
| min-height: 100% ; | |
| } | |
| /* ============================================================ | |
| HEADER — 60px bar with search + categories + status | |
| ============================================================ */ | |
| .header-wrap { | |
| flex-shrink: 0 ; | |
| min-height: 0 ; | |
| padding: 0 ; | |
| } | |
| .alembic-header { | |
| height: 60px; | |
| display: flex; | |
| align-items: center; | |
| padding: 0 28px; | |
| background: var(--bg-surface); | |
| border-bottom: 1px solid var(--border); | |
| gap: 20px; | |
| } | |
| .header-brand { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| flex-shrink: 0; | |
| } | |
| .header-logo { | |
| display: flex; | |
| align-items: center; | |
| } | |
| .header-logo svg { | |
| color: var(--accent); | |
| } | |
| .header-title { | |
| font-family: var(--font-display); | |
| font-size: 1.15rem; | |
| font-weight: 700; | |
| color: var(--text-primary); | |
| letter-spacing: -0.03em; | |
| } | |
| .header-search { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| background: var(--bg-muted); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-full); | |
| padding: 8px 16px; | |
| min-width: 200px; | |
| max-width: 320px; | |
| flex: 1; | |
| } | |
| .header-search svg { | |
| color: var(--text-muted); | |
| flex-shrink: 0; | |
| } | |
| .header-search-text { | |
| font-family: var(--font-body); | |
| font-size: 0.82rem; | |
| color: var(--text-muted); | |
| white-space: nowrap; | |
| } | |
| .header-pills { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .cat-pill { | |
| font-family: var(--font-body) ; | |
| font-size: 0.78rem ; | |
| font-weight: 500 ; | |
| color: var(--text-secondary) ; | |
| background: var(--bg-surface) ; | |
| border: 1px solid var(--border) ; | |
| border-radius: var(--radius-full) ; | |
| padding: 6px 14px ; | |
| cursor: pointer; | |
| transition: all 0.15s ease; | |
| line-height: 1.3 ; | |
| white-space: nowrap; | |
| } | |
| .cat-pill:hover { | |
| background: var(--bg-muted) ; | |
| border-color: var(--border-hover) ; | |
| color: var(--text-primary) ; | |
| } | |
| .cat-pill.active { | |
| background: var(--accent) ; | |
| border-color: var(--accent) ; | |
| color: #ffffff ; | |
| } | |
| .header-right { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| margin-left: auto; | |
| flex-shrink: 0; | |
| } | |
| .header-status { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| font-family: var(--font-body); | |
| font-size: 0.78rem; | |
| font-weight: 500; | |
| color: var(--text-secondary); | |
| } | |
| .status-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--success); | |
| } | |
| .header-avatar { | |
| width: 34px; | |
| height: 34px; | |
| border-radius: 50%; | |
| background: linear-gradient(135deg, #c084fc, #818cf8); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| position: relative; | |
| } | |
| .header-avatar::after { | |
| content: '▾'; | |
| position: absolute; | |
| right: -14px; | |
| font-size: 0.7rem; | |
| color: var(--text-muted); | |
| } | |
| /* ============================================================ | |
| MAIN CONTENT — Two-column layout | |
| ============================================================ */ | |
| .main-row { | |
| display: flex ; | |
| min-height: 500px ; | |
| gap: 0 ; | |
| padding: 20px 28px 0 28px ; | |
| } | |
| .main-row > .column, | |
| .main-row > div { | |
| overflow: visible ; | |
| } | |
| /* LEFT: Build panel */ | |
| .build-col { | |
| flex: 0 0 46% ; | |
| max-width: 46% ; | |
| display: flex ; | |
| flex-direction: column ; | |
| padding-right: 24px ; | |
| min-height: 600px ; | |
| max-height: calc(100vh - 180px) ; | |
| } | |
| /* RIGHT: Preview panel */ | |
| .preview-col { | |
| flex: 0 0 54% ; | |
| max-width: 54% ; | |
| display: flex ; | |
| flex-direction: column ; | |
| padding-left: 24px ; | |
| min-height: 500px ; | |
| } | |
| /* ============================================================ | |
| BUILD PANEL — "What would you like to build?" | |
| ============================================================ */ | |
| .build-section { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| } | |
| .build-header { | |
| margin-bottom: 6px; | |
| } | |
| .build-subhead { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| font-family: var(--font-body); | |
| font-size: 0.82rem; | |
| font-weight: 500; | |
| color: var(--text-secondary); | |
| margin-bottom: 8px; | |
| } | |
| .build-subhead svg { | |
| color: var(--accent); | |
| } | |
| .build-title { | |
| font-family: var(--font-display); | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| color: var(--text-primary); | |
| letter-spacing: -0.03em; | |
| line-height: 1.2; | |
| margin: 0 0 4px 0; | |
| } | |
| .build-subtitle { | |
| font-family: var(--font-body); | |
| font-size: 0.82rem; | |
| color: var(--text-secondary); | |
| line-height: 1.5; | |
| margin: 0 0 10px 0; | |
| } | |
| /* Textarea wrapper */ | |
| .prompt-area { | |
| min-height: auto ; | |
| padding: 0 ; | |
| overflow: visible ; | |
| } | |
| .prompt-area label { | |
| display: flex ; | |
| flex-direction: column ; | |
| } | |
| .prompt-area textarea { | |
| background: var(--bg-surface) ; | |
| border: 1.5px solid #c7d2fe ; | |
| border-radius: var(--radius-lg) ; | |
| color: var(--text-primary) ; | |
| font-family: var(--font-body) ; | |
| font-size: 0.88rem ; | |
| padding: 14px 16px ; | |
| min-height: 100px ; | |
| max-height: 100px ; | |
| resize: none ; | |
| transition: border-color 0.2s ease, box-shadow 0.2s ease ; | |
| line-height: 1.6 ; | |
| } | |
| .prompt-area textarea:focus { | |
| border-color: var(--border-focus) ; | |
| box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12) ; | |
| outline: none ; | |
| } | |
| .prompt-area textarea::placeholder { | |
| color: var(--text-muted) ; | |
| font-family: var(--font-body) ; | |
| } | |
| /* Textarea footer wrap */ | |
| .textarea-footer-wrap { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| } | |
| /* Textarea footer (icons + counter) */ | |
| .textarea-footer { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 8px 4px 0; | |
| } | |
| .textarea-icons { | |
| display: flex; | |
| gap: 6px; | |
| } | |
| .textarea-icon-btn { | |
| width: 30px; | |
| height: 30px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: var(--radius-sm); | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .textarea-icon-btn:hover { | |
| background: var(--bg-muted); | |
| color: var(--text-secondary); | |
| } | |
| .char-counter { | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| color: var(--text-muted); | |
| } | |
| /* Generate button */ | |
| .generate-btn-wrap { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| margin-top: 14px ; | |
| } | |
| button.generate-btn-wrap, | |
| button.lg.primary.generate-btn-wrap, | |
| .gradio-container button.generate-btn-wrap { | |
| background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%) ; | |
| background-color: #6366f1 ; | |
| color: #ffffff ; | |
| font-family: var(--font-body) ; | |
| font-weight: 600 ; | |
| font-size: 0.85rem ; | |
| border: none ; | |
| border-radius: var(--radius-md) ; | |
| padding: 12px 28px ; | |
| cursor: pointer; | |
| transition: all 0.2s ease; | |
| display: inline-flex ; | |
| align-items: center; | |
| gap: 8px; | |
| box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25) ; | |
| min-width: 0 ; | |
| max-width: fit-content ; | |
| width: auto ; | |
| justify-content: center ; | |
| } | |
| button.generate-btn-wrap:hover, | |
| .gradio-container button.generate-btn-wrap:hover { | |
| box-shadow: 0 4px 16px rgba(99, 102, 241, 0.35) ; | |
| transform: translateY(-1px); | |
| } | |
| button.generate-btn-wrap:active, | |
| .gradio-container button.generate-btn-wrap:active { | |
| transform: translateY(0); | |
| box-shadow: 0 1px 4px rgba(99, 102, 241, 0.2) ; | |
| } | |
| /* Save button */ | |
| .action-buttons-row { | |
| gap: 8px ; | |
| margin-bottom: 6px ; | |
| } | |
| .save-btn-wrap { | |
| max-width: 140px ; | |
| } | |
| button.save-btn-wrap, | |
| button.lg.secondary.save-btn-wrap, | |
| .gradio-container button.save-btn-wrap { | |
| background: var(--bg-surface) ; | |
| color: var(--accent) ; | |
| border: 1.5px solid #c7d2fe ; | |
| border-radius: 12px ; | |
| font-family: var(--font-display) ; | |
| font-weight: 600 ; | |
| font-size: 0.9rem ; | |
| padding: 10px 16px ; | |
| cursor: pointer ; | |
| transition: all 0.15s ease ; | |
| } | |
| button.save-btn-wrap:hover { | |
| background: var(--accent-light) ; | |
| border-color: var(--accent) ; | |
| } | |
| /* ============================================================ | |
| SUGGESTION CARDS — "Try these ideas" | |
| ============================================================ */ | |
| .suggestions-section { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| margin-top: 14px ; | |
| } | |
| .suggestions-label { | |
| font-family: var(--font-body); | |
| font-size: 0.78rem; | |
| font-weight: 500; | |
| color: var(--text-muted); | |
| margin-bottom: 10px; | |
| text-align: center; | |
| } | |
| .suggestion-card { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| padding: 10px 14px; | |
| background: var(--bg-surface); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-md); | |
| cursor: pointer; | |
| transition: all 0.15s ease; | |
| margin-bottom: 6px; | |
| } | |
| .suggestion-card:hover { | |
| border-color: var(--accent); | |
| background: var(--accent-light); | |
| } | |
| .suggestion-icon { | |
| width: 28px; | |
| height: 28px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: var(--accent); | |
| flex-shrink: 0; | |
| } | |
| .suggestion-text { | |
| font-family: var(--font-body); | |
| font-size: 0.84rem; | |
| font-weight: 500; | |
| color: var(--text-primary); | |
| flex: 1; | |
| } | |
| .suggestion-arrow { | |
| color: var(--text-muted); | |
| font-size: 0.9rem; | |
| flex-shrink: 0; | |
| transition: transform 0.15s; | |
| } | |
| .suggestion-card:hover .suggestion-arrow { | |
| transform: translateX(3px); | |
| color: var(--accent); | |
| } | |
| /* ============================================================ | |
| LIVE PREVIEW — Browser mockup | |
| ============================================================ */ | |
| .preview-label-wrap { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| flex-shrink: 0 ; | |
| margin-bottom: 10px ; | |
| } | |
| .preview-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| } | |
| .preview-label-left { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .preview-label-text { | |
| font-family: var(--font-display); | |
| font-size: 0.92rem; | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| } | |
| .preview-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--success); | |
| } | |
| .preview-controls { | |
| display: flex; | |
| gap: 4px; | |
| } | |
| .preview-ctrl-btn { | |
| width: 30px; | |
| height: 30px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: var(--radius-sm); | |
| border: 1px solid var(--border); | |
| background: var(--bg-surface); | |
| color: var(--text-muted); | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .preview-ctrl-btn:hover { | |
| border-color: var(--border-hover); | |
| color: var(--text-secondary); | |
| } | |
| /* Preview frame — the browser mockup */ | |
| .preview-frame { | |
| display: flex ; | |
| flex-direction: column ; | |
| overflow: hidden ; | |
| border-radius: var(--radius-lg) ; | |
| border: 1px solid var(--border) ; | |
| background: var(--bg-surface) ; | |
| box-shadow: var(--shadow-md) ; | |
| min-height: 450px ; | |
| } | |
| .preview-frame iframe { | |
| width: 100%; | |
| height: 100%; | |
| border: none; | |
| border-radius: var(--radius-lg); | |
| background: var(--bg-surface); | |
| } | |
| /* Preview mockup — the placeholder state */ | |
| .preview-mockup { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| overflow: hidden; | |
| } | |
| .browser-bar { | |
| height: 36px; | |
| background: var(--bg-muted); | |
| border-bottom: 1px solid var(--border); | |
| display: flex; | |
| align-items: center; | |
| padding: 0 14px; | |
| gap: 7px; | |
| flex-shrink: 0; | |
| border-radius: var(--radius-lg) var(--radius-lg) 0 0; | |
| } | |
| .browser-dot { | |
| width: 10px; | |
| height: 10px; | |
| border-radius: 50%; | |
| } | |
| .browser-dot.red { background: #ef4444; } | |
| .browser-dot.yellow { background: #f59e0b; } | |
| .browser-dot.green { background: #10b981; } | |
| .preview-body { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| padding: 40px 32px; | |
| text-align: center; | |
| position: relative; | |
| background: linear-gradient(180deg, #fafbff 0%, #ffffff 100%); | |
| } | |
| /* App mockup illustration inside preview */ | |
| .mockup-window { | |
| width: 200px; | |
| height: 120px; | |
| background: linear-gradient(145deg, #e0e7ff, #c7d2fe); | |
| border-radius: var(--radius-md); | |
| margin-bottom: 24px; | |
| position: relative; | |
| box-shadow: 0 4px 20px rgba(99, 102, 241, 0.15); | |
| overflow: hidden; | |
| } | |
| .mockup-titlebar { | |
| height: 20px; | |
| background: rgba(99, 102, 241, 0.2); | |
| display: flex; | |
| align-items: center; | |
| padding: 0 8px; | |
| gap: 4px; | |
| } | |
| .mockup-titlebar-dot { | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| background: rgba(99, 102, 241, 0.4); | |
| } | |
| .mockup-content { | |
| padding: 10px; | |
| display: flex; | |
| gap: 8px; | |
| height: calc(100% - 20px); | |
| } | |
| .mockup-sidebar { | |
| width: 30%; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 4px; | |
| } | |
| .mockup-sidebar-line { | |
| height: 8px; | |
| background: rgba(99, 102, 241, 0.15); | |
| border-radius: 3px; | |
| } | |
| .mockup-main { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .mockup-plus { | |
| font-size: 1.5rem; | |
| color: rgba(99, 102, 241, 0.4); | |
| font-weight: 300; | |
| } | |
| /* Decorative sparkles around the mockup */ | |
| .sparkle { | |
| position: absolute; | |
| color: var(--accent); | |
| opacity: 0.3; | |
| font-size: 1rem; | |
| } | |
| .sparkle-1 { top: 20%; right: 15%; } | |
| .sparkle-2 { top: 35%; left: 10%; } | |
| .sparkle-3 { bottom: 35%; right: 10%; } | |
| .sparkle-4 { top: 15%; left: 25%; } | |
| .preview-body h3 { | |
| font-family: var(--font-display); | |
| font-weight: 700; | |
| font-size: 1.1rem; | |
| color: var(--text-primary); | |
| margin: 0 0 8px 0; | |
| letter-spacing: -0.02em; | |
| } | |
| .preview-body p { | |
| font-family: var(--font-body); | |
| font-size: 0.82rem; | |
| color: var(--text-secondary); | |
| max-width: 300px; | |
| line-height: 1.6; | |
| margin: 0 0 16px 0; | |
| } | |
| .example-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| padding: 8px 16px; | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-full); | |
| background: var(--bg-surface); | |
| font-family: var(--font-body); | |
| font-size: 0.78rem; | |
| font-weight: 500; | |
| color: var(--accent); | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .example-btn:hover { | |
| background: var(--accent-light); | |
| border-color: var(--accent); | |
| } | |
| .example-btn svg { | |
| color: var(--accent); | |
| } | |
| /* ============================================================ | |
| BUILD PROGRESS — replaces preview body during generation | |
| ============================================================ */ | |
| .build-indicator { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| margin-bottom: 20px; | |
| padding: 10px 16px; | |
| background: var(--accent-light); | |
| border: 1px solid rgba(99, 102, 241, 0.2); | |
| border-radius: var(--radius-md); | |
| } | |
| .build-indicator .spinner { | |
| width: 14px; | |
| height: 14px; | |
| border: 2px solid rgba(99, 102, 241, 0.2); | |
| border-top-color: var(--accent); | |
| border-radius: 50%; | |
| animation: spin 0.7s linear infinite; | |
| } | |
| @keyframes spin { | |
| to { transform: rotate(360deg); } | |
| } | |
| .build-indicator .build-status { | |
| font-family: var(--font-body); | |
| font-size: 0.8rem; | |
| font-weight: 500; | |
| color: var(--accent); | |
| } | |
| .progress-bar-wrap { | |
| width: 100%; | |
| max-width: 280px; | |
| height: 4px; | |
| background: var(--bg-muted); | |
| border-radius: 2px; | |
| overflow: hidden; | |
| margin-top: 16px; | |
| } | |
| .progress-bar { | |
| height: 100%; | |
| background: var(--accent-gradient); | |
| border-radius: 2px; | |
| transition: width 0.5s ease; | |
| } | |
| .progress-text { | |
| margin-top: 8px; | |
| font-family: var(--font-mono); | |
| font-size: 0.7rem; | |
| color: var(--text-muted); | |
| } | |
| /* ============================================================ | |
| TEMPLATES GALLERY — Bottom section | |
| ============================================================ */ | |
| .gallery-section { | |
| flex-shrink: 0 ; | |
| background: var(--bg-surface) ; | |
| border-top: 1px solid var(--border) ; | |
| padding: 18px 28px 24px ; | |
| margin-top: 20px ; | |
| } | |
| .gallery-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| margin-bottom: 14px; | |
| } | |
| .gallery-header-left { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| } | |
| .gallery-header-icon { | |
| color: var(--text-secondary); | |
| } | |
| .gallery-header-text h4 { | |
| font-family: var(--font-display); | |
| font-size: 0.92rem; | |
| font-weight: 700; | |
| color: var(--text-primary); | |
| margin: 0; | |
| letter-spacing: -0.01em; | |
| } | |
| .gallery-header-text p { | |
| font-family: var(--font-body); | |
| font-size: 0.72rem; | |
| color: var(--text-muted); | |
| margin: 2px 0 0 0; | |
| } | |
| .gallery-see-all { | |
| font-family: var(--font-body); | |
| font-size: 0.78rem; | |
| font-weight: 500; | |
| color: var(--text-link); | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| text-decoration: none; | |
| } | |
| .gallery-see-all:hover { | |
| color: var(--accent-hover); | |
| } | |
| .gallery-scroll { | |
| display: flex; | |
| gap: 14px; | |
| overflow-x: auto; | |
| overflow-y: hidden; | |
| padding-bottom: 4px; | |
| scroll-behavior: smooth; | |
| } | |
| .gallery-scroll::-webkit-scrollbar { | |
| height: 3px; | |
| } | |
| .gallery-scroll::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| .gallery-scroll::-webkit-scrollbar-thumb { | |
| background: var(--border); | |
| border-radius: 2px; | |
| } | |
| .gallery-card { | |
| flex: 0 0 165px; | |
| background: var(--bg-surface); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-lg); | |
| padding: 14px 16px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| cursor: pointer; | |
| transition: all 0.15s ease; | |
| } | |
| .gallery-card:hover { | |
| border-color: var(--accent); | |
| box-shadow: var(--shadow-sm); | |
| } | |
| .gallery-card-icon { | |
| width: 32px; | |
| height: 32px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: var(--radius-sm); | |
| background: var(--bg-muted); | |
| margin-bottom: 2px; | |
| } | |
| .gallery-card-icon svg { | |
| width: 18px; | |
| height: 18px; | |
| } | |
| .gallery-card-name { | |
| font-family: var(--font-body); | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| } | |
| .gallery-card-desc { | |
| font-family: var(--font-body); | |
| font-size: 0.68rem; | |
| color: var(--text-secondary); | |
| line-height: 1.4; | |
| } | |
| .gallery-card-tags { | |
| display: flex; | |
| gap: 4px; | |
| flex-wrap: wrap; | |
| margin-top: 4px; | |
| } | |
| .gallery-tag { | |
| font-family: var(--font-mono); | |
| font-size: 0.6rem; | |
| font-weight: 500; | |
| color: var(--accent); | |
| background: var(--accent-light); | |
| border-radius: var(--radius-full); | |
| padding: 2px 7px; | |
| } | |
| .gallery-card-action { | |
| font-family: var(--font-body); | |
| font-size: 0.7rem; | |
| font-weight: 500; | |
| color: var(--text-muted); | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| margin-top: auto; | |
| padding-top: 6px; | |
| } | |
| .gallery-card:hover .gallery-card-action { | |
| color: var(--accent); | |
| } | |
| /* New App card — dashed */ | |
| .gallery-card-new { | |
| border-style: dashed; | |
| align-items: center; | |
| justify-content: center; | |
| text-align: center; | |
| } | |
| .gallery-card-new .gallery-card-icon { | |
| background: transparent; | |
| margin: 0 auto 4px; | |
| } | |
| .gallery-card-new:hover { | |
| border-color: var(--accent); | |
| background: var(--accent-light); | |
| } | |
| /* ============================================================ | |
| SCROLLBAR — Minimal | |
| ============================================================ */ | |
| ::-webkit-scrollbar { | |
| width: 4px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: var(--border); | |
| border-radius: 2px; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: var(--text-muted); | |
| } | |
| /* ============================================================ | |
| RESPONSE PANEL — when assistant responds | |
| ============================================================ */ | |
| .response-area { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| } | |
| .response-card { | |
| background: var(--bg-muted); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-lg); | |
| padding: 14px 18px; | |
| margin-top: 14px; | |
| } | |
| .response-card p { | |
| font-family: var(--font-body); | |
| font-size: 0.84rem; | |
| color: var(--text-primary); | |
| line-height: 1.6; | |
| margin: 0; | |
| } | |
| .response-card .confidence-badge { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 5px; | |
| font-family: var(--font-mono); | |
| font-size: 0.68rem; | |
| font-weight: 500; | |
| color: var(--accent); | |
| background: var(--accent-light); | |
| border-radius: var(--radius-full); | |
| padding: 3px 10px; | |
| margin-top: 8px; | |
| } | |
| /* ============================================================ | |
| RESPONSIVE | |
| ============================================================ */ | |
| @media (max-width: 1024px) { | |
| .build-col { | |
| flex: 0 0 48% ; | |
| max-width: 48% ; | |
| } | |
| .preview-col { | |
| flex: 0 0 52% ; | |
| max-width: 52% ; | |
| } | |
| } | |
| @media (max-width: 768px) { | |
| .main-row { | |
| flex-direction: column ; | |
| height: auto ; | |
| padding: 16px ; | |
| } | |
| .build-col, .preview-col { | |
| flex: none ; | |
| max-width: 100% ; | |
| padding: 0 ; | |
| } | |
| .preview-col { | |
| margin-top: 16px; | |
| } | |
| .header-search, .header-pills { | |
| display: none ; | |
| } | |
| .alembic-header { | |
| padding: 0 16px; | |
| } | |
| .gallery-section { | |
| max-height: 180px ; | |
| } | |
| } | |
| /* ============================================================ | |
| GRADIO OVERRIDES — Clean slate | |
| ============================================================ */ | |
| /* Gradio internal layout */ | |
| .gradio-container > main, | |
| .gradio-container > main > .contain { | |
| display: flex ; | |
| flex-direction: column ; | |
| } | |
| .gradio-container > main > .contain > .column { | |
| display: flex ; | |
| flex-direction: column ; | |
| } | |
| .gradio-container .border-none, | |
| .gradio-container .wrap, | |
| .gradio-container .panel { | |
| border: none ; | |
| } | |
| .gradio-container .prose { | |
| color: var(--text-primary) ; | |
| font-family: var(--font-body) ; | |
| } | |
| /* Ensure textbox labels are visible (Gradio 6 wraps inputs in <label>) */ | |
| .prompt-area label, | |
| .gradio-container .prompt-area label { | |
| display: flex ; | |
| min-height: auto ; | |
| } | |
| /* Hide label text spans but keep the label container visible */ | |
| .prompt-area label > span:first-child { | |
| display: none ; | |
| } | |
| footer { | |
| display: none ; | |
| } | |
| .gradio-container .textbox { | |
| background: transparent ; | |
| border: none ; | |
| } | |
| .dark .gradio-container, | |
| .dark body, | |
| .dark gradio-app { | |
| background: var(--bg-page) ; | |
| color: var(--text-primary) ; | |
| } | |
| .gradio-container .gr-group, | |
| .gradio-container .gr-box, | |
| .gradio-container .gr-panel, | |
| .gradio-container .gr-form { | |
| background: transparent ; | |
| border: none ; | |
| } | |
| .main-row.row { | |
| gap: 0 ; | |
| } | |
| /* Hide unwanted Gradio elements */ | |
| .gradio-container .show_progress_bar, | |
| .gradio-container .progress-bar { | |
| display: none ; | |
| } | |
| /* ============================================================ | |
| CHAT MESSAGES — Conversation history | |
| ============================================================ */ | |
| .chat-area { | |
| min-height: 0 ; | |
| padding: 0 ; | |
| margin-top: 0 ; | |
| margin-bottom: 16px ; | |
| flex: 1 1 auto ; | |
| overflow-y: auto ; | |
| max-height: calc(100vh - 400px) ; | |
| } | |
| .chat-history { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 10px; | |
| padding: 8px 0; | |
| } | |
| .chat-msg { | |
| display: flex; | |
| } | |
| .chat-msg-user { | |
| justify-content: flex-end; | |
| } | |
| .chat-msg-assistant { | |
| justify-content: flex-start; | |
| } | |
| .chat-msg-bubble { | |
| max-width: 85%; | |
| padding: 10px 14px; | |
| border-radius: var(--radius-lg); | |
| font-family: var(--font-body); | |
| font-size: 0.82rem; | |
| line-height: 1.6; | |
| word-wrap: break-word; | |
| } | |
| .user-bubble { | |
| background: var(--accent); | |
| color: #ffffff; | |
| border-bottom-right-radius: 4px; | |
| } | |
| .assistant-bubble { | |
| background: var(--bg-muted); | |
| color: var(--text-primary); | |
| border: 1px solid var(--border); | |
| border-bottom-left-radius: 4px; | |
| } | |
| .confidence-badge { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 4px; | |
| font-family: var(--font-mono); | |
| font-size: 0.65rem; | |
| font-weight: 500; | |
| color: var(--accent); | |
| background: var(--accent-light); | |
| border-radius: var(--radius-full); | |
| padding: 2px 8px; | |
| margin-left: 4px; | |
| } | |
| .plan-block { | |
| margin-top: 8px; | |
| padding: 8px 12px; | |
| background: rgba(99, 102, 241, 0.04); | |
| border-left: 2px solid var(--accent); | |
| border-radius: 0 var(--radius-sm) var(--radius-sm) 0; | |
| font-size: 0.72rem; | |
| color: var(--text-secondary); | |
| line-height: 1.5; | |
| } | |
| .thinking-dot { | |
| display: inline-block; | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| background: var(--accent); | |
| animation: pulse 1s ease-in-out infinite; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { opacity: 0.4; } | |
| 50% { opacity: 1; } | |
| } | |
| /* ============================================================ | |
| SUGGESTION BUTTONS — Clickable, fill textarea | |
| ============================================================ */ | |
| .suggestions-row { | |
| gap: 6px ; | |
| padding: 0 ; | |
| margin-top: 10px ; | |
| flex-wrap: wrap ; | |
| } | |
| .suggestion-btn, | |
| button.suggestion-btn { | |
| background: var(--bg-surface) ; | |
| border: 1px solid var(--border) ; | |
| border-radius: var(--radius-full) ; | |
| color: var(--text-secondary) ; | |
| font-family: var(--font-body) ; | |
| font-size: 0.72rem ; | |
| font-weight: 500 ; | |
| padding: 6px 12px ; | |
| cursor: pointer; | |
| transition: all 0.15s ease; | |
| white-space: nowrap ; | |
| min-width: 0 ; | |
| flex: 0 1 auto ; | |
| } | |
| .suggestion-btn:hover, | |
| button.suggestion-btn:hover { | |
| border-color: var(--accent) ; | |
| background: var(--accent-light) ; | |
| color: var(--accent) ; | |
| } | |
| /* ============================================================ | |
| CODE PREVIEW — Generated code display | |
| ============================================================ */ | |
| .code-preview-body { | |
| flex: 1; | |
| overflow: auto; | |
| padding: 0; | |
| background: #1e1e2e; | |
| } | |
| .code-block { | |
| margin: 0; | |
| padding: 16px; | |
| font-family: var(--font-mono); | |
| font-size: 0.72rem; | |
| line-height: 1.6; | |
| color: #cdd6f4; | |
| white-space: pre-wrap; | |
| word-break: break-word; | |
| } | |
| .code-block code { | |
| font-family: inherit; | |
| } | |
| .browser-bar-title { | |
| font-family: var(--font-body); | |
| font-size: 0.7rem; | |
| color: var(--text-muted); | |
| margin-left: auto; | |
| padding-right: 8px; | |
| } | |
| /* ============================================================ | |
| BUILT APP CARD — Highlighted in gallery | |
| ============================================================ */ | |
| .gallery-card-built { | |
| border-color: var(--accent) ; | |
| background: var(--accent-light) ; | |
| } | |
| .gallery-card-built .gallery-card-name { | |
| color: var(--accent); | |
| } | |
| .built-icon { | |
| font-size: 1.4rem ; | |
| color: var(--accent) ; | |
| background: transparent ; | |
| } | |
| /* ============================================================ | |
| SERVICE CONNECTION PANEL | |
| ============================================================ */ | |
| .service-connect-panel { | |
| background: #ffffff; | |
| border-radius: 16px; | |
| padding: 32px; | |
| border: 1px solid var(--border); | |
| max-width: 600px; | |
| margin: 0 auto; | |
| } | |
| .service-header { | |
| text-align: center; | |
| margin-bottom: 32px; | |
| } | |
| .service-icon { | |
| font-size: 3.5rem; | |
| display: block; | |
| margin-bottom: 16px; | |
| animation: pulse 2s ease-in-out infinite; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { transform: scale(1); } | |
| 50% { transform: scale(1.05); } | |
| } | |
| .service-header h3 { | |
| font-family: var(--font-display); | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| color: var(--text-primary); | |
| margin: 0 0 8px 0; | |
| } | |
| .service-header p { | |
| font-size: 0.9rem; | |
| color: var(--text-secondary); | |
| margin: 0; | |
| } | |
| .service-list { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 16px; | |
| margin-bottom: 28px; | |
| } | |
| .service-card { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 20px; | |
| border-radius: 12px; | |
| border: 2px solid var(--border); | |
| transition: all 0.2s ease; | |
| } | |
| .service-card.connected { | |
| background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%); | |
| border-color: #10b981; | |
| } | |
| .service-card.not-connected { | |
| background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%); | |
| border-color: #ef4444; | |
| } | |
| .service-card:hover { | |
| transform: translateY(-2px); | |
| box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); | |
| } | |
| .service-info { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| } | |
| .service-logo { | |
| font-size: 2.5rem; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .service-info h4 { | |
| font-family: var(--font-display); | |
| font-size: 1.1rem; | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| margin: 0 0 4px 0; | |
| } | |
| .service-status { | |
| font-size: 0.85rem; | |
| color: var(--text-secondary); | |
| margin: 0; | |
| } | |
| .service-connect-btn { | |
| padding: 10px 20px; | |
| border-radius: 8px; | |
| border: none; | |
| background: var(--accent); | |
| color: white; | |
| cursor: pointer; | |
| font-weight: 600; | |
| font-size: 0.9rem; | |
| transition: all 0.2s ease; | |
| } | |
| .service-connect-btn:hover:not(:disabled) { | |
| background: #4338ca; | |
| transform: scale(1.05); | |
| } | |
| .service-connect-btn:disabled { | |
| background: #d1d5db; | |
| cursor: not-allowed; | |
| opacity: 0.7; | |
| } | |
| .continue-build-btn { | |
| width: 100%; | |
| padding: 16px; | |
| background: var(--accent); | |
| color: white; | |
| border: none; | |
| border-radius: 12px; | |
| font-weight: 600; | |
| font-size: 1rem; | |
| cursor: pointer; | |
| transition: all 0.2s ease; | |
| font-family: var(--font-display); | |
| } | |
| .continue-build-btn:hover:not(:disabled) { | |
| background: #4338ca; | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 20px rgba(79, 70, 229, 0.3); | |
| } | |
| .continue-build-btn:disabled { | |
| background: #d1d5db; | |
| cursor: not-allowed; | |
| opacity: 0.7; | |
| } | |