From fd3533dba14dacedca2a0b8dafe4d7080b26c836 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 11 Feb 2026 17:13:22 +0800 Subject: [PATCH] feat(annotator): add a loupe when adjusting text selection range, closes #3002 (#3261) --- .../annotator/AnnotationRangeEditor.tsx | 64 +++++++++++++++---- .../components/annotator/MagnifierLoupe.tsx | 33 ++++++++++ apps/readest-app/src/types/view.ts | 6 ++ packages/foliate-js | 2 +- 4 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 apps/readest-app/src/app/reader/components/annotator/MagnifierLoupe.tsx diff --git a/apps/readest-app/src/app/reader/components/annotator/AnnotationRangeEditor.tsx b/apps/readest-app/src/app/reader/components/annotator/AnnotationRangeEditor.tsx index 5f519eb9..958dfdd6 100644 --- a/apps/readest-app/src/app/reader/components/annotator/AnnotationRangeEditor.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/AnnotationRangeEditor.tsx @@ -3,23 +3,28 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { BookNote, HighlightColor } from '@/types/book'; import { Point, TextSelection } from '@/utils/sel'; +import { useEnv } from '@/context/EnvContext'; import { useThemeStore } from '@/store/themeStore'; +import { useReaderStore } from '@/store/readerStore'; import { useSettingsStore } from '@/store/settingsStore'; import { useResponsiveSize } from '@/hooks/useResponsiveSize'; import { useAnnotationEditor } from '../../hooks/useAnnotationEditor'; import { getHighlightColorHex } from '../../utils/annotatorUtil'; +import MagnifierLoupe from './MagnifierLoupe'; interface HandleProps { + hidden?: boolean; position: Point; isVertical: boolean; type: 'start' | 'end'; color: string; - onDragStart: () => void; + onDragStart: (pointerType: string) => void; onDrag: (point: Point) => void; onDragEnd: () => void; } const Handle: React.FC = ({ + hidden, position, isVertical, type, @@ -38,7 +43,7 @@ const Handle: React.FC = ({ e.preventDefault(); e.stopPropagation(); isDragging.current = true; - onDragStart(); + onDragStart(e.pointerType); (e.target as HTMLElement).setPointerCapture(e.pointerId); }, [onDragStart], @@ -68,7 +73,10 @@ const Handle: React.FC = ({ return (