/* ===== AIFlow Design System ===== */ /* 设计方向:融合QwenPaw温暖科技感 + 极简主义 */ /* Google Fonts */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap'); /* CSS Custom Properties - Design Tokens */ :root { /* Colors - Light Theme */ --color-bg-primary: #F8F9FB; --color-bg-secondary: #FFFFFF; --color-bg-tertiary: #F1F3F7; --color-bg-hover: #EBEEF3; --color-bg-active: #E3E7F0; --color-text-primary: #101214; --color-text-secondary: #545A65; --color-text-tertiary: #8B919E; --color-text-disabled: #BFC4CE; --color-text-inverse: #FFFFFF; --color-accent: #5B5FED; --color-accent-hover: #4A4ECC; --color-accent-light: #EEEDFF; --color-accent-subtle: #F6F5FF; --color-success: #219B5E; --color-success-light: #E6F7EE; --color-warning: #E8922C; --color-warning-light: #FEF4E8; --color-error: #D9383A; --color-error-light: #FDEBEB; --color-info: #3B82F6; --color-info-light: #EBF2FE; --color-border: #E3E6EB; --color-border-light: #EEF0F4; --color-border-hover: #CDD2DA; --color-sidebar-bg: #F5F6F9; --color-sidebar-hover: #EAECF2; --color-sidebar-active: #E1E3F0; /* Shadows */ --shadow-xs: 0 1px 2px rgba(0,0,0,0.04); --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04); --shadow-md: 0 4px 12px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04); --shadow-lg: 0 12px 32px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04); --shadow-xl: 0 20px 48px rgba(0,0,0,0.1), 0 4px 12px rgba(0,0,0,0.06); /* Spacing */ --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 16px; --space-xl: 20px; --space-2xl: 24px; --space-3xl: 32px; --space-4xl: 40px; --space-5xl: 48px; /* Border Radius */ --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-2xl: 20px; --radius-full: 9999px; /* Typography */ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace; --text-xs: 11px; --text-sm: 13px; --text-base: 14px; --text-md: 15px; --text-lg: 18px; --text-xl: 22px; --text-2xl: 28px; --text-3xl: 36px; /* Layout */ --sidebar-width: 240px; --sidebar-collapsed: 64px; --header-height: 56px; --admin-sidebar-width: 220px; /* Transitions */ --transition-fast: 120ms ease; --transition-normal: 200ms ease; --transition-slow: 300ms ease; /* Z-index */ --z-base: 1; --z-dropdown: 100; --z-sticky: 200; --z-overlay: 300; --z-modal: 400; --z-toast: 500; } /* Reset & Base */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: var(--text-base); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } body { font-family: var(--font-sans); color: var(--color-text-primary); background: var(--color-bg-primary); line-height: 1.6; overflow: hidden; height: 100vh; } #root { height: 100vh; overflow: hidden; } a { color: var(--color-accent); text-decoration: none; } a:hover { color: var(--color-accent-hover); } button { font-family: inherit; cursor: pointer; border: none; background: none; } input, textarea, select { font-family: inherit; font-size: inherit; } /* Scrollbar */ ::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-text-disabled); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-tertiary); } /* Utility Classes */ .flex { display: flex; } .flex-col { flex-direction: column; } .flex-1 { flex: 1; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .justify-center { justify-content: center; } .gap-xs { gap: var(--space-xs); } .gap-sm { gap: var(--space-sm); } .gap-md { gap: var(--space-md); } .gap-lg { gap: var(--space-lg); } .gap-xl { gap: var(--space-xl); } .text-center { text-align: center; } .text-right { text-align: right; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .w-full { width: 100%; } .h-full { height: 100%; } .relative { position: relative; } .absolute { position: absolute; } .hidden { display: none; } .pointer { cursor: pointer; } .select-none { user-select: none; } /* Animation utilities */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideDown { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideLeft { from { opacity: 0; transform: translateX(8px); } to { opacity: 1; transform: translateX(0); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .animate-fadeIn { animation: fadeIn var(--transition-normal); } .animate-slideUp { animation: slideUp var(--transition-normal); } .animate-slideDown { animation: slideDown var(--transition-normal); } .animate-pulse { animation: pulse 2s ease infinite; } /* Skeleton loading */ .skeleton { background: linear-gradient(90deg, var(--color-bg-tertiary) 25%, var(--color-bg-hover) 50%, var(--color-bg-tertiary) 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: var(--radius-sm); } /* Responsive breakpoints utility */ @media (max-width: 768px) { :root { --sidebar-width: 0px; } } @media (min-width: 769px) and (max-width: 1024px) { :root { --sidebar-width: 64px; } } .loading-screen { display: flex; align-items: center; justify-content: center; height: 100vh; font-size: 18px; color: var(--color-text-secondary); background: var(--color-bg-primary); }