diff --git a/dashboard/src/components/PaperCard.tsx b/dashboard/src/components/PaperCard.tsx
index 8338896..e7cf6ad 100644
--- a/dashboard/src/components/PaperCard.tsx
+++ b/dashboard/src/components/PaperCard.tsx
@@ -88,7 +88,7 @@ export function PaperCard({
+
{headerActions}
)}
diff --git a/dashboard/src/components/agent/useAutoScroll.ts b/dashboard/src/components/agent/useAutoScroll.ts
index 8487457..c5bfd1e 100644
--- a/dashboard/src/components/agent/useAutoScroll.ts
+++ b/dashboard/src/components/agent/useAutoScroll.ts
@@ -17,7 +17,13 @@ export function useAutoScroll(deps: React.DependencyList): UseAutoScrollReturn {
const [shouldAutoScroll, setShouldAutoScroll] = useState(true);
const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {
- chatEndRef.current?.scrollIntoView({ behavior });
+ const el = scrollContainerRef.current;
+ if (el) {
+ el.scrollTo({
+ top: el.scrollHeight,
+ behavior,
+ });
+ }
}, []);
useEffect(() => {
diff --git a/dashboard/src/components/reader/BilingualViewer.tsx b/dashboard/src/components/reader/BilingualViewer.tsx
index c4d41c0..2b661d8 100644
--- a/dashboard/src/components/reader/BilingualViewer.tsx
+++ b/dashboard/src/components/reader/BilingualViewer.tsx
@@ -129,27 +129,47 @@ export function BilingualViewer({
hoverCardPos,
children,
}: BilingualViewerProps) {
- // 监测屏幕宽度以判断是否在移动端/平板设备上(宽度 < 1024px)
- const [isMobileViewport, setIsMobileViewport] = useState(() => {
+ // 监测屏幕宽度以判断是否在平板设备上(宽度 < 1024px)
+ const [isTabletViewport, setIsTabletViewport] = useState(() => {
if (typeof window !== 'undefined') {
return window.innerWidth < 1024;
}
return false;
});
+ // 检测是否在手机端(宽度 < 768px)
+ const [isMobileViewport, setIsMobileViewport] = useState(() => {
+ if (typeof window !== 'undefined') {
+ return window.innerWidth < 768;
+ }
+ return false;
+ });
+
useEffect(() => {
const handleResize = () => {
- setIsMobileViewport(window.innerWidth < 1024);
+ setIsTabletViewport(window.innerWidth < 1024);
+ setIsMobileViewport(window.innerWidth < 768);
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
const gridTemplateColumns = isMobileViewport
- ? (viewMode === 'bilingual' ? '1fr 1fr' : '1fr')
- : (viewMode === 'bilingual'
- ? (showNotesPanel ? '1fr 1fr 380px' : '1fr 1fr')
- : (showNotesPanel ? '1fr 380px' : '1fr'));
+ ? '1fr' // 手机端一律垂直单列堆叠
+ : (isTabletViewport
+ ? (viewMode === 'bilingual' ? '1fr 1fr' : '1fr')
+ : (viewMode === 'bilingual'
+ ? (showNotesPanel ? '1fr 1fr 380px' : '1fr 1fr')
+ : (showNotesPanel ? '1fr 380px' : '1fr')));
+
+ const style = isMobileViewport
+ ? {
+ gridTemplateColumns: '1fr',
+ gridTemplateRows: viewMode === 'bilingual'
+ ? (showNotesPanel ? '1fr 1fr 1fr' : '1fr 1fr')
+ : (showNotesPanel ? '1fr 1fr' : '1fr')
+ }
+ : { gridTemplateColumns };
// 解析英文和中文段落的 Front Matter 头部元数据
const { metadata: engMeta, pureMarkdown: engPure } = parseMarkdownFrontMatter(englishText);
@@ -173,7 +193,7 @@ export function BilingualViewer({
return (
{/* 英文正文视窗 (或双语对照) */}
{(viewMode === 'english' || viewMode === 'bilingual') && (
diff --git a/dashboard/src/components/reader/ReaderToolbar.tsx b/dashboard/src/components/reader/ReaderToolbar.tsx
index cf29090..e389cd1 100644
--- a/dashboard/src/components/reader/ReaderToolbar.tsx
+++ b/dashboard/src/components/reader/ReaderToolbar.tsx
@@ -1,5 +1,6 @@
// dashboard/src/components/reader/ReaderToolbar.tsx
-import { FileText, Loader, Languages, RotateCw, BookOpen, Sparkles, ChevronDown, History } from 'lucide-react';
+import { useState } from 'react';
+import { FileText, Loader, Languages, RotateCw, BookOpen, Sparkles, ChevronDown, History, SlidersHorizontal } from 'lucide-react';
import type { StandardPaper } from '../../types';
interface ReaderToolbarProps {
@@ -56,6 +57,8 @@ export function ReaderToolbar({
setSyncScroll,
showPdf,
}: ReaderToolbarProps) {
+ const [showActionsMenu, setShowActionsMenu] = useState(false);
+
return (
@@ -68,23 +71,24 @@ export function ReaderToolbar({
文献编码: {selectedPaper.bibcode}
-
+
{/* 快速切换文献菜单 */}
{showSwitchMenu && (
<>
setShowSwitchMenu(false)} />
-
+
{/* 最近阅读部分 */}
{recentlySelected.length > 0 && (
@@ -149,11 +153,11 @@ export function ReaderToolbar({
{/* 原文/中文/对照视图切换按钮 */}
{(englishText || chineseText) && (
-
+