| |
| :root { |
| --bg: #ffffff; |
| --card: #ffffff; |
| --card-solid: #ffffff; |
| --card-hover: #fafafa; |
| --text: #1a1a1a; |
| --text-secondary: #555555; |
| --text-muted: #888888; |
| --border: #e0e0e0; |
| --border-light: #f0f0f0; |
| --primary: #8bc34a; |
| --primary-hover: #7cb342; |
| --primary-light: rgba(139, 195, 74, 0.12); |
| --primary-glow: rgba(139, 195, 74, 0.25); |
| --success: #4caf50; |
| --success-light: rgba(76, 175, 80, 0.12); |
| --error: #e53935; |
| --error-light: rgba(229, 57, 53, 0.1); |
| --warning: #ffc107; |
| --shadow-sm: 0 1px 3px rgba(0,0,0,0.06); |
| --shadow: 0 2px 8px rgba(0,0,0,0.08); |
| --shadow-lg: 0 4px 16px rgba(0,0,0,0.12); |
| --radius: 12px; |
| --radius-sm: 8px; |
| --radius-lg: 16px; |
| --sidebar-width: 260px; |
| --transition: 0.2s ease; |
| } |
|
|
| |
| [data-theme="dark"] { |
| --bg: #121212; |
| --card: #1e1e1e; |
| --card-solid: #1e1e1e; |
| --card-hover: #252525; |
| --text: #f5f5f5; |
| --text-secondary: #b0b0b0; |
| --text-muted: #808080; |
| --border: #333333; |
| --border-light: #2a2a2a; |
| --primary: #aed581; |
| --primary-hover: #8bc34a; |
| --primary-light: rgba(174, 213, 129, 0.15); |
| --primary-glow: rgba(174, 213, 129, 0.3); |
| --shadow: 0 2px 8px rgba(0,0,0,0.3); |
| --shadow-lg: 0 4px 16px rgba(0,0,0,0.4); |
| } |
|
|
|
|
| |
| * { |
| box-sizing: border-box; |
| margin: 0; |
| padding: 0; |
| } |
|
|
| html { |
| scroll-behavior: smooth; |
| } |
|
|
| body { |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; |
| background: var(--bg); |
| color: var(--text); |
| line-height: 1.6; |
| min-height: 100vh; |
| overflow-x: hidden; |
| transition: background var(--transition), color var(--transition); |
| } |
|
|
| |
| .app-container { |
| display: flex; |
| min-height: 100vh; |
| } |
|
|
| |
| .animated-bg { |
| position: fixed; |
| inset: 0; |
| z-index: -1; |
| background: var(--bg); |
| } |
|
|
| |
| .sidebar { |
| width: var(--sidebar-width); |
| height: 100vh; |
| position: fixed; |
| left: 0; |
| top: 0; |
| background: var(--card); |
| border-right: 1px solid var(--border); |
| display: flex; |
| flex-direction: column; |
| z-index: 100; |
| transition: transform var(--transition), background var(--transition); |
| } |
|
|
| .sidebar-header { |
| padding: 24px 20px; |
| border-bottom: 1px solid var(--border-light); |
| } |
|
|
| .logo { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| } |
|
|
| .logo-icon { |
| width: 44px; |
| height: 44px; |
| background: var(--primary); |
| border-radius: 10px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| color: white; |
| font-weight: 700; |
| font-size: 18px; |
| transition: transform var(--transition); |
| } |
|
|
| .logo:hover .logo-icon { |
| transform: scale(1.05); |
| } |
|
|
|
|
| .logo-text h1 { |
| font-size: 18px; |
| font-weight: 700; |
| color: var(--text); |
| letter-spacing: -0.5px; |
| } |
|
|
| .logo-text span { |
| font-size: 11px; |
| color: var(--text-muted); |
| text-transform: uppercase; |
| letter-spacing: 0.5px; |
| } |
|
|
| |
| .sidebar-nav { |
| flex: 1; |
| padding: 16px 12px; |
| overflow-y: auto; |
| } |
|
|
| .nav-section { |
| margin-bottom: 24px; |
| } |
|
|
| .nav-section-title { |
| font-size: 10px; |
| font-weight: 600; |
| color: var(--text-muted); |
| text-transform: uppercase; |
| letter-spacing: 1px; |
| padding: 0 12px; |
| margin-bottom: 8px; |
| } |
|
|
| .nav-item { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| padding: 12px 16px; |
| border-radius: var(--radius-sm); |
| color: var(--text-secondary); |
| font-size: 14px; |
| font-weight: 500; |
| cursor: pointer; |
| border: none; |
| background: transparent; |
| width: 100%; |
| text-align: left; |
| transition: all var(--transition); |
| position: relative; |
| } |
|
|
| .nav-item:hover { |
| color: var(--text); |
| background: var(--primary-light); |
| } |
|
|
| .nav-item.active { |
| color: var(--primary); |
| background: var(--primary-light); |
| } |
|
|
| .nav-item.active::after { |
| content: ''; |
| position: absolute; |
| left: 0; |
| top: 50%; |
| transform: translateY(-50%); |
| width: 3px; |
| height: 24px; |
| background: var(--primary); |
| border-radius: 0 3px 3px 0; |
| } |
|
|
| .nav-item svg { |
| width: 20px; |
| height: 20px; |
| flex-shrink: 0; |
| } |
|
|
| |
| .sidebar-footer { |
| padding: 16px; |
| border-top: 1px solid var(--border-light); |
| } |
|
|
|
|
| .theme-toggle { |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| padding: 12px 16px; |
| background: var(--border-light); |
| border-radius: var(--radius-sm); |
| cursor: pointer; |
| transition: background var(--transition); |
| } |
|
|
| .theme-toggle:hover { |
| background: var(--border); |
| } |
|
|
| .theme-toggle-label { |
| display: flex; |
| align-items: center; |
| gap: 10px; |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .theme-toggle-label svg { |
| width: 18px; |
| height: 18px; |
| } |
|
|
| .theme-switch { |
| width: 44px; |
| height: 24px; |
| background: var(--border); |
| border-radius: 12px; |
| position: relative; |
| transition: background var(--transition); |
| } |
|
|
| .theme-switch::after { |
| content: ''; |
| position: absolute; |
| width: 18px; |
| height: 18px; |
| background: white; |
| border-radius: 50%; |
| top: 3px; |
| left: 3px; |
| transition: transform var(--transition); |
| box-shadow: 0 2px 4px rgba(0,0,0,0.2); |
| } |
|
|
| [data-theme="dark"] .theme-switch { |
| background: var(--primary); |
| } |
|
|
| [data-theme="dark"] .theme-switch::after { |
| transform: translateX(20px); |
| } |
|
|
| |
| .main-content { |
| flex: 1; |
| margin-left: var(--sidebar-width); |
| min-height: 100vh; |
| padding: 24px 32px; |
| transition: margin var(--transition); |
| } |
|
|
| |
| .breadcrumbs { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| margin-bottom: 20px; |
| font-size: 13px; |
| } |
|
|
| .breadcrumb-item { |
| color: var(--text-muted); |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
|
|
| .breadcrumb-item a { |
| color: var(--text-secondary); |
| text-decoration: none; |
| transition: color var(--transition); |
| } |
|
|
| .breadcrumb-item a:hover { |
| color: var(--primary); |
| } |
|
|
| .breadcrumb-item.active { |
| color: var(--text); |
| font-weight: 500; |
| } |
|
|
| .breadcrumb-separator { |
| color: var(--text-muted); |
| } |
|
|
|
|
| |
| .page-header { |
| margin-bottom: 28px; |
| } |
|
|
| .page-header h2 { |
| font-size: 28px; |
| font-weight: 700; |
| margin-bottom: 8px; |
| letter-spacing: -0.5px; |
| color: var(--text); |
| } |
|
|
| .page-header p { |
| color: var(--text-secondary); |
| font-size: 15px; |
| max-width: 600px; |
| line-height: 1.7; |
| } |
|
|
| |
| .page { |
| display: none; |
| animation: pageIn 0.3s ease; |
| } |
|
|
| .page.active { |
| display: block; |
| } |
|
|
| @keyframes pageIn { |
| from { |
| opacity: 0; |
| transform: translateY(10px); |
| } |
| to { |
| opacity: 1; |
| transform: translateY(0); |
| } |
| } |
|
|
| |
| .card { |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius-lg); |
| box-shadow: var(--shadow-sm); |
| overflow: hidden; |
| transition: transform var(--transition), box-shadow var(--transition); |
| } |
|
|
| .card:hover { |
| box-shadow: var(--shadow); |
| } |
|
|
| .card + .card { |
| margin-top: 20px; |
| } |
|
|
| .card-header { |
| padding: 20px 24px; |
| border-bottom: 1px solid var(--border-light); |
| } |
|
|
| .card-header h3 { |
| font-size: 16px; |
| font-weight: 600; |
| margin-bottom: 4px; |
| display: flex; |
| align-items: center; |
| gap: 10px; |
| } |
|
|
| .card-header h3 svg { |
| width: 20px; |
| height: 20px; |
| color: var(--primary); |
| } |
|
|
| .card-header p { |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .card-body { |
| padding: 24px; |
| } |
|
|
|
|
| |
| .form-group { |
| margin-bottom: 20px; |
| } |
|
|
| .form-group:last-child { |
| margin-bottom: 0; |
| } |
|
|
| .form-label { |
| display: block; |
| font-size: 13px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 8px; |
| } |
|
|
| .form-label .optional { |
| color: var(--text-muted); |
| font-weight: 400; |
| font-size: 12px; |
| } |
|
|
| .form-input, .form-select { |
| width: 100%; |
| padding: 12px 16px; |
| border: 1px solid var(--border); |
| border-radius: var(--radius-sm); |
| font-size: 14px; |
| color: var(--text); |
| background: var(--card-solid); |
| transition: all var(--transition); |
| } |
|
|
| .form-input:focus, .form-select:focus { |
| outline: none; |
| border-color: var(--primary); |
| box-shadow: 0 0 0 3px var(--primary-light); |
| } |
|
|
| .form-input::placeholder { |
| color: var(--text-muted); |
| } |
|
|
| |
| .grid-2 { |
| display: grid; |
| grid-template-columns: repeat(2, 1fr); |
| gap: 16px; |
| } |
|
|
| .grid-3 { |
| display: grid; |
| grid-template-columns: repeat(3, 1fr); |
| gap: 16px; |
| } |
|
|
| .grid-4 { |
| display: grid; |
| grid-template-columns: repeat(4, 1fr); |
| gap: 12px; |
| } |
|
|
| @media (max-width: 768px) { |
| .grid-2, .grid-3, .grid-4 { |
| grid-template-columns: 1fr; |
| } |
| } |
|
|
| |
| .btn { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| gap: 8px; |
| padding: 12px 24px; |
| border: none; |
| border-radius: var(--radius-sm); |
| font-size: 14px; |
| font-weight: 600; |
| cursor: pointer; |
| transition: all var(--transition); |
| } |
|
|
| .btn-primary { |
| background: var(--primary); |
| color: white; |
| } |
|
|
| .btn-primary:hover { |
| background: var(--primary-hover); |
| } |
|
|
| .btn-secondary { |
| background: var(--card-solid); |
| color: var(--text); |
| border: 1px solid var(--border); |
| } |
|
|
| .btn-secondary:hover { |
| background: var(--card-hover); |
| border-color: var(--primary); |
| } |
|
|
| .btn-success { |
| background: var(--success); |
| color: white; |
| } |
|
|
| .btn-success:hover { |
| opacity: 0.9; |
| } |
|
|
| .btn:disabled { |
| opacity: 0.5; |
| cursor: not-allowed; |
| } |
|
|
| .btn svg { |
| width: 18px; |
| height: 18px; |
| } |
|
|
| .btn-group { |
| display: flex; |
| gap: 12px; |
| flex-wrap: wrap; |
| } |
|
|
|
|
| |
| .status { |
| padding: 14px 18px; |
| border-radius: var(--radius-sm); |
| font-size: 14px; |
| margin-top: 16px; |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| } |
|
|
| .status-info { |
| background: var(--primary-light); |
| color: var(--primary); |
| border: 1px solid rgba(139, 195, 74, 0.25); |
| } |
|
|
| .status-success { |
| background: var(--success-light); |
| color: var(--success); |
| border: 1px solid rgba(76, 175, 80, 0.25); |
| } |
|
|
| .status-error { |
| background: var(--error-light); |
| color: var(--error); |
| border: 1px solid rgba(229, 57, 53, 0.25); |
| } |
|
|
| |
| .preview-container { |
| position: relative; |
| } |
|
|
| .preview-toolbar { |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| margin-bottom: 16px; |
| flex-wrap: wrap; |
| gap: 12px; |
| } |
|
|
| .preview-tabs { |
| display: flex; |
| gap: 8px; |
| } |
|
|
| .preview-tab { |
| padding: 10px 20px; |
| border: 1px solid var(--border); |
| background: var(--card-solid); |
| color: var(--text-secondary); |
| font-size: 13px; |
| font-weight: 500; |
| cursor: pointer; |
| border-radius: var(--radius-sm); |
| transition: all var(--transition); |
| } |
|
|
| .preview-tab:hover { |
| border-color: var(--primary); |
| color: var(--text); |
| } |
|
|
| .preview-tab.active { |
| background: var(--primary); |
| color: white; |
| border-color: var(--primary); |
| } |
|
|
| .preview-actions { |
| display: flex; |
| gap: 8px; |
| } |
|
|
| .preview-action-btn { |
| width: 40px; |
| height: 40px; |
| border: 1px solid var(--border); |
| background: var(--card-solid); |
| border-radius: var(--radius-sm); |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| color: var(--text-secondary); |
| transition: all var(--transition); |
| } |
|
|
| .preview-action-btn:hover { |
| border-color: var(--primary); |
| color: var(--primary); |
| background: var(--primary-light); |
| } |
|
|
| .preview-action-btn.active { |
| background: var(--primary); |
| color: white; |
| border-color: var(--primary); |
| } |
|
|
| .preview-action-btn svg { |
| width: 18px; |
| height: 18px; |
| } |
|
|
|
|
| |
| .preview-panel { |
| display: none; |
| } |
|
|
| .preview-panel.active { |
| display: block; |
| } |
|
|
| .preview-frame { |
| width: 100%; |
| height: 500px; |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| background: var(--card-solid); |
| overflow: hidden; |
| } |
|
|
| .preview-frame iframe { |
| width: 100%; |
| height: 100%; |
| border: none; |
| } |
|
|
| |
| .split-view { |
| display: none; |
| gap: 16px; |
| } |
|
|
| .split-view.active { |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| } |
|
|
| .split-panel { |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| overflow: hidden; |
| background: var(--card-solid); |
| } |
|
|
| .split-panel-header { |
| padding: 12px 16px; |
| background: var(--border-light); |
| font-size: 13px; |
| font-weight: 600; |
| color: var(--text-secondary); |
| border-bottom: 1px solid var(--border-light); |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
|
|
| .split-panel-header .dot { |
| width: 8px; |
| height: 8px; |
| border-radius: 50%; |
| } |
|
|
| .split-panel-header .dot.before { |
| background: var(--text-muted); |
| } |
|
|
| .split-panel-header .dot.after { |
| background: var(--success); |
| } |
|
|
| .split-panel iframe { |
| width: 100%; |
| height: 450px; |
| border: none; |
| } |
|
|
| |
| .fullscreen-overlay { |
| position: fixed; |
| inset: 0; |
| background: var(--bg); |
| z-index: 1000; |
| display: none; |
| flex-direction: column; |
| } |
|
|
| .fullscreen-overlay.active { |
| display: flex; |
| } |
|
|
| .fullscreen-header { |
| padding: 16px 24px; |
| background: var(--card); |
| border-bottom: 1px solid var(--border); |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| } |
|
|
| .fullscreen-title { |
| font-size: 16px; |
| font-weight: 600; |
| } |
|
|
| .fullscreen-close { |
| width: 40px; |
| height: 40px; |
| border: none; |
| background: var(--border-light); |
| border-radius: var(--radius-sm); |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| color: var(--text-secondary); |
| transition: all var(--transition); |
| } |
|
|
| .fullscreen-close:hover { |
| background: var(--error-light); |
| color: var(--error); |
| } |
|
|
| .fullscreen-content { |
| flex: 1; |
| padding: 24px; |
| overflow: hidden; |
| } |
|
|
| .fullscreen-content iframe { |
| width: 100%; |
| height: 100%; |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| } |
|
|
|
|
| |
| .drop-zone { |
| border: 2px dashed var(--border); |
| border-radius: var(--radius); |
| padding: 40px 24px; |
| text-align: center; |
| transition: all var(--transition); |
| cursor: pointer; |
| background: var(--border-light); |
| } |
|
|
| .drop-zone:hover, |
| .drop-zone.drag-over { |
| border-color: var(--primary); |
| background: var(--primary-light); |
| } |
|
|
| .drop-zone-icon { |
| width: 56px; |
| height: 56px; |
| margin: 0 auto 16px; |
| color: var(--text-muted); |
| transition: transform var(--transition), color var(--transition); |
| pointer-events: none; |
| } |
|
|
| .drop-zone:hover .drop-zone-icon, |
| .drop-zone.drag-over .drop-zone-icon { |
| color: var(--primary); |
| transform: scale(1.1); |
| } |
|
|
| .drop-zone-text { |
| font-size: 15px; |
| font-weight: 500; |
| color: var(--text-secondary); |
| margin-bottom: 6px; |
| pointer-events: none; |
| } |
|
|
| .drop-zone-hint { |
| font-size: 12px; |
| color: var(--text-muted); |
| pointer-events: none; |
| } |
|
|
| .drop-zone-file { |
| display: none; |
| align-items: center; |
| justify-content: center; |
| gap: 12px; |
| padding: 14px 18px; |
| background: var(--card-solid); |
| border: 1px solid var(--border); |
| border-radius: var(--radius-sm); |
| margin-top: 16px; |
| } |
|
|
| .drop-zone-file.active { |
| display: flex; |
| } |
|
|
| .drop-zone-file-name { |
| font-size: 14px; |
| font-weight: 500; |
| color: var(--text); |
| } |
|
|
| .drop-zone-file-size { |
| font-size: 12px; |
| color: var(--text-muted); |
| } |
|
|
| .drop-zone-file-remove { |
| margin-left: auto; |
| padding: 6px 12px; |
| background: var(--error-light); |
| color: var(--error); |
| border: none; |
| border-radius: 6px; |
| font-size: 12px; |
| font-weight: 500; |
| cursor: pointer; |
| transition: all var(--transition); |
| } |
|
|
| .drop-zone-file-remove:hover { |
| background: var(--error); |
| color: white; |
| } |
|
|
| |
| .skeleton { |
| background: var(--border-light); |
| animation: shimmer 1.5s infinite; |
| border-radius: var(--radius-sm); |
| } |
|
|
| @keyframes shimmer { |
| 0% { opacity: 1; } |
| 50% { opacity: 0.5; } |
| 100% { opacity: 1; } |
| } |
|
|
| .skeleton-text { |
| height: 16px; |
| margin-bottom: 8px; |
| } |
|
|
| .skeleton-text:last-child { |
| width: 60%; |
| } |
|
|
| .skeleton-image { |
| height: 140px; |
| border-radius: var(--radius-sm); |
| } |
|
|
| .skeleton-card { |
| padding: 16px; |
| background: var(--card); |
| border-radius: var(--radius); |
| border: 1px solid var(--border); |
| } |
|
|
| |
| .image-grid-skeleton { |
| display: grid; |
| grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); |
| gap: 16px; |
| } |
|
|
| .image-card-skeleton { |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius-sm); |
| overflow: hidden; |
| } |
|
|
| .image-card-skeleton .skeleton-image { |
| border-radius: 0; |
| } |
|
|
| .image-card-skeleton .skeleton-meta { |
| padding: 12px; |
| } |
|
|
|
|
| |
| .image-toolbar { |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| flex-wrap: wrap; |
| gap: 16px; |
| padding: 16px 0; |
| border-bottom: 1px solid var(--border-light); |
| margin-bottom: 20px; |
| } |
|
|
| .image-toolbar-left, |
| .image-toolbar-right { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| flex-wrap: wrap; |
| } |
|
|
| .counter-badge { |
| padding: 10px 16px; |
| background: var(--primary-light); |
| border: 1px solid rgba(139, 195, 74, 0.2); |
| border-radius: 20px; |
| font-size: 13px; |
| color: var(--primary); |
| font-weight: 600; |
| } |
|
|
| .image-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); |
| gap: 16px; |
| } |
|
|
| .image-card { |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| overflow: hidden; |
| transition: all var(--transition); |
| cursor: pointer; |
| position: relative; |
| } |
|
|
| .image-card:hover { |
| transform: translateY(-2px); |
| box-shadow: var(--shadow); |
| border-color: var(--primary); |
| } |
|
|
| .image-card.selected { |
| border-color: var(--primary); |
| box-shadow: 0 0 0 2px var(--primary-light); |
| } |
|
|
| .image-thumb { |
| width: 100%; |
| height: 150px; |
| object-fit: cover; |
| background: var(--border-light); |
| transition: transform var(--transition); |
| } |
|
|
| .image-card:hover .image-thumb { |
| transform: scale(1.02); |
| } |
|
|
| .image-meta { |
| padding: 14px; |
| } |
|
|
| .image-filename { |
| font-size: 13px; |
| font-weight: 600; |
| color: var(--text); |
| white-space: nowrap; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| margin-bottom: 10px; |
| } |
|
|
| .image-info { |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| } |
|
|
| .image-badge { |
| font-size: 11px; |
| padding: 4px 10px; |
| background: var(--border-light); |
| border-radius: 6px; |
| color: var(--text-secondary); |
| font-weight: 500; |
| } |
|
|
| .image-checkbox { |
| display: flex; |
| align-items: center; |
| gap: 6px; |
| font-size: 12px; |
| color: var(--text-secondary); |
| } |
|
|
| .image-checkbox input { |
| width: 18px; |
| height: 18px; |
| accent-color: var(--primary); |
| cursor: pointer; |
| } |
|
|
| .image-preview-btn { |
| position: absolute; |
| top: 10px; |
| right: 10px; |
| width: 36px; |
| height: 36px; |
| background: rgba(0,0,0,0.6); |
| border: none; |
| border-radius: 8px; |
| color: white; |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| opacity: 0; |
| transform: scale(0.8); |
| transition: all var(--transition); |
| z-index: 10; |
| } |
|
|
| .image-card:hover .image-preview-btn { |
| opacity: 1; |
| transform: scale(1); |
| } |
|
|
| .image-preview-btn:hover { |
| background: var(--primary); |
| } |
|
|
| .image-preview-btn svg { |
| width: 18px; |
| height: 18px; |
| } |
|
|
|
|
| |
| .download-section { |
| display: flex; |
| align-items: center; |
| gap: 10px; |
| } |
|
|
| .download-section .form-input { |
| width: 140px; |
| padding: 10px 14px; |
| } |
|
|
| |
| .toast-container { |
| position: fixed; |
| top: 24px; |
| right: 24px; |
| z-index: 1001; |
| display: flex; |
| flex-direction: column; |
| gap: 12px; |
| max-width: 400px; |
| } |
|
|
| .toast { |
| display: flex; |
| align-items: flex-start; |
| gap: 14px; |
| padding: 16px 18px; |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| box-shadow: var(--shadow-lg); |
| animation: toastIn 0.3s ease; |
| } |
|
|
| .toast.hiding { |
| animation: toastOut 0.3s ease forwards; |
| } |
|
|
| @keyframes toastIn { |
| from { |
| transform: translateX(100%); |
| opacity: 0; |
| } |
| to { |
| transform: translateX(0); |
| opacity: 1; |
| } |
| } |
|
|
| @keyframes toastOut { |
| from { |
| transform: translateX(0); |
| opacity: 1; |
| } |
| to { |
| transform: translateX(100%); |
| opacity: 0; |
| } |
| } |
|
|
| .toast-icon { |
| width: 22px; |
| height: 22px; |
| flex-shrink: 0; |
| } |
|
|
| .toast-success .toast-icon { color: var(--success); } |
| .toast-error .toast-icon { color: var(--error); } |
| .toast-info .toast-icon { color: var(--primary); } |
|
|
| .toast-content { |
| flex: 1; |
| } |
|
|
| .toast-title { |
| font-size: 14px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 2px; |
| } |
|
|
| .toast-message { |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .toast-close { |
| background: none; |
| border: none; |
| padding: 4px; |
| cursor: pointer; |
| color: var(--text-muted); |
| border-radius: 6px; |
| transition: all var(--transition); |
| } |
|
|
| .toast-close:hover { |
| background: var(--border-light); |
| color: var(--text); |
| } |
|
|
|
|
| |
| .modal-overlay { |
| position: fixed; |
| inset: 0; |
| background: rgba(0,0,0,0.6); |
| z-index: 1000; |
| display: none; |
| align-items: center; |
| justify-content: center; |
| padding: 24px; |
| } |
|
|
| .modal-overlay.active { |
| display: flex; |
| animation: fadeIn 0.2s ease; |
| } |
|
|
| @keyframes fadeIn { |
| from { opacity: 0; } |
| to { opacity: 1; } |
| } |
|
|
| .modal-content { |
| position: relative; |
| max-width: 90vw; |
| max-height: 90vh; |
| background: var(--card); |
| border-radius: var(--radius-lg); |
| overflow: hidden; |
| box-shadow: var(--shadow-lg); |
| animation: modalIn 0.3s ease; |
| } |
|
|
| @keyframes modalIn { |
| from { |
| transform: scale(0.95); |
| opacity: 0; |
| } |
| to { |
| transform: scale(1); |
| opacity: 1; |
| } |
| } |
|
|
| .modal-image { |
| max-width: 100%; |
| max-height: 75vh; |
| display: block; |
| } |
|
|
| .modal-footer { |
| padding: 18px 24px; |
| background: var(--card); |
| border-top: 1px solid var(--border); |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| gap: 16px; |
| } |
|
|
| .modal-info { |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .modal-info strong { |
| color: var(--text); |
| font-weight: 600; |
| } |
|
|
| .modal-close { |
| position: absolute; |
| top: 16px; |
| right: 16px; |
| width: 40px; |
| height: 40px; |
| background: rgba(0,0,0,0.5); |
| border: none; |
| border-radius: 50%; |
| color: white; |
| cursor: pointer; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| transition: all var(--transition); |
| } |
|
|
| .modal-close:hover { |
| background: var(--error); |
| } |
|
|
| |
| .progress-container { |
| margin-top: 16px; |
| display: none; |
| } |
|
|
| .progress-container.active { |
| display: block; |
| } |
|
|
| .progress-bar { |
| height: 6px; |
| background: var(--border); |
| border-radius: 3px; |
| overflow: hidden; |
| } |
|
|
| .progress-fill { |
| height: 100%; |
| background: var(--primary); |
| border-radius: 3px; |
| width: 0%; |
| transition: width 0.3s ease; |
| } |
|
|
| .progress-fill.indeterminate { |
| width: 30%; |
| animation: indeterminate 1.5s ease-in-out infinite; |
| } |
|
|
| @keyframes indeterminate { |
| 0% { transform: translateX(-100%); } |
| 100% { transform: translateX(400%); } |
| } |
|
|
| .progress-text { |
| font-size: 12px; |
| color: var(--text-secondary); |
| margin-top: 8px; |
| text-align: center; |
| } |
|
|
| |
| .spinner { |
| width: 20px; |
| height: 20px; |
| border: 2px solid rgba(255,255,255,0.3); |
| border-top-color: white; |
| border-radius: 50%; |
| animation: spin 0.8s linear infinite; |
| } |
|
|
| @keyframes spin { |
| to { transform: rotate(360deg); } |
| } |
|
|
| .btn.loading { |
| pointer-events: none; |
| } |
|
|
|
|
| |
| .form-group.error .form-input, |
| .form-group.error .form-select { |
| border-color: var(--error); |
| } |
|
|
| .form-group.error .form-input:focus { |
| box-shadow: 0 0 0 3px var(--error-light); |
| } |
|
|
| .form-error { |
| display: none; |
| font-size: 12px; |
| color: var(--error); |
| margin-top: 6px; |
| align-items: center; |
| gap: 6px; |
| } |
|
|
| .form-group.error .form-error { |
| display: flex; |
| } |
|
|
| .form-error svg { |
| width: 14px; |
| height: 14px; |
| } |
|
|
| |
| .kbd { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| padding: 3px 8px; |
| background: var(--border-light); |
| border: 1px solid var(--border); |
| border-radius: 6px; |
| font-size: 10px; |
| font-family: monospace; |
| color: var(--text-muted); |
| margin-left: 8px; |
| } |
|
|
| |
| @media (max-width: 1024px) { |
| .sidebar { |
| transform: translateX(-100%); |
| } |
| |
| .sidebar.open { |
| transform: translateX(0); |
| } |
| |
| .main-content { |
| margin-left: 0; |
| } |
| |
| .mobile-menu-btn { |
| display: flex; |
| } |
| |
| .split-view.active { |
| grid-template-columns: 1fr; |
| } |
| } |
|
|
| @media (max-width: 640px) { |
| .main-content { |
| padding: 16px; |
| } |
| |
| .page-header h2 { |
| font-size: 22px; |
| } |
| |
| .image-toolbar { |
| flex-direction: column; |
| align-items: flex-start; |
| } |
| |
| .download-section { |
| flex-direction: column; |
| width: 100%; |
| } |
| |
| .download-section .form-input { |
| width: 100%; |
| } |
| } |
|
|
| |
| .mobile-menu-btn { |
| display: none; |
| position: fixed; |
| top: 16px; |
| left: 16px; |
| z-index: 101; |
| width: 44px; |
| height: 44px; |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius-sm); |
| cursor: pointer; |
| align-items: center; |
| justify-content: center; |
| color: var(--text); |
| } |
|
|
| @media (max-width: 1024px) { |
| .mobile-menu-btn { |
| display: flex; |
| } |
| } |
|
|
| |
| .sidebar-overlay { |
| display: none; |
| position: fixed; |
| inset: 0; |
| background: rgba(0,0,0,0.5); |
| z-index: 99; |
| } |
|
|
| .sidebar-overlay.active { |
| display: block; |
| } |
|
|
|
|
| |
| .tooltip { |
| position: relative; |
| } |
|
|
| .tooltip::before, |
| .tooltip::after { |
| position: absolute; |
| opacity: 0; |
| visibility: hidden; |
| transition: all 0.2s ease; |
| z-index: 100; |
| pointer-events: none; |
| } |
|
|
| .tooltip::before { |
| content: attr(data-tooltip); |
| bottom: calc(100% + 8px); |
| left: 50%; |
| transform: translateX(-50%); |
| padding: 8px 12px; |
| background: var(--text); |
| color: var(--bg); |
| font-size: 12px; |
| font-weight: 500; |
| white-space: nowrap; |
| border-radius: 8px; |
| box-shadow: var(--shadow); |
| } |
|
|
| .tooltip::after { |
| content: ''; |
| bottom: calc(100% + 2px); |
| left: 50%; |
| transform: translateX(-50%); |
| border: 6px solid transparent; |
| border-top-color: var(--text); |
| } |
|
|
| .tooltip:hover::before, |
| .tooltip:hover::after { |
| opacity: 1; |
| visibility: visible; |
| } |
|
|
| |
| .tooltip-bottom::before { |
| bottom: auto; |
| top: calc(100% + 8px); |
| } |
|
|
| .tooltip-bottom::after { |
| bottom: auto; |
| top: calc(100% + 2px); |
| border-top-color: transparent; |
| border-bottom-color: var(--text); |
| } |
|
|
| .tooltip-left::before { |
| bottom: auto; |
| left: auto; |
| right: calc(100% + 8px); |
| top: 50%; |
| transform: translateY(-50%); |
| } |
|
|
| .tooltip-left::after { |
| bottom: auto; |
| left: auto; |
| right: calc(100% + 2px); |
| top: 50%; |
| border-top-color: transparent; |
| border-left-color: var(--text); |
| transform: translateY(-50%); |
| } |
|
|
| |
| .step-indicator { |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| gap: 8px; |
| margin-bottom: 24px; |
| padding: 16px; |
| background: var(--card); |
| border: 1px solid var(--border); |
| border-radius: var(--radius); |
| } |
|
|
| .step { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| } |
|
|
| .step-number { |
| width: 32px; |
| height: 32px; |
| border-radius: 50%; |
| background: var(--border-light); |
| color: var(--text-muted); |
| font-size: 13px; |
| font-weight: 600; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| transition: all var(--transition); |
| } |
|
|
| .step-number svg { |
| width: 16px; |
| height: 16px; |
| } |
|
|
| .step.active .step-number { |
| background: var(--primary); |
| color: white; |
| } |
|
|
| .step.completed .step-number { |
| background: var(--success); |
| color: white; |
| } |
|
|
| .step-label { |
| font-size: 13px; |
| color: var(--text-muted); |
| font-weight: 500; |
| transition: color var(--transition); |
| } |
|
|
| .step.active .step-label { |
| color: var(--text); |
| } |
|
|
| .step.completed .step-label { |
| color: var(--success); |
| } |
|
|
| .step-connector { |
| width: 40px; |
| height: 2px; |
| background: var(--border); |
| border-radius: 1px; |
| position: relative; |
| overflow: hidden; |
| } |
|
|
| .step-connector::after { |
| content: ''; |
| position: absolute; |
| left: 0; |
| top: 0; |
| height: 100%; |
| width: 0%; |
| background: var(--success); |
| transition: width 0.5s ease; |
| } |
|
|
| .step-connector.completed::after { |
| width: 100%; |
| } |
|
|
|
|
| |
| .success-overlay { |
| position: fixed; |
| inset: 0; |
| background: rgba(139, 195, 74, 0.1); |
| z-index: 1000; |
| display: none; |
| align-items: center; |
| justify-content: center; |
| animation: successFadeIn 0.3s ease; |
| } |
|
|
| .success-overlay.active { |
| display: flex; |
| } |
|
|
| @keyframes successFadeIn { |
| from { opacity: 0; } |
| to { opacity: 1; } |
| } |
|
|
| .success-content { |
| text-align: center; |
| animation: successBounce 0.4s ease; |
| } |
|
|
| @keyframes successBounce { |
| 0% { transform: scale(0.8); opacity: 0; } |
| 100% { transform: scale(1); opacity: 1; } |
| } |
|
|
| .success-icon { |
| width: 80px; |
| height: 80px; |
| background: var(--success); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin: 0 auto 20px; |
| box-shadow: var(--shadow-lg); |
| } |
|
|
| .success-icon svg { |
| width: 40px; |
| height: 40px; |
| color: white; |
| } |
|
|
| .success-title { |
| font-size: 24px; |
| font-weight: 700; |
| color: var(--text); |
| margin-bottom: 8px; |
| } |
|
|
| .success-message { |
| font-size: 15px; |
| color: var(--text-secondary); |
| margin-bottom: 20px; |
| } |
|
|
| |
| .confetti { |
| position: absolute; |
| width: 10px; |
| height: 10px; |
| border-radius: 2px; |
| animation: confettiFall 3s ease-out forwards; |
| } |
|
|
| @keyframes confettiFall { |
| 0% { |
| transform: translateY(0) rotate(0deg); |
| opacity: 1; |
| } |
| 100% { |
| transform: translateY(400px) rotate(720deg); |
| opacity: 0; |
| } |
| } |
|
|
| |
| .error-state { |
| padding: 40px 24px; |
| text-align: center; |
| background: var(--error-light); |
| border: 1px solid rgba(229, 57, 53, 0.2); |
| border-radius: var(--radius); |
| margin-top: 16px; |
| } |
|
|
| .error-state-icon { |
| width: 64px; |
| height: 64px; |
| background: rgba(229, 57, 53, 0.15); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin: 0 auto 16px; |
| } |
|
|
| .error-state-icon svg { |
| width: 32px; |
| height: 32px; |
| color: var(--error); |
| } |
|
|
| .error-state-title { |
| font-size: 18px; |
| font-weight: 600; |
| color: var(--error); |
| margin-bottom: 8px; |
| } |
|
|
| .error-state-message { |
| font-size: 14px; |
| color: var(--text-secondary); |
| margin-bottom: 20px; |
| max-width: 400px; |
| margin-left: auto; |
| margin-right: auto; |
| } |
|
|
| .error-state-actions { |
| display: flex; |
| gap: 12px; |
| justify-content: center; |
| flex-wrap: wrap; |
| } |
|
|
| .error-state .btn { |
| min-width: 120px; |
| } |
|
|
| |
| .inline-error { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| padding: 14px 18px; |
| background: var(--error-light); |
| border: 1px solid rgba(229, 57, 53, 0.3); |
| border-radius: var(--radius-sm); |
| margin-top: 16px; |
| } |
|
|
| .inline-error-icon { |
| width: 40px; |
| height: 40px; |
| background: rgba(229, 57, 53, 0.15); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| flex-shrink: 0; |
| } |
|
|
| .inline-error-icon svg { |
| width: 20px; |
| height: 20px; |
| color: var(--error); |
| } |
|
|
| .inline-error-content { |
| flex: 1; |
| } |
|
|
| .inline-error-title { |
| font-size: 14px; |
| font-weight: 600; |
| color: var(--error); |
| margin-bottom: 2px; |
| } |
|
|
| .inline-error-message { |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .inline-error-action { |
| padding: 8px 16px; |
| background: var(--error); |
| color: white; |
| border: none; |
| border-radius: 6px; |
| font-size: 13px; |
| font-weight: 500; |
| cursor: pointer; |
| transition: all var(--transition); |
| } |
|
|
| .inline-error-action:hover { |
| opacity: 0.9; |
| } |
|
|
|
|
| |
| .empty-state { |
| padding: 60px 24px; |
| text-align: center; |
| } |
|
|
| .empty-state-illustration { |
| width: 120px; |
| height: 120px; |
| margin: 0 auto 24px; |
| background: var(--primary-light); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| position: relative; |
| } |
|
|
| .empty-state-illustration::before { |
| content: ''; |
| position: absolute; |
| inset: -4px; |
| border-radius: 50%; |
| border: 2px dashed var(--border); |
| animation: emptyRotate 20s linear infinite; |
| } |
|
|
| @keyframes emptyRotate { |
| from { transform: rotate(0deg); } |
| to { transform: rotate(360deg); } |
| } |
|
|
| .empty-state-illustration svg { |
| width: 48px; |
| height: 48px; |
| color: var(--primary); |
| } |
|
|
| .empty-state-title { |
| font-size: 20px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 8px; |
| } |
|
|
| .empty-state-message { |
| font-size: 14px; |
| color: var(--text-secondary); |
| margin-bottom: 24px; |
| max-width: 360px; |
| margin-left: auto; |
| margin-right: auto; |
| line-height: 1.6; |
| } |
|
|
| .empty-state-actions { |
| display: flex; |
| gap: 12px; |
| justify-content: center; |
| flex-wrap: wrap; |
| } |
|
|
| |
| .preview-empty { |
| height: 100%; |
| min-height: 400px; |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| justify-content: center; |
| background: var(--border-light); |
| border-radius: var(--radius); |
| border: 2px dashed var(--border); |
| } |
|
|
| .preview-empty-icon { |
| width: 80px; |
| height: 80px; |
| background: var(--card); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin-bottom: 20px; |
| box-shadow: var(--shadow); |
| } |
|
|
| .preview-empty-icon svg { |
| width: 36px; |
| height: 36px; |
| color: var(--text-muted); |
| } |
|
|
| .preview-empty-title { |
| font-size: 16px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 6px; |
| } |
|
|
| .preview-empty-message { |
| font-size: 13px; |
| color: var(--text-muted); |
| } |
|
|
| |
| .image-grid-empty { |
| grid-column: 1 / -1; |
| padding: 60px 24px; |
| text-align: center; |
| background: var(--border-light); |
| border-radius: var(--radius); |
| border: 2px dashed var(--border); |
| } |
|
|
| .image-grid-empty-icon { |
| width: 72px; |
| height: 72px; |
| background: var(--card); |
| border-radius: 50%; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin: 0 auto 16px; |
| box-shadow: var(--shadow); |
| } |
|
|
| .image-grid-empty-icon svg { |
| width: 32px; |
| height: 32px; |
| color: var(--text-muted); |
| } |
|
|
| .image-grid-empty-title { |
| font-size: 16px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 6px; |
| } |
|
|
| .image-grid-empty-message { |
| font-size: 13px; |
| color: var(--text-muted); |
| max-width: 300px; |
| margin: 0 auto; |
| } |
|
|
|
|
| |
| .help-tip { |
| display: inline-flex; |
| align-items: center; |
| justify-content: center; |
| width: 18px; |
| height: 18px; |
| background: var(--border-light); |
| border: 1px solid var(--border); |
| border-radius: 50%; |
| font-size: 11px; |
| font-weight: 600; |
| color: var(--text-muted); |
| cursor: help; |
| margin-left: 6px; |
| transition: all var(--transition); |
| } |
|
|
| .help-tip:hover { |
| background: var(--primary-light); |
| border-color: var(--primary); |
| color: var(--primary); |
| } |
|
|
| |
| .feature-hint { |
| display: flex; |
| align-items: flex-start; |
| gap: 12px; |
| padding: 14px 16px; |
| background: var(--primary-light); |
| border: 1px solid rgba(139, 195, 74, 0.2); |
| border-radius: var(--radius-sm); |
| margin-bottom: 20px; |
| } |
|
|
| .feature-hint-icon { |
| width: 36px; |
| height: 36px; |
| background: var(--primary); |
| border-radius: 8px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| flex-shrink: 0; |
| } |
|
|
| .feature-hint-icon svg { |
| width: 18px; |
| height: 18px; |
| color: white; |
| } |
|
|
| .feature-hint-content { |
| flex: 1; |
| } |
|
|
| .feature-hint-title { |
| font-size: 14px; |
| font-weight: 600; |
| color: var(--text); |
| margin-bottom: 2px; |
| } |
|
|
| .feature-hint-message { |
| font-size: 13px; |
| color: var(--text-secondary); |
| } |
|
|
| .feature-hint-dismiss { |
| padding: 4px; |
| background: none; |
| border: none; |
| color: var(--text-muted); |
| cursor: pointer; |
| border-radius: 4px; |
| transition: all var(--transition); |
| } |
|
|
| .feature-hint-dismiss:hover { |
| background: var(--border-light); |
| color: var(--text); |
| } |
|
|
| |
| .setup-notice { |
| background: var(--primary-light); |
| border: 1px solid rgba(139, 195, 74, 0.25); |
| border-radius: var(--radius-sm); |
| margin-bottom: 12px; |
| overflow: hidden; |
| } |
|
|
| .setup-notice-header { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| padding: 10px 12px; |
| background: rgba(139, 195, 74, 0.1); |
| border-bottom: 1px solid rgba(139, 195, 74, 0.15); |
| font-size: 12px; |
| font-weight: 600; |
| color: var(--primary); |
| } |
|
|
| .setup-notice-header svg { |
| width: 16px; |
| height: 16px; |
| } |
|
|
| .setup-notice-close { |
| margin-left: auto; |
| background: none; |
| border: none; |
| font-size: 18px; |
| color: var(--text-muted); |
| cursor: pointer; |
| padding: 0 4px; |
| line-height: 1; |
| border-radius: 4px; |
| transition: all var(--transition); |
| } |
|
|
| .setup-notice-close:hover { |
| background: rgba(139, 195, 74, 0.2); |
| color: var(--text); |
| } |
|
|
| .setup-notice-body { |
| padding: 12px; |
| } |
|
|
| .setup-notice-body p { |
| font-size: 11px; |
| color: var(--text-secondary); |
| margin-bottom: 8px; |
| } |
|
|
| .setup-notice-code { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| background: var(--card-solid); |
| border: 1px solid var(--border); |
| border-radius: 6px; |
| padding: 8px 10px; |
| margin-bottom: 8px; |
| } |
|
|
| .setup-notice-code code { |
| flex: 1; |
| font-family: 'Consolas', 'Monaco', monospace; |
| font-size: 11px; |
| color: var(--text); |
| word-break: break-all; |
| } |
|
|
| .copy-btn { |
| background: var(--border-light); |
| border: none; |
| padding: 4px 6px; |
| border-radius: 4px; |
| cursor: pointer; |
| color: var(--text-muted); |
| transition: all var(--transition); |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| } |
|
|
| .copy-btn:hover { |
| background: var(--primary-light); |
| color: var(--primary); |
| } |
|
|
| .copy-btn.copied { |
| background: var(--success-light); |
| color: var(--success); |
| } |
|
|
| .setup-notice-hint { |
| font-size: 10px !important; |
| color: var(--text-muted) !important; |
| margin-bottom: 0 !important; |
| margin-top: 4px; |
| } |
|
|
| .setup-notice-hint strong { |
| color: var(--primary); |
| } |
|
|
| .setup-notice-or { |
| font-size: 10px !important; |
| color: var(--text-muted) !important; |
| text-align: center; |
| margin: 4px 0 !important; |
| } |
|
|
| |
| .setup-notice.hidden { |
| display: none; |
| } |