diff --git a/frontend/App.vue b/frontend/App.vue
index f1f59b3..1539417 100644
--- a/frontend/App.vue
+++ b/frontend/App.vue
@@ -54,7 +54,7 @@
-
卷册进度
-
-
-
- {{ tick.label }}
-
-
-
- 当前:{{ currentVolLabel }} | 已加载 {{ loadedCount }} / {{ TOTAL_VOLS }} {{ currentNovel.volsLabel }}
-
-
+
地图搜索与事件
+
+
+ 卷册进度时间轴
+ {{ currentVolLabel }} · {{ loadedCount }} / {{ TOTAL_VOLS }} {{ currentNovel.volsLabel }}
+
+
+
+
+ {{ tick.label }}
+
+
+
+
×
{{ selectedFaction.name }}
@@ -773,6 +776,11 @@ function clearRouteFocus() {
drawRoutesOnly()
}
+function toggleRouteOrderMarkers() {
+ showRouteOrder.value = !showRouteOrder.value
+ drawRoutesOnly()
+}
+
function clearAllRoutes() {
selectedRoutes.value = []
focusedRouteName.value = ''
@@ -1176,7 +1184,7 @@ function scrollToChatBottom() {
.chapter-panel {
right: 12px;
- bottom: 14px;
+ bottom: 128px;
width: 360px;
max-height: calc(100vh - 140px);
overflow-y: auto;
@@ -1189,6 +1197,40 @@ function scrollToChatBottom() {
color: #e6c27a;
}
+.timeline-dock {
+ left: 50%;
+ bottom: 10px;
+ transform: translateX(-50%);
+ width: min(980px, calc(100vw - 32px));
+ border-radius: 14px;
+ padding: 10px 14px 8px;
+ position: absolute;
+ z-index: 1000;
+ background: linear-gradient(160deg, rgba(10, 15, 26, 0.94), rgba(28, 22, 19, 0.9));
+ border: 1px solid rgba(201, 169, 110, 0.58);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
+ backdrop-filter: blur(4px);
+}
+
+.timeline-head {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+ gap: 10px;
+ font-size: 12px;
+ color: #e7c986;
+ margin-bottom: 4px;
+}
+
+.timeline-meta {
+ color: #c8bfad;
+ font-size: 11px;
+}
+
+.timeline-wrap {
+ padding-bottom: 20px;
+}
+
.vol-slider-wrap {
position: relative;
padding-bottom: 22px;
@@ -1200,6 +1242,43 @@ function scrollToChatBottom() {
accent-color: #c9a96e;
}
+.timeline-dock .chapter-slider {
+ margin-top: 4px;
+}
+
+.timeline-dock .chapter-slider::-webkit-slider-runnable-track {
+ height: 6px;
+ background: linear-gradient(90deg, #6f5632, #d8bb7e);
+ border-radius: 999px;
+}
+
+.timeline-dock .chapter-slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+ margin-top: -5px;
+ border: 2px solid #f6e6c4;
+ background: #1f2432;
+ box-shadow: 0 0 0 2px rgba(201, 169, 110, 0.35);
+}
+
+.timeline-dock .chapter-slider::-moz-range-track {
+ height: 6px;
+ background: linear-gradient(90deg, #6f5632, #d8bb7e);
+ border-radius: 999px;
+}
+
+.timeline-dock .chapter-slider::-moz-range-thumb {
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+ border: 2px solid #f6e6c4;
+ background: #1f2432;
+ box-shadow: 0 0 0 2px rgba(201, 169, 110, 0.35);
+}
+
.vol-ticks {
position: relative;
height: 18px;
@@ -1541,11 +1620,23 @@ function scrollToChatBottom() {
.chapter-panel {
right: 8px;
- bottom: calc(36vh + 16px);
+ bottom: calc(36vh + 98px);
width: calc(100vw - 16px);
max-height: 30vh;
}
+ .timeline-dock {
+ width: calc(100vw - 16px);
+ bottom: 8px;
+ padding: 8px 10px 7px;
+ }
+
+ .timeline-head {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ }
+
.info-panel {
top: 130px;
right: 8px;