diff --git a/src/components/pdf-viewer/page/pdf-page.js b/src/components/pdf-viewer/page/pdf-page.js index dd9b782..d776d37 100644 --- a/src/components/pdf-viewer/page/pdf-page.js +++ b/src/components/pdf-viewer/page/pdf-page.js @@ -125,7 +125,7 @@ export default class PDFPage extends PDFViewerComponent { const itemEnd = charPosition + normalizedText.length const overlappingMatches = pageMatches.filter(match => { - const matchEnd = match.charIndex + this.searchTerm.length + const matchEnd = match.charIndex + (match.length || this.searchTerm.length) return match.charIndex < itemEnd && matchEnd > itemStart }) @@ -151,7 +151,8 @@ export default class PDFPage extends PDFViewerComponent { matches.forEach(match => { const relativeStart = Math.max(0, match.charIndex - itemStart) - const relativeEnd = Math.min(text.length, match.charIndex + this.searchTerm.length - itemStart) + const matchLength = match.length || this.searchTerm.length + const relativeEnd = Math.min(text.length, match.charIndex + matchLength - itemStart) if (relativeStart > currentPos) { segments.push({ text: text.substring(currentPos, relativeStart), highlight: false }) diff --git a/src/components/pdf-viewer/pdf-viewer.js b/src/components/pdf-viewer/pdf-viewer.js index 4ecfdb7..f0df139 100644 --- a/src/components/pdf-viewer/pdf-viewer.js +++ b/src/components/pdf-viewer/pdf-viewer.js @@ -85,21 +85,59 @@ export default class PDFViewer extends LitElement { _handleKeyDown(event) { if (!this.open) return - if (event.key === 'Escape') { - if (this.searchOpen) { - this.searchOpen = false - event.preventDefault() - } else if (this.escapeClosesViewer) { - this.open = false - event.preventDefault() - } - } else if (event.key === '/' && !this.searchOpen) { - const target = event.target - if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA') { - this.searchOpen = true - event.preventDefault() + const target = event.composedPath()[0] + const isInputField = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' + + if (isInputField && event.key !== 'Escape') return + + const shortcuts = { + 'Escape': () => { + if (this.searchOpen) { + this.searchOpen = false + return true + } else if (this.escapeClosesViewer) { + this.open = false + return true + } + return false + }, + '/': () => { + if (!this.searchOpen) { + this.searchOpen = true + return true + } + return false + }, + 's': () => { + this.sidebarCollapsed = !this.sidebarCollapsed + return true + }, + 'p': () => { + this.printPDF() + return true + }, + 'ArrowUp': () => { + if (this.currentPage > 1) { + this.shouldScroll = true + this.currentPage-- + return true + } + return false + }, + 'ArrowDown': () => { + if (this.currentPage < this.totalPages) { + this.shouldScroll = true + this.currentPage++ + return true + } + return false } } + + const handler = shortcuts[event.key] + if (handler && handler()) { + event.preventDefault() + } } _createContextValue() { @@ -387,7 +425,8 @@ export default class PDFViewer extends LitElement { if (!term || !this.pdfDoc) return const matches = [] - const searchTermLower = term.toLowerCase() + const normalizedTerm = normalizeText(term) + const searchTermLower = normalizedTerm.toLowerCase() for (let pageNum = 1; pageNum <= this.totalPages; pageNum++) { try { @@ -413,7 +452,8 @@ export default class PDFViewer extends LitElement { matches.push({ pageNum, charIndex: index, - text: term + text: term, + length: normalizedTerm.length }) index = pageTextLower.indexOf(searchTermLower, index + 1) } diff --git a/src/components/pdf-viewer/toolbar/pdf-toolbar.js b/src/components/pdf-viewer/toolbar/pdf-toolbar.js index 16b268d..ecbc0e8 100644 --- a/src/components/pdf-viewer/toolbar/pdf-toolbar.js +++ b/src/components/pdf-viewer/toolbar/pdf-toolbar.js @@ -129,12 +129,14 @@ export default class PDFToolbar extends PDFViewerComponent {
${sidebarCollapsed ? html` - ` : html` - `} @@ -175,12 +177,12 @@ export default class PDFToolbar extends PDFViewerComponent {
- -