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 @@