/* ========== 深色音乐流媒体风格 · 项目管理系统(专辑色 + 鲜明点缀) ========== */ @font-face { font-family: 'Alibaba PuHuiTi'; font-weight: 300 400; font-style: normal; font-display: swap; src: url('https://at.alicdn.com/t/webfont_jq0x47mjt6a.eot'); src: url('https://at.alicdn.com/t/webfont_jq0x47mjt6a.eot?#iefix') format('embedded-opentype'), url('https://at.alicdn.com/t/webfont_jq0x47mjt6a.woff2') format('woff2'), url('https://at.alicdn.com/t/webfont_jq0x47mjt6a.woff') format('woff'), url('https://at.alicdn.com/t/webfont_jq0x47mjt6a.ttf') format('truetype'); } :root { /* 深色背景 · 专辑感 */ --bg-deep: #0d0d0f; --bg-base: #12121a; --bg-elevated: #1a1a24; --bg-panel: #252530; --bg-hover: #2d2d3a; /* 鲜明点缀 · 专辑色 */ --accent-violet: #8b5cf6; --accent-violet-light: #a78bfa; --accent-cyan: #22d3ee; --accent-magenta: #ec4899; --accent-gold: #f59e0b; --accent-teal: #14b8a6; /* 渐变(专辑封面感) */ --gradient-hero: linear-gradient(135deg, #8b5cf6 0%, #ec4899 50%, #f59e0b 100%); --gradient-cta: linear-gradient(135deg, #a78bfa 0%, #ec4899 100%); --gradient-panel: linear-gradient(180deg, rgba(37, 37, 48, 0.95) 0%, rgba(26, 26, 36, 0.98) 100%); /* 文字 */ --text: #f1f5f9; --text-muted: #94a3b8; --text-dim: #64748b; /* 边框与阴影 */ --border: rgba(148, 163, 184, 0.12); --border-accent: rgba(139, 92, 246, 0.35); --shadow-soft: 0 4px 20px rgba(0, 0, 0, 0.4); --shadow-glow: 0 0 24px rgba(139, 92, 246, 0.25); --focus-ring: 0 0 0 2px rgba(139, 92, 246, 0.5); /* 通用 */ --ease: cubic-bezier(0.4, 0, 0.2, 1); --radius: 10px; --radius-sm: 6px; --space-16: 16px; --space-24: 24px; --space-32: 32px; --font-en: "IBM Plex Sans", sans-serif; --font-cn: "Alibaba PuHuiTi", "PingFang SC", "Noto Sans SC", sans-serif; --font-head: var(--font-en), var(--font-cn); --font-body: var(--font-cn), var(--font-en); } *, *::before, *::after { box-sizing: border-box; } html { font-size: 16px; -webkit-font-smoothing: antialiased; } body { margin: 0; font-family: var(--font-body); font-weight: 400; color: var(--text); background: var(--bg-base); line-height: 1.5; } /* ---------- 登录页 · 类似 Premium CTA 卡片 ---------- */ .view-login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: var(--space-32); background: var(--bg-deep); background-image: radial-gradient(ellipse 80% 50% at 50% 0%, rgba(139, 92, 246, 0.15) 0%, transparent 50%), radial-gradient(ellipse 60% 40% at 80% 60%, rgba(236, 72, 153, 0.08) 0%, transparent 50%); } .view-login.hidden { display: none; } .login-card { width: 100%; max-width: 400px; background: var(--gradient-panel); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid var(--border-accent); border-radius: var(--radius); box-shadow: var(--shadow-soft), var(--shadow-glow); padding: var(--space-32) var(--space-24); } .login-brand { text-align: center; margin-bottom: var(--space-24); } .login-brand .brand-icon { font-size: 1.75rem; background: var(--gradient-hero); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; display: block; margin-bottom: var(--space-16); font-weight: 300; } .login-title { font-family: var(--font-head); font-weight: 400; font-size: 1.35rem; color: var(--text); margin: 0 0 0.35rem 0; } .login-desc { font-size: 0.875rem; font-weight: 300; color: var(--text-muted); margin: 0; } .login-form .form-group { margin-bottom: var(--space-16); } .login-form .form-group label { display: block; font-size: 0.8125rem; font-weight: 400; color: var(--text-muted); margin-bottom: 0.35rem; } .login-form .input { width: 100%; padding: 0.6rem 0.85rem; background: var(--bg-panel); border: 1px solid var(--border); color: var(--text); border-radius: var(--radius-sm); transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease); } .login-form .input:focus { outline: none; border-color: var(--accent-violet); box-shadow: var(--focus-ring); } .login-form .input::placeholder { color: var(--text-dim); } .login-error { font-size: 0.8125rem; color: #fca5a5; margin-bottom: var(--space-16); padding: 0.5rem 0.75rem; background: rgba(236, 72, 153, 0.1); border: 1px solid rgba(236, 72, 153, 0.3); border-radius: var(--radius-sm); } .btn-login-submit { width: 100%; padding: 0.65rem 1rem; margin-top: var(--space-16); font-weight: 400; background: var(--gradient-cta); border: none; color: #fff; border-radius: var(--radius-sm); transition: opacity 0.2s var(--ease), box-shadow 0.2s var(--ease); } .btn-login-submit:hover { opacity: 0.95; box-shadow: 0 0 20px rgba(139, 92, 246, 0.4); } /* ---------- 主应用 · 侧栏(类似播放器/歌单区) ---------- */ .app { display: flex; min-height: 100vh; background: var(--bg-base); } .sidebar { width: 240px; min-width: 240px; background: var(--bg-elevated); border-right: 1px solid var(--border); color: var(--text); display: flex; flex-direction: column; padding: var(--space-24) 0; } .sidebar-brand { display: flex; align-items: center; gap: 0.75rem; padding: 0 var(--space-24) var(--space-24); border-bottom: 1px solid var(--border); margin-bottom: var(--space-16); } .brand-icon { font-size: 1.25rem; color: var(--accent-violet-light); font-weight: 300; } .brand-text { font-family: var(--font-head); font-weight: 400; font-size: 0.95rem; letter-spacing: 0.02em; color: var(--text); } .sidebar-nav { flex: 1; } .nav-item { display: flex; align-items: center; gap: 0.75rem; padding: 0.65rem var(--space-24); color: var(--text-muted); text-decoration: none; transition: color 0.2s var(--ease), background 0.2s var(--ease); } .nav-item:hover { color: var(--text); background: var(--bg-hover); } .nav-item.active { color: var(--accent-violet-light); background: rgba(139, 92, 246, 0.12); font-weight: 400; } .nav-icon { font-size: 1rem; opacity: 0.85; color: var(--text-dim); } .nav-item.active .nav-icon { color: var(--accent-violet-light); } .sidebar-footer { padding: var(--space-16) var(--space-24) 0; border-top: 1px solid var(--border); } .user-info { display: block; font-size: 0.75rem; font-weight: 300; color: var(--text-muted); margin-bottom: var(--space-16); padding: 0 var(--space-24); } .btn-logout { width: calc(100% - var(--space-24) * 2); margin: 0 var(--space-24); padding: 0.5rem; background: var(--bg-panel); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text-muted); font-size: 0.875rem; font-weight: 400; cursor: pointer; transition: color 0.2s var(--ease), border-color 0.2s var(--ease), background 0.2s var(--ease); } .btn-logout:hover { color: var(--text); border-color: var(--accent-violet); background: var(--bg-hover); } /* ---------- 主内容区 ---------- */ .main { flex: 1; overflow: auto; padding: var(--space-24) var(--space-32) var(--space-32); background: var(--bg-base); } .view { display: none; } .view.active { display: block; } .page-header { display: flex; align-items: center; gap: var(--space-16); margin-bottom: var(--space-24); flex-wrap: wrap; } .page-title { font-family: var(--font-head); font-weight: 400; font-size: 1.35rem; color: var(--text); margin: 0; } .page-title.detail-title { flex: 1; min-width: 0; } .header-actions { display: flex; align-items: center; gap: var(--space-16); margin-left: auto; } .btn-back { display: inline-flex; align-items: center; padding: 0.4rem 0.75rem; background: var(--bg-panel); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text-muted); font-size: 0.875rem; font-weight: 400; cursor: pointer; transition: color 0.2s var(--ease), border-color 0.2s var(--ease), background 0.2s var(--ease); } .btn-back:hover { color: var(--accent-violet-light); border-color: var(--accent-violet); background: var(--bg-hover); } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.5rem 1rem; border-radius: var(--radius-sm); font-size: 0.875rem; font-weight: 400; font-family: inherit; cursor: pointer; border: 1px solid transparent; transition: background 0.2s var(--ease), color 0.2s var(--ease), box-shadow 0.2s var(--ease), border-color 0.2s var(--ease); } .btn-primary { background: var(--gradient-cta); border-color: transparent; color: #fff; } .btn-primary:hover:not(:disabled) { box-shadow: 0 0 20px rgba(139, 92, 246, 0.4); } .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } .btn-ghost { background: transparent; color: var(--text-muted); border-color: var(--border); } .btn-ghost:hover { color: var(--accent-violet-light); border-color: var(--accent-violet); box-shadow: var(--focus-ring); } .btn-icon { font-size: 1rem; line-height: 1; font-weight: 300; color: var(--text-muted); } .btn-sm { padding: 0.35rem 0.75rem; font-size: 0.8125rem; } .btn-new-project .btn-icon { font-size: 1.1rem; font-weight: 400; color: inherit; } /* ---------- 工具栏(类似播放控制区) ---------- */ .toolbar { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow-soft); padding: var(--space-24); margin-bottom: var(--space-24); } .search-row { display: flex; gap: var(--space-16); margin-bottom: var(--space-16); } .search-row .input-select { width: 120px; flex-shrink: 0; } .search-row .input-search { flex: 1; min-width: 160px; } .btn-search { padding: 0.5rem var(--space-24); background: var(--accent-violet); border: none; color: #fff; font-weight: 400; border-radius: var(--radius-sm); transition: background 0.2s var(--ease), box-shadow 0.2s var(--ease); } .btn-search:hover { background: var(--accent-violet-light); box-shadow: var(--shadow-glow); } .filter-row { display: flex; gap: var(--space-24); flex-wrap: wrap; align-items: flex-end; } .filter-group { display: flex; align-items: center; gap: var(--space-16); } .filter-group label { font-size: 0.8125rem; font-weight: 300; color: var(--text-muted); white-space: nowrap; } .filter-check label { display: flex; align-items: center; gap: 0.35rem; cursor: pointer; font-weight: 300; } .input-filter { min-width: 120px; } .input-date { min-width: 130px; } .input { width: 100%; padding: 0.5rem 0.75rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: 0.875rem; font-weight: 400; font-family: inherit; color: var(--text); background: var(--bg-panel); transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease); } .input::placeholder { color: var(--text-dim); } .input:focus { outline: none; border-color: var(--accent-violet); box-shadow: var(--focus-ring); } .input-select, .input-filter { cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' fill-opacity='0.9' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.6rem center; padding-right: 1.75rem; } .input-area { min-height: 60px; resize: vertical; } .form-group em { color: var(--accent-magenta); font-style: normal; } .form-group label { font-weight: 400; } /* ---------- 表格 · 歌单列表感 ---------- */ .table-wrap { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow-soft); overflow: hidden; position: relative; min-height: 200px; } .table-loading, .table-empty { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-16); color: var(--text-muted); font-size: 0.875rem; font-weight: 300; background: var(--bg-elevated); } .table-empty .empty-icon { font-size: 2rem; opacity: 0.5; color: var(--text-dim); } .table { width: 100%; border-collapse: collapse; font-size: 0.875rem; font-weight: 400; } .table thead { background: var(--bg-panel); border-bottom: 1px solid var(--border); } .table th { text-align: left; padding: var(--space-16) 1rem; font-weight: 400; color: var(--text-muted); } .table td { padding: var(--space-16) 1rem; border-bottom: 1px solid var(--border); color: var(--text); } .table tbody tr { transition: background 0.2s var(--ease); } .table tbody tr:hover { background: var(--bg-hover); } .table tbody tr:last-child td { border-bottom: none; } .table .cell-actions { display: flex; gap: var(--space-16); } .table .link-action { color: var(--accent-cyan); cursor: pointer; background: none; border: none; font-size: 0.875rem; font-weight: 400; padding: 0; text-decoration: none; transition: color 0.2s var(--ease); } .table .link-action:hover { color: var(--accent-violet-light); text-decoration: underline; } /* ---------- 分页 ---------- */ .pagination { display: flex; align-items: center; justify-content: space-between; margin-top: var(--space-24); padding: 0 var(--space-16); } .pagination-info { font-size: 0.8125rem; font-weight: 300; color: var(--text-muted); } .pagination-btns { display: flex; gap: var(--space-16); } .pagination .btn-sm { background: var(--bg-panel); border: 1px solid var(--border); color: var(--text-muted); } .pagination .btn-sm:hover:not(:disabled) { color: var(--accent-violet-light); border-color: var(--accent-violet); box-shadow: var(--focus-ring); } .pagination .btn-sm:disabled { opacity: 0.4; cursor: not-allowed; } /* ---------- 详情 · 艺术家/专辑信息区感 ---------- */ .detail-loading { display: flex; align-items: center; justify-content: center; min-height: 240px; color: var(--text-muted); font-size: 0.875rem; font-weight: 300; } .detail-content { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow-soft); overflow: hidden; } .tabs { display: flex; gap: 0.25rem; padding: 0 var(--space-24); background: var(--bg-panel); border-bottom: 1px solid var(--border); overflow-x: auto; } .tab { padding: var(--space-16) 1rem; background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px; font-size: 0.875rem; font-weight: 400; color: var(--text-muted); cursor: pointer; white-space: nowrap; transition: color 0.2s var(--ease), border-color 0.2s var(--ease); } .tab:hover { color: var(--text); } .tab.active { color: var(--accent-violet-light); border-bottom-color: var(--accent-violet); } .tab-panels { padding: var(--space-24) var(--space-24) var(--space-32); } .tab-panel { display: none; } .tab-panel.active { display: block; } .form-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-24) var(--space-24); } .form-group { display: flex; flex-direction: column; gap: 0.35rem; } .form-group-full { grid-column: 1 / -1; } .form-group label { font-size: 0.8125rem; font-weight: 400; color: var(--text-muted); } /* ---------- 抽屉(操作日志) ---------- */ .drawer-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); opacity: 0; visibility: hidden; transition: opacity 0.25s var(--ease), visibility 0.25s var(--ease); z-index: 100; } .drawer-overlay.visible { opacity: 1; visibility: visible; } .drawer { position: fixed; top: 0; right: 0; width: 400px; max-width: 100%; height: 100%; background: var(--bg-elevated); border-left: 1px solid var(--border); box-shadow: var(--shadow-soft); transform: translateX(100%); transition: transform 0.25s var(--ease); z-index: 101; display: flex; flex-direction: column; } .drawer.visible { transform: translateX(0); } .drawer-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-24) var(--space-24); border-bottom: 1px solid var(--border); } .drawer-title { font-family: var(--font-head); font-weight: 400; font-size: 1.125rem; margin: 0; color: var(--text); } .drawer-close { width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; background: none; border: none; border-radius: var(--radius-sm); font-size: 1.25rem; color: var(--text-muted); cursor: pointer; transition: color 0.2s var(--ease), background 0.2s var(--ease); } .drawer-close:hover { color: var(--text); background: var(--bg-hover); } .drawer-body { flex: 1; overflow: auto; padding: var(--space-24); position: relative; } .drawer-loading, .drawer-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-16); min-height: 160px; color: var(--text-muted); font-size: 0.875rem; font-weight: 300; } .drawer-empty .empty-icon { font-size: 2rem; opacity: 0.5; color: var(--text-dim); } .log-list { list-style: none; margin: 0; padding: 0; } .log-item { padding: var(--space-16) 0; border-bottom: 1px solid var(--border); font-size: 0.875rem; font-weight: 400; } .log-item:last-child { border-bottom: none; } .log-item .log-meta { color: var(--text-muted); font-size: 0.8125rem; font-weight: 300; margin-bottom: 0.25rem; } .log-item .log-desc { color: var(--text); } /* ---------- Toast(Premium 提示感) ---------- */ .toast { position: fixed; bottom: var(--space-32); left: 50%; transform: translateX(-50%) translateY(100px); padding: 0.65rem var(--space-24); background: var(--bg-panel); border: 1px solid var(--border-accent); color: var(--text); font-size: 0.875rem; font-weight: 400; border-radius: var(--radius-sm); box-shadow: var(--shadow-soft), var(--shadow-glow); opacity: 0; visibility: hidden; transition: transform 0.25s var(--ease), opacity 0.25s var(--ease), visibility 0.25s var(--ease); z-index: 1000; } .toast.visible { transform: translateX(-50%) translateY(0); opacity: 1; visibility: visible; } .toast.success { border-color: var(--accent-teal); box-shadow: var(--shadow-soft), 0 0 20px rgba(20, 184, 166, 0.25); } .toast.error { border-color: var(--accent-magenta); box-shadow: var(--shadow-soft), 0 0 20px rgba(236, 72, 153, 0.2); } @media (max-width: 900px) { .form-grid { grid-template-columns: 1fr; } .sidebar { width: 64px; min-width: 64px; padding: var(--space-16) 0; } .brand-text, .nav-item span:not(.nav-icon), .user-info, .btn-logout { display: none; } .sidebar-brand { justify-content: center; padding: 0 var(--space-16) var(--space-16); } .nav-item { justify-content: center; padding: 0.75rem; } .sidebar-footer { padding: var(--space-16); } .drawer { width: 100%; } }