UNPKG

@letter-ai/lector

Version:

Headless PDF viewer for React

339 lines (284 loc) 11.4 kB
import { ComponentPropsWithoutRef } from 'react'; import { Context } from 'react'; import type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api'; import { ForwardRefExoticComponent } from 'react'; import { FunctionComponent } from 'react'; import { HTMLProps } from 'react'; import type { IPDFLinkService } from 'pdfjs-dist/types/web/interfaces'; import { JSX } from 'react/jsx-runtime'; import type { JSX as JSX_2 } from 'react'; import type { PageViewport } from 'pdfjs-dist'; import { PDFDocumentProxy } from 'pdfjs-dist'; import type { PDFPageProxy } from 'pdfjs-dist'; import { default as React_2 } from 'react'; import { ReactElement } from 'react'; import { ReactNode } from 'react'; import { RefAttributes } from 'react'; import { StoreApi } from 'zustand'; import type { TypedArray } from 'pdfjs-dist/types/src/display/api'; import { Virtualizer } from '@tanstack/react-virtual'; /** * AnnotationLayer renders PDF annotations like links, highlights, and form fields. * * @param renderForms - Whether to render form fields in the annotation layer. * @param externalLinksEnabled - Whether external links should be clickable. When false, external links won't open. * @param jumpOptions - Options for page navigation behavior when clicking internal links. * See `usePdfJump` hook for available options. */ export declare const AnnotationLayer: ({ renderForms, externalLinksEnabled, jumpOptions, className, style, ...props }: AnnotationLayerParams & HTMLProps<HTMLDivElement>) => JSX.Element; declare interface AnnotationLayerParams { /** * Whether to render forms. */ renderForms?: boolean; /** * Whether external links are enabled. * If false, external links will not open. * @default true */ externalLinksEnabled?: boolean; /** * Options to pass to the jumpToPage function when navigating. * See usePdfJump hook for available options. * @default { behavior: "smooth", align: "start" } */ jumpOptions?: Parameters<ReturnType<typeof usePdfJump>['jumpToPage']>[1]; } export declare function calculateHighlightRects(pageProxy: PDFPageProxy, textMatch: TextPosition): Promise<HighlightRect[]>; export declare const cancellable: <T extends Promise<unknown>>(promise: T) => { promise: T; cancel: () => void; }; export declare const CanvasLayer: ({ style, ...props }: HTMLProps<HTMLCanvasElement>) => JSX.Element; export declare const clamp: (value: number, min: number, max: number) => number; export declare const CurrentPage: ({ ...props }: HTMLProps<HTMLInputElement>) => JSX.Element; export declare const CurrentZoom: ({ ...props }: HTMLProps<HTMLInputElement>) => JSX.Element; export declare const CustomLayer: ({ children, }: { children: (pageNumber: number) => JSX_2.Element; }) => JSX_2.Element; export declare const firstMemo: <T>(first: boolean, memo: unknown, initializer: () => T) => T; export declare const getFitWidthZoom: (containerWidth: number, viewports: PageViewport[], zoomOptions: { minZoom: number; maxZoom: number; }) => number; export declare const HighlightLayer: ForwardRefExoticComponent<HighlightLayerProps & RefAttributes<HTMLDivElement>>; declare interface HighlightLayerProps extends ComponentPropsWithoutRef<"div"> { asChild?: boolean; } declare type HighlightRect = { pageNumber: number; top: number; left: number; height: number; width: number; type?: "pixels" | "percent"; }; export { HighlightRect } export { HighlightRect as HighlightRect_alias_1 } export declare interface InitialPDFState { pdfDocumentProxy: PDFDocumentProxy; pageProxies: PDFPageProxy[]; viewports: Array<PageViewport>; zoom: number; isZoomFitWidth?: boolean; zoomOptions?: ZoomOptions; } export declare class LinkService implements IPDFLinkService { _pdfDocumentProxy?: PDFDocumentProxy; externalLinkEnabled: boolean; isInPresentationMode: boolean; _currentPageNumber: number; _pageNavigationCallback?: (pageNumber: number) => void; get pdfDocumentProxy(): PDFDocumentProxy; constructor(); get pagesCount(): number; get page(): number; set page(value: number); setDocument(pdfDocument: PDFDocumentProxy): void; setViewer(): void; getDestinationHash(dest: unknown[]): string; getAnchorUrl(hash: string): string; addLinkAttributes(link: HTMLAnchorElement, url: string, newWindow?: boolean | undefined): void; goToDestination(dest: string | unknown[] | Promise<unknown[]>): Promise<void>; executeNamedAction(): void; navigateTo(dest: any): void; get rotation(): number; set rotation(value: number); goToPage(pageNumber: number): void; setHash(hash: string): void; executeSetOCGState(): void; registerPageNavigationCallback(callback: (pageNumber: number) => void): void; unregisterPageNavigationCallback(): void; } export declare const NextPage: () => void; export declare const Outline: ({ children, ...props }: HTMLProps<HTMLUListElement> & { children: ReactElement<typeof OutlineItem>; }) => JSX.Element; export declare const OutlineChildItems: ({ ...props }: HTMLProps<HTMLUListElement> & { children?: ReactElement<typeof OutlineItem>[]; }) => JSX.Element; export declare const OutlineItem: FunctionComponent<OutlineItemProps>; declare interface OutlineItemProps extends HTMLProps<HTMLDivElement> { level?: number; item?: OutlineItemType; children?: ReactElement<typeof OutlineChildItems>; outlineItem?: ReactElement<typeof OutlineItem>; } declare type OutlineItemType = NonNullable<ReturnType<typeof usePDFOutline>>[number]; export declare const Page: ({ children, pageNumber, style, ...props }: HTMLProps<HTMLDivElement> & { children: ReactNode; pageNumber?: number; }) => JSX.Element; export declare const Pages: ({ children, gap, virtualizerOptions, initialOffset, onOffsetChange, ...props }: HTMLProps<HTMLDivElement> & { virtualizerOptions?: { overscan?: number; }; gap?: number; children: ReactElement; initialOffset?: number; onOffsetChange?: (offset: number) => void; }) => JSX.Element; declare interface PDFState { pdfDocumentProxy: PDFDocumentProxy; zoom: number; updateZoom: (zoom: number | ((prevZoom: number) => number), isZoomFitWidth?: boolean) => void; isZoomFitWidth: boolean; zoomFitWidth: () => void; isPinching: boolean; setIsPinching: (isPinching: boolean) => void; currentPage: number; setCurrentPage: (pageNumber: number) => void; viewports: Array<PageViewport>; viewportRef: React.MutableRefObject<HTMLDivElement | null>; pageProxies: PDFPageProxy[]; textContent: TextContent[]; setTextContent: (textContents: TextContent[]) => void; zoomOptions: Required<ZoomOptions>; virtualizer: PDFVirtualizer | null; setVirtualizer: (virtualizer: PDFVirtualizer) => void; highlights: HighlightRect[]; setHighlight: (higlights: HighlightRect[]) => void; getPdfPageProxy: (pageNumber: number) => PDFPageProxy; customSelectionRects: HighlightRect[]; setCustomSelectionRects: (rects: HighlightRect[]) => void; } export declare const PDFStore: { useContext: () => StoreApi<PDFState>; Context: Context<StoreApi<PDFState>>; Provider: (props: { children?: React.ReactNode; initialValue: InitialPDFState; }) => JSX.Element; }; export declare type PDFVirtualizer = Virtualizer<any, any>; export declare const PreviousPage: () => void; export declare const Root: ForwardRefExoticComponent<Omit<HTMLProps<HTMLDivElement> & usePDFDocumentParams & { loader?: ReactNode; }, "ref"> & RefAttributes<unknown>>; export declare const Search: ({ children, loading }: SearchProps) => ReactNode; declare interface SearchOptions { threshold?: number; limit?: number; textSize?: number; } declare interface SearchProps { children: React.ReactNode; loading?: React.ReactNode; } export declare interface SearchResult { pageNumber: number; text: string; score: number; matchIndex: number; isExactMatch: boolean; } export declare interface SearchResults { exactMatches: SearchResult[]; fuzzyMatches: SearchResult[]; hasMoreResults: boolean; } export declare const SelectionTooltip: ({ children }: SelectionTooltipProps) => JSX.Element; declare interface SelectionTooltipProps { children: React_2.ReactNode; } export declare type Source = string | URL | TypedArray | ArrayBuffer | DocumentInitParameters; declare type TextContent = { pageNumber: number; text: string; }; export declare const TextLayer: ({ className, style, ...props }: HTMLProps<HTMLDivElement>) => JSX.Element; declare interface TextPosition { pageNumber: number; text: string; matchIndex: number; } export declare const Thumbnail: ({ pageNumber, ...props }: HTMLProps<HTMLCanvasElement> & { pageNumber?: number; }) => JSX.Element; export declare const Thumbnails: ({ children, ...props }: HTMLProps<HTMLDivElement> & { children: ReactElement<typeof Thumbnail>; }) => JSX.Element; export declare const TotalPages: ({ ...props }: HTMLProps<HTMLDivElement>) => JSX.Element; declare const usePdf: <T>(selector: (state: PDFState) => T) => T; export { usePdf } export { usePdf as usePdf_alias_1 } export declare const usePDFDocumentContext: ({ onDocumentLoad, source, initialRotation, isZoomFitWidth, zoom, zoomOptions, }: usePDFDocumentParams) => { initialState: InitialPDFState | null | undefined; }; export declare interface usePDFDocumentParams { /** * The URL of the PDF file to load. */ source: Source; onDocumentLoad?: ({ proxy, source, }: { proxy: PDFDocumentProxy; source: Source; }) => void; initialRotation?: number; isZoomFitWidth?: boolean; zoom?: number; zoomOptions?: ZoomOptions; } export declare const usePdfJump: () => { jumpToPage: (pageIndex: number, options?: { align?: "start" | "center" | "end" | "auto"; behavior?: "auto" | "smooth"; }) => void; jumpToOffset: (offset: number) => void; jumpToHighlightRects: (rects: HighlightRect[], type: "pixels" | "percent", align?: "start" | "center", additionalOffset?: number) => void; }; declare const usePDFOutline: () => { title: string; bold: boolean; italic: boolean; color: Uint8ClampedArray; dest: string | Array<any> | null; url: string | null; unsafeUrl: string | undefined; newWindow: boolean | undefined; count: number | undefined; items: Array<any>; }[] | undefined; export declare const useSearch: () => { textContent: { pageNumber: number; text: string; }[]; keywords: string[]; searchResults: SearchResults; search: (searchText: string, options?: SearchOptions) => SearchResults; }; export declare const useSelectionDimensions: () => { getDimension: () => { highlights: HighlightRect[]; text: string; isCollapsed: boolean; } | undefined; }; export declare const ZoomIn: ({ ...props }: HTMLProps<HTMLButtonElement>) => JSX.Element; export declare interface ZoomOptions { minZoom?: number; maxZoom?: number; } export declare const ZoomOut: ({ ...props }: HTMLProps<HTMLButtonElement>) => JSX.Element; export { }