react-3d-flipbook 1.1.1

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,1121 @@
1
+ import * as React$1 from 'react';
2
+ import React__default from 'react';
3
+
4
+ interface FlipbookPage {
5
+ /** Image source URL for the page */
6
+ src: string;
7
+ /** Thumbnail image URL */
8
+ thumb?: string;
9
+ /** Page title for table of contents */
10
+ title?: string;
11
+ /** HTML content to overlay on the page */
12
+ htmlContent?: string;
13
+ /** JSON data associated with the page */
14
+ json?: Record<string, unknown>;
15
+ /** Which side of a double page spread */
16
+ side?: "left" | "right";
17
+ /** Whether this is an empty/placeholder page */
18
+ empty?: boolean;
19
+ /** Page width in pixels (for landscape/portrait support) */
20
+ width?: number;
21
+ /** Page height in pixels (for landscape/portrait support) */
22
+ height?: number;
23
+ /** Page orientation - auto-detected from width/height if not specified */
24
+ orientation?: "portrait" | "landscape";
25
+ }
26
+ interface TocItem {
27
+ title: string;
28
+ page: number;
29
+ children?: TocItem[];
30
+ }
31
+ type ViewMode = "webgl";
32
+ type SkinType = "dark" | "light" | "gradient";
33
+ type LayoutType = "1" | "2" | "3" | "4";
34
+ type HAlign = "left" | "center" | "right";
35
+ type VAlign = "top" | "middle" | "bottom";
36
+ interface ButtonConfig {
37
+ enabled?: boolean;
38
+ title?: string;
39
+ iconFA?: string;
40
+ iconM?: string;
41
+ iconFA_alt?: string;
42
+ iconM_alt?: string;
43
+ hAlign?: HAlign;
44
+ vAlign?: VAlign;
45
+ hideOnMobile?: boolean;
46
+ }
47
+ interface DownloadButtonConfig extends ButtonConfig {
48
+ url?: string;
49
+ name?: string;
50
+ forceDownload?: boolean;
51
+ openInNewWindow?: boolean;
52
+ }
53
+ interface CurrentPageConfig {
54
+ enabled?: boolean;
55
+ title?: string;
56
+ vAlign?: VAlign;
57
+ hAlign?: HAlign;
58
+ marginH?: number;
59
+ marginV?: number;
60
+ color?: string;
61
+ background?: string;
62
+ }
63
+ interface CloseButtonConfig extends ButtonConfig {
64
+ size?: number;
65
+ }
66
+ interface ShareProviderConfig {
67
+ enabled?: boolean;
68
+ icon?: string;
69
+ }
70
+ interface ShareConfig {
71
+ whatsapp?: ShareProviderConfig;
72
+ twitter?: ShareProviderConfig;
73
+ facebook?: ShareProviderConfig;
74
+ pinterest?: ShareProviderConfig;
75
+ email?: ShareProviderConfig;
76
+ linkedin?: ShareProviderConfig;
77
+ digg?: ShareProviderConfig;
78
+ reddit?: ShareProviderConfig;
79
+ }
80
+ interface PdfConfig {
81
+ annotationLayer?: boolean;
82
+ }
83
+ interface FillPreloaderConfig {
84
+ enabled?: boolean;
85
+ imgEmpty?: string;
86
+ imgFull?: string;
87
+ }
88
+ interface LocalizationStrings {
89
+ print?: string;
90
+ printLeftPage?: string;
91
+ printRightPage?: string;
92
+ printCurrentPage?: string;
93
+ printAllPages?: string;
94
+ download?: string;
95
+ downloadLeftPage?: string;
96
+ downloadRightPage?: string;
97
+ downloadCurrentPage?: string;
98
+ downloadAllPages?: string;
99
+ bookmarks?: string;
100
+ bookmarkLeftPage?: string;
101
+ bookmarkRightPage?: string;
102
+ bookmarkCurrentPage?: string;
103
+ search?: string;
104
+ findInDocument?: string;
105
+ pagesFoundContaining?: string;
106
+ noMatches?: string;
107
+ matchesFound?: string;
108
+ thumbnails?: string;
109
+ tableOfContent?: string;
110
+ share?: string;
111
+ pressEscToClose?: string;
112
+ password?: string;
113
+ }
114
+ interface MobileConfig {
115
+ shadows?: boolean;
116
+ pageSegmentsW?: number;
117
+ }
118
+ interface AssetsConfig {
119
+ preloader?: string;
120
+ overlay?: string;
121
+ flipMp3?: string;
122
+ spinner?: string;
123
+ backgroundMp3?: string;
124
+ }
125
+ interface LightboxConfig {
126
+ enabled?: boolean;
127
+ opened?: boolean;
128
+ fullscreen?: boolean;
129
+ closeOnClick?: boolean;
130
+ resetOnOpen?: boolean;
131
+ background?: string;
132
+ backgroundColor?: string;
133
+ backgroundPattern?: string;
134
+ backgroundImage?: string;
135
+ startPage?: number;
136
+ marginV?: number;
137
+ marginH?: number;
138
+ css?: string;
139
+ preload?: boolean;
140
+ showMenu?: boolean;
141
+ closeOnBack?: boolean;
142
+ }
143
+ interface FlipbookOptions {
144
+ name?: string;
145
+ pages?: FlipbookPage[];
146
+ tableOfContent?: TocItem[];
147
+ tableOfContentCloseOnClick?: boolean;
148
+ thumbsCloseOnClick?: boolean;
149
+ deeplinkingEnabled?: boolean;
150
+ deeplinkingPrefix?: string;
151
+ assets?: AssetsConfig;
152
+ pdfUrl?: string | null;
153
+ pdfBrowserViewerIfMobile?: boolean;
154
+ pdfBrowserViewerIfIE?: boolean;
155
+ pdfBrowserViewerFullscreen?: boolean;
156
+ pdfBrowserViewerFullscreenTarget?: string;
157
+ rangeChunkSize?: number;
158
+ disableRange?: boolean;
159
+ disableStream?: boolean;
160
+ disableAutoFetch?: boolean;
161
+ pdfAutoLinks?: boolean;
162
+ pdf?: PdfConfig;
163
+ pdfTextLayer?: boolean;
164
+ annotationLayer?: boolean;
165
+ htmlLayer?: boolean;
166
+ rightToLeft?: boolean;
167
+ startPage?: number;
168
+ sound?: boolean;
169
+ backgroundColor?: string;
170
+ backgroundImage?: string;
171
+ backgroundPattern?: string;
172
+ backgroundTransparent?: boolean;
173
+ thumbSize?: number;
174
+ loadAllPages?: boolean;
175
+ loadPagesF?: number;
176
+ loadPagesB?: number;
177
+ autoplayOnStart?: boolean;
178
+ autoplayInterval?: number;
179
+ autoplayLoop?: boolean;
180
+ skin?: SkinType;
181
+ layout?: LayoutType;
182
+ skinColor?: string;
183
+ skinBackground?: string;
184
+ menuOverBook?: boolean;
185
+ menuFloating?: boolean;
186
+ menuBackground?: string;
187
+ menuShadow?: string;
188
+ menuMargin?: number;
189
+ menuPadding?: number;
190
+ menuTransparent?: boolean;
191
+ hideMenu?: boolean;
192
+ menu2OverBook?: boolean;
193
+ menu2Floating?: boolean;
194
+ menu2Background?: string;
195
+ menu2Shadow?: string;
196
+ menu2Margin?: number;
197
+ menu2Padding?: number;
198
+ menu2Transparent?: boolean;
199
+ btnColor?: string;
200
+ btnBackground?: string;
201
+ btnSize?: number;
202
+ btnRadius?: number;
203
+ btnMargin?: number;
204
+ btnPaddingV?: number;
205
+ btnPaddingH?: number;
206
+ btnShadow?: string;
207
+ btnTextShadow?: string;
208
+ btnBorder?: string;
209
+ btnColorHover?: string;
210
+ btnBackgroundHover?: string;
211
+ sideBtnColor?: string;
212
+ sideBtnBackground?: string;
213
+ sideBtnSize?: number;
214
+ sideBtnRadius?: number;
215
+ sideBtnMargin?: number;
216
+ sideBtnPaddingV?: number;
217
+ sideBtnPaddingH?: number;
218
+ sideBtnShadow?: string;
219
+ sideBtnTextShadow?: string;
220
+ sideBtnBorder?: string;
221
+ sideBtnColorHover?: string;
222
+ sideBtnBackgroundHover?: string;
223
+ floatingBtnColor?: string;
224
+ floatingBtnColorHover?: string;
225
+ floatingBtnBackground?: string;
226
+ floatingBtnBackgroundHover?: string;
227
+ floatingBtnSize?: number | null;
228
+ floatingBtnRadius?: number | null;
229
+ floatingBtnMargin?: number | null;
230
+ floatingBtnPadding?: number | null;
231
+ floatingBtnShadow?: string;
232
+ floatingBtnTextShadow?: string;
233
+ floatingBtnBorder?: string;
234
+ currentPage?: CurrentPageConfig;
235
+ btnFirst?: ButtonConfig;
236
+ btnPrev?: ButtonConfig;
237
+ btnNext?: ButtonConfig;
238
+ btnLast?: ButtonConfig;
239
+ btnZoomIn?: ButtonConfig;
240
+ btnZoomOut?: ButtonConfig;
241
+ btnRotateLeft?: ButtonConfig;
242
+ btnRotateRight?: ButtonConfig;
243
+ btnAutoplay?: ButtonConfig;
244
+ btnSearch?: ButtonConfig;
245
+ btnSelect?: ButtonConfig;
246
+ btnBookmark?: ButtonConfig;
247
+ btnToc?: ButtonConfig;
248
+ btnThumbs?: ButtonConfig;
249
+ btnShare?: ButtonConfig;
250
+ btnPrint?: ButtonConfig;
251
+ btnDownloadPages?: DownloadButtonConfig;
252
+ btnDownloadPdf?: DownloadButtonConfig;
253
+ btnSound?: ButtonConfig;
254
+ btnExpand?: ButtonConfig;
255
+ btnClose?: CloseButtonConfig;
256
+ btnOrder?: string[];
257
+ btnShareIfMobile?: boolean;
258
+ btnSoundIfMobile?: boolean;
259
+ btnPrintIfMobile?: boolean;
260
+ sideNavigationButtons?: boolean;
261
+ shareUrl?: string;
262
+ shareTitle?: string;
263
+ shareImage?: string;
264
+ share?: ShareConfig;
265
+ pageTextureSize?: number;
266
+ pageTextureSizeSmall?: number;
267
+ thumbTextureSize?: number;
268
+ pageTextureSizeMobile?: number;
269
+ pageTextureSizeMobileSmall?: number;
270
+ viewMode?: ViewMode;
271
+ singlePageMode?: boolean;
272
+ singlePageModeIfMobile?: boolean;
273
+ zoomMin?: number;
274
+ zoomMax2?: number;
275
+ zoomSize?: number;
276
+ zoomStep?: number;
277
+ zoomTime?: number;
278
+ zoomReset?: boolean;
279
+ zoomResetTime?: number;
280
+ wheelDisabledNotFullscreen?: boolean;
281
+ arrowsDisabledNotFullscreen?: boolean;
282
+ arrowsAlwaysEnabledForNavigation?: boolean;
283
+ touchSwipeEnabled?: boolean;
284
+ doubleClickZoomDisabled?: boolean;
285
+ pageDragDisabled?: boolean;
286
+ rightClickEnabled?: boolean;
287
+ responsiveView?: boolean;
288
+ responsiveViewRatio?: number;
289
+ responsiveViewTreshold?: number;
290
+ minPixelRatio?: number;
291
+ pageFlipDuration?: number;
292
+ contentOnStart?: boolean;
293
+ thumbnailsOnStart?: boolean;
294
+ searchOnStart?: boolean;
295
+ sideMenuOverBook?: boolean;
296
+ sideMenuOverMenu?: boolean;
297
+ sideMenuOverMenu2?: boolean;
298
+ sideMenuPosition?: "left" | "right";
299
+ lightBox?: boolean;
300
+ lightBoxOpened?: boolean;
301
+ lightBoxFullscreen?: boolean;
302
+ lightboxCloseOnClick?: boolean;
303
+ lightboxResetOnOpen?: boolean;
304
+ lightboxBackground?: string;
305
+ lightboxBackgroundColor?: string;
306
+ lightboxBackgroundPattern?: string;
307
+ lightboxBackgroundImage?: string;
308
+ lightboxStartPage?: number;
309
+ lightboxMarginV?: number;
310
+ lightboxMarginH?: number;
311
+ lightboxCSS?: string;
312
+ lightboxPreload?: boolean;
313
+ lightboxShowMenu?: boolean;
314
+ lightboxCloseOnBack?: boolean;
315
+ disableImageResize?: boolean;
316
+ pan?: number;
317
+ panMax?: number;
318
+ panMax2?: number;
319
+ panMin?: number;
320
+ panMin2?: number;
321
+ tilt?: number;
322
+ tiltMax?: number;
323
+ tiltMax2?: number;
324
+ tiltMin?: number;
325
+ tiltMin2?: number;
326
+ rotateCameraOnMouseMove?: boolean;
327
+ rotateCameraOnMouseDrag?: boolean;
328
+ lights?: boolean;
329
+ lightColor?: number;
330
+ lightPositionX?: number;
331
+ lightPositionZ?: number;
332
+ lightPositionY?: number;
333
+ lightIntensity?: number;
334
+ shadows?: boolean;
335
+ shadowMapSize?: number;
336
+ shadowOpacity?: number;
337
+ shadowDistance?: number;
338
+ pageRoughness?: number;
339
+ pageMetalness?: number;
340
+ pageHardness?: number;
341
+ coverHardness?: number;
342
+ pageSegmentsW?: number;
343
+ pageSegmentsH?: number;
344
+ pageMiddleShadowSize?: number;
345
+ pageMiddleShadowColorL?: string;
346
+ pageMiddleShadowColorR?: string;
347
+ antialias?: boolean;
348
+ /** Camera zoom/margin factor - higher values move camera further back (default: 1.35) */
349
+ cameraZoom?: number;
350
+ /** Camera vertical position offset (default: 0) */
351
+ cameraPositionY?: number;
352
+ /** Camera look-at Y position (default: 0) */
353
+ cameraLookAtY?: number;
354
+ /** Field of view in degrees (default: 45) */
355
+ cameraFov?: number;
356
+ /** Base page scale in world units - affects overall page size (default: 6) */
357
+ pageScale?: number;
358
+ preloaderText?: string;
359
+ fillPreloader?: FillPreloaderConfig;
360
+ logoImg?: string;
361
+ logoUrl?: string;
362
+ logoCSS?: string;
363
+ logoHideOnMobile?: boolean;
364
+ printMenu?: boolean;
365
+ downloadMenu?: boolean;
366
+ cover?: boolean;
367
+ backCover?: boolean;
368
+ googleAnalyticsTrackingCode?: string;
369
+ minimumAndroidVersion?: number;
370
+ linkColor?: string;
371
+ linkColorHover?: string;
372
+ linkOpacity?: number;
373
+ linkTarget?: string;
374
+ pageNumberOffset?: number;
375
+ flipSound?: boolean;
376
+ backgroundMusic?: string;
377
+ strings?: LocalizationStrings;
378
+ mobile?: MobileConfig;
379
+ }
380
+ interface FlipbookEventMap {
381
+ pageFlip: {
382
+ page: number;
383
+ direction: "next" | "prev";
384
+ };
385
+ pageFlipStart: {
386
+ page: number;
387
+ direction: "next" | "prev";
388
+ };
389
+ pageFlipEnd: {
390
+ page: number;
391
+ };
392
+ zoomChange: {
393
+ zoom: number;
394
+ };
395
+ ready: void;
396
+ loadProgress: {
397
+ progress: number;
398
+ };
399
+ pageLoaded: {
400
+ page: number;
401
+ };
402
+ fullscreenChange: {
403
+ isFullscreen: boolean;
404
+ };
405
+ lightboxOpen: void;
406
+ lightboxClose: void;
407
+ soundToggle: {
408
+ enabled: boolean;
409
+ };
410
+ autoplayToggle: {
411
+ enabled: boolean;
412
+ };
413
+ }
414
+ interface FlipbookInstance {
415
+ nextPage: () => void;
416
+ prevPage: () => void;
417
+ firstPage: () => void;
418
+ lastPage: () => void;
419
+ goToPage: (page: number) => void;
420
+ zoomIn: () => void;
421
+ zoomOut: () => void;
422
+ zoomTo: (zoom: number) => void;
423
+ getCurrentPage: () => number;
424
+ getNumPages: () => number;
425
+ getZoom: () => number;
426
+ isFullscreen: () => boolean;
427
+ toggleFullscreen: () => void;
428
+ toggleAutoplay: () => void;
429
+ toggleSound: () => void;
430
+ toggleThumbnails: () => void;
431
+ toggleTableOfContents: () => void;
432
+ toggleSearch: () => void;
433
+ openLightbox: () => void;
434
+ closeLightbox: () => void;
435
+ bookmarkPage: (page: number) => void;
436
+ removeBookmark: (page: number) => void;
437
+ getBookmarkedPages: () => number[];
438
+ printCurrentPage: () => void;
439
+ downloadCurrentPage: () => void;
440
+ destroy: () => void;
441
+ }
442
+ interface FlipbookProps extends Partial<FlipbookOptions> {
443
+ /** Pages to display in the flipbook */
444
+ pages: FlipbookPage[];
445
+ /** Class name for the container element */
446
+ className?: string;
447
+ /** Inline styles for the container */
448
+ style?: React.CSSProperties;
449
+ /** Width of the flipbook container */
450
+ width?: number | string;
451
+ /** Height of the flipbook container */
452
+ height?: number | string;
453
+ onPageFlip?: (event: FlipbookEventMap["pageFlip"]) => void;
454
+ onPageFlipStart?: (event: FlipbookEventMap["pageFlipStart"]) => void;
455
+ onPageFlipEnd?: (event: FlipbookEventMap["pageFlipEnd"]) => void;
456
+ onZoomChange?: (event: FlipbookEventMap["zoomChange"]) => void;
457
+ onReady?: () => void;
458
+ onLoadProgress?: (event: FlipbookEventMap["loadProgress"]) => void;
459
+ onPageLoaded?: (event: FlipbookEventMap["pageLoaded"]) => void;
460
+ onFullscreenChange?: (event: FlipbookEventMap["fullscreenChange"]) => void;
461
+ onLightboxOpen?: () => void;
462
+ onLightboxClose?: () => void;
463
+ onSoundToggle?: (event: FlipbookEventMap["soundToggle"]) => void;
464
+ onAutoplayToggle?: (event: FlipbookEventMap["autoplayToggle"]) => void;
465
+ }
466
+ interface UseFlipbookReturn$1 {
467
+ containerRef: React.RefObject<HTMLDivElement>;
468
+ flipbookRef: React.RefObject<FlipbookInstance>;
469
+ currentPage: number;
470
+ numPages: number;
471
+ zoom: number;
472
+ isFullscreen: boolean;
473
+ isLoading: boolean;
474
+ isReady: boolean;
475
+ }
476
+ interface FlipbookContextValue {
477
+ options: FlipbookOptions;
478
+ currentPage: number;
479
+ numPages: number;
480
+ zoom: number;
481
+ isFullscreen: boolean;
482
+ isLoading: boolean;
483
+ instance: FlipbookInstance | null;
484
+ }
485
+
486
+ declare const Flipbook: React__default.ForwardRefExoticComponent<FlipbookProps & React__default.RefAttributes<FlipbookInstance>>;
487
+
488
+ interface WebGLPageFlipProps {
489
+ pages: FlipbookPage[];
490
+ currentPage: number;
491
+ width: number;
492
+ height: number;
493
+ singlePageMode?: boolean;
494
+ flipDuration?: number;
495
+ pageHardness?: number;
496
+ coverHardness?: number;
497
+ pageSegmentsW?: number;
498
+ pageSegmentsH?: number;
499
+ shadows?: boolean;
500
+ shadowOpacity?: number;
501
+ lights?: boolean;
502
+ lightIntensity?: number;
503
+ lightColor?: number;
504
+ pageRoughness?: number;
505
+ pageMetalness?: number;
506
+ antialias?: boolean;
507
+ backgroundColor?: string;
508
+ /** Camera zoom/margin factor - higher values move camera further back (default: 1.35) */
509
+ cameraZoom?: number;
510
+ /** Base page scale in world units - affects overall page size (default: 6) */
511
+ pageScale?: number;
512
+ /** Camera vertical position offset (default: 0) */
513
+ cameraPositionY?: number;
514
+ /** Camera look-at Y position (default: 0) */
515
+ cameraLookAtY?: number;
516
+ /** Field of view in degrees (default: 45) */
517
+ cameraFov?: number;
518
+ onFlipStart?: (page: number, direction: "next" | "prev") => void;
519
+ onFlipEnd?: (page: number) => void;
520
+ onPageChange?: (page: number) => void;
521
+ }
522
+ interface WebGLPageFlipInstance {
523
+ flipNext: () => void;
524
+ flipPrev: () => void;
525
+ flipToPage: (page: number) => void;
526
+ flipToFirst: () => void;
527
+ flipToLast: () => void;
528
+ isFlipping: () => boolean;
529
+ dispose: () => void;
530
+ }
531
+ declare const WebGLPageFlip: React$1.ForwardRefExoticComponent<WebGLPageFlipProps & React$1.RefAttributes<WebGLPageFlipInstance>>;
532
+
533
+ interface ThumbnailsPanelProps {
534
+ pages: FlipbookPage[];
535
+ currentPage: number;
536
+ isOpen: boolean;
537
+ position?: 'left' | 'right';
538
+ thumbnailSize?: number;
539
+ showPageNumbers?: boolean;
540
+ onPageSelect: (page: number) => void;
541
+ onClose: () => void;
542
+ }
543
+ declare const ThumbnailsPanel: React__default.FC<ThumbnailsPanelProps>;
544
+
545
+ interface TableOfContentsProps {
546
+ items: TocItem[];
547
+ currentPage: number;
548
+ isOpen: boolean;
549
+ position?: 'left' | 'right';
550
+ closeOnClick?: boolean;
551
+ onPageSelect: (page: number) => void;
552
+ onClose: () => void;
553
+ }
554
+ declare const TableOfContents: React__default.FC<TableOfContentsProps>;
555
+
556
+ interface SearchResult {
557
+ pageNumber: number;
558
+ pageIndex: number;
559
+ text: string;
560
+ matchIndex: number;
561
+ contextBefore: string;
562
+ contextAfter: string;
563
+ }
564
+ interface SearchPanelProps {
565
+ pages: FlipbookPage[];
566
+ pageTextContent?: Map<number, string>;
567
+ currentPage: number;
568
+ isOpen: boolean;
569
+ position?: "left" | "right";
570
+ minQueryLength?: number;
571
+ maxResults?: number;
572
+ highlightColor?: string;
573
+ onPageSelect: (page: number) => void;
574
+ onClose: () => void;
575
+ onSearchStart?: () => void;
576
+ onSearchEnd?: (results: SearchResult[]) => void;
577
+ }
578
+ declare const SearchPanel: React__default.FC<SearchPanelProps>;
579
+
580
+ interface Bookmark {
581
+ page: number;
582
+ title?: string;
583
+ createdAt: Date;
584
+ note?: string;
585
+ }
586
+ interface BookmarksPanelProps {
587
+ pages: FlipbookPage[];
588
+ bookmarks: number[];
589
+ currentPage: number;
590
+ isOpen: boolean;
591
+ position?: 'left' | 'right';
592
+ showThumbnails?: boolean;
593
+ onPageSelect: (page: number) => void;
594
+ onRemoveBookmark: (page: number) => void;
595
+ onClose: () => void;
596
+ }
597
+ declare const BookmarksPanel: React__default.FC<BookmarksPanelProps>;
598
+
599
+ interface UseFlipbookOptions extends Partial<FlipbookOptions> {
600
+ pages: FlipbookPage[];
601
+ initialPage?: number;
602
+ onPageChange?: (page: number) => void;
603
+ onZoomChange?: (zoom: number) => void;
604
+ onFullscreenChange?: (isFullscreen: boolean) => void;
605
+ }
606
+ interface UseFlipbookReturn {
607
+ currentPage: number;
608
+ numPages: number;
609
+ zoom: number;
610
+ isFullscreen: boolean;
611
+ isLoading: boolean;
612
+ isAnimating: boolean;
613
+ canGoNext: boolean;
614
+ canGoPrev: boolean;
615
+ bookmarkedPages: number[];
616
+ containerRef: React.RefObject<HTMLDivElement>;
617
+ nextPage: () => void;
618
+ prevPage: () => void;
619
+ firstPage: () => void;
620
+ lastPage: () => void;
621
+ goToPage: (page: number) => void;
622
+ setCurrentPageDirect: (page: number) => void;
623
+ zoomIn: () => void;
624
+ zoomOut: () => void;
625
+ zoomTo: (zoom: number) => void;
626
+ resetZoom: () => void;
627
+ toggleFullscreen: () => void;
628
+ enterFullscreen: () => void;
629
+ exitFullscreenMode: () => void;
630
+ toggleBookmark: (page?: number) => void;
631
+ isPageBookmarked: (page: number) => boolean;
632
+ preloadPages: (pageIndices: number[]) => Promise<void>;
633
+ getInstance: () => FlipbookInstance;
634
+ }
635
+ declare function useFlipbook(options: UseFlipbookOptions): UseFlipbookReturn;
636
+ declare function useSwipeGesture(containerRef: React.RefObject<HTMLElement>, onSwipeLeft: () => void, onSwipeRight: () => void, options?: {
637
+ threshold?: number;
638
+ enabled?: boolean;
639
+ }): void;
640
+ declare function useWheelZoom(containerRef: React.RefObject<HTMLElement>, onZoom: (delta: number) => void, options?: {
641
+ enabled?: boolean;
642
+ sensitivity?: number;
643
+ }): void;
644
+ declare function useResizeObserver(ref: React.RefObject<HTMLElement>, callback: (entry: ResizeObserverEntry) => void): void;
645
+
646
+ interface UseAutoplayOptions {
647
+ /** Total number of pages */
648
+ numPages: number;
649
+ /** Current page number (1-based) */
650
+ currentPage: number;
651
+ /** Interval between page flips in milliseconds */
652
+ interval?: number;
653
+ /** Whether to loop back to the first page after the last */
654
+ loop?: boolean;
655
+ /** Whether to start autoplay automatically */
656
+ autoStart?: boolean;
657
+ /** Number of pages to flip at a time (1 for single, 2 for spread) */
658
+ pageIncrement?: number;
659
+ /** Whether the flipbook is in right-to-left mode */
660
+ rightToLeft?: boolean;
661
+ /** Callback when page should change */
662
+ onPageChange: (page: number) => void;
663
+ /** Callback when autoplay starts */
664
+ onStart?: () => void;
665
+ /** Callback when autoplay stops */
666
+ onStop?: () => void;
667
+ /** Callback when autoplay pauses */
668
+ onPause?: () => void;
669
+ /** Callback when autoplay resumes */
670
+ onResume?: () => void;
671
+ /** Callback when autoplay completes (reaches end without loop) */
672
+ onComplete?: () => void;
673
+ }
674
+ interface UseAutoplayReturn {
675
+ /** Whether autoplay is currently active */
676
+ isPlaying: boolean;
677
+ /** Whether autoplay is paused */
678
+ isPaused: boolean;
679
+ /** Current autoplay interval in milliseconds */
680
+ interval: number;
681
+ /** Time remaining until next page flip (ms) */
682
+ timeRemaining: number;
683
+ /** Progress through current interval (0-1) */
684
+ progress: number;
685
+ /** Start autoplay */
686
+ start: () => void;
687
+ /** Stop autoplay completely */
688
+ stop: () => void;
689
+ /** Pause autoplay (can resume) */
690
+ pause: () => void;
691
+ /** Resume paused autoplay */
692
+ resume: () => void;
693
+ /** Toggle between play and pause */
694
+ toggle: () => void;
695
+ /** Set the autoplay interval */
696
+ setInterval: (ms: number) => void;
697
+ /** Skip to next page immediately */
698
+ skipNext: () => void;
699
+ /** Reset autoplay to beginning */
700
+ reset: () => void;
701
+ }
702
+ declare function useAutoplay(options: UseAutoplayOptions): UseAutoplayReturn;
703
+
704
+ interface PDFDocumentProxy {
705
+ numPages: number;
706
+ getPage: (pageNumber: number) => Promise<PDFPageProxy>;
707
+ destroy: () => Promise<void>;
708
+ }
709
+ interface PDFPageProxy {
710
+ getViewport: (options: {
711
+ scale: number;
712
+ rotation?: number;
713
+ }) => PDFPageViewport;
714
+ render: (params: PDFRenderParams) => PDFRenderTask;
715
+ getTextContent: (params?: {
716
+ normalizeWhitespace?: boolean;
717
+ }) => Promise<PDFTextContent>;
718
+ cleanup: () => void;
719
+ }
720
+ interface PDFPageViewport {
721
+ width: number;
722
+ height: number;
723
+ scale: number;
724
+ rotation: number;
725
+ viewBox: number[];
726
+ transform: number[];
727
+ clone: (options?: {
728
+ scale?: number;
729
+ rotation?: number;
730
+ }) => PDFPageViewport;
731
+ }
732
+ interface PDFRenderParams {
733
+ canvasContext: CanvasRenderingContext2D;
734
+ viewport: PDFPageViewport;
735
+ enableWebGL?: boolean;
736
+ renderInteractiveForms?: boolean;
737
+ transform?: number[];
738
+ }
739
+ interface PDFRenderTask {
740
+ promise: Promise<void>;
741
+ cancel: () => void;
742
+ }
743
+ interface PDFTextContent {
744
+ items: PDFTextItem[];
745
+ styles: Record<string, unknown>;
746
+ }
747
+ interface PDFTextItem {
748
+ str: string;
749
+ dir: string;
750
+ transform: number[];
751
+ width: number;
752
+ height: number;
753
+ fontName: string;
754
+ }
755
+ interface PDFDocumentLoadingTask {
756
+ promise: Promise<PDFDocumentProxy>;
757
+ destroy: () => Promise<void>;
758
+ onProgress?: (progress: {
759
+ loaded: number;
760
+ total: number;
761
+ }) => void;
762
+ }
763
+ interface PDFJSLib {
764
+ getDocument: (src: string | {
765
+ url: string;
766
+ [key: string]: unknown;
767
+ } | ArrayBuffer | Uint8Array) => PDFDocumentLoadingTask;
768
+ GlobalWorkerOptions: {
769
+ workerSrc: string;
770
+ };
771
+ version: string;
772
+ }
773
+ declare global {
774
+ interface Window {
775
+ pdfjsLib?: PDFJSLib;
776
+ }
777
+ }
778
+ interface UsePdfLoaderOptions {
779
+ /** PDF file URL or ArrayBuffer */
780
+ source: string | ArrayBuffer | Uint8Array | null;
781
+ /** PDF.js worker source URL (required for PDF.js to work) */
782
+ workerSrc?: string;
783
+ /** Scale factor for rendering pages (default: 1.5) */
784
+ scale?: number;
785
+ /** Whether to extract text content for search */
786
+ extractText?: boolean;
787
+ /** Maximum texture size for page rendering */
788
+ maxTextureSize?: number;
789
+ /** Callback when loading starts */
790
+ onLoadStart?: () => void;
791
+ /** Callback for loading progress */
792
+ onLoadProgress?: (progress: number) => void;
793
+ /** Callback when loading completes */
794
+ onLoadComplete?: (numPages: number) => void;
795
+ /** Callback when loading fails */
796
+ onLoadError?: (error: Error) => void;
797
+ /** Callback when a page is rendered */
798
+ onPageRendered?: (pageNumber: number, dataUrl: string) => void;
799
+ }
800
+ interface UsePdfLoaderReturn {
801
+ /** Whether PDF.js is available */
802
+ isAvailable: boolean;
803
+ /** Whether the PDF is currently loading */
804
+ isLoading: boolean;
805
+ /** Loading progress (0-1) */
806
+ progress: number;
807
+ /** Any error that occurred during loading */
808
+ error: Error | null;
809
+ /** Number of pages in the PDF */
810
+ numPages: number;
811
+ /** Generated flipbook pages */
812
+ pages: FlipbookPage[];
813
+ /** Text content extracted from pages (for search) */
814
+ textContent: Map<number, string>;
815
+ /** Load a PDF from a source */
816
+ loadPdf: (source: string | ArrayBuffer | Uint8Array) => Promise<void>;
817
+ /** Render a specific page to canvas/image */
818
+ renderPage: (pageNumber: number, options?: {
819
+ scale?: number;
820
+ format?: "png" | "jpeg";
821
+ quality?: number;
822
+ }) => Promise<string>;
823
+ /** Get text content from a specific page */
824
+ getPageText: (pageNumber: number) => Promise<string>;
825
+ /** Cleanup and destroy the PDF document */
826
+ destroy: () => void;
827
+ }
828
+ declare function usePdfLoader(options?: UsePdfLoaderOptions): UsePdfLoaderReturn;
829
+
830
+ interface FlipbookSizeOptions {
831
+ /** Maximum width constraint for the container (default: 1200) */
832
+ maxWidth?: number;
833
+ /** Maximum height constraint for the container (default: 900) */
834
+ maxHeight?: number;
835
+ /** Whether the flipbook is in single-page mode (default: false) */
836
+ singlePageMode?: boolean;
837
+ }
838
+ interface FlipbookSize {
839
+ /** Calculated container width in pixels */
840
+ width: number;
841
+ /** Calculated container height in pixels */
842
+ height: number;
843
+ /** The aspect ratio of the container (width / height) */
844
+ aspectRatio: number;
845
+ /** Whether the page is landscape orientation */
846
+ isLandscape: boolean;
847
+ }
848
+ /**
849
+ * Calculate optimal flipbook container size based on page dimensions
850
+ *
851
+ * This function calculates the best container size that:
852
+ * - Maintains the PDF page aspect ratio
853
+ * - Fits within the specified max width/height constraints
854
+ * - Accounts for single-page vs two-page spread modes
855
+ *
856
+ * @param pageWidth - The PDF page width (in points or pixels)
857
+ * @param pageHeight - The PDF page height (in points or pixels)
858
+ * @param options - Sizing options
859
+ * @returns Calculated container dimensions
860
+ *
861
+ * @example
862
+ * ```typescript
863
+ * // Get first page info from PDF
864
+ * const pdfInfo = await getPdfInfo('document.pdf');
865
+ * const firstPage = pdfInfo.pageInfos[0];
866
+ *
867
+ * // Calculate optimal size for single-page mode
868
+ * const size = calculateFlipbookSize(firstPage.width, firstPage.height, {
869
+ * singlePageMode: true,
870
+ * maxWidth: 800,
871
+ * maxHeight: 600,
872
+ * });
873
+ *
874
+ * // Use with Flipbook component
875
+ * <Flipbook pages={pages} width={size.width} height={size.height} singlePageMode />
876
+ * ```
877
+ */
878
+ declare function calculateFlipbookSize(pageWidth: number, pageHeight: number, options?: FlipbookSizeOptions): FlipbookSize;
879
+ /**
880
+ * Calculate optimal flipbook size from a FlipbookPage array
881
+ * Uses the first page's dimensions for calculation
882
+ *
883
+ * @param pages - Array of FlipbookPage objects (must have at least one page with width/height)
884
+ * @param options - Sizing options
885
+ * @returns Calculated container dimensions, or null if pages don't have size info
886
+ *
887
+ * @example
888
+ * ```typescript
889
+ * const pages = await pdfToFlipbookPages('document.pdf');
890
+ * const size = calculateFlipbookSizeFromPages(pages, { singlePageMode: true });
891
+ *
892
+ * if (size) {
893
+ * <Flipbook pages={pages} width={size.width} height={size.height} />
894
+ * }
895
+ * ```
896
+ */
897
+ declare function calculateFlipbookSizeFromPages(pages: FlipbookPage[], options?: FlipbookSizeOptions): FlipbookSize | null;
898
+ /**
899
+ * Set the PDF.js worker source URL
900
+ * Must be called before using any PDF functions
901
+ *
902
+ * @example
903
+ * // For Vite
904
+ * import workerSrc from 'pdfjs-dist/build/pdf.worker.mjs?url';
905
+ * setPdfWorkerSrc(workerSrc);
906
+ *
907
+ * // For CDN
908
+ * setPdfWorkerSrc('https://unpkg.com/pdfjs-dist@4.0.379/build/pdf.worker.mjs');
909
+ */
910
+ declare function setPdfWorkerSrc(workerSrc: string): void;
911
+ interface PdfToImagesOptions {
912
+ /** Scale factor for rendering (default: 2 for high DPI) */
913
+ scale?: number;
914
+ /** Image format: 'png' or 'jpeg' (default: 'png') */
915
+ format?: "png" | "jpeg";
916
+ /** JPEG quality 0-1 (default: 0.92) */
917
+ quality?: number;
918
+ /** Callback for progress updates */
919
+ onProgress?: (current: number, total: number) => void;
920
+ /** Specific page numbers to render (1-indexed). If not provided, renders all pages */
921
+ pageNumbers?: number[];
922
+ }
923
+ interface PdfPageInfo {
924
+ /** Page number (1-indexed) */
925
+ pageNumber: number;
926
+ /** Original PDF page width in points */
927
+ width: number;
928
+ /** Original PDF page height in points */
929
+ height: number;
930
+ /** Detected orientation */
931
+ orientation: "portrait" | "landscape";
932
+ /** Data URL of the rendered image */
933
+ dataUrl: string;
934
+ }
935
+ /**
936
+ * Load a PDF and convert pages to images
937
+ *
938
+ * @param source - PDF source: URL string, ArrayBuffer, or Uint8Array
939
+ * @param options - Conversion options
940
+ * @returns Promise resolving to array of FlipbookPage objects
941
+ *
942
+ * @example
943
+ * ```typescript
944
+ * import { pdfToFlipbookPages, setPdfWorkerSrc } from 'react-3d-flipbook/utils';
945
+ *
946
+ * // Set up worker first
947
+ * setPdfWorkerSrc('https://unpkg.com/pdfjs-dist@4.0.379/build/pdf.worker.mjs');
948
+ *
949
+ * // Convert PDF to flipbook pages
950
+ * const pages = await pdfToFlipbookPages('https://example.com/document.pdf', {
951
+ * scale: 2,
952
+ * onProgress: (current, total) => console.log(`Rendering page ${current}/${total}`)
953
+ * });
954
+ *
955
+ * // Use with Flipbook component
956
+ * <Flipbook pages={pages} width={800} height={600} />
957
+ * ```
958
+ */
959
+ declare function pdfToFlipbookPages(source: string | ArrayBuffer | Uint8Array, options?: PdfToImagesOptions): Promise<FlipbookPage[]>;
960
+ /**
961
+ * Get PDF document info without rendering pages
962
+ */
963
+ declare function getPdfInfo(source: string | ArrayBuffer | Uint8Array): Promise<{
964
+ numPages: number;
965
+ pageInfos: Array<{
966
+ pageNumber: number;
967
+ width: number;
968
+ height: number;
969
+ orientation: "portrait" | "landscape";
970
+ }>;
971
+ }>;
972
+ /**
973
+ * Load PDF pages lazily (one at a time) for memory efficiency
974
+ * Returns an async generator that yields pages one by one
975
+ *
976
+ * @example
977
+ * ```typescript
978
+ * const pages: FlipbookPage[] = [];
979
+ * for await (const page of pdfToFlipbookPagesLazy(pdfUrl)) {
980
+ * pages.push(page);
981
+ * // Update UI progressively
982
+ * setPages([...pages]);
983
+ * }
984
+ * ```
985
+ */
986
+ declare function pdfToFlipbookPagesLazy(source: string | ArrayBuffer | Uint8Array, options?: PdfToImagesOptions): AsyncGenerator<FlipbookPage, void, unknown>;
987
+
988
+ /**
989
+ * Clamp a value between min and max
990
+ */
991
+ declare function clamp(value: number, min: number, max: number): number;
992
+ /**
993
+ * Linear interpolation between two values
994
+ */
995
+ declare function lerp(start: number, end: number, t: number): number;
996
+ /**
997
+ * Convert degrees to radians
998
+ */
999
+ declare function degToRad(degrees: number): number;
1000
+ /**
1001
+ * Convert radians to degrees
1002
+ */
1003
+ declare function radToDeg(radians: number): number;
1004
+ /**
1005
+ * Debounce a function
1006
+ */
1007
+ declare function debounce<T extends (...args: never[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void;
1008
+ /**
1009
+ * Throttle a function
1010
+ */
1011
+ declare function throttle<T extends (...args: unknown[]) => unknown>(func: T, limit: number): (...args: Parameters<T>) => void;
1012
+ /**
1013
+ * Check if a value is a number
1014
+ */
1015
+ declare function isNumber(value: unknown): value is number;
1016
+ /**
1017
+ * Check if running on mobile device
1018
+ */
1019
+ declare function isMobile(): boolean;
1020
+ /**
1021
+ * Check if touch device
1022
+ */
1023
+ declare function isTouchDevice(): boolean;
1024
+ /**
1025
+ * Check if WebGL is supported
1026
+ */
1027
+ declare function isWebGLSupported(): boolean;
1028
+ /**
1029
+ * Get the aspect ratio of an image
1030
+ */
1031
+ declare function getImageAspectRatio(width: number, height: number): number;
1032
+ /**
1033
+ * Calculate page dimensions based on container and aspect ratio
1034
+ */
1035
+ declare function calculatePageDimensions(containerWidth: number, containerHeight: number, pageAspectRatio: number, isDoublePage?: boolean): {
1036
+ width: number;
1037
+ height: number;
1038
+ };
1039
+ /**
1040
+ * Preload an image
1041
+ */
1042
+ declare function preloadImage(src: string): Promise<HTMLImageElement>;
1043
+ /**
1044
+ * Preload multiple images
1045
+ */
1046
+ declare function preloadImages(srcs: string[], onProgress?: (loaded: number, total: number) => void): Promise<HTMLImageElement[]>;
1047
+ /**
1048
+ * Generate a unique ID
1049
+ */
1050
+ declare function generateId(prefix?: string): string;
1051
+ /**
1052
+ * Get element offset relative to document
1053
+ */
1054
+ declare function getElementOffset(element: HTMLElement): {
1055
+ top: number;
1056
+ left: number;
1057
+ };
1058
+ /**
1059
+ * Request fullscreen for an element
1060
+ */
1061
+ declare function requestFullscreen(element: HTMLElement): Promise<void>;
1062
+ /**
1063
+ * Exit fullscreen
1064
+ */
1065
+ declare function exitFullscreen(): Promise<void>;
1066
+ /**
1067
+ * Check if currently in fullscreen mode
1068
+ */
1069
+ declare function isFullscreen(): boolean;
1070
+ /**
1071
+ * Get fullscreen element
1072
+ */
1073
+ declare function getFullscreenElement(): Element | null;
1074
+ /**
1075
+ * Format page number for display
1076
+ */
1077
+ declare function formatPageNumber(page: number, totalPages: number, offset?: number): string;
1078
+ /**
1079
+ * Parse page number from URL hash
1080
+ */
1081
+ declare function getPageFromHash(prefix?: string): number | null;
1082
+ /**
1083
+ * Set page number in URL hash
1084
+ */
1085
+ declare function setPageHash(page: number, prefix?: string): void;
1086
+ /**
1087
+ * Clear URL hash
1088
+ */
1089
+ declare function clearHash(): void;
1090
+ /**
1091
+ * Local storage helpers
1092
+ */
1093
+ declare const storage: {
1094
+ get<T>(key: string, defaultValue: T): T;
1095
+ set<T>(key: string, value: T): void;
1096
+ remove(key: string): void;
1097
+ };
1098
+ /**
1099
+ * Easing functions for animations
1100
+ */
1101
+ declare const easing: {
1102
+ linear: (t: number) => number;
1103
+ easeInQuad: (t: number) => number;
1104
+ easeOutQuad: (t: number) => number;
1105
+ easeInOutQuad: (t: number) => number;
1106
+ easeInCubic: (t: number) => number;
1107
+ easeOutCubic: (t: number) => number;
1108
+ easeInOutCubic: (t: number) => number;
1109
+ easeInQuart: (t: number) => number;
1110
+ easeOutQuart: (t: number) => number;
1111
+ easeInOutQuart: (t: number) => number;
1112
+ easeInSine: (t: number) => number;
1113
+ easeOutSine: (t: number) => number;
1114
+ easeInOutSine: (t: number) => number;
1115
+ easeInExpo: (t: number) => number;
1116
+ easeOutExpo: (t: number) => number;
1117
+ easeInOutExpo: (t: number) => number;
1118
+ };
1119
+
1120
+ export { BookmarksPanel, Flipbook, SearchPanel, TableOfContents, ThumbnailsPanel, WebGLPageFlip, calculateFlipbookSize, calculateFlipbookSizeFromPages, calculatePageDimensions, clamp, clearHash, debounce, degToRad, easing, exitFullscreen, formatPageNumber, generateId, getElementOffset, getFullscreenElement, getImageAspectRatio, getPageFromHash, getPdfInfo, isFullscreen, isMobile, isNumber, isTouchDevice, isWebGLSupported, lerp, pdfToFlipbookPages, pdfToFlipbookPagesLazy, preloadImage, preloadImages, radToDeg, requestFullscreen, setPageHash, setPdfWorkerSrc, storage, throttle, useAutoplay, useFlipbook, usePdfLoader, useResizeObserver, useSwipeGesture, useWheelZoom };
1121
+ export type { AssetsConfig, Bookmark, BookmarksPanelProps, ButtonConfig, CloseButtonConfig, CurrentPageConfig, DownloadButtonConfig, FillPreloaderConfig, FlipbookContextValue, FlipbookEventMap, FlipbookInstance, FlipbookOptions, FlipbookPage, FlipbookProps, FlipbookSize, FlipbookSizeOptions, HAlign, LayoutType, LightboxConfig, LocalizationStrings, MobileConfig, PdfConfig, PdfPageInfo, PdfToImagesOptions, SearchPanelProps, SearchResult, ShareConfig, ShareProviderConfig, SkinType, TableOfContentsProps, ThumbnailsPanelProps, TocItem, UseAutoplayOptions, UseAutoplayReturn, UseFlipbookReturn$1 as UseFlipbookReturn, UsePdfLoaderOptions, UsePdfLoaderReturn, VAlign, ViewMode, WebGLPageFlipInstance, WebGLPageFlipProps };