/* ============================================ 页面样式 - 书架、发现、历史、书签、搜索、详情 ============================================ */ /* 通用页面容器 */ .page { padding: var(--spacing-md); animation: fadeIn var(--transition-normal) ease; } .page-section { margin-bottom: var(--spacing-lg); } .section-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--spacing-md); } .section-title { font-size: var(--font-size-lg); font-weight: 600; color: var(--text-primary); } .section-more { font-size: var(--font-size-sm); color: var(--primary); } /* ========== 书架页面 ========== */ .shelf-page { padding-bottom: var(--spacing-xl); } .shelf-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--spacing-lg); } .shelf-title { font-family: var(--font-display); font-size: var(--font-size-2xl); color: var(--primary); } .shelf-actions { display: flex; gap: var(--spacing-sm); } .shelf-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-md); } @media (min-width: 480px) { .shelf-grid { grid-template-columns: repeat(4, 1fr); } } .shelf-item { position: relative; } .shelf-item .novel-grid-card { height: 100%; } .shelf-item .unread-badge { position: absolute; top: var(--spacing-xs); right: var(--spacing-xs); background: #e74c3c; color: white; font-size: 10px; padding: 2px 6px; border-radius: var(--radius-full); z-index: 1; } .shelf-item .reading-progress { position: absolute; bottom: 0; left: 0; right: 0; height: 3px; background: var(--bg-hover); } .shelf-item .reading-progress-bar { height: 100%; background: var(--primary); transition: width var(--transition-normal); } /* ========== 发现/探索页面 ========== */ .explore-page { padding-bottom: var(--spacing-xl); } .explore-banner { position: relative; height: 160px; margin: calc(-1 * var(--spacing-md)); margin-bottom: var(--spacing-lg); background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--primary-dark) 100%); overflow: hidden; } .explore-banner::before { content: ''; position: absolute; inset: 0; background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.05'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); } .explore-banner-content { position: relative; height: 100%; display: flex; flex-direction: column; justify-content: center; padding: var(--spacing-lg); padding-top: calc(var(--spacing-lg) + var(--spacing-md)); } .explore-banner h2 { font-family: var(--font-display); font-size: var(--font-size-2xl); color: white; margin-bottom: var(--spacing-xs); } .explore-banner p { font-size: var(--font-size-sm); color: rgba(255, 255, 255, 0.8); } /* 标签云 */ .tags-cloud { display: flex; flex-wrap: wrap; gap: var(--spacing-sm); } .tag-btn { padding: var(--spacing-sm) var(--spacing-md); background: var(--bg-card); border-radius: var(--radius-full); font-size: var(--font-size-sm); color: var(--text-secondary); transition: all var(--transition-fast); } .tag-btn:active { background: var(--primary); color: var(--bg-primary); } .tag-btn.active { background: var(--primary); color: var(--bg-primary); } /* 小说列表 */ .novel-list { display: flex; flex-direction: column; gap: var(--spacing-md); } /* 推荐列表横向滚动 */ .novel-scroll { display: flex; gap: var(--spacing-md); overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; padding-bottom: var(--spacing-sm); margin: 0 calc(-1 * var(--spacing-md)); padding-left: var(--spacing-md); padding-right: var(--spacing-md); } .novel-scroll::-webkit-scrollbar { display: none; } .novel-scroll .novel-grid-card { flex-shrink: 0; width: 120px; scroll-snap-align: start; } /* ========== 历史页面 ========== */ .history-page { padding-bottom: var(--spacing-xl); } .history-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--spacing-lg); } .history-title { font-size: var(--font-size-xl); font-weight: 600; } .clear-history-btn { font-size: var(--font-size-sm); color: var(--text-muted); } .history-list { display: flex; flex-direction: column; gap: var(--spacing-md); } .history-date-group { margin-bottom: var(--spacing-lg); } .history-date { font-size: var(--font-size-sm); color: var(--text-muted); margin-bottom: var(--spacing-sm); padding-left: var(--spacing-xs); } /* ========== 书签页面 ========== */ .bookmarks-page { padding-bottom: var(--spacing-xl); } .bookmarks-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--spacing-lg); } .bookmarks-title { font-size: var(--font-size-xl); font-weight: 600; } .bookmarks-list { display: flex; flex-direction: column; gap: var(--spacing-md); } .bookmark-item { cursor: pointer; } .bookmark-item .bookmark-note { margin-top: var(--spacing-xs); padding: var(--spacing-sm); background: var(--bg-secondary); border-radius: var(--radius-sm); font-style: italic; } /* ========== 搜索页面 ========== */ #search-panel { position: fixed; inset: 0; background: var(--bg-primary); z-index: 200; display: flex; flex-direction: column; } .search-header { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-md); padding-top: calc(var(--spacing-md) + var(--safe-area-top)); background: var(--bg-secondary); border-bottom: 1px solid var(--border-color); } .search-input-wrap { flex: 1; display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-sm) var(--spacing-md); background: var(--bg-primary); border-radius: var(--radius-full); } .search-input-wrap svg { width: 20px; height: 20px; fill: var(--text-muted); flex-shrink: 0; } .search-input-wrap input { flex: 1; font-size: var(--font-size-md); } .search-input-wrap input::placeholder { color: var(--text-muted); } #search-clear { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; } #search-clear svg { width: 18px; height: 18px; } .search-tags { padding: var(--spacing-md); border-bottom: 1px solid var(--border-color); max-height: 40vh; overflow-y: auto; } .search-section { margin-bottom: var(--spacing-md); } .search-section:last-child { margin-bottom: 0; } .search-tags-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-sm); } .search-tags-title { font-size: var(--font-size-sm); color: var(--text-muted); } .search-tags .clear-history-btn { font-size: var(--font-size-xs); color: var(--text-muted); background: none; border: none; cursor: pointer; } .search-tags .tags-cloud { gap: var(--spacing-xs); } /* 搜索历史标签样式 */ .history-tag { display: inline-flex; align-items: center; gap: 4px; padding-right: 6px !important; } .history-tag .remove-history { fill: var(--text-muted); opacity: 0.6; cursor: pointer; flex-shrink: 0; } .history-tag .remove-history:hover { opacity: 1; fill: #e74c3c; } .search-results { flex: 1; overflow-y: auto; padding: var(--spacing-md); padding-bottom: calc(var(--spacing-md) + var(--safe-area-bottom)); } .search-hint { text-align: center; padding: var(--spacing-xl); color: var(--text-muted); } /* ========== 小说详情页面 ========== */ .detail-page { padding: 0; /* 底部留出操作栏空间:按钮高度(52px) + padding(32px) + 安全区域 */ padding-bottom: calc(100px + var(--safe-area-bottom)); } .detail-header { position: relative; padding: var(--spacing-lg); padding-top: var(--spacing-xl); background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%); } .detail-header::before { content: ''; position: absolute; inset: 0; background: var(--bg-secondary); opacity: 0.8; z-index: -1; } .detail-cover-wrap { display: flex; gap: var(--spacing-lg); } .detail-cover { width: 120px; height: 165px; border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-lg); flex-shrink: 0; } .detail-cover img { width: 100%; height: 100%; object-fit: cover; } .detail-meta { flex: 1; display: flex; flex-direction: column; gap: var(--spacing-sm); } .detail-title { font-size: var(--font-size-xl); font-weight: 700; line-height: 1.3; } .detail-author { font-size: var(--font-size-md); color: var(--text-secondary); } .detail-stats { display: flex; gap: var(--spacing-lg); margin-top: auto; } .detail-stat { text-align: center; } .detail-stat-value { font-size: var(--font-size-lg); font-weight: 600; color: var(--primary); } .detail-stat-label { font-size: var(--font-size-xs); color: var(--text-muted); } .detail-tags { display: flex; flex-wrap: wrap; gap: var(--spacing-xs); padding: var(--spacing-md) var(--spacing-lg); } .detail-synopsis { padding: var(--spacing-md) var(--spacing-lg); } .detail-synopsis h3 { font-size: var(--font-size-md); margin-bottom: var(--spacing-sm); } .detail-synopsis p { font-size: var(--font-size-sm); color: var(--text-secondary); line-height: 1.8; } .detail-synopsis .expand-btn { display: inline; color: var(--primary); font-size: var(--font-size-sm); } .detail-chapters { padding: var(--spacing-md) var(--spacing-lg); } .detail-chapters h3 { font-size: var(--font-size-md); margin-bottom: var(--spacing-md); display: flex; align-items: center; justify-content: space-between; } .detail-chapters .chapter-count { font-size: var(--font-size-sm); color: var(--text-muted); font-weight: normal; } .chapters-preview { display: flex; flex-direction: column; background: var(--bg-card); border-radius: var(--radius-md); overflow: hidden; } .chapters-preview .chapter-item:last-child { border-bottom: none; } .view-all-chapters { display: flex; align-items: center; justify-content: center; gap: var(--spacing-xs); padding: var(--spacing-md); color: var(--primary); font-size: var(--font-size-sm); border-top: 1px solid var(--border-color); } .view-all-chapters svg { width: 16px; height: 16px; fill: currentColor; } /* 详情页底部操作栏 */ .detail-actions { position: fixed; bottom: 0; left: 0; right: 0; display: flex; gap: var(--spacing-sm); padding: var(--spacing-md); padding-bottom: calc(var(--spacing-md) + var(--safe-area-bottom)); padding-left: max(var(--spacing-md), var(--safe-area-left)); padding-right: max(var(--spacing-md), var(--safe-area-right)); background: var(--bg-secondary); border-top: 1px solid var(--border-color); z-index: 50; } .detail-actions button { flex: 1; padding: var(--spacing-md); border-radius: var(--radius-md); font-size: var(--font-size-md); font-weight: 500; display: flex; align-items: center; justify-content: center; gap: var(--spacing-sm); transition: all var(--transition-fast); } .detail-actions svg { width: 20px; height: 20px; fill: currentColor; } .btn-shelf { background: var(--bg-card); color: var(--text-primary); } .btn-shelf.in-shelf { color: var(--primary); } .btn-read { background: var(--primary); color: var(--bg-primary); } .btn-read:active { background: var(--primary-dark); }