/* ============================================================ 流云图库 - 现代化双栏布局样式 ============================================================ */ /* ============ CSS 变量 ============ */ :root { /* 主色调 - 蓝紫渐变 */ --primary-blue: #1e40af; --secondary-blue: #3b82f6; --accent-purple: #8b5cf6; --accent-pink: #ec4899; /* 中性色 */ --white: #ffffff; --light-gray: #f8fafc; --medium-gray: #e2e8f0; --border-gray: #e5e7eb; --dark-gray: #475569; --text-dark: #1e293b; --text-light: #64748b; --text-muted: #94a3b8; /* 背景 */ --bg-primary: #f8fafc; --bg-surface: #ffffff; --bg-hover: #f1f5f9; --bg-sidebar: #ffffff; /* 阴影 */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08); --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.08); --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.12); /* 圆角 */ --radius: 8px; --radius-card: 12px; --radius-lg: 16px; --radius-full: 999px; /* 间距 */ --spacer-xs: 4px; --spacer-sm: 8px; --spacer-md: 12px; --spacer-lg: 16px; --spacer-xl: 20px; --spacer-2xl: 24px; --spacer-3xl: 32px; /* 尺寸 */ --sidebar-width: 260px; --sidebar-collapsed-width: 72px; --topbar-height: 64px; /* 动画 */ --transition-fast: 150ms ease; --transition-base: 200ms ease; --transition-slow: 300ms ease; } /* ============ 基础 Reset ============ */ * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; } body { font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, 'PingFang SC', 'Microsoft YaHei', sans-serif; background: var(--bg-primary); min-height: 100vh; color: var(--text-dark); line-height: 1.6; overflow-x: hidden; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } button { font-family: inherit; cursor: pointer; border: none; background: none; } input { font-family: inherit; } /* ============ 双栏布局 ============ */ .app-layout { display: flex; min-height: 100vh; } /* ============ 侧边栏 ============ */ .sidebar { width: var(--sidebar-width); background: var(--bg-sidebar); border-right: 1px solid var(--border-gray); display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; flex-shrink: 0; transition: width var(--transition-slow); z-index: 100; overflow: hidden; } /* 折叠状态 */ .sidebar.collapsed { width: var(--sidebar-collapsed-width); } .sidebar.collapsed .brand-text, .sidebar.collapsed .nav-item span, .sidebar.collapsed .sidebar-section-title span, .sidebar.collapsed .sidebar-section-title .section-arrow, .sidebar.collapsed .sidebar-tags, .sidebar.collapsed .sidebar-people, .sidebar.collapsed .sidebar-section-content, .sidebar.collapsed .sidebar-divider { opacity: 0; pointer-events: none; display: none; } .sidebar.collapsed .sidebar-section { padding: var(--spacer-md) 0; gap: var(--spacer-xs); } .sidebar.collapsed .sidebar-section-title { justify-content: center; padding: var(--spacer-sm) 0; margin-bottom: 0; } .sidebar.collapsed .sidebar-section-group { margin-bottom: var(--spacer-sm); } .sidebar.collapsed .nav-item { justify-content: center; padding-left: 0; padding-right: 0; margin: 0 var(--spacer-xs); } .sidebar.collapsed .sidebar-brand { padding: var(--spacer-lg) 0; justify-content: center; } .sidebar.collapsed .collapse-btn { justify-content: center; padding: var(--spacer-md) 0; } .sidebar.collapsed .collapse-btn i { transform: rotate(180deg); } .sidebar.collapsed .sidebar-nav { padding: var(--spacer-md) var(--spacer-xs); } /* 品牌 Logo */ .sidebar-brand { display: flex; align-items: center; gap: var(--spacer-md); padding: var(--spacer-2xl) var(--spacer-xl); border-bottom: 1px solid var(--border-gray); height: var(--topbar-height); flex-shrink: 0; } .brand-icon { width: 40px; height: 40px; background: linear-gradient(135deg, var(--secondary-blue) 0%, var(--accent-purple) 100%); border-radius: var(--radius); display: flex; align-items: center; justify-content: center; color: var(--white); font-size: 1.1rem; flex-shrink: 0; box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3); } .brand-text { font-size: 1.2rem; font-weight: 700; background: linear-gradient(135deg, var(--primary-blue) 0%, var(--accent-purple) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; white-space: nowrap; transition: opacity var(--transition-base); } /* 导航菜单 */ .sidebar-nav { padding: var(--spacer-lg) var(--spacer-md); display: flex; flex-direction: column; gap: var(--spacer-xs); flex-shrink: 0; } .nav-item { display: flex; align-items: center; gap: var(--spacer-md); padding: var(--spacer-md) var(--spacer-lg); border-radius: var(--radius); color: var(--text-light); font-weight: 500; font-size: 0.95rem; cursor: pointer; transition: all var(--transition-fast); white-space: nowrap; } .nav-item i { width: 20px; text-align: center; flex-shrink: 0; font-size: 1rem; } .nav-item:hover { background: var(--bg-hover); color: var(--text-dark); } .nav-item.active { background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%); color: var(--secondary-blue); font-weight: 600; } .nav-item.active i { color: var(--secondary-blue); } /* 分隔线 */ .sidebar-divider { height: 1px; background: var(--border-gray); margin: var(--spacer-sm) var(--spacer-xl); flex-shrink: 0; } /* 侧边栏区域 */ .sidebar-section { flex: 1; overflow-y: auto; padding: var(--spacer-lg) var(--spacer-md); display: flex; flex-direction: column; min-height: 0; gap: var(--spacer-sm); } .sidebar-section::-webkit-scrollbar { width: 4px; } .sidebar-section::-webkit-scrollbar-thumb { background: var(--medium-gray); border-radius: 2px; } /* 可折叠区块组 */ .sidebar-section-group { display: flex; flex-direction: column; } .sidebar-section-title { display: flex; align-items: center; gap: var(--spacer-md); padding: var(--spacer-sm) var(--spacer-lg); font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: var(--spacer-sm); } .sidebar-section-title.collapsible { cursor: pointer; border-radius: var(--radius); transition: background var(--transition-fast); user-select: none; } .sidebar-section-title.collapsible:hover { background: var(--bg-hover); color: var(--text-light); } .section-arrow { margin-left: auto; font-size: 0.7rem; transition: transform var(--transition-base); opacity: 0.6; } .sidebar-section-group.collapsed .section-arrow { transform: rotate(-90deg); } .sidebar-section-content { overflow: hidden auto; max-height: 600px; transition: max-height 0.28s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease, margin 0.2s ease; opacity: 1; margin-bottom: var(--spacer-sm); } /* 侧边栏内容滚动条美化 */ .sidebar-section-content::-webkit-scrollbar { width: 4px; } .sidebar-section-content::-webkit-scrollbar-track { background: transparent; } .sidebar-section-content::-webkit-scrollbar-thumb { background: var(--border-gray); border-radius: 2px; } .sidebar-section-content::-webkit-scrollbar-thumb:hover { background: var(--text-light); } .sidebar-section-group.collapsed .sidebar-section-content { max-height: 0; opacity: 0; margin-bottom: 0; transition: max-height 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s ease, margin 0.15s ease; } .sidebar-section-title i:first-child { width: 20px; text-align: center; font-size: 0.85rem; } /* 侧边栏标签列表 */ .sidebar-tags { display: flex; flex-direction: column; gap: var(--spacer-xs); transition: opacity var(--transition-base); } .sidebar-tag { display: flex; align-items: center; justify-content: space-between; padding: var(--spacer-sm) var(--spacer-lg); border-radius: var(--radius); cursor: pointer; transition: all var(--transition-fast); font-size: 0.9rem; color: var(--text-light); } .sidebar-tag:hover { background: var(--bg-hover); color: var(--text-dark); } .sidebar-tag.active { background: rgba(59, 130, 246, 0.1); color: var(--secondary-blue); font-weight: 500; } .sidebar-tag-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sidebar-tag-count { background: var(--bg-hover); padding: 2px 8px; border-radius: var(--radius-full); font-size: 0.75rem; font-weight: 600; color: var(--text-muted); flex-shrink: 0; } .sidebar-tag.active .sidebar-tag-count { background: var(--secondary-blue); color: var(--white); } /* 侧边栏人物列表 */ .sidebar-people { display: flex; flex-direction: column; gap: var(--spacer-xs); transition: opacity var(--transition-base); } .sidebar-person { display: flex; align-items: center; gap: var(--spacer-sm); padding: var(--spacer-sm) var(--spacer-lg); border-radius: var(--radius); cursor: pointer; transition: all var(--transition-fast); font-size: 0.9rem; color: var(--text-light); } .sidebar-person:hover { background: var(--bg-hover); color: var(--text-dark); } .sidebar-person.active { background: rgba(139, 92, 246, 0.1); color: var(--accent-purple); font-weight: 500; } .sidebar-person-avatar { width: 28px; height: 28px; border-radius: 50%; background: #6366f1; color: var(--white); display: flex; align-items: center; justify-content: center; font-size: 0.8rem; font-weight: 600; flex-shrink: 0; } .sidebar-person-info { display: flex; flex-direction: column; flex: 1; min-width: 0; } .sidebar-person-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 0.9rem; } .sidebar-person-count { font-size: 0.75rem; color: var(--text-muted); } .sidebar-person.active .sidebar-person-count { color: var(--accent-purple); opacity: 0.8; } /* 侧边栏底部 */ .sidebar-footer { padding: var(--spacer-md); border-top: 1px solid var(--border-gray); flex-shrink: 0; margin-top: auto; } .collapse-btn { display: flex; align-items: center; justify-content: center; width: 100%; padding: var(--spacer-md); border-radius: var(--radius); color: var(--text-light); font-size: 1rem; font-weight: 500; transition: all var(--transition-fast); cursor: pointer; } .collapse-btn:hover { background: var(--bg-hover); color: var(--text-dark); } .collapse-btn i { width: 20px; text-align: center; transition: transform var(--transition-base); } /* ============ 主内容区 ============ */ .main-content { flex: 1; display: flex; flex-direction: column; min-width: 0; } /* ============ 顶部工具栏 ============ */ .topbar { height: var(--topbar-height); background: var(--bg-surface); border-bottom: 1px solid var(--border-gray); display: flex; align-items: center; gap: var(--spacer-lg); padding: 0 var(--spacer-2xl); position: sticky; top: 0; z-index: 50; } .mobile-menu-btn { display: none; width: 40px; height: 40px; border-radius: var(--radius); color: var(--text-light); align-items: center; justify-content: center; transition: all var(--transition-fast); } .mobile-menu-btn:hover { background: var(--bg-hover); color: var(--text-dark); } /* 搜索栏 */ .search-bar { flex: 1; max-width: 640px; position: relative; display: flex; align-items: center; } .search-icon { position: absolute; left: var(--spacer-lg); color: var(--text-muted); font-size: 1rem; pointer-events: none; } .search-bar input { width: 100%; padding: var(--spacer-md) var(--spacer-3xl); font-size: 0.95rem; border: 1px solid var(--border-gray); border-radius: var(--radius-full); background: var(--bg-hover); color: var(--text-dark); transition: all var(--transition-fast); } .search-bar input::placeholder { color: var(--text-muted); } .search-bar input:focus { outline: none; border-color: var(--secondary-blue); background: var(--white); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .search-clear { position: absolute; right: var(--spacer-md); width: 28px; height: 28px; border-radius: var(--radius-full); color: var(--text-muted); display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); } .search-clear:hover { background: var(--medium-gray); color: var(--text-dark); } /* 顶部操作按钮 */ .topbar-actions { display: flex; align-items: center; gap: var(--spacer-sm); margin-left: auto; } .action-btn { width: 40px; height: 40px; border-radius: var(--radius); color: var(--text-light); display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); position: relative; } .action-btn:hover { background: var(--bg-hover); color: var(--secondary-blue); } .action-btn:active { transform: scale(0.95); } /* ============ 筛选状态条 ============ */ .filter-bar { display: flex; align-items: center; gap: var(--spacer-md); padding: var(--spacer-md) var(--spacer-2xl); background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border-bottom: 1px solid #fcd34d; } .filter-indicator { display: flex; align-items: center; gap: var(--spacer-sm); color: #92400e; font-weight: 600; font-size: 0.9rem; } .filter-pill { background: var(--white); padding: 4px var(--spacer-md); border-radius: var(--radius-full); font-weight: 700; color: #92400e; font-size: 0.9rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); } .filter-remove { margin-left: auto; padding: var(--spacer-sm) var(--spacer-md); background: #92400e; color: var(--white); border-radius: var(--radius-full); font-weight: 600; font-size: 0.85rem; transition: all var(--transition-fast); display: flex; align-items: center; gap: var(--spacer-xs); } .filter-remove:hover { background: #78350f; transform: translateY(-1px); } /* ============ 内容区域 ============ */ .content-area { flex: 1; padding: var(--spacer-2xl); max-width: 100%; } /* 统计条 */ .stats-bar { display: flex; align-items: center; justify-content: center; gap: var(--spacer-xl); padding: var(--spacer-xl) var(--spacer-2xl); background: var(--bg-surface); border-radius: var(--radius-card); border: 1px solid var(--border-gray); margin-bottom: var(--spacer-2xl); } .stat-item { display: flex; align-items: center; gap: var(--spacer-sm); } .stat-icon { width: 36px; height: 36px; border-radius: var(--radius); background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%); color: var(--secondary-blue); display: flex; align-items: center; justify-content: center; font-size: 1rem; } .stat-value { font-size: 1.4rem; font-weight: 700; color: var(--text-dark); line-height: 1; } .stat-label { color: var(--text-light); font-size: 0.9rem; } .stat-divider { width: 1px; height: 36px; background: var(--border-gray); } /* 热门人物横向滚动条 */ .people-strip { display: flex; align-items: center; gap: var(--spacer-lg); padding: var(--spacer-md) var(--spacer-xl); background: var(--bg-surface); border-radius: var(--radius-card); border: 1px solid var(--border-gray); margin-bottom: var(--spacer-2xl); overflow: hidden; position: relative; } .people-strip-header { display: flex; align-items: center; gap: var(--spacer-sm); font-weight: 600; color: var(--text-dark); font-size: 0.9rem; flex-shrink: 0; padding-right: var(--spacer-lg); border-right: 1px solid var(--border-gray); } .people-strip-header i { color: var(--accent-purple); } .people-scroll { display: flex; gap: var(--spacer-md); overflow-x: auto; flex: 1; scroll-behavior: smooth; scrollbar-width: none; padding: var(--spacer-xs) 0; } .people-scroll::-webkit-scrollbar { display: none; } .person-chip-scroll { display: flex; align-items: center; gap: var(--spacer-sm); padding: var(--spacer-xs) var(--spacer-md) var(--spacer-xs) var(--spacer-xs); background: var(--bg-hover); border-radius: var(--radius-full); cursor: pointer; transition: all var(--transition-fast); flex-shrink: 0; border: 1px solid transparent; } .person-chip-scroll:hover { background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(236, 72, 153, 0.1) 100%); border-color: rgba(139, 92, 246, 0.2); transform: translateY(-1px); } .person-chip-scroll.active { background: linear-gradient(135deg, var(--accent-purple) 0%, var(--accent-pink) 100%); color: var(--white); } .person-chip-scroll.active .person-chip-name, .person-chip-scroll.active .person-chip-count { color: var(--white); } .person-chip-avatar { width: 32px; height: 32px; border-radius: var(--radius-full); background: linear-gradient(135deg, var(--accent-purple) 0%, var(--accent-pink) 100%); color: var(--white); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.85rem; flex-shrink: 0; } .person-chip-info { display: flex; flex-direction: column; line-height: 1.2; } .person-chip-name { font-weight: 600; font-size: 0.85rem; color: var(--text-dark); white-space: nowrap; } .person-chip-count { font-size: 0.75rem; color: var(--text-muted); } .people-scroll-hint { color: var(--text-muted); padding-left: var(--spacer-md); border-left: 1px solid var(--border-gray); flex-shrink: 0; animation: scrollHint 2s ease-in-out infinite; } @keyframes scrollHint { 0%, 100% { opacity: 0.4; transform: translateX(0); } 50% { opacity: 1; transform: translateX(4px); } } /* ============ 移动端遮罩 ============ */ .mobile-overlay { display: none; position: fixed; inset: 0; background: rgba(0, 0, 0, 0.4); z-index: 99; opacity: 0; transition: opacity var(--transition-base); } .mobile-overlay.active { display: block; opacity: 1; } /* ============ 旧样式保留:搜索框 + 按钮(兼容) ============ */ .container { max-width: 1400px; margin: 0 auto; padding: 30px 20px; } .header { text-align: center; margin-bottom: 50px; color: var(--text-dark); } .header h1 { font-size: 3rem; margin-bottom: 15px; font-weight: 700; background: linear-gradient(135deg, var(--primary-blue) 0%, var(--secondary-blue) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .header p { font-size: 1.3rem; color: var(--text-light); max-width: 600px; margin: 0 auto; } .search-container { text-align: center; margin-bottom: 50px; } .search-box { position: relative; display: inline-block; max-width: 500px; width: 100%; } .search-box input { width: 100%; padding: 18px 60px 18px 25px; font-size: 16px; border: 2px solid var(--medium-gray); border-radius: 50px; background: var(--white); box-shadow: var(--shadow-md); transition: all 0.3s ease; color: var(--text-dark); } .search-box input:focus { outline: none; border-color: var(--secondary-blue); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); transform: translateY(-2px); } .search-box button { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); background: var(--secondary-blue); border: none; color: var(--white); font-size: 18px; cursor: pointer; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; } .search-box button:hover { background: var(--primary-blue); transform: translateY(-50%) scale(1.05); } .action-buttons { display: flex; justify-content: center; gap: 15px; margin-top: 20px; flex-wrap: wrap; } .random-button, .favorites-button { padding: 12px 24px; background: linear-gradient(135deg, var(--secondary-blue) 0%, var(--primary-blue) 100%); color: var(--white); border: none; border-radius: 25px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; box-shadow: var(--shadow-md); } .random-button:hover, .favorites-button:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); background: linear-gradient(135deg, var(--primary-blue) 0%, var(--secondary-blue) 100%); } .favorites-button { background: linear-gradient(135deg, #ec4899 0%, #db2777 100%); } .favorites-button:hover { background: linear-gradient(135deg, #db2777 0%, #ec4899 100%); } /* ============ 旧样式保留:收藏夹 ============ */ .favorites-container { width: 100%; min-height: 100vh; background: #f8fafc; } .favorites-header { background: linear-gradient(135deg, #fdf2f8 0%, #fce7f3 50%, #fbcfe8 100%); padding: 30px 40px; box-shadow: 0 4px 20px rgba(236, 72, 153, 0.1); border-bottom: 1px solid #f9a8d4; position: sticky; top: 0; z-index: 100; } .header-content { max-width: 1400px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 20px; } .header-left { display: flex; align-items: center; gap: 20px; } .favorites-icon { width: 60px; height: 60px; background: linear-gradient(135deg, #ec4899 0%, #db2777 100%); border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 12px rgba(236, 72, 153, 0.3); } .favorites-icon i { font-size: 1.8rem; color: white; } .header-info h1 { font-size: 2rem; font-weight: 700; background: linear-gradient(135deg, #ec4899 0%, #db2777 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 5px; } .favorites-count { font-size: 1.1rem; color: #6b7280; } .count-number { font-weight: 700; color: #ec4899; font-size: 1.2rem; } .sort-button, .back-button, .explore-button { padding: 10px 20px; border: none; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 6px; font-size: 0.9rem; } .sort-button { background: white; color: #6b7280; border: 2px solid #e5e7eb; } .sort-button:hover { background: #f9fafb; border-color: #d1d5db; transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .back-button { background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); color: white; } .back-button:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4); } .explore-button { background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; } .explore-button:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4); } .favorites-content { width: 100%; padding: 0; margin: 0; } .empty-favorites { text-align: center; padding: 100px 20px; background: white; min-height: 60vh; display: flex; flex-direction: column; justify-content: center; align-items: center; } .empty-icon { width: 120px; height: 120px; background: #f3f4f6; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 30px; } .empty-icon i { font-size: 4rem; color: #9ca3af; } .empty-favorites h3 { font-size: 1.8rem; color: #374151; margin-bottom: 10px; } .empty-favorites p { font-size: 1.1rem; color: #6b7280; margin-bottom: 30px; } .favorites-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; padding: 30px; max-width: none; margin: 0; justify-items: center; align-items: start; } .favorite-card { width: 100%; max-width: 320px; background: white; border-radius: 10px; overflow: hidden; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06); transition: all 0.3s ease; cursor: pointer; border: 1px solid #f1f5f9; height: 100%; display: flex; flex-direction: column; } .favorite-card:hover { transform: translateY(-3px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1); } .card-image { position: relative; height: 180px; overflow: hidden; flex-shrink: 0; } .card-image img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .favorite-card:hover .card-image img { transform: scale(1.06); } .card-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to bottom, rgba(0,0,0,0.1), rgba(0,0,0,0.25)); opacity: 0; transition: opacity 0.3s ease; display: flex; align-items: flex-end; } .favorite-card:hover .card-overlay { opacity: 1; } @media (hover: none) and (pointer: coarse) { .favorite-card .card-overlay { opacity: 0.2; } .favorite-card:active .card-overlay, .favorite-card:focus .card-overlay { opacity: 1; } } .overlay-content { display: flex; gap: 6px; padding: 12px; width: 100%; justify-content: flex-end; } .quick-view, .remove-favorite { width: 32px; height: 32px; border: none; border-radius: 50%; background: rgba(255, 255, 255, 0.95); color: #374151; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; font-size: 0.85rem; } .quick-view:hover { background: #3b82f6; color: white; transform: scale(1.1); } .remove-favorite:hover { background: #ef4444; color: white; transform: scale(1.1); } .favorite-badge { position: absolute; top: 10px; left: 10px; width: 28px; height: 28px; background: linear-gradient(135deg, #ec4899 0%, #db2777 100%); border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 6px rgba(236, 72, 153, 0.4); } .favorite-badge i { color: white; font-size: 0.9rem; } .card-content { padding: 12px; flex-grow: 1; display: flex; flex-direction: column; gap: 6px; } .image-title { font-size: 1rem; font-weight: 600; color: #1f2937; line-height: 1.2; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; margin: 0; } .album-info { color: #6b7280; font-size: 0.85rem; line-height: 1.3; margin: 0; } .image-meta { display: flex; gap: 10px; flex-wrap: wrap; margin-top: auto; } .meta-item { display: flex; align-items: center; gap: 3px; font-size: 0.75rem; color: #9ca3af; } .meta-item i { font-size: 0.7rem; } /* ============ 旧样式保留:预览模态框 ============ */ .preview-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: all 0.3s ease; } .preview-modal.active { opacity: 1; visibility: visible; } .preview-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); backdrop-filter: blur(5px); } .preview-container { position: relative; background: white; border-radius: 16px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); max-width: 90vw; max-height: 90vh; width: 1200px; height: 800px; display: flex; flex-direction: column; transform: scale(0.9); transition: transform 0.3s ease; } .preview-modal.active .preview-container { transform: scale(1); } .preview-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; border-bottom: 1px solid #f1f5f9; flex-shrink: 0; } .preview-title h3 { font-size: 1.4rem; font-weight: 600; color: #1f2937; margin: 0 0 4px 0; } .preview-info { font-size: 0.9rem; color: #6b7280; } .preview-actions { display: flex; align-items: center; gap: 16px; } .preview-nav { width: 40px; height: 40px; border: 1px solid #e5e7eb; border-radius: 8px; background: white; color: #374151; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .preview-nav:hover:not(:disabled) { background: #f9fafb; border-color: #d1d5db; transform: translateY(-1px); } .preview-nav:disabled { opacity: 0.4; cursor: not-allowed; } .preview-counter { font-size: 0.9rem; color: #6b7280; font-weight: 500; } .preview-close { width: 40px; height: 40px; border: none; border-radius: 8px; background: #f3f4f6; color: #374151; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .preview-close:hover { background: #ef4444; color: white; } .preview-content { flex: 1; padding: 0; overflow: hidden; display: flex; align-items: center; justify-content: center; } .preview-image-container { position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } .preview-image { max-width: 100%; max-height: 100%; object-fit: contain; transition: opacity 0.3s ease; } .preview-loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; gap: 8px; color: #6b7280; } .preview-loading i { font-size: 2rem; } .preview-footer { display: flex; justify-content: space-between; align-items: center; padding: 16px 24px; border-top: 1px solid #f1f5f9; flex-shrink: 0; } .preview-meta { display: flex; gap: 20px; } .preview-meta .meta-item { display: flex; align-items: center; gap: 6px; font-size: 0.9rem; color: #6b7280; } .preview-meta .meta-item i { font-size: 0.8rem; } .preview-controls { display: flex; gap: 12px; } .preview-action { padding: 8px 16px; border: 1px solid #e5e7eb; border-radius: 8px; background: white; color: #374151; cursor: pointer; font-size: 0.9rem; font-weight: 500; transition: all 0.2s ease; display: flex; align-items: center; gap: 6px; } .preview-action:hover { background: #f9fafb; border-color: #d1d5db; } .preview-remove { border-color: #fecaca; color: #dc2626; } .preview-remove:hover { background: #fef2f2; border-color: #fca5a5; } .preview-action.favorited { border-color: #fbcfe8; color: #ec4899; background: #fdf2f8; } .preview-action.favorited:hover { background: #fce7f3; border-color: #f9a8d4; } .preview-action.favorited i { color: #ec4899; } /* ============ 旧样式保留:统计 + 发现区域 ============ */ .stats { text-align: center; color: var(--text-dark); margin-bottom: 40px; font-size: 1.1rem; background: var(--white); padding: 20px; border-radius: var(--border-radius); box-shadow: var(--shadow-sm); border: 1px solid var(--medium-gray); } .discover-section { background: var(--white); border-radius: var(--border-radius-lg); box-shadow: var(--shadow-sm); border: 1px solid var(--medium-gray); margin-bottom: 30px; overflow: hidden; } .section-header { display: flex; justify-content: space-between; align-items: center; padding: 18px 24px; background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); border-bottom: 1px solid var(--medium-gray); } .section-header h3 { margin: 0; font-size: 1.1rem; font-weight: 700; color: var(--text-dark); display: flex; align-items: center; gap: 10px; } .section-header h3 i { color: var(--secondary-blue); } .section-toggle { background: none; border: none; color: var(--text-light); cursor: pointer; padding: 6px 10px; border-radius: 6px; transition: all 0.2s ease; font-size: 0.9rem; } .section-toggle:hover { background: rgba(59, 130, 246, 0.1); color: var(--secondary-blue); } .tag-cloud { padding: 20px 24px; display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; } .tag-chip { display: inline-flex; align-items: center; gap: 4px; padding: 6px 14px; background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); border: 1px solid #bae6fd; border-radius: 20px; cursor: pointer; font-weight: 600; transition: all 0.25s ease; user-select: none; } .tag-chip small { color: var(--text-light); font-weight: 500; opacity: 0.8; } .tag-chip:hover { background: linear-gradient(135deg, var(--secondary-blue) 0%, var(--primary-blue) 100%); color: var(--white) !important; border-color: var(--secondary-blue); transform: translateY(-2px); box-shadow: var(--shadow-md); } .tag-chip:hover small { color: rgba(255, 255, 255, 0.85); } .people-cloud { padding: 20px 24px; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; } .person-chip { display: flex; align-items: center; gap: 12px; padding: 10px 14px; background: linear-gradient(135deg, #fdf4ff 0%, #fae8ff 100%); border: 1px solid #f5d0fe; border-radius: 12px; cursor: pointer; transition: all 0.25s ease; } .person-chip:hover { background: linear-gradient(135deg, #a855f7 0%, #9333ea 100%); border-color: #9333ea; transform: translateY(-2px); box-shadow: var(--shadow-md); } .person-chip:hover .person-name, .person-chip:hover .person-meta { color: var(--white); } .person-avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #a855f7 0%, #7c3aed 100%); color: var(--white); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.1rem; flex-shrink: 0; } .person-chip:hover .person-avatar { background: rgba(255, 255, 255, 0.25); } .person-info { flex: 1; min-width: 0; } .person-name { font-weight: 700; color: var(--text-dark); font-size: 0.95rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .person-meta { font-size: 0.8rem; color: var(--text-light); margin-top: 2px; } .filter-status { display: none; align-items: center; gap: 12px; padding: 14px 20px; background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border: 1px solid #fcd34d; border-radius: var(--border-radius); margin-bottom: 24px; box-shadow: var(--shadow-sm); } .filter-label { font-weight: 600; color: #92400e; font-size: 0.95rem; } .filter-tag { background: var(--white); padding: 4px 12px; border-radius: 16px; font-weight: 700; color: #92400e; font-size: 0.9rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .filter-clear { margin-left: auto; padding: 6px 14px; background: #92400e; color: var(--white); border: none; border-radius: 16px; font-weight: 600; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 6px; } .filter-clear:hover { background: #78350f; transform: translateY(-1px); } /* ============ 相册网格 + 卡片 ============ */ .albums-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; margin-bottom: 40px; } .loading { text-align: center; padding: 60px 20px; color: var(--text-light); font-size: 1.1rem; grid-column: 1 / -1; } .loading .fa-spinner { font-size: 2rem; margin-bottom: 15px; color: var(--secondary-blue); } .skeleton { background: linear-gradient(90deg, var(--light-gray) 25%, var(--medium-gray) 50%, var(--light-gray) 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: var(--border-radius); } @keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .skeleton-card { background: var(--white); border-radius: var(--border-radius-lg); box-shadow: var(--shadow-lg); overflow: hidden; border: 1px solid var(--medium-gray); } .skeleton-cover { height: 220px; width: 100%; } .skeleton-content { padding: 25px; } .skeleton-title { height: 24px; width: 80%; margin-bottom: 15px; border-radius: 4px; } .skeleton-meta { display: flex; justify-content: space-between; margin-bottom: 20px; } .skeleton-meta-item { height: 16px; width: 40%; border-radius: 4px; } .skeleton-button { height: 44px; width: 100%; border-radius: 10px; } .album-card { background: var(--white); border-radius: var(--radius-card); box-shadow: var(--shadow-sm); overflow: hidden; transition: all var(--transition-slow); position: relative; border: 1px solid var(--border-gray); cursor: pointer; display: flex; flex-direction: column; } .album-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); border-color: var(--secondary-blue); } .album-cover { height: 220px; overflow: hidden; position: relative; background: var(--bg-hover); display: flex; align-items: center; justify-content: center; } .album-cover img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; display: block; } .album-card:hover .album-cover img { transform: scale(1.05); } .album-info { padding: 16px; display: flex; flex-direction: column; gap: 8px; flex: 1; } .album-info h3 { font-size: 1rem; margin: 0; color: var(--text-dark); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-weight: 600; } .album-meta { display: flex; justify-content: space-between; align-items: center; color: var(--text-light); font-size: 0.85rem; } .album-meta span { display: flex; align-items: center; gap: 6px; } /* 相册标签胶囊 */ .album-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: auto; } .album-tag { padding: 2px 8px; background: var(--bg-hover); border-radius: var(--radius-full); font-size: 0.75rem; color: var(--text-light); font-weight: 500; } /* 无结果 */ .no-results { text-align: center; padding: 60px 20px; color: var(--text-light); font-size: 1.2rem; grid-column: 1 / -1; } .no-results .fa-search { font-size: 3rem; margin-bottom: 20px; color: var(--medium-gray); } .search-hint { text-align: center; padding: 60px 20px; color: var(--text-light); font-size: 1.2rem; max-width: 600px; margin: 0 auto; grid-column: 1 / -1; } .search-hint .fa-search { font-size: 3rem; margin-bottom: 20px; color: var(--medium-gray); } .search-hint h3 { color: var(--text-dark); margin-bottom: 15px; } .loading-state { text-align: center; padding: 60px 20px; color: var(--text-light); font-size: 1.2rem; max-width: 400px; margin: 0 auto; grid-column: 1 / -1; } .loading-state .fa-spinner { font-size: 3rem; margin-bottom: 20px; color: var(--secondary-blue); } .loading-state p { margin-bottom: 20px; color: var(--text-dark); } .progress-bar { width: 100%; height: 6px; background-color: var(--light-gray); border-radius: 3px; overflow: hidden; } .progress { height: 100%; background: linear-gradient(135deg, var(--secondary-blue) 0%, var(--primary-blue) 100%); border-radius: 3px; transition: width 0.3s ease; } /* 分页加载 */ .loading-more { text-align: center; padding: 40px 20px; background: var(--white); border-radius: var(--border-radius); box-shadow: var(--shadow-sm); margin: 20px 0; border: 1px solid var(--medium-gray); } .loading-spinner { display: flex; align-items: center; justify-content: center; gap: 12px; color: var(--text-light); font-size: 1rem; } .loading-spinner .fa-spinner { color: var(--secondary-blue); font-size: 1.2rem; } .load-more-error { text-align: center; padding: 30px 20px; background: #fef2f2; border-radius: var(--border-radius); box-shadow: var(--shadow-sm); margin: 20px 0; border: 1px solid #fecaca; color: #dc2626; } .error-content { display: flex; align-items: center; justify-content: center; gap: 10px; font-size: 1rem; } .error-content .fa-exclamation-triangle { font-size: 1.2rem; } .error-content a { color: var(--primary-blue); text-decoration: underline; cursor: pointer; } .error-content a:hover { color: var(--secondary-blue); } /* ============ 响应式设计 ============ */ /* 桌面端:侧边栏折叠 */ @media (max-width: 1199px) { .content-area { padding: var(--spacer-xl); } .stats-bar { gap: var(--spacer-lg); padding: var(--spacer-lg); } .stat-value { font-size: 1.2rem; } } /* 平板端 */ @media (max-width: 1024px) { .sidebar { position: fixed; left: 0; top: 0; transform: translateX(-100%); box-shadow: var(--shadow-xl); } .sidebar.mobile-open { transform: translateX(0); } .mobile-menu-btn { display: flex; } .topbar { padding: 0 var(--spacer-lg); } .content-area { padding: var(--spacer-lg); } .stats-bar { flex-wrap: wrap; gap: var(--spacer-md); } .stat-divider:nth-of-type(2) { display: none; } .albums-grid { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 20px; } .album-cover { height: 200px; } } /* 手机端 */ @media (max-width: 768px) { :root { --topbar-height: 56px; } .topbar { padding: 0 var(--spacer-md); gap: var(--spacer-sm); } .search-bar input { padding: 10px var(--spacer-2xl); font-size: 0.9rem; } .topbar-actions .action-btn:nth-child(1) { display: none; } .content-area { padding: var(--spacer-md); } .stats-bar { padding: var(--spacer-md); gap: var(--spacer-sm); margin-bottom: var(--spacer-lg); } .stat-icon { width: 30px; height: 30px; font-size: 0.85rem; } .stat-value { font-size: 1rem; } .stat-label { font-size: 0.8rem; } .stat-divider { height: 28px; } .people-strip { padding: var(--spacer-sm) var(--spacer-md); gap: var(--spacer-md); margin-bottom: var(--spacer-lg); } .people-strip-header { font-size: 0.8rem; padding-right: var(--spacer-md); } .people-scroll-hint { display: none; } .albums-grid { grid-template-columns: repeat(2, 1fr); gap: 12px; margin-bottom: 20px; } .album-cover { height: 140px; } .album-info { padding: 10px; gap: 4px; } .album-info h3 { font-size: 0.85rem; -webkit-line-clamp: 2; } .album-meta { font-size: 0.75rem; flex-direction: column; align-items: flex-start; gap: 2px; } .filter-bar { padding: var(--spacer-sm) var(--spacer-md); flex-wrap: wrap; gap: var(--spacer-sm); } .filter-indicator { font-size: 0.8rem; } .filter-pill { font-size: 0.8rem; padding: 3px 10px; } .filter-remove { font-size: 0.8rem; padding: var(--spacer-xs) var(--spacer-md); } } /* 小屏手机 */ @media (max-width: 480px) { .albums-grid { grid-template-columns: 1fr; gap: 16px; } .album-cover { height: 180px; } .album-info { padding: 14px; } .album-info h3 { font-size: 1rem; } .album-meta { font-size: 0.85rem; } .stats-bar { flex-direction: column; gap: var(--spacer-sm); } .stat-divider { width: 60%; height: 1px; } } /* 触摸设备优化 */ @media (hover: none) and (pointer: coarse) { .album-card:hover { transform: none; box-shadow: var(--shadow-sm); } .album-card:active { transform: scale(0.98); box-shadow: var(--shadow-md); } .nav-item:hover { background: transparent; } .nav-item:active { background: var(--bg-hover); } .sidebar-tag:hover { background: transparent; } .sidebar-tag:active { background: var(--bg-hover); } } /* 高分辨率屏幕优化 */ @media (min-resolution: 2dppx) { .album-cover img { image-rendering: -webkit-optimize-contrast; image-rendering: crisp-edges; } }