pdf-search-highlight 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,184 @@
1
+ import { C as ClassNames, P as PageData, S as SearchOptions, a as PDFSearchViewerOptions, b as SpanData, c as SearchMatch } from '../PDFSearchViewer-8kMeXl51.cjs';
2
+ export { E as EventEmitter, d as PDFSearchViewer, e as PDFSearchViewerEventMap, f as PDFSource } from '../PDFSearchViewer-8kMeXl51.cjs';
3
+
4
+ interface SearchControllerOptions {
5
+ classNames?: Pick<ClassNames, 'highlight' | 'activeHighlight'>;
6
+ }
7
+ /**
8
+ * Headless search + highlight controller.
9
+ * Does NOT render PDF — works with any PageData[] you provide.
10
+ *
11
+ * Use this when you want full control over:
12
+ * - Where the PDF is rendered
13
+ * - Where the search UI lives
14
+ * - How search results are displayed
15
+ *
16
+ * Usage:
17
+ * ```js
18
+ * import { PDFRenderer, SearchController } from 'pdf-search-highlight';
19
+ *
20
+ * // Render PDF wherever you want
21
+ * const renderer = new PDFRenderer(pdfContainer, pdfjsLib, {});
22
+ * const pages = await renderer.renderAllPages();
23
+ *
24
+ * // Search controller — no UI, just logic
25
+ * const search = new SearchController();
26
+ * search.setPages(pages);
27
+ *
28
+ * // Wire up your own UI
29
+ * input.oninput = () => search.search(input.value);
30
+ * nextBtn.onclick = () => search.next();
31
+ * prevBtn.onclick = () => search.prev();
32
+ *
33
+ * // React to changes
34
+ * search.onChange = ({ current, total }) => {
35
+ * label.textContent = total > 0 ? `${current + 1}/${total}` : '';
36
+ * };
37
+ * ```
38
+ */
39
+ declare class SearchController {
40
+ private highlightManager;
41
+ private pages;
42
+ private lastQuery;
43
+ /** Callback fired when match state changes (search, next, prev, clear). */
44
+ onChange: ((state: {
45
+ current: number;
46
+ total: number;
47
+ query: string;
48
+ }) => void) | null;
49
+ constructor(options?: SearchControllerOptions);
50
+ /**
51
+ * Set the pages to search on.
52
+ * Call this after rendering PDF pages.
53
+ */
54
+ setPages(pages: PageData[]): void;
55
+ /**
56
+ * Search for text across all pages.
57
+ * Returns total number of matches.
58
+ */
59
+ search(query: string, options?: SearchOptions): number;
60
+ /** Navigate to next match. Returns new index. */
61
+ next(): number;
62
+ /** Navigate to previous match. Returns new index. */
63
+ prev(): number;
64
+ /** Go to a specific match by index. */
65
+ goTo(index: number): void;
66
+ /** Clear all highlights. */
67
+ clear(): void;
68
+ /** Current match index (0-based). -1 if none. */
69
+ get current(): number;
70
+ /** Total number of matches. */
71
+ get total(): number;
72
+ /** Last searched query. */
73
+ get query(): string;
74
+ private notify;
75
+ }
76
+
77
+ /**
78
+ * Renders PDF pages into a container using canvas + text layer.
79
+ *
80
+ * Text layer approach (matching demo):
81
+ * - Extract text content from each page
82
+ * - Create absolutely-positioned <span> elements overlaying the canvas
83
+ * - Position spans using the transform matrix from pdf.js
84
+ * - Spans are transparent (for text selection) but allow DOM-based search/highlight
85
+ */
86
+ declare class PDFRenderer {
87
+ private container;
88
+ private scale;
89
+ private pageGap;
90
+ private cls;
91
+ private workerSrc?;
92
+ private pdfDoc;
93
+ private pageData;
94
+ private pdfjsLib;
95
+ constructor(container: HTMLElement, options: PDFSearchViewerOptions);
96
+ /**
97
+ * Set the pdfjs-dist library reference.
98
+ * Must be called before loadDocument.
99
+ */
100
+ setPdfjsLib(lib: any): void;
101
+ /**
102
+ * Load a PDF from File, ArrayBuffer, URL string, or Uint8Array.
103
+ */
104
+ loadDocument(source: File | ArrayBuffer | Uint8Array | string): Promise<number>;
105
+ /**
106
+ * Render all pages into the container.
107
+ * Returns PageData[] for search/highlight.
108
+ */
109
+ renderAllPages(): Promise<PageData[]>;
110
+ private renderPage;
111
+ private calculateScale;
112
+ getClassNames(): Required<ClassNames>;
113
+ getPageData(): PageData[];
114
+ getPageCount(): number;
115
+ cleanup(): void;
116
+ }
117
+
118
+ interface MatchRange {
119
+ spanIdx: number;
120
+ start: number;
121
+ end: number;
122
+ }
123
+ /**
124
+ * Search for text across page spans using charMap-based matching.
125
+ *
126
+ * Algorithm:
127
+ * 1. Concatenate all span texts into one string (fullText)
128
+ * 2. Build charMap: charMap[i] = { spanIdx, charIdx } for each char in fullText
129
+ * 3. Run regex on fullText
130
+ * 4. Map each match back to span ranges via charMap
131
+ */
132
+ declare function searchPage(spans: SpanData[], query: string, options?: SearchOptions): MatchRange[][];
133
+
134
+ /**
135
+ * Manages cross-span highlighting using the charMap approach.
136
+ *
137
+ * Algorithm (from demo):
138
+ * 1. Group match ranges by spanIdx
139
+ * 2. For each affected span, replace textContent with a DocumentFragment:
140
+ * - Plain text nodes for non-matching parts
141
+ * - <mark> elements for matching parts
142
+ * 3. Collect marks per match for navigation
143
+ */
144
+ declare class HighlightManager {
145
+ private matches;
146
+ private currentMatch;
147
+ private highlightClass;
148
+ private activeHighlightClass;
149
+ constructor(highlightClass: string, activeHighlightClass: string);
150
+ /**
151
+ * Apply highlights for all matches on a page.
152
+ * Returns the SearchMatch[] (array of mark groups).
153
+ */
154
+ applyHighlights(pageSpans: SpanData[], matchRanges: MatchRange[][]): SearchMatch[];
155
+ /**
156
+ * Add matches to the global list.
157
+ */
158
+ addMatches(newMatches: SearchMatch[]): void;
159
+ /**
160
+ * Clear all highlights and restore original span text.
161
+ */
162
+ clearHighlights(allPageData: PageData[]): void;
163
+ /**
164
+ * Set active match by index. Applies active CSS class and scrolls into view.
165
+ */
166
+ setActiveMatch(index: number): void;
167
+ /**
168
+ * Navigate to next match (wraps around).
169
+ */
170
+ next(): number;
171
+ /**
172
+ * Navigate to previous match (wraps around).
173
+ */
174
+ prev(): number;
175
+ getCurrentIndex(): number;
176
+ getTotal(): number;
177
+ getMatches(): SearchMatch[];
178
+ }
179
+
180
+ declare const DEFAULT_CLASS_NAMES: Required<ClassNames>;
181
+ declare const DEFAULT_SCALE: number | "auto";
182
+ declare const DEFAULT_PAGE_GAP = 20;
183
+
184
+ export { ClassNames, DEFAULT_CLASS_NAMES, DEFAULT_PAGE_GAP, DEFAULT_SCALE, HighlightManager, type MatchRange, PDFRenderer, PDFSearchViewerOptions, PageData, SearchController, type SearchControllerOptions, SearchMatch, SearchOptions, SpanData, searchPage };
@@ -0,0 +1,184 @@
1
+ import { C as ClassNames, P as PageData, S as SearchOptions, a as PDFSearchViewerOptions, b as SpanData, c as SearchMatch } from '../PDFSearchViewer-8kMeXl51.js';
2
+ export { E as EventEmitter, d as PDFSearchViewer, e as PDFSearchViewerEventMap, f as PDFSource } from '../PDFSearchViewer-8kMeXl51.js';
3
+
4
+ interface SearchControllerOptions {
5
+ classNames?: Pick<ClassNames, 'highlight' | 'activeHighlight'>;
6
+ }
7
+ /**
8
+ * Headless search + highlight controller.
9
+ * Does NOT render PDF — works with any PageData[] you provide.
10
+ *
11
+ * Use this when you want full control over:
12
+ * - Where the PDF is rendered
13
+ * - Where the search UI lives
14
+ * - How search results are displayed
15
+ *
16
+ * Usage:
17
+ * ```js
18
+ * import { PDFRenderer, SearchController } from 'pdf-search-highlight';
19
+ *
20
+ * // Render PDF wherever you want
21
+ * const renderer = new PDFRenderer(pdfContainer, pdfjsLib, {});
22
+ * const pages = await renderer.renderAllPages();
23
+ *
24
+ * // Search controller — no UI, just logic
25
+ * const search = new SearchController();
26
+ * search.setPages(pages);
27
+ *
28
+ * // Wire up your own UI
29
+ * input.oninput = () => search.search(input.value);
30
+ * nextBtn.onclick = () => search.next();
31
+ * prevBtn.onclick = () => search.prev();
32
+ *
33
+ * // React to changes
34
+ * search.onChange = ({ current, total }) => {
35
+ * label.textContent = total > 0 ? `${current + 1}/${total}` : '';
36
+ * };
37
+ * ```
38
+ */
39
+ declare class SearchController {
40
+ private highlightManager;
41
+ private pages;
42
+ private lastQuery;
43
+ /** Callback fired when match state changes (search, next, prev, clear). */
44
+ onChange: ((state: {
45
+ current: number;
46
+ total: number;
47
+ query: string;
48
+ }) => void) | null;
49
+ constructor(options?: SearchControllerOptions);
50
+ /**
51
+ * Set the pages to search on.
52
+ * Call this after rendering PDF pages.
53
+ */
54
+ setPages(pages: PageData[]): void;
55
+ /**
56
+ * Search for text across all pages.
57
+ * Returns total number of matches.
58
+ */
59
+ search(query: string, options?: SearchOptions): number;
60
+ /** Navigate to next match. Returns new index. */
61
+ next(): number;
62
+ /** Navigate to previous match. Returns new index. */
63
+ prev(): number;
64
+ /** Go to a specific match by index. */
65
+ goTo(index: number): void;
66
+ /** Clear all highlights. */
67
+ clear(): void;
68
+ /** Current match index (0-based). -1 if none. */
69
+ get current(): number;
70
+ /** Total number of matches. */
71
+ get total(): number;
72
+ /** Last searched query. */
73
+ get query(): string;
74
+ private notify;
75
+ }
76
+
77
+ /**
78
+ * Renders PDF pages into a container using canvas + text layer.
79
+ *
80
+ * Text layer approach (matching demo):
81
+ * - Extract text content from each page
82
+ * - Create absolutely-positioned <span> elements overlaying the canvas
83
+ * - Position spans using the transform matrix from pdf.js
84
+ * - Spans are transparent (for text selection) but allow DOM-based search/highlight
85
+ */
86
+ declare class PDFRenderer {
87
+ private container;
88
+ private scale;
89
+ private pageGap;
90
+ private cls;
91
+ private workerSrc?;
92
+ private pdfDoc;
93
+ private pageData;
94
+ private pdfjsLib;
95
+ constructor(container: HTMLElement, options: PDFSearchViewerOptions);
96
+ /**
97
+ * Set the pdfjs-dist library reference.
98
+ * Must be called before loadDocument.
99
+ */
100
+ setPdfjsLib(lib: any): void;
101
+ /**
102
+ * Load a PDF from File, ArrayBuffer, URL string, or Uint8Array.
103
+ */
104
+ loadDocument(source: File | ArrayBuffer | Uint8Array | string): Promise<number>;
105
+ /**
106
+ * Render all pages into the container.
107
+ * Returns PageData[] for search/highlight.
108
+ */
109
+ renderAllPages(): Promise<PageData[]>;
110
+ private renderPage;
111
+ private calculateScale;
112
+ getClassNames(): Required<ClassNames>;
113
+ getPageData(): PageData[];
114
+ getPageCount(): number;
115
+ cleanup(): void;
116
+ }
117
+
118
+ interface MatchRange {
119
+ spanIdx: number;
120
+ start: number;
121
+ end: number;
122
+ }
123
+ /**
124
+ * Search for text across page spans using charMap-based matching.
125
+ *
126
+ * Algorithm:
127
+ * 1. Concatenate all span texts into one string (fullText)
128
+ * 2. Build charMap: charMap[i] = { spanIdx, charIdx } for each char in fullText
129
+ * 3. Run regex on fullText
130
+ * 4. Map each match back to span ranges via charMap
131
+ */
132
+ declare function searchPage(spans: SpanData[], query: string, options?: SearchOptions): MatchRange[][];
133
+
134
+ /**
135
+ * Manages cross-span highlighting using the charMap approach.
136
+ *
137
+ * Algorithm (from demo):
138
+ * 1. Group match ranges by spanIdx
139
+ * 2. For each affected span, replace textContent with a DocumentFragment:
140
+ * - Plain text nodes for non-matching parts
141
+ * - <mark> elements for matching parts
142
+ * 3. Collect marks per match for navigation
143
+ */
144
+ declare class HighlightManager {
145
+ private matches;
146
+ private currentMatch;
147
+ private highlightClass;
148
+ private activeHighlightClass;
149
+ constructor(highlightClass: string, activeHighlightClass: string);
150
+ /**
151
+ * Apply highlights for all matches on a page.
152
+ * Returns the SearchMatch[] (array of mark groups).
153
+ */
154
+ applyHighlights(pageSpans: SpanData[], matchRanges: MatchRange[][]): SearchMatch[];
155
+ /**
156
+ * Add matches to the global list.
157
+ */
158
+ addMatches(newMatches: SearchMatch[]): void;
159
+ /**
160
+ * Clear all highlights and restore original span text.
161
+ */
162
+ clearHighlights(allPageData: PageData[]): void;
163
+ /**
164
+ * Set active match by index. Applies active CSS class and scrolls into view.
165
+ */
166
+ setActiveMatch(index: number): void;
167
+ /**
168
+ * Navigate to next match (wraps around).
169
+ */
170
+ next(): number;
171
+ /**
172
+ * Navigate to previous match (wraps around).
173
+ */
174
+ prev(): number;
175
+ getCurrentIndex(): number;
176
+ getTotal(): number;
177
+ getMatches(): SearchMatch[];
178
+ }
179
+
180
+ declare const DEFAULT_CLASS_NAMES: Required<ClassNames>;
181
+ declare const DEFAULT_SCALE: number | "auto";
182
+ declare const DEFAULT_PAGE_GAP = 20;
183
+
184
+ export { ClassNames, DEFAULT_CLASS_NAMES, DEFAULT_PAGE_GAP, DEFAULT_SCALE, HighlightManager, type MatchRange, PDFRenderer, PDFSearchViewerOptions, PageData, SearchController, type SearchControllerOptions, SearchMatch, SearchOptions, SpanData, searchPage };
@@ -0,0 +1,23 @@
1
+ import {
2
+ DEFAULT_CLASS_NAMES,
3
+ DEFAULT_PAGE_GAP,
4
+ DEFAULT_SCALE,
5
+ EventEmitter,
6
+ HighlightManager,
7
+ PDFRenderer,
8
+ PDFSearchViewer,
9
+ SearchController,
10
+ searchPage
11
+ } from "../chunk-M56VMBOL.js";
12
+ export {
13
+ DEFAULT_CLASS_NAMES,
14
+ DEFAULT_PAGE_GAP,
15
+ DEFAULT_SCALE,
16
+ EventEmitter,
17
+ HighlightManager,
18
+ PDFRenderer,
19
+ PDFSearchViewer,
20
+ SearchController,
21
+ searchPage
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,58 @@
1
+ /* pdf-search-highlight base styles */
2
+
3
+ /* Page wrapper */
4
+ .psh-page {
5
+ position: relative;
6
+ background: #fff;
7
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
8
+ border-radius: 4px;
9
+ overflow: hidden;
10
+ }
11
+
12
+ .psh-page canvas {
13
+ display: block;
14
+ width: 100%;
15
+ height: auto;
16
+ }
17
+
18
+ /* Text layer: transparent spans overlaying canvas */
19
+ .psh-text-layer {
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ right: 0;
24
+ bottom: 0;
25
+ overflow: hidden;
26
+ line-height: 1;
27
+ }
28
+
29
+ .psh-text-layer span {
30
+ position: absolute;
31
+ color: transparent;
32
+ white-space: pre;
33
+ cursor: text;
34
+ transform-origin: 0% 0%;
35
+ }
36
+
37
+ .psh-text-layer span::selection {
38
+ background: rgba(0, 100, 200, 0.3);
39
+ }
40
+
41
+ /* Search highlights */
42
+ .highlight {
43
+ background: rgba(255, 230, 0, 0.45) !important;
44
+ border-radius: 2px;
45
+ }
46
+
47
+ .highlight.active {
48
+ background: rgba(233, 69, 96, 0.55) !important;
49
+ }
50
+
51
+ /* Page label */
52
+ .psh-page-label {
53
+ text-align: center;
54
+ font-size: 12px;
55
+ color: #666;
56
+ margin-top: 4px;
57
+ padding-bottom: 8px;
58
+ }
@@ -0,0 +1,166 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+ var _chunkOMRGA5I4cjs = require('../chunk-OMRGA5I4.cjs');
6
+
7
+ // src/react/usePDFRenderer.ts
8
+ var _react = require('react');
9
+ function usePDFRenderer(pdfjsLib, options = {}) {
10
+ const containerRef = _react.useRef.call(void 0, null);
11
+ const rendererRef = _react.useRef.call(void 0, null);
12
+ const [pages, setPages] = _react.useState.call(void 0, []);
13
+ const [pageCount, setPageCount] = _react.useState.call(void 0, 0);
14
+ const [loading, setLoading] = _react.useState.call(void 0, false);
15
+ _react.useEffect.call(void 0, () => {
16
+ return () => {
17
+ _optionalChain([rendererRef, 'access', _ => _.current, 'optionalAccess', _2 => _2.cleanup, 'call', _3 => _3()]);
18
+ rendererRef.current = null;
19
+ };
20
+ }, []);
21
+ const getRenderer = _react.useCallback.call(void 0, () => {
22
+ if (!containerRef.current) throw new Error("Container ref not attached");
23
+ if (!rendererRef.current) {
24
+ const r = new (0, _chunkOMRGA5I4cjs.PDFRenderer)(containerRef.current, options);
25
+ r.setPdfjsLib(pdfjsLib);
26
+ rendererRef.current = r;
27
+ }
28
+ return rendererRef.current;
29
+ }, [pdfjsLib, options]);
30
+ const loadPDF = _react.useCallback.call(void 0,
31
+ async (source) => {
32
+ const renderer = getRenderer();
33
+ setLoading(true);
34
+ try {
35
+ const count = await renderer.loadDocument(source);
36
+ const p = await renderer.renderAllPages();
37
+ setPages(p);
38
+ setPageCount(count);
39
+ return p;
40
+ } finally {
41
+ setLoading(false);
42
+ }
43
+ },
44
+ [getRenderer]
45
+ );
46
+ const cleanup = _react.useCallback.call(void 0, () => {
47
+ _optionalChain([rendererRef, 'access', _4 => _4.current, 'optionalAccess', _5 => _5.cleanup, 'call', _6 => _6()]);
48
+ rendererRef.current = null;
49
+ setPages([]);
50
+ setPageCount(0);
51
+ }, []);
52
+ return { containerRef, pages, pageCount, loading, loadPDF, cleanup };
53
+ }
54
+
55
+ // src/react/useSearchController.ts
56
+
57
+ function useSearchController(pages, options = {}) {
58
+ const controllerRef = _react.useRef.call(void 0, null);
59
+ const [current, setCurrent] = _react.useState.call(void 0, -1);
60
+ const [total, setTotal] = _react.useState.call(void 0, 0);
61
+ if (!controllerRef.current) {
62
+ controllerRef.current = new (0, _chunkOMRGA5I4cjs.SearchController)(options);
63
+ }
64
+ _react.useEffect.call(void 0, () => {
65
+ const ctrl = controllerRef.current;
66
+ ctrl.onChange = ({ current: c, total: t }) => {
67
+ setCurrent(c);
68
+ setTotal(t);
69
+ };
70
+ return () => {
71
+ ctrl.onChange = null;
72
+ };
73
+ }, []);
74
+ _react.useEffect.call(void 0, () => {
75
+ controllerRef.current.setPages(pages);
76
+ }, [pages]);
77
+ const search = _react.useCallback.call(void 0, (query, opts) => {
78
+ return controllerRef.current.search(query, opts);
79
+ }, []);
80
+ const next = _react.useCallback.call(void 0, () => {
81
+ controllerRef.current.next();
82
+ }, []);
83
+ const prev = _react.useCallback.call(void 0, () => {
84
+ controllerRef.current.prev();
85
+ }, []);
86
+ const goTo = _react.useCallback.call(void 0, (index) => {
87
+ controllerRef.current.goTo(index);
88
+ }, []);
89
+ const clear = _react.useCallback.call(void 0, () => {
90
+ controllerRef.current.clear();
91
+ }, []);
92
+ return { search, next, prev, goTo, clear, current, total };
93
+ }
94
+
95
+ // src/react/PDFSearchViewer.tsx
96
+
97
+
98
+
99
+
100
+
101
+
102
+ var _jsxruntime = require('react/jsx-runtime');
103
+ var PDFSearchViewer2 = _react.forwardRef.call(void 0, function PDFSearchViewer3(props, ref) {
104
+ const {
105
+ pdfjsLib,
106
+ source,
107
+ searchQuery,
108
+ searchOptions,
109
+ viewerOptions,
110
+ onLoad,
111
+ onSearch,
112
+ onMatchChange,
113
+ onError,
114
+ className,
115
+ style
116
+ } = props;
117
+ const containerRef = _react.useRef.call(void 0, null);
118
+ const coreRef = _react.useRef.call(void 0, null);
119
+ const callbackRefs = _react.useRef.call(void 0, { onLoad, onSearch, onMatchChange, onError });
120
+ callbackRefs.current = { onLoad, onSearch, onMatchChange, onError };
121
+ _react.useEffect.call(void 0, () => {
122
+ if (!containerRef.current || !pdfjsLib) return;
123
+ const core = new (0, _chunkOMRGA5I4cjs.PDFSearchViewer)(
124
+ containerRef.current,
125
+ pdfjsLib,
126
+ _nullishCoalesce(viewerOptions, () => ( {}))
127
+ );
128
+ core.on("load", (data) => _optionalChain([callbackRefs, 'access', _7 => _7.current, 'access', _8 => _8.onLoad, 'optionalCall', _9 => _9(data)]));
129
+ core.on("search", (data) => _optionalChain([callbackRefs, 'access', _10 => _10.current, 'access', _11 => _11.onSearch, 'optionalCall', _12 => _12(data)]));
130
+ core.on("matchchange", (data) => _optionalChain([callbackRefs, 'access', _13 => _13.current, 'access', _14 => _14.onMatchChange, 'optionalCall', _15 => _15(data)]));
131
+ core.on("error", (data) => _optionalChain([callbackRefs, 'access', _16 => _16.current, 'access', _17 => _17.onError, 'optionalCall', _18 => _18(data)]));
132
+ coreRef.current = core;
133
+ return () => {
134
+ core.destroy();
135
+ coreRef.current = null;
136
+ };
137
+ }, [pdfjsLib]);
138
+ _react.useEffect.call(void 0, () => {
139
+ if (!coreRef.current || !source) return;
140
+ coreRef.current.loadPDF(source).catch(() => {
141
+ });
142
+ }, [source]);
143
+ _react.useEffect.call(void 0, () => {
144
+ if (!coreRef.current) return;
145
+ if (searchQuery && searchQuery.trim().length > 0) {
146
+ coreRef.current.search(searchQuery, searchOptions);
147
+ } else {
148
+ coreRef.current.clearSearch();
149
+ }
150
+ }, [searchQuery, searchOptions]);
151
+ _react.useImperativeHandle.call(void 0, ref, () => ({
152
+ nextMatch: () => _nullishCoalesce(_optionalChain([coreRef, 'access', _19 => _19.current, 'optionalAccess', _20 => _20.nextMatch, 'call', _21 => _21()]), () => ( -1)),
153
+ prevMatch: () => _nullishCoalesce(_optionalChain([coreRef, 'access', _22 => _22.current, 'optionalAccess', _23 => _23.prevMatch, 'call', _24 => _24()]), () => ( -1)),
154
+ clearSearch: () => _optionalChain([coreRef, 'access', _25 => _25.current, 'optionalAccess', _26 => _26.clearSearch, 'call', _27 => _27()]),
155
+ getMatchCount: () => _nullishCoalesce(_optionalChain([coreRef, 'access', _28 => _28.current, 'optionalAccess', _29 => _29.getMatchCount, 'call', _30 => _30()]), () => ( 0)),
156
+ getCurrentMatchIndex: () => _nullishCoalesce(_optionalChain([coreRef, 'access', _31 => _31.current, 'optionalAccess', _32 => _32.getCurrentMatchIndex, 'call', _33 => _33()]), () => ( -1)),
157
+ getCore: () => coreRef.current
158
+ }));
159
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: containerRef, className, style });
160
+ });
161
+
162
+
163
+
164
+
165
+ exports.PDFSearchViewer = PDFSearchViewer2; exports.usePDFRenderer = usePDFRenderer; exports.useSearchController = useSearchController;
166
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/hoangnguyen/Desktop/untitled%20folder/pdf-search-highlight/dist/react/index.cjs"],"names":[],"mappings":"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","file":"/Users/hoangnguyen/Desktop/untitled folder/pdf-search-highlight/dist/react/index.cjs","sourcesContent":[null]}