diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index 189502a..e011537 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -50,11 +50,13 @@ body { background-color: var(--bg-background); line-height: 1.5; -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow-x: hidden; } #app { - height: 100vh; - width: 100vw; + min-height: 100vh; + width: 100%; display: flex; flex-direction: column; } @@ -136,8 +138,9 @@ body { display: inline-flex; align-items: center; justify-content: center; - padding: 0.5rem 1rem; - border-radius: var(--radius-md); + padding: 0.65rem 1rem; + min-height: 42px; + border-radius: 12px; font-weight: 500; font-size: 0.875rem; cursor: pointer; diff --git a/frontend/src/views/CharacterView.vue b/frontend/src/views/CharacterView.vue index 6a806e4..b4a50c8 100644 --- a/frontend/src/views/CharacterView.vue +++ b/frontend/src/views/CharacterView.vue @@ -362,4 +362,88 @@ watch(() => projectStore.projectRoot, async (newRoot, oldRoot) => { .modal-actions { display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1.5rem; } .modal-actions button { padding: 0.6rem 1.2rem; border-radius: 6px; cursor: pointer; border: 1px solid var(--border-color); background: var(--bg-secondary); } .btn-primary { background: var(--primary) !important; color: white !important; border: none !important; } + +@media (max-width: 768px) { + .character-view { + padding: 0.9rem; + min-height: 100vh; + height: auto; + } + + .page-header { + flex-direction: column; + align-items: flex-start; + gap: 0.9rem; + margin-bottom: 1rem; + } + + .header-left h1 { font-size: 1.35rem; } + .subtitle, .sync-status, .sync-hint { font-size: 0.8rem; } + + .header-actions { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.55rem; + } + + .btn-create, .btn-secondary { + width: 100%; + justify-content: center; + padding: 0.62rem 0.75rem; + font-size: 0.82rem; + } + + .tabs { + overflow-x: auto; + overflow-y: hidden; + flex-wrap: nowrap; + padding-bottom: 0.65rem; + margin-bottom: 0.85rem; + -webkit-overflow-scrolling: touch; + } + + .tabs button { + flex: 0 0 auto; + white-space: nowrap; + padding: 0.55rem 0.85rem; + font-size: 0.82rem; + } + + .content-area { + flex-direction: column; + gap: 0.9rem; + } + + .char-list { + width: 100%; + max-height: 34vh; + } + + .char-editor, .no-selection { + min-height: 48vh; + } + + .editor-header { + gap: 0.75rem; + align-items: flex-start; + flex-direction: column; + } + + .btn-save { + width: 100%; + } + + .editor-content { + min-height: 42vh; + font-size: 0.85rem; + padding: 0.85rem; + } + + .modal { + width: min(92vw, 400px); + padding: 1rem; + } +} + diff --git a/frontend/src/views/DashboardView.vue b/frontend/src/views/DashboardView.vue index 97de5eb..653027d 100644 --- a/frontend/src/views/DashboardView.vue +++ b/frontend/src/views/DashboardView.vue @@ -538,4 +538,210 @@ h1, h2, h3, p { margin: 0; } .init-guide-card .btn { gap: 0.375rem; } +@media (max-width: 900px) { + .dashboard-scroll-container { + padding: 1.5rem 1rem; + } + + .welcome-text { + font-size: 1.85rem; + } + + .project-info { + font-size: 0.96rem; + } + + .stats-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + margin-bottom: 1.5rem; + } + + .main-content-grid { + grid-template-columns: 1fr; + gap: 1rem; + } + + .content-left, + .content-right { + gap: 1rem; + } + + .premium-card, + .init-guide-card { + padding: 1.2rem; + border-radius: 18px; + } +} + +@media (max-width: 640px) { + .dashboard-scroll-container { + padding: 0.75rem 0.65rem 1rem; + } + + .header-section { + margin-bottom: 1rem; + } + + .welcome-text { + font-size: 1.28rem; + gap: 0.42rem; + align-items: flex-start; + margin-bottom: 0.3rem; + } + + .welcome-icon { + width: 1.7rem; + height: 1.7rem; + flex-shrink: 0; + margin-top: 0.02rem; + } + + .project-info { + font-size: 0.88rem; + } + + .project-name { + display: inline-block; + margin-top: 0.15rem; + max-width: 100%; + word-break: break-word; + } + + .stats-grid { + grid-template-columns: 1fr; + gap: 0.65rem; + margin-bottom: 1rem; + } + + .stat-card { + padding: 0.82rem 0.9rem; + border-radius: 14px; + gap: 0.85rem; + } + + .stat-icon-wrapper { + width: 2.6rem; + height: 2.6rem; + border-radius: 10px; + font-size: 1rem; + } + + .stat-value { + font-size: 1.12rem; + } + + .stat-key { + font-size: 0.74rem; + } + + .actions-grid { + grid-template-columns: 1fr; + gap: 0.6rem; + } + + .action-item { + padding: 0.82rem 0.9rem; + align-items: center; + gap: 0.75rem; + border-radius: 12px; + } + + .action-icon-box { + width: 2.45rem; + height: 2.45rem; + border-radius: 10px; + } + + .action-label { + font-size: 0.92rem; + } + + .action-desc { + font-size: 0.72rem; + } + + .premium-card, + .init-guide-card { + padding: 0.95rem; + border-radius: 16px; + } + + .card-title { + font-size: 1rem; + margin-bottom: 0.85rem; + } + + .card-header { + flex-direction: column; + align-items: flex-start; + gap: 0.45rem; + } + + .goal-target { + align-self: flex-start; + font-size: 0.78rem; + } + + .goal-hint { + font-size: 0.82rem; + } + + .timeline-item { + padding-left: 1rem; + padding-bottom: 0.8rem; + } + + .timeline-line { + left: 6px; + top: 18px; + } + + .timeline-marker { + width: 14px; + height: 14px; + } + + .marker-dot { + width: 7px; + height: 7px; + } + + .timeline-header { + flex-direction: column; + gap: 0.18rem; + } + + .timeline-title { + font-size: 0.86rem; + } + + .timeline-time { + margin-top: 0; + font-size: 0.7rem; + } + + .timeline-content { + padding: 0.72rem 0.75rem; + border-radius: 10px; + } + + .type-badge { + font-size: 0.68rem; + padding: 2px 6px; + } + + .init-guide { + padding: 0.6rem 0 0.35rem; + } + + .init-guide-card { + padding: 1.2rem 0.9rem; + } + + .init-guide-card .btn { + width: 100%; + justify-content: center; + } +} diff --git a/frontend/src/views/FanqiePublishView.vue b/frontend/src/views/FanqiePublishView.vue index 61aa061..5b53cc0 100644 --- a/frontend/src/views/FanqiePublishView.vue +++ b/frontend/src/views/FanqiePublishView.vue @@ -660,4 +660,164 @@ function formatWordCount(c) { return c >= 10000 ? (c / 10000).toFixed(1) + '万' .spinner { width: 28px; height: 28px; border: 3px solid var(--border); border-top-color: var(--primary); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .loading-state { text-align: center; padding: 2.5rem 1rem; color: var(--text-muted); display: flex; flex-direction: column; align-items: center; gap: 0.75rem; } + +@media (max-width: 768px) { + .fanqie-layout { + min-height: 100vh; + padding-bottom: 2rem; + } + + .fanqie-container { + padding: 0 0.9rem; + } + + .page-header { + padding: 1rem 0 0.9rem; + } + + .page-header-top { + flex-direction: column; + align-items: flex-start; + gap: 0.75rem; + } + + .page-title { + font-size: 1.35rem; + line-height: 1.2; + } + + .page-subtitle { + font-size: 0.84rem; + } + + .card { + padding: 0.95rem; + border-radius: 12px; + margin-bottom: 0.9rem; + } + + .card-header { + flex-direction: column; + align-items: flex-start; + gap: 0.65rem; + } + + .header-actions, + .publish-btns, + .account-actions { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.45rem; + } + + .header-actions .btn, + .publish-btns .btn, + .account-actions .btn, + .account-actions a.btn { + width: 100%; + justify-content: center; + } + + .account-item { + flex-direction: column; + align-items: flex-start; + gap: 0.65rem; + padding: 0.75rem; + } + + .account-info { + flex-wrap: wrap; + gap: 0.45rem; + } + + .add-account-form, + .config-input-group { + flex-direction: column; + align-items: stretch; + } + + .config-input-group .btn, + .add-account-form .btn { + width: 100%; + justify-content: center; + } + + .book-chips { + gap: 0.4rem; + } + + .book-chip { + font-size: 0.78rem; + padding: 0.35rem 0.72rem; + } + + .chapter-table-wrap { + border: none; + max-height: none; + overflow: visible; + } + + .chapter-table, + .chapter-table thead, + .chapter-table tbody, + .chapter-table th, + .chapter-table td, + .chapter-table tr { + display: block; + width: 100%; + } + + .chapter-table thead { + display: none; + } + + .chapter-table tbody { + display: flex; + flex-direction: column; + gap: 0.65rem; + } + + .chapter-table tr { + border: 1px solid var(--border); + border-radius: 12px; + background: var(--bg-card); + padding: 0.75rem 0.8rem; + } + + .chapter-table td { + border: none; + padding: 0.18rem 0; + } + + .chapter-table td::before { + display: inline-block; + min-width: 3.6rem; + color: var(--text-muted); + font-size: 0.78rem; + font-weight: 600; + } + + .chapter-table .col-check::before { content: '选择'; } + .chapter-table .col-id::before { content: '章节'; } + .chapter-table .col-title::before { content: '标题'; } + .chapter-table .col-words::before { content: '字数'; } + .chapter-table .col-status::before { content: '状态'; } + + .publish-controls { + flex-direction: column; + align-items: stretch; + gap: 0.75rem; + } + + .publish-progress { + padding: 0.9rem; + } + + .qr-screenshot { + max-width: min(72vw, 260px); + max-height: min(72vw, 260px); + } +} + diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index db62ff5..94f818f 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -395,10 +395,11 @@ function getGenreIcon(genre) { diff --git a/frontend/src/views/OutlineView.vue b/frontend/src/views/OutlineView.vue index 8f203a9..0bc0da0 100644 --- a/frontend/src/views/OutlineView.vue +++ b/frontend/src/views/OutlineView.vue @@ -1,7 +1,7 @@