/* ============================================ ERP Nutzfahrzeuge - Design Tokens ============================================ */ :root { /* Brand Colors */ --color-primary: #1e40af; --color-primary-hover: #1e3a8a; --color-primary-light: #dbeafe; --color-primary-dark: #1e3a8a; --color-secondary: #475569; --color-accent: #f59e0b; /* Status Colors */ --color-success: #16a34a; --color-success-light: #dcfce7; --color-warning: #f59e0b; --color-warning-light: #fef3c7; --color-error: #dc2626; --color-error-light: #fee2e2; --color-info: #0ea5e9; --color-info-light: #e0f2fe; /* Surface Colors */ --color-bg: #f8fafc; --color-surface: #ffffff; --color-surface-hover: #f1f5f9; --color-surface-active: #e2e8f0; --color-border: #e2e8f0; --color-border-strong: #cbd5e1; /* Text Colors */ --color-text: #0f172a; --color-text-secondary: #64748b; --color-text-muted: #94a3b8; --color-text-inverse: #ffffff; /* Typography */ --font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; --font-size-xs: 0.75rem; --font-size-sm: 0.875rem; --font-size-base: 1rem; --font-size-lg: 1.125rem; --font-size-xl: 1.25rem; --font-size-2xl: 1.5rem; --font-size-3xl: 1.875rem; --font-size-4xl: 2.25rem; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --line-height-tight: 1.25; --line-height-normal: 1.5; --line-height-relaxed: 1.75; /* Spacing (4px base) */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; --space-16: 4rem; /* Border Radius */ --radius-sm: 0.25rem; --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-xl: 0.75rem; --radius-full: 9999px; /* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.05); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1); --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1); --shadow-xl: 0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1); /* Transitions */ --transition-fast: 150ms ease; --transition-normal: 250ms ease; --transition-slow: 350ms ease; /* Layout */ --sidebar-width: 260px; --sidebar-collapsed: 64px; --topbar-height: 64px; /* Z-Index */ --z-sidebar: 30; --z-topbar: 40; --z-dropdown: 50; --z-modal: 100; --z-toast: 200; } /* Dark Mode */ [data-theme="dark"] { --color-bg: #0f172a; --color-surface: #1e293b; --color-surface-hover: #334155; --color-surface-active: #475569; --color-border: #334155; --color-border-strong: #475569; --color-text: #f1f5f9; --color-text-secondary: #94a3b8; --color-text-muted: #64748b; --color-primary-light: #1e3a8a; --color-success-light: #14532d; --color-warning-light: #78350f; --color-error-light: #7f1d1d; --color-info-light: #0c4a6e; } /* Base Reset */ * { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; } body { font-family: var(--font-family); background: var(--color-bg); color: var(--color-text); line-height: var(--line-height-normal); -webkit-font-smoothing: antialiased; } /* Skip Link */ .skip-link { position: absolute; top: -100px; left: 0; background: var(--color-primary); color: white; padding: var(--space-2) var(--space-4); border-radius: 0 0 var(--radius-md) 0; z-index: var(--z-toast); text-decoration: none; } .skip-link:focus { top: 0; } /* Focus Ring */ *:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } /* Scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-border-strong); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); } /* App Layout */ .app-layout { display: flex; min-height: 100vh; } /* Sidebar */ .sidebar { width: var(--sidebar-width); background: var(--color-surface); border-right: 1px solid var(--color-border); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: var(--z-sidebar); transition: transform var(--transition-normal); } .sidebar.collapsed { transform: translateX(-100%); } .sidebar-header { height: var(--topbar-height); display: flex; align-items: center; padding: 0 var(--space-6); border-bottom: 1px solid var(--color-border); gap: var(--space-3); } .sidebar-logo { width: 32px; height: 32px; background: var(--color-primary); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; color: white; font-weight: var(--font-weight-bold); font-size: var(--font-size-base); } .sidebar-title { font-weight: var(--font-weight-bold); font-size: var(--font-size-base); color: var(--color-text); } .sidebar-subtitle { font-size: var(--font-size-xs); color: var(--color-text-muted); } .sidebar-nav { flex: 1; overflow-y: auto; padding: var(--space-4) var(--space-3); } .sidebar-nav-section { margin-bottom: var(--space-6); } .sidebar-nav-label { font-size: var(--font-size-xs); text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-text-muted); padding: 0 var(--space-3) var(--space-2); font-weight: var(--font-weight-semibold); } .sidebar-nav-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); color: var(--color-text-secondary); cursor: pointer; transition: all var(--transition-fast); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); text-decoration: none; margin-bottom: 2px; } .sidebar-nav-item:hover { background: var(--color-surface-hover); color: var(--color-text); } .sidebar-nav-item.active { background: var(--color-primary); color: white; } .sidebar-nav-item.disabled { opacity: 0.4; cursor: not-allowed; } .sidebar-footer { padding: var(--space-4) var(--space-3); border-top: 1px solid var(--color-border); } /* Main Content */ .main-content { flex: 1; margin-left: var(--sidebar-width); display: flex; flex-direction: column; min-height: 100vh; transition: margin var(--transition-normal); } .main-content.sidebar-collapsed { margin-left: 0; } /* Topbar */ .topbar { height: var(--topbar-height); background: var(--color-surface); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; padding: 0 var(--space-6); gap: var(--space-4); position: sticky; top: 0; z-index: var(--z-topbar); } .topbar-breadcrumb { display: flex; align-items: center; gap: var(--space-2); font-size: var(--font-size-sm); color: var(--color-text-secondary); } .topbar-breadcrumb .current { color: var(--color-text); font-weight: var(--font-weight-semibold); } .topbar-actions { margin-left: auto; display: flex; align-items: center; gap: var(--space-3); } /* Content Area */ .content-area { flex: 1; padding: var(--space-6); max-width: 1600px; width: 100%; } /* Cards */ .card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); } .card-header { padding: var(--space-4) var(--space-6); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; justify-content: space-between; } .card-title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); } .card-body { padding: var(--space-6); } /* KPI Cards */ .kpi-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-5); box-shadow: var(--shadow-sm); transition: box-shadow var(--transition-fast); } .kpi-card:hover { box-shadow: var(--shadow-md); } .kpi-card .kpi-label { font-size: var(--font-size-sm); color: var(--color-text-secondary); font-weight: var(--font-weight-medium); } .kpi-card .kpi-value { font-size: var(--font-size-3xl); font-weight: var(--font-weight-bold); margin-top: var(--space-1); } .kpi-card .kpi-trend { font-size: var(--font-size-xs); margin-top: var(--space-2); display: flex; align-items: center; gap: var(--space-1); } /* Badges */ .badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-2); border-radius: var(--radius-full); font-size: var(--font-size-xs); font-weight: var(--font-weight-medium); } .badge-success { background: var(--color-success-light); color: var(--color-success); } .badge-warning { background: var(--color-warning-light); color: #92400e; } .badge-error { background: var(--color-error-light); color: var(--color-error); } .badge-info { background: var(--color-info-light); color: #075985; } .badge-neutral { background: var(--color-surface-active); color: var(--color-text-secondary); } .badge-primary { background: var(--color-primary-light); color: var(--color-primary); } /* Table */ .data-table { width: 100%; border-collapse: collapse; font-size: var(--font-size-sm); } .data-table th { text-align: left; padding: var(--space-3) var(--space-4); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); border-bottom: 1px solid var(--color-border); white-space: nowrap; cursor: pointer; user-select: none; } .data-table th:hover { color: var(--color-text); } .data-table td { padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border); color: var(--color-text); } .data-table tbody tr { transition: background var(--transition-fast); } .data-table tbody tr:hover { background: var(--color-surface-hover); } .data-table .sortable-icon { opacity: 0.3; margin-left: var(--space-1); } .data-table .sorted .sortable-icon { opacity: 1; } /* Buttons */ .btn { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); border-radius: var(--radius-md); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); cursor: pointer; border: 1px solid transparent; transition: all var(--transition-fast); text-decoration: none; white-space: nowrap; } .btn:active { transform: scale(0.98); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--color-primary); color: white; } .btn-primary:hover:not(:disabled) { background: var(--color-primary-hover); } .btn-secondary { background: var(--color-surface); color: var(--color-text); border-color: var(--color-border-strong); } .btn-secondary:hover:not(:disabled) { background: var(--color-surface-hover); } .btn-ghost { background: transparent; color: var(--color-text-secondary); } .btn-ghost:hover:not(:disabled) { background: var(--color-surface-hover); color: var(--color-text); } .btn-danger { background: var(--color-error); color: white; } .btn-danger:hover:not(:disabled) { background: #b91c1c; } .btn-sm { padding: var(--space-1) var(--space-3); font-size: var(--font-size-xs); } .btn-lg { padding: var(--space-3) var(--space-6); font-size: var(--font-size-base); } /* Inputs */ .input, .select, .textarea { width: 100%; padding: var(--space-2) var(--space-3); border: 1px solid var(--color-border-strong); border-radius: var(--radius-md); font-size: var(--font-size-sm); background: var(--color-surface); color: var(--color-text); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } .input:focus, .select:focus, .textarea:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-light); outline: none; } .input:disabled { background: var(--color-surface-hover); cursor: not-allowed; } .input-error { border-color: var(--color-error); } .input-error:focus { box-shadow: 0 0 0 3px var(--color-error-light); } .label { display: block; font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); margin-bottom: var(--space-1); } .label .required { color: var(--color-error); } .form-group { margin-bottom: var(--space-4); } .form-hint { font-size: var(--font-size-xs); color: var(--color-text-muted); margin-top: var(--space-1); } .form-error { font-size: var(--font-size-xs); color: var(--color-error); margin-top: var(--space-1); } /* Tabs */ .tabs { display: flex; gap: var(--space-1); border-bottom: 2px solid var(--color-border); margin-bottom: var(--space-6); overflow-x: auto; } .tab { padding: var(--space-3) var(--space-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; transition: all var(--transition-fast); white-space: nowrap; } .tab:hover { color: var(--color-text); } .tab.active { color: var(--color-primary); border-bottom-color: var(--color-primary); } /* Mobile Menu Button */ .mobile-menu-btn { display: none; background: none; border: none; color: var(--color-text); cursor: pointer; padding: var(--space-2); } /* Responsive */ @media (max-width: 768px) { .sidebar { transform: translateX(-100%); } .sidebar.open { transform: translateX(0); } .main-content { margin-left: 0; } .mobile-menu-btn { display: flex; } .content-area { padding: var(--space-4); } .kpi-grid { grid-template-columns: 1fr 1fr !important; } .data-table { font-size: var(--font-size-xs); } .data-table th, .data-table td { padding: var(--space-2); } .hide-mobile { display: none !important; } .topbar-actions .lang-switcher { display: none; } } @media (max-width: 480px) { .kpi-grid { grid-template-columns: 1fr !important; } } /* Loading Skeleton */ .skeleton { background: linear-gradient(90deg, var(--color-surface-hover) 25%, var(--color-surface-active) 50%, var(--color-surface-hover) 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: var(--radius-md); } @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* Empty State */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-12) var(--space-6); text-align: center; } .empty-state-icon { width: 64px; height: 64px; color: var(--color-text-muted); margin-bottom: var(--space-4); } .empty-state-title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); margin-bottom: var(--space-2); } .empty-state-text { font-size: var(--font-size-sm); color: var(--color-text-secondary); max-width: 400px; margin-bottom: var(--space-4); } /* Error State */ .error-state { display: flex; flex-direction: column; align-items: center; padding: var(--space-12) var(--space-6); text-align: center; } .error-state-icon { width: 48px; height: 48px; color: var(--color-error); margin-bottom: var(--space-4); } /* Chat (KI Copilot) */ .chat-container { display: flex; flex-direction: column; height: 100%; max-height: 600px; } .chat-messages { flex: 1; overflow-y: auto; padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-4); } .chat-message { display: flex; gap: var(--space-3); max-width: 80%; } .chat-message.user { margin-left: auto; flex-direction: row-reverse; } .chat-bubble { padding: var(--space-3) var(--space-4); border-radius: var(--radius-lg); font-size: var(--font-size-sm); } .chat-message.assistant .chat-bubble { background: var(--color-surface-hover); } .chat-message.user .chat-bubble { background: var(--color-primary); color: white; } .chat-input-area { border-top: 1px solid var(--color-border); padding: var(--space-4); display: flex; gap: var(--space-2); } /* Avatar */ .avatar { width: 32px; height: 32px; border-radius: var(--radius-full); background: var(--color-primary); color: white; display: flex; align-items: center; justify-content: center; font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); flex-shrink: 0; } .avatar-lg { width: 48px; height: 48px; font-size: var(--font-size-lg); } /* Select dropdown */ .select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right var(--space-3) center; padding-right: var(--space-8); } /* Toggle Switch */ .toggle { position: relative; width: 44px; height: 24px; background: var(--color-border-strong); border-radius: var(--radius-full); cursor: pointer; transition: background var(--transition-fast); } .toggle.active { background: var(--color-primary); } .toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: var(--radius-full); transition: transform var(--transition-fast); } .toggle.active::after { transform: translateX(20px); } /* Tooltip */ .tooltip { position: relative; } .tooltip:hover::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: var(--color-text); color: var(--color-text-inverse); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--font-size-xs); white-space: nowrap; z-index: var(--z-dropdown); margin-bottom: var(--space-1); } /* Progress Bar */ .progress-bar { width: 100%; height: 8px; background: var(--color-surface-active); border-radius: var(--radius-full); overflow: hidden; } .progress-bar-fill { height: 100%; background: var(--color-primary); border-radius: var(--radius-full); transition: width var(--transition-normal); } /* Modal Overlay */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; padding: var(--space-4); } .modal { background: var(--color-surface); border-radius: var(--radius-xl); box-shadow: var(--shadow-xl); max-width: 600px; width: 100%; max-height: 90vh; overflow-y: auto; } .modal-header { padding: var(--space-6); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; justify-content: space-between; } .modal-body { padding: var(--space-6); } .modal-footer { padding: var(--space-4) var(--space-6); border-top: 1px solid var(--color-border); display: flex; justify-content: flex-end; gap: var(--space-3); } /* Toast */ .toast-container { position: fixed; bottom: var(--space-6); right: var(--space-6); z-index: var(--z-toast); display: flex; flex-direction: column; gap: var(--space-2); } .toast { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); padding: var(--space-4); display: flex; align-items: flex-start; gap: var(--space-3); min-width: 300px; max-width: 400px; animation: slideIn var(--transition-normal); } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .toast-success { border-left: 4px solid var(--color-success); } .toast-error { border-left: 4px solid var(--color-error); } .toast-warning { border-left: 4px solid var(--color-warning); } .toast-info { border-left: 4px solid var(--color-info); } /* Pagination */ .pagination { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-4); justify-content: space-between; } .pagination-info { font-size: var(--font-size-sm); color: var(--color-text-secondary); } .pagination-controls { display: flex; gap: var(--space-1); } .pagination-btn { padding: var(--space-1) var(--space-3); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); cursor: pointer; font-size: var(--font-size-sm); transition: all var(--transition-fast); } .pagination-btn:hover:not(:disabled) { background: var(--color-surface-hover); } .pagination-btn.active { background: var(--color-primary); color: white; border-color: var(--color-primary); } .pagination-btn:disabled { opacity: 0.4; cursor: not-allowed; } /* Image Grid */ .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--space-4); } .image-grid-item { aspect-ratio: 4/3; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--color-border); position: relative; cursor: pointer; transition: transform var(--transition-fast); } .image-grid-item:hover { transform: scale(1.02); } .image-grid-item img { width: 100%; height: 100%; object-fit: cover; } /* File Upload Drop Zone */ .dropzone { border: 2px dashed var(--color-border-strong); border-radius: var(--radius-lg); padding: var(--space-8); text-align: center; cursor: pointer; transition: border-color var(--transition-fast), background var(--transition-fast); } .dropzone:hover, .dropzone.dragover { border-color: var(--color-primary); background: var(--color-primary-light); } /* Stat Grid */ .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-4); } /* Two Column Layout */ .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-6); } @media (max-width: 768px) { .two-col { grid-template-columns: 1fr; } } /* Info Grid */ .info-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--space-4); } .info-item { padding: var(--space-3) 0; } .info-label { font-size: var(--font-size-xs); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; font-weight: var(--font-weight-medium); margin-bottom: var(--space-1); } .info-value { font-size: var(--font-size-sm); color: var(--color-text); font-weight: var(--font-weight-medium); } /* Warning Banner */ .warning-banner { background: var(--color-warning-light); border: 1px solid var(--color-warning); border-radius: var(--radius-md); padding: var(--space-4); display: flex; align-items: flex-start; gap: var(--space-3); margin-bottom: var(--space-4); } .warning-banner-icon { color: var(--color-warning); flex-shrink: 0; } /* Spinner */ .spinner { width: 20px; height: 20px; border: 2px solid var(--color-border); border-top-color: var(--color-primary); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .spinner-lg { width: 40px; height: 40px; border-width: 3px; } /* Sidebar Overlay (mobile) */ .sidebar-overlay { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 25; } @media (max-width: 768px) { .sidebar-overlay.show { display: block; } } /* ============================================ v2 Additions: Card View, Calendar, Stammdaten ============================================ */ /* View Toggle */ .view-toggle { display: inline-flex; border: 1px solid var(--color-border-strong); border-radius: var(--radius-md); overflow: hidden; } .view-toggle-btn { padding: var(--space-2) var(--space-3); background: var(--color-surface); border: none; cursor: pointer; font-size: var(--font-size-sm); color: var(--color-text-secondary); display: flex; align-items: center; gap: var(--space-2); transition: all var(--transition-fast); } .view-toggle-btn:hover { background: var(--color-surface-hover); } .view-toggle-btn.active { background: var(--color-primary); color: white; } /* Vehicle Cards Grid */ .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-4); } .vehicle-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); overflow: hidden; cursor: pointer; transition: box-shadow var(--transition-fast), transform var(--transition-fast); } .vehicle-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); } .vehicle-card-image { width: 100%; aspect-ratio: 4/3; background: linear-gradient(135deg, var(--color-surface-active), var(--color-border)); display: flex; align-items: center; justify-content: center; position: relative; } .vehicle-card-image .card-status-badge { position: absolute; top: var(--space-2); right: var(--space-2); } .vehicle-card-body { padding: var(--space-4); } .vehicle-card-title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); margin-bottom: var(--space-1); } .vehicle-card-subtitle { font-size: var(--font-size-xs); color: var(--color-text-muted); font-family: var(--font-mono); margin-bottom: var(--space-3); } .vehicle-card-meta { display: flex; justify-content: space-between; align-items: center; margin-top: var(--space-2); } .vehicle-card-price { font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); color: var(--color-primary); } .vehicle-card-info { font-size: var(--font-size-xs); color: var(--color-text-secondary); display: flex; gap: var(--space-3); margin-top: var(--space-2); } /* Contact Cards Grid */ .contact-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-5); cursor: pointer; transition: box-shadow var(--transition-fast), transform var(--transition-fast); } .contact-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); } .contact-card-header { display: flex; align-items: flex-start; gap: var(--space-3); margin-bottom: var(--space-3); } .contact-card-name { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); } .contact-card-person { font-size: var(--font-size-sm); color: var(--color-text-secondary); } .contact-card-info { display: flex; flex-direction: column; gap: var(--space-2); font-size: var(--font-size-sm); color: var(--color-text-secondary); } .contact-card-info-item { display: flex; align-items: center; gap: var(--space-2); } /* Subtabs (Stammdaten) */ .subtabs { display: flex; gap: var(--space-1); flex-wrap: wrap; margin-bottom: var(--space-6); border-bottom: 1px solid var(--color-border); padding-bottom: var(--space-2); } .subtab { padding: var(--space-2) var(--space-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); cursor: pointer; border-radius: var(--radius-md); transition: all var(--transition-fast); white-space: nowrap; border: 1px solid transparent; } .subtab:hover { background: var(--color-surface-hover); color: var(--color-text); } .subtab.active { background: var(--color-primary); color: white; } /* Stammdaten Table compact */ .stammdaten-table { width: 100%; border-collapse: collapse; font-size: var(--font-size-sm); } .stammdaten-table th { text-align: left; padding: var(--space-2) var(--space-3); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); border-bottom: 1px solid var(--color-border); } .stammdaten-table td { padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--color-border); } .stammdaten-table tbody tr:hover { background: var(--color-surface-hover); } /* Calendar */ .calendar { width: 100%; border: 1px solid var(--color-border); border-radius: var(--radius-lg); overflow: hidden; } .calendar-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-4) var(--space-6); border-bottom: 1px solid var(--color-border); background: var(--color-surface); } .calendar-title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); } .calendar-nav { display: flex; gap: var(--space-2); align-items: center; } .calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); background: var(--color-border); gap: 1px; } .calendar-day-header { padding: var(--space-2) var(--space-1); text-align: center; font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); background: var(--color-surface); text-transform: uppercase; } .calendar-day { min-height: 90px; padding: var(--space-1); background: var(--color-surface); font-size: var(--font-size-xs); display: flex; flex-direction: column; cursor: pointer; transition: background var(--transition-fast); } .calendar-day:hover { background: var(--color-surface-hover); } .calendar-day.other-month { background: var(--color-bg); color: var(--color-text-muted); } .calendar-day.today { background: var(--color-primary-light); } .calendar-day-num { font-weight: var(--font-weight-semibold); padding: var(--space-1); } .calendar-day.today .calendar-day-num { color: var(--color-primary); } .calendar-events { display: flex; flex-direction: column; gap: 2px; overflow: hidden; } .calendar-event { padding: 1px var(--space-1); border-radius: var(--radius-sm); font-size: 10px; font-weight: var(--font-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; } .calendar-event-verkauf { background: var(--color-success-light); color: var(--color-success); } .calendar-event-ueberfuehrung { background: var(--color-info-light); color: var(--color-info); } .calendar-event-lieferung { background: var(--color-warning-light); color: #92400e; } .calendar-event-termin { background: var(--color-primary-light); color: var(--color-primary); } .calendar-event-pruefung { background: var(--color-error-light); color: var(--color-error); } /* Calendar Legend */ .calendar-legend { display: flex; gap: var(--space-4); flex-wrap: wrap; padding: var(--space-3) var(--space-6); border-top: 1px solid var(--color-border); background: var(--color-surface); } .calendar-legend-item { display: flex; align-items: center; gap: var(--space-2); font-size: var(--font-size-xs); color: var(--color-text-secondary); } .calendar-legend-dot { width: 12px; height: 12px; border-radius: var(--radius-sm); } /* Event Modal */ .event-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; padding: var(--space-4); } /* Section Header */ .section-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-4); } .section-header h3 { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); } /* Stammdaten Section Card */ .stammdaten-section { margin-bottom: var(--space-6); } @media (max-width: 768px) { .card-grid { grid-template-columns: 1fr; } .calendar-day { min-height: 60px; } .calendar-event { font-size: 9px; } .subtab { font-size: var(--font-size-xs); padding: var(--space-1) var(--space-3); } } /* ============================================ v3 Additions: Image Manager ============================================ */ /* Image Manager */ .image-manager { display: flex; flex-direction: column; gap: var(--space-4); } .image-upload-zone { border: 2px dashed var(--color-border-strong); border-radius: var(--radius-lg); padding: var(--space-6); text-align: center; cursor: pointer; transition: border-color var(--transition-fast), background var(--transition-fast); display: flex; flex-direction: column; align-items: center; gap: var(--space-2); } .image-upload-zone:hover, .image-upload-zone.dragover { border-color: var(--color-primary); background: var(--color-primary-light); } .image-upload-zone.uploading { pointer-events: none; opacity: 0.7; } .image-upload-icon { width: 48px; height: 48px; color: var(--color-text-muted); } .image-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: var(--space-4); } .image-thumb { position: relative; aspect-ratio: 4/3; border-radius: var(--radius-md); overflow: hidden; border: 2px solid var(--color-border); cursor: pointer; background: linear-gradient(135deg, var(--color-surface-active), var(--color-border)); display: flex; align-items: center; justify-content: center; transition: border-color var(--transition-fast), transform var(--transition-fast); } .image-thumb:hover { border-color: var(--color-primary); transform: scale(1.02); } .image-thumb.main-photo { border-color: var(--color-warning); border-width: 3px; } .image-thumb-placeholder { color: var(--color-text-muted); display: flex; flex-direction: column; align-items: center; gap: var(--space-1); } .image-thumb-overlay { position: absolute; inset: 0; background: linear-gradient(transparent 50%, rgba(0,0,0,0.7)); display: flex; align-items: flex-end; padding: var(--space-2); opacity: 0; transition: opacity var(--transition-fast); } .image-thumb:hover .image-thumb-overlay { opacity: 1; } .image-thumb-actions { display: flex; gap: var(--space-1); } .image-thumb-action { width: 28px; height: 28px; border-radius: var(--radius-sm); background: rgba(255,255,255,0.9); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--color-text); transition: background var(--transition-fast); } .image-thumb-action:hover { background: white; } .image-thumb-action.danger:hover { background: var(--color-error); color: white; } .image-thumb-action.star.active { background: var(--color-warning); color: white; } .image-thumb-category { position: absolute; top: var(--space-1); left: var(--space-1); padding: 2px var(--space-1); border-radius: var(--radius-sm); font-size: 9px; font-weight: var(--font-weight-semibold); text-transform: uppercase; background: rgba(255,255,255,0.9); color: var(--color-text); } .image-thumb-main-badge { position: absolute; top: var(--space-1); right: var(--space-1); width: 24px; height: 24px; border-radius: 50%; background: var(--color-warning); color: white; display: flex; align-items: center; justify-content: center; } /* Lightbox Modal */ .lightbox { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.9); z-index: var(--z-modal); display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-6); } .lightbox-image { max-width: 90%; max-height: 80vh; border-radius: var(--radius-lg); background: var(--color-surface-active); display: flex; align-items: center; justify-content: center; } .lightbox-info { color: white; text-align: center; margin-top: var(--space-4); } .lightbox-close { position: absolute; top: var(--space-4); right: var(--space-4); width: 40px; height: 40px; border-radius: 50%; background: rgba(255,255,255,0.2); border: none; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; } .lightbox-close:hover { background: rgba(255,255,255,0.3); } .lightbox-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 48px; height: 48px; border-radius: 50%; background: rgba(255,255,255,0.2); border: none; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; } .lightbox-nav:hover { background: rgba(255,255,255,0.3); } .lightbox-nav.prev { left: var(--space-4); } .lightbox-nav.next { right: var(--space-4); } /* KI Retusche Modal */ .retusche-option { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-md); cursor: pointer; transition: border-color var(--transition-fast), background var(--transition-fast); } .retusche-option:hover { border-color: var(--color-primary); background: var(--color-primary-light); } .retusche-option.selected { border-color: var(--color-primary); background: var(--color-primary-light); } .retusche-option-icon { width: 40px; height: 40px; border-radius: var(--radius-md); background: var(--color-primary-light); color: var(--color-primary); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } /* Photo Category Select */ .photo-category-select { padding: 4px; border-radius: var(--radius-sm); border: 1px solid var(--color-border); font-size: var(--font-size-xs); } /* Drag Handle */ .drag-handle { cursor: grab; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; opacity: 0; transition: opacity var(--transition-fast); } .image-thumb:hover .drag-handle { opacity: 0.6; } @media (max-width: 768px) { .image-gallery { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); } .lightbox-nav { width: 36px; height: 36px; } } /* ============================================ v4 Additions: Tabbed Form, Dashboard Config ============================================ */ /* Form Tabs */ .form-tabs { display: flex; gap: var(--space-1); flex-wrap: wrap; margin-bottom: var(--space-6); border-bottom: 2px solid var(--color-border); padding-bottom: var(--space-2); overflow-x: auto; } .form-tab { padding: var(--space-2) var(--space-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); cursor: pointer; border-radius: var(--radius-md); transition: all var(--transition-fast); white-space: nowrap; border: 1px solid transparent; display: flex; align-items: center; gap: var(--space-2); } .form-tab:hover { background: var(--color-surface-hover); color: var(--color-text); } .form-tab.active { background: var(--color-primary); color: white; } .form-tab.has-error { color: var(--color-error); } .form-tab.has-error.active { background: var(--color-error); color: white; } /* ZB Field Reference */ .zb-field-ref { display: inline-flex; align-items: center; gap: 2px; padding: 1px 4px; background: var(--color-surface-active); border-radius: var(--radius-sm); font-size: 10px; font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); font-family: var(--font-mono); margin-left: var(--space-1); vertical-align: middle; } /* Dashboard Config */ .dashboard-config-btn { position: absolute; top: var(--space-2); right: var(--space-2); } .dashboard-widget { position: relative; transition: opacity var(--transition-fast); } .dashboard-widget.hidden { display: none; } .dashboard-widget.dragging { opacity: 0.5; } .dashboard-widget-handle { position: absolute; top: var(--space-2); right: var(--space-2); cursor: grab; color: var(--color-text-muted); opacity: 0; transition: opacity var(--transition-fast); } .dashboard-widget:hover .dashboard-widget-handle { opacity: 1; } /* Config Modal Item */ .config-item { display: flex; align-items: center; justify-content: space-between; padding: var(--space-3) var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: var(--space-2); } .config-item-label { font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); } /* File Input Button */ .file-input-wrapper { position: relative; display: inline-block; } .file-input-wrapper input[type=file] { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } /* Compact Info Grid (for more fields) */ .compact-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--space-3); } .compact-grid .form-group { margin-bottom: 0; } /* 3-column layout for wider forms */ .three-col { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); } @media (max-width: 1024px) { .three-col { grid-template-columns: 1fr 1fr; } } @media (max-width: 768px) { .three-col { grid-template-columns: 1fr; } } /* Form Section Title */ .form-section-title { font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: var(--space-3); padding-bottom: var(--space-2); border-bottom: 1px solid var(--color-border); } /* ============================================ v6 Mobile Responsive Fixes ============================================ */ /* Mobile-optimized base */ @media (max-width: 768px) { html { font-size: 14px; } body { font-size: 14px; -webkit-text-size-adjust: 100%; } /* Content area reduced padding */ .content-area { padding: var(--space-3); } /* Topbar */ .topbar { padding: 0 var(--space-3); height: 56px; } .topbar-breadcrumb { font-size: var(--font-size-xs); } .topbar-breadcrumb span:first-child { display: none; } .topbar-actions { gap: var(--space-1); } .topbar-actions .lang-switcher { display: flex; } .topbar-actions .lang-switcher .btn { min-width: 32px; padding: var(--space-1); } .topbar-actions .btn { min-width: 36px; min-height: 36px; padding: var(--space-1); } /* Sidebar overlay */ .sidebar { width: 280px; z-index: 100; box-shadow: var(--shadow-xl); } .sidebar-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 90; } .sidebar-overlay.show { display: block; } /* Main content full width on mobile */ .main-content { margin-left: 0; } /* Hamburger button visible */ .mobile-menu-btn { display: flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; } /* KPI cards: 2 columns on mobile */ .kpi-grid { grid-template-columns: 1fr 1fr; gap: var(--space-3); } .kpi-card { padding: var(--space-3); } .kpi-card .kpi-value { font-size: var(--font-size-xl); } .kpi-card .kpi-label { font-size: var(--font-size-xs); } .kpi-card .kpi-trend { font-size: 10px; } /* Cards */ .card { border-radius: var(--radius-md); } .card-header { padding: var(--space-3); } .card-body { padding: var(--space-3); } .card-title { font-size: var(--font-size-base); } /* Two-col becomes single col */ .two-col { grid-template-columns: 1fr; gap: var(--space-4); } .three-col { grid-template-columns: 1fr; } /* Tables: horizontal scroll */ .data-table { font-size: var(--font-size-xs); width: max-content; min-width: 100%; } .data-table th, .data-table td { padding: var(--space-2); white-space: nowrap; } .data-table th { font-size: 11px; } .card-body:has(.data-table) { padding: 0; overflow-x: auto; -webkit-overflow-scrolling: touch; } /* Tabs: horizontal scroll */ .tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; gap: var(--space-1); padding-bottom: var(--space-1); } .tab { padding: var(--space-2) var(--space-3); font-size: var(--font-size-xs); flex-shrink: 0; } /* Form tabs: horizontal scroll */ .form-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap; padding-bottom: var(--space-2); } .form-tab { flex-shrink: 0; padding: var(--space-2) var(--space-3); font-size: var(--font-size-xs); } /* Subtabs: horizontal scroll */ .subtabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap; padding-bottom: var(--space-2); } .subtab { flex-shrink: 0; font-size: var(--font-size-xs); padding: var(--space-1) var(--space-3); } /* Buttons: touch targets */ .btn { min-height: 40px; padding: var(--space-2) var(--space-3); font-size: var(--font-size-sm); } .btn-sm { min-height: 36px; min-width: 36px; } .btn-lg { min-height: 48px; } /* Inputs: touch targets */ .input, .select, .textarea { min-height: 40px; font-size: var(--font-size-sm); padding: var(--space-2); } /* Form groups: reduced spacing */ .form-group { margin-bottom: var(--space-3); } /* Info grid: 2 columns on mobile */ .info-grid { grid-template-columns: 1fr 1fr; gap: var(--space-2); } .info-item { padding: var(--space-1) 0; } .info-label { font-size: 10px; } .info-value { font-size: var(--font-size-xs); } /* Card grid: single column on small mobile */ .card-grid { grid-template-columns: 1fr; gap: var(--space-3); } .vehicle-card-image { aspect-ratio: 16/9; } .vehicle-card-body { padding: var(--space-3); } .vehicle-card-title { font-size: var(--font-size-sm); } .vehicle-card-price { font-size: var(--font-size-base); } /* Calendar: smaller cells */ .calendar-day { min-height: 60px; padding: 2px; } .calendar-day-num { font-size: 10px; } .calendar-event { font-size: 8px; padding: 1px 2px; } .calendar-header { padding: var(--space-2) var(--space-3); } .calendar-title { font-size: var(--font-size-sm); } /* Pagination */ .pagination { padding: var(--space-2); flex-direction: column; gap: var(--space-2); } .pagination-info { font-size: var(--font-size-xs); } .pagination-btn { min-width: 36px; min-height: 36px; } /* Modal: full width on mobile */ .modal { max-width: 100%; max-height: 95vh; border-radius: var(--radius-md); margin: 0; } .modal-header { padding: var(--space-3); } .modal-body { padding: var(--space-3); } .modal-footer { padding: var(--space-3); flex-direction: column-reverse; } .modal-footer .btn { width: 100%; } /* Toast: full width on mobile */ .toast-container { left: var(--space-2); right: var(--space-2); bottom: var(--space-2); } .toast { min-width: auto; max-width: 100%; } /* Chat */ .chat-container { max-height: 400px; } .chat-message { max-width: 90%; } /* Dropzone */ .dropzone { padding: var(--space-4); } /* Image gallery */ .image-gallery { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: var(--space-2); } .image-thumb-action { width: 24px; height: 24px; } /* Lightbox nav */ .lightbox-nav { width: 36px; height: 36px; } /* Headings */ h1 { font-size: var(--font-size-xl) !important; } h2 { font-size: var(--font-size-lg) !important; } h3 { font-size: var(--font-size-base) !important; } /* View toggle */ .view-toggle-btn { padding: var(--space-1) var(--space-2); font-size: var(--font-size-xs); min-height: 36px; } /* Stammdaten table */ .stammdaten-table { font-size: var(--font-size-xs); } .stammdaten-table th, .stammdaten-table td { padding: var(--space-1) var(--space-2); white-space: nowrap; } /* ZB field ref badges */ .zb-field-ref { font-size: 9px; padding: 1px 2px; } /* Compact grid on mobile */ .compact-grid { grid-template-columns: 1fr; } } /* Very small mobile (< 400px) */ @media (max-width: 400px) { .kpi-grid { grid-template-columns: 1fr; } .info-grid { grid-template-columns: 1fr; } .content-area { padding: var(--space-2); } .topbar { padding: 0 var(--space-2); } .card-body { padding: var(--space-2); } } /* Touch-friendly scrollbar */ @media (max-width: 768px) { ::-webkit-scrollbar { width: 4px; height: 4px; } ::-webkit-scrollbar-thumb { background: var(--color-border-strong); border-radius: 2px; } } /* ============================================ v7: KI-Copilot ChatGPT Interface + Verkauf List ============================================ */ /* ChatGPT-like Chat Interface */ .chat-fullscreen { display: flex; flex-direction: column; height: calc(100vh - var(--topbar-height) - 48px); max-height: 800px; } .chat-messages-full { flex: 1; overflow-y: auto; padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-4); scroll-behavior: smooth; } .chat-bubble-full { padding: var(--space-3) var(--space-4); border-radius: var(--radius-lg); font-size: var(--font-size-sm); line-height: var(--line-height-relaxed); max-width: 75%; white-space: pre-wrap; } .chat-msg-user { display: flex; justify-content: flex-end; } .chat-msg-user .chat-bubble-full { background: var(--color-primary); color: white; border-bottom-right-radius: var(--radius-sm); } .chat-msg-ai { display: flex; justify-content: flex-start; gap: var(--space-3); } .chat-msg-ai .chat-bubble-full { background: var(--color-surface-hover); border-bottom-left-radius: var(--radius-sm); } .chat-ai-avatar { width: 36px; height: 36px; border-radius: var(--radius-md); background: var(--color-primary); color: white; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } /* Quick Command Chips */ .chat-chips { display: flex; gap: var(--space-2); overflow-x: auto; padding: var(--space-2) 0; -webkit-overflow-scrolling: touch; } .chat-chip { padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); background: var(--color-surface-hover); border: 1px solid var(--color-border); font-size: var(--font-size-xs); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); cursor: pointer; white-space: nowrap; transition: all var(--transition-fast); flex-shrink: 0; } .chat-chip:hover { background: var(--color-primary-light); color: var(--color-primary); border-color: var(--color-primary); } /* Chat Input Area */ .chat-input-area-full { border-top: 1px solid var(--color-border); padding: var(--space-3); display: flex; gap: var(--space-2); align-items: flex-end; } .chat-textarea { flex: 1; padding: var(--space-3); border: 1px solid var(--color-border-strong); border-radius: var(--radius-lg); font-size: var(--font-size-sm); font-family: var(--font-family); background: var(--color-surface); color: var(--color-text); resize: none; min-height: 48px; max-height: 200px; transition: border-color var(--transition-fast); line-height: var(--line-height-normal); } .chat-textarea:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-light); outline: none; } .chat-send-btn { width: 48px; height: 48px; border-radius: 50%; background: var(--color-primary); color: white; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all var(--transition-fast); } .chat-send-btn:hover { background: var(--color-primary-hover); } .chat-send-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Mic Button */ .chat-mic-btn { width: 48px; height: 48px; border-radius: 50%; background: var(--color-surface); border: 1px solid var(--color-border-strong); color: var(--color-text-secondary); cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all var(--transition-fast); } .chat-mic-btn:hover { background: var(--color-surface-hover); } .chat-mic-btn.recording { background: var(--color-error); color: white; border-color: var(--color-error); animation: pulse 1.5s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } /* Typing Indicator */ .typing-indicator { display: flex; gap: 4px; padding: var(--space-2) var(--space-3); } .typing-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--color-text-muted); animation: typingBounce 1.4s infinite; } .typing-dot:nth-child(2) { animation-delay: 0.2s; } .typing-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes typingBounce { 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } 30% { transform: translateY(-8px); opacity: 1; } } /* Verkauf List */ .verkauf-status-badge { padding: 2px var(--space-2); border-radius: var(--radius-full); font-size: var(--font-size-xs); font-weight: var(--font-weight-medium); } .verkauf-status-entwurf { background: var(--color-surface-active); color: var(--color-text-secondary); } .verkauf-status-pruefung { background: var(--color-warning-light); color: #92400e; } .verkauf-status-abgeschlossen { background: var(--color-success-light); color: var(--color-success); } .verkauf-status-storniert { background: var(--color-error-light); color: var(--color-error); } .verkauf-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4); cursor: pointer; transition: box-shadow var(--transition-fast), transform var(--transition-fast); } .verkauf-card:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); } @media (max-width: 768px) { .chat-fullscreen { height: calc(100vh - 56px - 24px); } .chat-bubble-full { max-width: 90%; } .chat-input-area-full { padding: var(--space-2); } .chat-textarea { min-height: 40px; font-size: var(--font-size-xs); } .chat-send-btn, .chat-mic-btn { width: 40px; height: 40px; } .typing-dot { width: 6px; height: 6px; } } /* ============================================ v8: Fixed-bottom Copilot Chat Layout ============================================ */ .copilot-container { display: flex; flex-direction: column; height: calc(100dvh - var(--topbar-height) - 48px); height: calc(100vh - var(--topbar-height) - 48px); background: var(--color-bg); } .copilot-chat { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-4); scroll-behavior: smooth; } .copilot-input-container { flex-shrink: 0; border-top: 1px solid var(--color-border); background: var(--color-surface); padding: var(--space-3); position: sticky; bottom: 0; z-index: 10; } .copilot-chips { display: flex; gap: var(--space-2); overflow-x: auto; padding: var(--space-2) 0; -webkit-overflow-scrolling: touch; } .copilot-input-row { display: flex; gap: var(--space-2); align-items: flex-end; } .copilot-textarea { flex: 1; padding: var(--space-3); border: 1px solid var(--color-border-strong); border-radius: var(--radius-lg); font-size: var(--font-size-sm); font-family: var(--font-family); background: var(--color-surface); color: var(--color-text); resize: none; min-height: 48px; max-height: 200px; line-height: var(--line-height-normal); transition: border-color var(--transition-fast); } .copilot-textarea:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-light); outline: none; } @media (max-width: 768px) { .copilot-container { height: calc(100dvh - 56px); height: calc(100vh - 56px); padding: 0 !important; } .copilot-chat { padding: var(--space-2); padding-bottom: 0; } .copilot-input-container { padding: var(--space-2); } .copilot-textarea { min-height: 40px; font-size: var(--font-size-xs); } .chat-bubble-full { max-width: 90%; } } /* v8 fix: Content area override for copilot page */ .content-area.copilot-page, .content-area:has(.copilot-container) { padding: 0; max-width: 100%; overflow: hidden; display: flex; flex-direction: column; } .content-area.copilot-page > div:first-child, .content-area:has(.copilot-container) > div:first-child { padding: var(--space-4) var(--space-6) 0; flex-shrink: 0; } .content-area.copilot-page .copilot-container, .content-area:has(.copilot-container) .copilot-container { height: calc(100vh - var(--topbar-height) - 80px); flex: 1; padding: 0 var(--space-6); } /* Fallback for browsers without :has() */ body:has(.copilot-container) .content-area { padding: 0; max-width: 100%; overflow: hidden; } /* ============================================ v8c: Mobile Copilot Layout Fix (dvh, safe-area) ============================================ */ /* Dynamic viewport height with fallbacks */ .copilot-container { height: calc(100vh - var(--topbar-height) - 80px); height: calc(100dvh - var(--topbar-height) - 80px); } /* Safe area insets */ .topbar { padding-top: env(safe-area-inset-top); height: calc(var(--topbar-height) + env(safe-area-inset-top)); } .copilot-input-container { padding-bottom: calc(var(--space-3) + env(safe-area-inset-bottom)); } /* Mobile-specific copilot (< 768px) */ @media (max-width: 768px) { /* Content area: full width, no padding when copilot active */ .content-area.copilot-page, .content-area:has(.copilot-container) { padding: 0 !important; margin: 0 !important; max-width: 100% !important; overflow: hidden; } .content-area.copilot-page > div:first-child, .content-area:has(.copilot-container) > div:first-child { padding: var(--space-2) var(--space-3) 0; } /* Copilot container: full height on mobile */ .copilot-container { height: calc(100vh - var(--topbar-height) - 60px); height: calc(100dvh - var(--topbar-height) - 60px); padding: 0 var(--space-3); } /* Chat area: flex 1 with touch scroll */ .copilot-chat { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: var(--space-2); } /* Input container: sticky bottom with safe-area */ .copilot-input-container { position: sticky; bottom: 0; padding: var(--space-2) var(--space-3); padding-bottom: calc(var(--space-2) + env(safe-area-inset-bottom)); background: var(--color-surface); z-index: 10; } /* Chips: horizontal scroll on mobile */ .copilot-chips { overflow-x: auto; white-space: nowrap; -webkit-overflow-scrolling: touch; padding: var(--space-1) 0; } .chat-chip { flex-shrink: 0; } /* Textarea: smaller on mobile */ .copilot-textarea { width: 100%; min-height: 40px; max-height: 120px; font-size: var(--font-size-xs); padding: var(--space-2); } /* Mic and Send: touch targets */ .chat-mic-btn { min-width: 40px; min-height: 40px; width: 40px; height: 40px; } .chat-send-btn { min-width: 40px; min-height: 40px; width: 40px; height: 40px; } /* Chat bubbles: wider on mobile */ .chat-bubble-full { max-width: 88%; font-size: var(--font-size-xs); } /* Typing dots: smaller on mobile */ .typing-dot { width: 6px; height: 6px; } } /* Very small mobile (< 400px) */ @media (max-width: 400px) { .copilot-container { height: calc(100vh - var(--topbar-height) - 50px); height: calc(100dvh - var(--topbar-height) - 50px); padding: 0 var(--space-2); } .copilot-textarea { min-height: 36px; } .chat-bubble-full { max-width: 92%; } } /* v8d: Reliable copilot mobile fix */ body.copilot-active .content-area { padding: 0 !important; max-width: 100% !important; overflow: hidden !important; display: flex !important; flex-direction: column !important; } body.copilot-active .content-area > div:first-child { padding: var(--space-3) var(--space-4) 0; flex-shrink: 0; } body.copilot-active .content-area .copilot-container { height: calc(100dvh - var(--topbar-height) - 60px); height: calc(100vh - var(--topbar-height) - 60px); flex: 1; padding: 0 var(--space-4); max-height: none !important; } @media (max-width: 768px) { body.copilot-active .content-area { padding: 0 !important; } body.copilot-active .content-area > div:first-child { padding: var(--space-2) var(--space-3) 0; } body.copilot-active .content-area .copilot-container { height: calc(100dvh - 56px - 48px); height: calc(100vh - 56px - 48px); padding: 0 var(--space-2); max-height: none !important; } body.copilot-active .copilot-input-container { padding: var(--space-2) !important; padding-bottom: calc(var(--space-2) + env(safe-area-inset-bottom)) !important; } body.copilot-active .copilot-textarea { min-height: 44px !important; font-size: 16px !important; } body.copilot-active .copilot-input-row { gap: var(--space-2); } } @media (max-width: 400px) { body.copilot-active .content-area .copilot-container { padding: 0 var(--space-1); } body.copilot-active .copilot-textarea { min-height: 40px !important; } }