Spaces:
Sleeping
Sleeping
| /* ===== BranchChat Design System ===== */ | |
| @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); | |
| /* --- CSS Custom Properties --- */ | |
| :root { | |
| /* Background layers */ | |
| --bg-primary: #0a0a0f; | |
| --bg-secondary: #12121a; | |
| --bg-tertiary: #1a1a26; | |
| --bg-elevated: #22222e; | |
| --bg-hover: #2a2a38; | |
| /* Text */ | |
| --text-primary: #e8e8f0; | |
| --text-secondary: #9898a8; | |
| --text-tertiary: #686878; | |
| --text-inverse: #0a0a0f; | |
| /* Accent — Cyan-Teal */ | |
| --accent: #00d4aa; | |
| --accent-hover: #00e8bb; | |
| --accent-dim: rgba(0, 212, 170, 0.15); | |
| --accent-glow: rgba(0, 212, 170, 0.3); | |
| /* Branch colors */ | |
| --branch-main: #00d4aa; | |
| --branch-active: #6c7aff; | |
| --branch-alt: #ff6c8a; | |
| --branch-dim: #555566; | |
| /* Status */ | |
| --status-generating: #f0c040; | |
| --status-error: #ff4466; | |
| --status-success: #00d4aa; | |
| /* Glass */ | |
| --glass-bg: rgba(18, 18, 26, 0.85); | |
| --glass-border: rgba(255, 255, 255, 0.06); | |
| --glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); | |
| /* Sizing */ | |
| --sidebar-width: 280px; | |
| --radius-sm: 6px; | |
| --radius-md: 10px; | |
| --radius-lg: 16px; | |
| --radius-xl: 20px; | |
| /* Transitions */ | |
| --transition-fast: 150ms ease; | |
| --transition-medium: 250ms ease; | |
| --transition-slow: 400ms ease; | |
| } | |
| /* --- Reset & Global --- */ | |
| *, *::before, *::after { | |
| box-sizing: border-box; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| html, body, #root { | |
| height: 100%; | |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; | |
| font-size: 14px; | |
| line-height: 1.6; | |
| color: var(--text-primary); | |
| background: var(--bg-primary); | |
| overflow: hidden; | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| /* --- Scrollbar --- */ | |
| ::-webkit-scrollbar { | |
| width: 6px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: var(--bg-hover); | |
| border-radius: 3px; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: var(--text-tertiary); | |
| } | |
| /* --- Layout --- */ | |
| .app-layout { | |
| display: flex; | |
| height: 100%; | |
| width: 100%; | |
| } | |
| /* --- Sidebar --- */ | |
| .sidebar { | |
| width: var(--sidebar-width); | |
| min-width: var(--sidebar-width); | |
| height: 100%; | |
| background: var(--bg-secondary); | |
| border-right: 1px solid var(--glass-border); | |
| display: flex; | |
| flex-direction: column; | |
| transition: transform var(--transition-medium), min-width var(--transition-medium), width var(--transition-medium); | |
| z-index: 10; | |
| } | |
| .sidebar.collapsed { | |
| width: 0; | |
| min-width: 0; | |
| transform: translateX(calc(-1 * var(--sidebar-width))); | |
| } | |
| .sidebar-header { | |
| padding: 16px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| border-bottom: 1px solid var(--glass-border); | |
| } | |
| .sidebar-logo { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| font-weight: 700; | |
| font-size: 16px; | |
| letter-spacing: -0.3px; | |
| } | |
| .sidebar-logo .logo-icon { | |
| width: 28px; | |
| height: 28px; | |
| background: linear-gradient(135deg, var(--accent), #6c7aff); | |
| border-radius: var(--radius-sm); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 14px; | |
| } | |
| .new-chat-btn { | |
| width: 100%; | |
| padding: 10px 16px; | |
| margin: 12px 16px; | |
| width: calc(100% - 32px); | |
| background: var(--accent-dim); | |
| color: var(--accent); | |
| border: 1px solid rgba(0, 212, 170, 0.2); | |
| border-radius: var(--radius-md); | |
| font-family: inherit; | |
| font-size: 13px; | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| justify-content: center; | |
| } | |
| .new-chat-btn:hover { | |
| background: rgba(0, 212, 170, 0.25); | |
| border-color: var(--accent); | |
| transform: translateY(-1px); | |
| } | |
| .conversation-list { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 8px; | |
| } | |
| .conversation-item { | |
| padding: 10px 12px; | |
| border-radius: var(--radius-md); | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| margin-bottom: 2px; | |
| } | |
| .conversation-item:hover { | |
| background: var(--bg-hover); | |
| } | |
| .conversation-item.active { | |
| background: var(--accent-dim); | |
| border: 1px solid rgba(0, 212, 170, 0.15); | |
| } | |
| .conversation-item-title { | |
| font-size: 13px; | |
| font-weight: 500; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| flex: 1; | |
| } | |
| .conversation-item-time { | |
| font-size: 11px; | |
| color: var(--text-tertiary); | |
| white-space: nowrap; | |
| } | |
| .conversation-item-delete { | |
| opacity: 0; | |
| background: none; | |
| border: none; | |
| color: var(--text-tertiary); | |
| cursor: pointer; | |
| padding: 4px; | |
| border-radius: var(--radius-sm); | |
| font-size: 14px; | |
| transition: all var(--transition-fast); | |
| flex-shrink: 0; | |
| margin-left: 4px; | |
| } | |
| .conversation-item:hover .conversation-item-delete { | |
| opacity: 1; | |
| } | |
| .conversation-item-delete:hover { | |
| color: var(--status-error); | |
| background: rgba(255, 68, 102, 0.1); | |
| } | |
| /* Sidebar model status */ | |
| .sidebar-footer { | |
| padding: 12px 16px; | |
| border-top: 1px solid var(--glass-border); | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| font-size: 12px; | |
| color: var(--text-secondary); | |
| } | |
| .model-status-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| flex-shrink: 0; | |
| } | |
| .model-status-dot.ready { | |
| background: var(--status-success); | |
| box-shadow: 0 0 8px var(--accent-glow); | |
| } | |
| .model-status-dot.loading { | |
| background: var(--status-generating); | |
| animation: pulse 1.5s ease infinite; | |
| } | |
| .model-status-dot.error { | |
| background: var(--status-error); | |
| } | |
| .model-status-dot.unloaded { | |
| background: var(--text-tertiary); | |
| } | |
| /* --- Main Content --- */ | |
| .main-content { | |
| flex: 1; | |
| display: flex; | |
| height: 100%; | |
| min-width: 0; | |
| } | |
| /* --- Chat Pane --- */ | |
| .chat-pane { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| height: 100%; | |
| min-width: 0; | |
| position: relative; | |
| } | |
| .chat-header { | |
| padding: 12px 20px; | |
| border-bottom: 1px solid var(--glass-border); | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| background: var(--bg-secondary); | |
| z-index: 5; | |
| } | |
| .sidebar-toggle { | |
| background: none; | |
| border: none; | |
| color: var(--text-secondary); | |
| cursor: pointer; | |
| font-size: 18px; | |
| padding: 4px 8px; | |
| border-radius: var(--radius-sm); | |
| transition: all var(--transition-fast); | |
| } | |
| .sidebar-toggle:hover { | |
| color: var(--text-primary); | |
| background: var(--bg-hover); | |
| } | |
| .chat-header-title { | |
| font-size: 14px; | |
| font-weight: 600; | |
| flex: 1; | |
| } | |
| .branch-indicator { | |
| font-size: 11px; | |
| padding: 3px 10px; | |
| background: var(--bg-tertiary); | |
| border-radius: 100px; | |
| color: var(--text-secondary); | |
| border: 1px solid var(--glass-border); | |
| } | |
| .chat-messages { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 20px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 4px; | |
| } | |
| .chat-empty { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 16px; | |
| color: var(--text-tertiary); | |
| } | |
| .chat-empty-icon { | |
| font-size: 48px; | |
| opacity: 0.3; | |
| } | |
| .chat-empty h2 { | |
| font-size: 20px; | |
| font-weight: 600; | |
| color: var(--text-secondary); | |
| } | |
| .chat-empty p { | |
| font-size: 13px; | |
| max-width: 360px; | |
| text-align: center; | |
| line-height: 1.7; | |
| } | |
| /* Message bubbles */ | |
| .message-row { | |
| display: flex; | |
| gap: 12px; | |
| padding: 8px 0; | |
| position: relative; | |
| animation: messageIn 0.3s ease; | |
| } | |
| .message-row.user { | |
| justify-content: flex-end; | |
| } | |
| .message-row.assistant { | |
| justify-content: flex-start; | |
| } | |
| .message-avatar { | |
| width: 32px; | |
| height: 32px; | |
| border-radius: var(--radius-sm); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 14px; | |
| flex-shrink: 0; | |
| margin-top: 2px; | |
| } | |
| .message-avatar.user { | |
| background: linear-gradient(135deg, #6c7aff, #a855f7); | |
| order: 2; | |
| } | |
| .message-avatar.assistant { | |
| background: linear-gradient(135deg, var(--accent), #00a888); | |
| } | |
| .message-content { | |
| max-width: 70%; | |
| min-width: 80px; | |
| } | |
| .message-bubble { | |
| padding: 12px 16px; | |
| border-radius: var(--radius-lg); | |
| font-size: 13.5px; | |
| line-height: 1.7; | |
| position: relative; | |
| word-wrap: break-word; | |
| } | |
| .message-bubble.user { | |
| background: linear-gradient(135deg, rgba(108, 122, 255, 0.15), rgba(168, 85, 247, 0.1)); | |
| border: 1px solid rgba(108, 122, 255, 0.15); | |
| border-bottom-right-radius: var(--radius-sm); | |
| } | |
| .message-bubble.assistant { | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| border-bottom-left-radius: var(--radius-sm); | |
| } | |
| .message-bubble.generating { | |
| border-color: var(--status-generating); | |
| border-style: solid; | |
| } | |
| .message-bubble.generating::after { | |
| content: '▍'; | |
| animation: blink 1s step-end infinite; | |
| color: var(--status-generating); | |
| margin-left: 2px; | |
| } | |
| .message-bubble.error { | |
| border-color: var(--status-error); | |
| } | |
| /* Branch button on message */ | |
| .message-actions { | |
| display: flex; | |
| gap: 4px; | |
| margin-top: 6px; | |
| align-items: center; | |
| } | |
| .branch-btn { | |
| opacity: 0; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| color: var(--text-secondary); | |
| font-size: 11px; | |
| padding: 3px 10px; | |
| border-radius: 100px; | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| font-family: inherit; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .message-row:hover .branch-btn { | |
| opacity: 1; | |
| } | |
| .branch-btn:hover { | |
| background: var(--accent-dim); | |
| color: var(--accent); | |
| border-color: rgba(0, 212, 170, 0.3); | |
| } | |
| .branch-count { | |
| font-size: 10px; | |
| padding: 2px 7px; | |
| background: var(--bg-tertiary); | |
| border-radius: 100px; | |
| color: var(--text-tertiary); | |
| border: 1px solid var(--glass-border); | |
| } | |
| /* Chat input */ | |
| .chat-input-area { | |
| padding: 16px 20px; | |
| border-top: 1px solid var(--glass-border); | |
| background: var(--bg-secondary); | |
| } | |
| .chat-input-wrapper { | |
| display: flex; | |
| align-items: flex-end; | |
| gap: 10px; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-lg); | |
| padding: 6px 6px 6px 16px; | |
| transition: border-color var(--transition-fast); | |
| } | |
| .chat-input-wrapper:focus-within { | |
| border-color: var(--accent); | |
| box-shadow: 0 0 0 3px var(--accent-dim); | |
| } | |
| .chat-input { | |
| flex: 1; | |
| background: none; | |
| border: none; | |
| outline: none; | |
| color: var(--text-primary); | |
| font-family: inherit; | |
| font-size: 14px; | |
| line-height: 1.5; | |
| resize: none; | |
| max-height: 120px; | |
| min-height: 24px; | |
| padding: 6px 0; | |
| } | |
| .chat-input::placeholder { | |
| color: var(--text-tertiary); | |
| } | |
| .send-btn { | |
| width: 36px; | |
| height: 36px; | |
| border-radius: var(--radius-md); | |
| background: var(--accent); | |
| color: var(--text-inverse); | |
| border: none; | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 16px; | |
| transition: all var(--transition-fast); | |
| flex-shrink: 0; | |
| } | |
| .send-btn:hover:not(:disabled) { | |
| background: var(--accent-hover); | |
| transform: scale(1.05); | |
| } | |
| .send-btn:disabled { | |
| background: var(--bg-hover); | |
| color: var(--text-tertiary); | |
| cursor: not-allowed; | |
| } | |
| /* --- Tree View Panel --- */ | |
| .tree-pane { | |
| width: 420px; | |
| min-width: 300px; | |
| height: 100%; | |
| background: var(--bg-secondary); | |
| border-left: 1px solid var(--glass-border); | |
| position: relative; | |
| display: flex; | |
| flex-direction: column; | |
| transition: all var(--transition-medium); | |
| } | |
| /* Fullscreen mode */ | |
| .tree-pane-fullscreen { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| width: 100% ; | |
| min-width: 100% ; | |
| z-index: 50; | |
| border-left: none; | |
| animation: fadeIn 0.2s ease; | |
| } | |
| .tree-header { | |
| padding: 12px 16px; | |
| border-bottom: 1px solid var(--glass-border); | |
| font-size: 13px; | |
| font-weight: 600; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| } | |
| .tree-header-actions { | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .tree-action-btn { | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| color: var(--text-secondary); | |
| font-size: 14px; | |
| width: 30px; | |
| height: 30px; | |
| border-radius: var(--radius-sm); | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-family: inherit; | |
| } | |
| .tree-action-btn:hover { | |
| background: var(--accent-dim); | |
| color: var(--accent); | |
| border-color: rgba(0, 212, 170, 0.3); | |
| } | |
| .tree-container { | |
| flex: 1; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .tree-empty { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| text-align: center; | |
| color: var(--text-tertiary); | |
| font-size: 13px; | |
| } | |
| /* 3D Graph tooltip */ | |
| .graph-tooltip { | |
| background: var(--glass-bg) ; | |
| backdrop-filter: blur(12px) ; | |
| border: 1px solid var(--glass-border) ; | |
| border-radius: var(--radius-md) ; | |
| padding: 12px 16px ; | |
| box-shadow: var(--glass-shadow) ; | |
| max-width: 320px ; | |
| font-family: 'Inter', sans-serif ; | |
| color: var(--text-primary) ; | |
| font-size: 12px ; | |
| line-height: 1.5 ; | |
| pointer-events: none; | |
| } | |
| .graph-tooltip .tooltip-role { | |
| font-size: 10px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.8px; | |
| font-weight: 600; | |
| margin-bottom: 4px; | |
| } | |
| .graph-tooltip .tooltip-role.user { | |
| color: #6c7aff; | |
| } | |
| .graph-tooltip .tooltip-role.assistant { | |
| color: var(--accent); | |
| } | |
| .graph-tooltip .tooltip-text { | |
| color: var(--text-secondary); | |
| white-space: pre-wrap; | |
| word-break: break-word; | |
| } | |
| /* --- Graph Node Labels (CSS2D) --- */ | |
| .graph-node-label { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 1px; | |
| pointer-events: none; | |
| user-select: none; | |
| text-align: center; | |
| white-space: nowrap; | |
| } | |
| .graph-node-turn { | |
| font-family: 'Inter', sans-serif; | |
| font-size: 10px; | |
| font-weight: 700; | |
| letter-spacing: 0.3px; | |
| } | |
| .graph-node-preview { | |
| font-family: 'Inter', sans-serif; | |
| font-size: 9px; | |
| color: rgba(232, 232, 240, 0.5); | |
| max-width: 120px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| /* --- Graph Legend --- */ | |
| .graph-legend { | |
| position: absolute; | |
| bottom: 12px; | |
| left: 12px; | |
| background: rgba(18, 18, 26, 0.88); | |
| backdrop-filter: blur(12px); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-md); | |
| padding: 10px 14px; | |
| font-size: 11px; | |
| color: var(--text-secondary); | |
| pointer-events: auto; | |
| z-index: 5; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 5px; | |
| } | |
| .graph-legend-title { | |
| font-size: 10px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.8px; | |
| color: var(--text-tertiary); | |
| margin-bottom: 2px; | |
| } | |
| .graph-legend-item { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| font-size: 11px; | |
| } | |
| .graph-legend-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| flex-shrink: 0; | |
| } | |
| .graph-legend-diamond { | |
| width: 8px; | |
| height: 8px; | |
| background: #ff6c8a; | |
| transform: rotate(45deg); | |
| flex-shrink: 0; | |
| } | |
| /* --- Branch Dialog / Modal --- */ | |
| .modal-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0, 0, 0, 0.6); | |
| backdrop-filter: blur(4px); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 100; | |
| animation: fadeIn 0.2s ease; | |
| } | |
| .modal-content { | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-xl); | |
| width: 520px; | |
| max-width: 90vw; | |
| max-height: 80vh; | |
| overflow-y: auto; | |
| box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5); | |
| animation: slideUp 0.3s ease; | |
| } | |
| .modal-header { | |
| padding: 20px 24px 16px; | |
| border-bottom: 1px solid var(--glass-border); | |
| } | |
| .modal-header h3 { | |
| font-size: 16px; | |
| font-weight: 700; | |
| margin-bottom: 4px; | |
| } | |
| .modal-header p { | |
| font-size: 12px; | |
| color: var(--text-secondary); | |
| } | |
| .modal-body { | |
| padding: 20px 24px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 16px; | |
| } | |
| .modal-label { | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: var(--text-secondary); | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| margin-bottom: 6px; | |
| } | |
| .modal-textarea { | |
| width: 100%; | |
| min-height: 80px; | |
| padding: 12px; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-md); | |
| color: var(--text-primary); | |
| font-family: inherit; | |
| font-size: 13px; | |
| line-height: 1.6; | |
| resize: vertical; | |
| outline: none; | |
| transition: border-color var(--transition-fast); | |
| } | |
| .modal-textarea:focus { | |
| border-color: var(--accent); | |
| } | |
| .modal-info { | |
| padding: 10px 14px; | |
| background: rgba(240, 192, 64, 0.08); | |
| border: 1px solid rgba(240, 192, 64, 0.15); | |
| border-radius: var(--radius-md); | |
| font-size: 12px; | |
| color: var(--status-generating); | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 8px; | |
| } | |
| .modal-footer { | |
| padding: 16px 24px 20px; | |
| border-top: 1px solid var(--glass-border); | |
| display: flex; | |
| justify-content: flex-end; | |
| gap: 10px; | |
| } | |
| .btn-secondary { | |
| padding: 8px 18px; | |
| background: var(--bg-tertiary); | |
| border: 1px solid var(--glass-border); | |
| color: var(--text-secondary); | |
| font-family: inherit; | |
| font-size: 13px; | |
| font-weight: 500; | |
| border-radius: var(--radius-md); | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| } | |
| .btn-secondary:hover { | |
| background: var(--bg-hover); | |
| color: var(--text-primary); | |
| } | |
| .btn-primary { | |
| padding: 8px 18px; | |
| background: var(--accent); | |
| color: var(--text-inverse); | |
| border: none; | |
| font-family: inherit; | |
| font-size: 13px; | |
| font-weight: 600; | |
| border-radius: var(--radius-md); | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| } | |
| .btn-primary:hover { | |
| background: var(--accent-hover); | |
| transform: translateY(-1px); | |
| } | |
| /* --- Model Loader Overlay --- */ | |
| .model-loader-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(10, 10, 15, 0.95); | |
| backdrop-filter: blur(20px); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 200; | |
| animation: fadeIn 0.3s ease; | |
| } | |
| .model-loader-card { | |
| width: 480px; | |
| max-width: 90vw; | |
| text-align: center; | |
| } | |
| .model-loader-icon { | |
| font-size: 48px; | |
| margin-bottom: 24px; | |
| animation: float 3s ease infinite; | |
| } | |
| .model-loader-card h2 { | |
| font-size: 22px; | |
| font-weight: 700; | |
| margin-bottom: 8px; | |
| background: linear-gradient(135deg, var(--accent), #6c7aff); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| } | |
| .model-loader-card p { | |
| font-size: 13px; | |
| color: var(--text-secondary); | |
| margin-bottom: 28px; | |
| } | |
| .progress-bar-track { | |
| width: 100%; | |
| height: 6px; | |
| background: var(--bg-tertiary); | |
| border-radius: 3px; | |
| overflow: hidden; | |
| margin-bottom: 20px; | |
| } | |
| .progress-bar-fill { | |
| height: 100%; | |
| background: linear-gradient(90deg, var(--accent), #6c7aff); | |
| border-radius: 3px; | |
| transition: width 0.4s ease; | |
| } | |
| .progress-percent { | |
| font-size: 28px; | |
| font-weight: 700; | |
| color: var(--accent); | |
| margin-bottom: 4px; | |
| } | |
| .model-loader-steps { | |
| margin-top: 20px; | |
| text-align: left; | |
| max-height: 200px; | |
| overflow-y: auto; | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-md); | |
| padding: 12px 16px; | |
| } | |
| .model-loader-step { | |
| font-size: 11px; | |
| font-family: 'SF Mono', 'Fira Code', monospace; | |
| color: var(--text-secondary); | |
| padding: 2px 0; | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 8px; | |
| animation: messageIn 0.2s ease; | |
| } | |
| .model-loader-step::before { | |
| content: '›'; | |
| color: var(--accent); | |
| font-weight: 700; | |
| flex-shrink: 0; | |
| } | |
| .model-loader-step:last-child { | |
| color: var(--text-primary); | |
| } | |
| /* --- Context Menu --- */ | |
| .context-menu { | |
| position: fixed; | |
| background: var(--bg-elevated); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-md); | |
| box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5); | |
| padding: 4px; | |
| z-index: 150; | |
| min-width: 180px; | |
| animation: fadeIn 0.15s ease; | |
| } | |
| .context-menu-item { | |
| padding: 8px 14px; | |
| font-size: 12px; | |
| cursor: pointer; | |
| border-radius: var(--radius-sm); | |
| transition: all var(--transition-fast); | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| white-space: nowrap; | |
| background: none; | |
| border: none; | |
| width: 100%; | |
| color: var(--text-primary); | |
| font-family: inherit; | |
| text-align: left; | |
| } | |
| .context-menu-item:hover { | |
| background: var(--accent-dim); | |
| color: var(--accent); | |
| } | |
| /* --- Animations --- */ | |
| @keyframes fadeIn { | |
| from { opacity: 0; } | |
| to { opacity: 1; } | |
| } | |
| @keyframes slideUp { | |
| from { opacity: 0; transform: translateY(20px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| @keyframes messageIn { | |
| from { opacity: 0; transform: translateY(8px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0.4; } | |
| } | |
| @keyframes blink { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0; } | |
| } | |
| @keyframes float { | |
| 0%, 100% { transform: translateY(0); } | |
| 50% { transform: translateY(-8px); } | |
| } | |
| @keyframes spin { | |
| from { transform: rotate(0deg); } | |
| to { transform: rotate(360deg); } | |
| } | |
| .spinner { | |
| display: inline-block; | |
| width: 14px; | |
| height: 14px; | |
| border: 2px solid var(--glass-border); | |
| border-top-color: var(--status-generating); | |
| border-radius: 50%; | |
| animation: spin 0.8s linear infinite; | |
| } | |
| /* --- Responsive --- */ | |
| @media (max-width: 900px) { | |
| .tree-pane { | |
| display: none; | |
| } | |
| } | |
| @media (max-width: 600px) { | |
| .sidebar { | |
| position: absolute; | |
| height: 100%; | |
| z-index: 20; | |
| } | |
| .sidebar.collapsed { | |
| transform: translateX(calc(-1 * var(--sidebar-width))); | |
| } | |
| } | |
| /* --- Onboarding Tour --- */ | |
| .onboarding-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| z-index: 300; | |
| pointer-events: none; | |
| } | |
| .onboarding-backdrop { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| pointer-events: auto; | |
| z-index: 301; | |
| } | |
| /* SVG-like spotlight: dark overlay with a transparent cutout */ | |
| .onboarding-backdrop::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| background: rgba(0, 0, 0, 0.7); | |
| z-index: -1; | |
| } | |
| .onboarding-spotlight { | |
| position: absolute; | |
| box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7); | |
| border: 2px solid var(--accent); | |
| z-index: 302; | |
| pointer-events: none; | |
| transition: all var(--transition-medium); | |
| animation: spotlightPulse 2s ease infinite; | |
| } | |
| @keyframes spotlightPulse { | |
| 0%, 100% { border-color: var(--accent); box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 20px rgba(0, 212, 170, 0.2); } | |
| 50% { border-color: var(--accent-hover); box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 30px rgba(0, 212, 170, 0.35); } | |
| } | |
| .onboarding-backdrop-solid { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0, 0, 0, 0.75); | |
| backdrop-filter: blur(4px); | |
| pointer-events: auto; | |
| z-index: 301; | |
| } | |
| .onboarding-tooltip { | |
| width: 360px; | |
| background: var(--bg-secondary); | |
| border: 1px solid var(--glass-border); | |
| border-radius: var(--radius-xl); | |
| padding: 28px 24px 20px; | |
| box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6), 0 0 40px rgba(0, 212, 170, 0.08); | |
| z-index: 310; | |
| pointer-events: auto; | |
| animation: slideUp 0.35s ease; | |
| } | |
| .onboarding-tooltip-centered { | |
| max-width: 420px; | |
| width: 420px; | |
| text-align: center; | |
| } | |
| .onboarding-tooltip-icon { | |
| font-size: 32px; | |
| margin-bottom: 12px; | |
| } | |
| .onboarding-tooltip-centered .onboarding-tooltip-icon { | |
| font-size: 40px; | |
| margin-bottom: 16px; | |
| } | |
| .onboarding-tooltip-title { | |
| font-size: 16px; | |
| font-weight: 700; | |
| color: var(--text-primary); | |
| margin-bottom: 8px; | |
| line-height: 1.3; | |
| } | |
| .onboarding-tooltip-body { | |
| font-size: 13px; | |
| color: var(--text-secondary); | |
| line-height: 1.7; | |
| margin-bottom: 20px; | |
| } | |
| .onboarding-tooltip-footer { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 12px; | |
| } | |
| .onboarding-dots { | |
| display: flex; | |
| gap: 5px; | |
| } | |
| .onboarding-dot { | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| background: var(--bg-hover); | |
| transition: all var(--transition-fast); | |
| } | |
| .onboarding-dot.active { | |
| background: var(--accent); | |
| width: 18px; | |
| border-radius: 3px; | |
| } | |
| .onboarding-dot.done { | |
| background: rgba(0, 212, 170, 0.4); | |
| } | |
| .onboarding-actions { | |
| display: flex; | |
| gap: 6px; | |
| } | |
| .onboarding-btn { | |
| padding: 6px 14px; | |
| border-radius: var(--radius-md); | |
| font-family: inherit; | |
| font-size: 12px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| border: none; | |
| } | |
| .onboarding-btn-primary { | |
| background: var(--accent); | |
| color: var(--text-inverse); | |
| } | |
| .onboarding-btn-primary:hover { | |
| background: var(--accent-hover); | |
| transform: translateY(-1px); | |
| } | |
| .onboarding-btn-secondary { | |
| background: var(--bg-tertiary); | |
| color: var(--text-secondary); | |
| border: 1px solid var(--glass-border); | |
| } | |
| .onboarding-btn-secondary:hover { | |
| background: var(--bg-hover); | |
| color: var(--text-primary); | |
| } | |
| .onboarding-btn-skip { | |
| background: none; | |
| color: var(--text-tertiary); | |
| } | |
| .onboarding-btn-skip:hover { | |
| color: var(--text-secondary); | |
| } | |
| .onboarding-step-counter { | |
| position: absolute; | |
| top: 10px; | |
| right: 14px; | |
| font-size: 10px; | |
| color: var(--text-tertiary); | |
| font-weight: 600; | |
| } | |