diff --git a/apps/readest-app/src/app/reader/components/HeaderBar.tsx b/apps/readest-app/src/app/reader/components/HeaderBar.tsx index fb5319ce..c05c2f3c 100644 --- a/apps/readest-app/src/app/reader/components/HeaderBar.tsx +++ b/apps/readest-app/src/app/reader/components/HeaderBar.tsx @@ -39,17 +39,21 @@ const HeaderBar: React.FC = ({ }) => { const _ = useTranslation(); const { appService } = useEnv(); - const headerRef = useRef(null); const { isTrafficLightVisible } = useTrafficLight(); const { trafficLightInFullscreen, setTrafficLightVisibility } = useTrafficLightStore(); - const [isDropdownOpen, setIsDropdownOpen] = useState(false); - const { bookKeys, hoveredBookKey, setHoveredBookKey } = useReaderStore(); + const { bookKeys, hoveredBookKey, getView, setHoveredBookKey } = useReaderStore(); const { systemUIVisible, statusBarHeight } = useThemeStore(); const { isSideBarVisible } = useSidebarStore(); - const iconSize16 = useResponsiveSize(16); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + const view = getView(bookKey); + const iconSize16 = useResponsiveSize(16); + const headerRef = useRef(null); const windowButtonVisible = appService?.hasWindowBar && !isTrafficLightVisible; + const docs = view?.renderer.getContents() ?? []; + const pointerInDoc = docs.some(({ doc }) => doc.body.style.cursor === 'pointer'); + const handleToggleDropdown = (isOpen: boolean) => { setIsDropdownOpen(isOpen); if (!isOpen) setHoveredBookKey(''); @@ -90,7 +94,7 @@ const HeaderBar: React.FC = ({ >
setHoveredBookKey(bookKey)} onMouseEnter={() => !appService?.isMobile && setHoveredBookKey(bookKey)} onTouchStart={() => !appService?.isMobile && setHoveredBookKey(bookKey)} diff --git a/apps/readest-app/src/app/reader/components/annotator/AnnotationNotes.tsx b/apps/readest-app/src/app/reader/components/annotator/AnnotationNotes.tsx index 9142b18f..aeed6a96 100644 --- a/apps/readest-app/src/app/reader/components/annotator/AnnotationNotes.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/AnnotationNotes.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import React from 'react'; +import React, { useMemo } from 'react'; import { BookNote } from '@/types/book'; import { useEnv } from '@/context/EnvContext'; import { useBookDataStore } from '@/store/bookDataStore'; @@ -31,7 +31,11 @@ const AnnotationNotes: React.FC = ({ const { setHoveredBookKey } = useReaderStore(); const { setSideBarVisible } = useSidebarStore(); const config = getConfig(bookKey); - const maxSize = useResponsiveSize(300); + const maxSize = useResponsiveSize(150); + + const sortedNotes = useMemo(() => { + return [...notes].sort((a, b) => b.updatedAt - a.updatedAt); + }, [notes]); const handleShowAnnotation = (note: BookNote) => { if (!note.id) return; @@ -51,10 +55,7 @@ const AnnotationNotes: React.FC = ({ return (
= ({ left: `${triangleDir === 'right' ? `${popupWidth + 16}px` : undefined}`, height: `${popupHeight}px`, maxWidth: `${maxSize}px`, + overflowX: 'auto', } : { top: triangleDir === 'up' ? undefined : `${popupHeight + 16}px`, bottom: triangleDir === 'up' ? `${popupHeight + 16}px` : undefined, width: `${popupWidth}px`, maxHeight: `${maxSize}px`, + overflowY: 'auto', }), scrollbarWidth: 'thin', }} > -
- {notes.map((note, index) => ( +
+ {sortedNotes.map((note, index) => (
handleShowAnnotation?.(note)} - className='cursor-pointer rounded-lg bg-gray-600 p-4 shadow-md transition-colors' + className={clsx('cursor-pointer rounded-lg bg-gray-600 shadow-lg transition-colors')} + style={ + isVertical + ? { + minWidth: 'max-content', + height: `${popupHeight}px`, + maxHeight: `${popupHeight}px`, + } + : {} + } > {note.note && (
= ({ bookKey }) => { const customColors = settings.globalReadSettings.customHighlightColors; const hexColor = color && customColors ? customColors[color] : color ? HIGHLIGHT_COLOR_HEX[color] : color; - if (style === 'highlight') { + if (annotation.note) { + const { defaultView } = doc; + const node = range.startContainer; + const el = node.nodeType === 1 ? node : node.parentElement; + const { writingMode } = defaultView.getComputedStyle(el); + draw(Overlayer.bubble, { writingMode }); + } else if (style === 'highlight') { draw(Overlayer.highlight, { color: hexColor }); } else if (['underline', 'squiggly'].includes(style as string)) { const { defaultView } = doc; diff --git a/apps/readest-app/src/app/reader/components/footerbar/FooterBar.tsx b/apps/readest-app/src/app/reader/components/footerbar/FooterBar.tsx index b0bd4581..31520d34 100644 --- a/apps/readest-app/src/app/reader/components/footerbar/FooterBar.tsx +++ b/apps/readest-app/src/app/reader/components/footerbar/FooterBar.tsx @@ -41,6 +41,9 @@ const FooterBar: React.FC = ({ const actionTab = hoveredBookKey === bookKey ? userSelectedTab : ''; const isVisible = hoveredBookKey === bookKey; + const docs = view?.renderer.getContents() ?? []; + const pointerInDoc = docs.some(({ doc }) => doc.body.style.cursor === 'pointer'); + const progressInfo = useMemo( () => (bookFormat === 'PDF' ? section : pageinfo), [bookFormat, section, pageinfo], @@ -224,7 +227,7 @@ const FooterBar: React.FC = ({ className={clsx( 'absolute bottom-0 left-0 z-10 flex h-[52px] w-full', needHorizontalScroll && 'sm:!bottom-3 sm:!h-7', - isMobile ? 'pointer-events-none' : '', + isMobile || pointerInDoc ? 'pointer-events-none' : '', )} onMouseEnter={() => !isMobile && setHoveredBookKey(bookKey)} onTouchStart={() => !isMobile && setHoveredBookKey(bookKey)} diff --git a/packages/foliate-js b/packages/foliate-js index 873b5459..bab0bccb 160000 --- a/packages/foliate-js +++ b/packages/foliate-js @@ -1 +1 @@ -Subproject commit 873b545933d911047a472d388fa8aab6c545235c +Subproject commit bab0bccbe999877c0c14770387ca033ae247ad42