epochs-pdf 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,416 @@
1
+ import { JSX } from 'react';
2
+ import { ReactElement } from 'react';
3
+ import { ReactNode } from 'react';
4
+
5
+ /** Add / edit free text on the page. */
6
+ export declare const AddText: ToolbarToolComponent;
7
+
8
+ export declare type AlignItems = "flex-start" | "center" | "flex-end" | "stretch";
9
+
10
+ export declare const ALL_TOOLBAR_TOOLS: readonly [ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent, ToolbarToolComponent];
11
+
12
+ /** Clear all markup. */
13
+ export declare const Clear: ToolbarToolComponent;
14
+
15
+ /** Default left / right toolbar layout. */
16
+ export declare const DEFAULT_TOOLBAR_LAYOUT: [
17
+ ToolbarToolComponent[],
18
+ ToolbarToolComponent[]
19
+ ];
20
+
21
+ /** Root document container. Must wrap one or more `<Page>` elements. */
22
+ declare function Document_2(_props: DocumentProps): null;
23
+
24
+ declare namespace Document_2 {
25
+ var displayName: string;
26
+ }
27
+ export { Document_2 as Document }
28
+
29
+ export declare interface DocumentProps {
30
+ title?: string;
31
+ author?: string;
32
+ subject?: string;
33
+ creator?: string;
34
+ children?: ReactNode;
35
+ }
36
+
37
+ /** Download PDF (with markup when present). */
38
+ export declare const Download: ToolbarToolComponent;
39
+
40
+ /** Trigger a browser download of the generated PDF. */
41
+ export declare function download(element: ReactElement, filename?: string): void;
42
+
43
+ /** Erase markup annotations. */
44
+ export declare const Erase: ToolbarToolComponent;
45
+
46
+ export declare type FlexDirection = "column" | "row";
47
+
48
+ /** Convert a solid hex into the CSS color used for drawing markup. */
49
+ export declare function hexToMarkupColor(hex: string, kind: MarkupKind, alpha?: number): string;
50
+
51
+ /** Highlight text markup tool. */
52
+ declare const Highlight_2: ToolbarToolComponent;
53
+ export { Highlight_2 as Highlight }
54
+
55
+ export declare const HIGHLIGHT_PRESETS: MarkupColorOption[];
56
+
57
+ /** Image placeholder (binary embedding planned). */
58
+ declare function Image_2(_props: ImageProps): null;
59
+
60
+ declare namespace Image_2 {
61
+ var displayName: string;
62
+ }
63
+ export { Image_2 as Image }
64
+
65
+ export declare interface ImageProps {
66
+ src: string;
67
+ style?: Style;
68
+ }
69
+
70
+ export declare type JustifyContent = "flex-start" | "center" | "flex-end" | "space-between" | "space-around";
71
+
72
+ /** Linked text. */
73
+ export declare function Link(_props: LinkProps): null;
74
+
75
+ export declare namespace Link {
76
+ var displayName: string;
77
+ }
78
+
79
+ export declare interface LinkProps {
80
+ src: string;
81
+ style?: Style;
82
+ children?: ReactNode;
83
+ }
84
+
85
+ export declare interface MarkupAnnotation {
86
+ id: string;
87
+ pageNumber: number;
88
+ kind: MarkupKind;
89
+ color: string;
90
+ rects: MarkupRect[];
91
+ text?: string;
92
+ }
93
+
94
+ export declare interface MarkupColorOption {
95
+ id: string;
96
+ label: string;
97
+ /** Solid hex used by the swatch / color input. */
98
+ hex: string;
99
+ }
100
+
101
+ export declare type MarkupKind = "highlight" | "underline" | "redact";
102
+
103
+ export declare interface MarkupRect {
104
+ /** Left edge in page CSS pixels at scale = 1. */
105
+ x: number;
106
+ /** Top edge in page CSS pixels at scale = 1. */
107
+ y: number;
108
+ w: number;
109
+ h: number;
110
+ }
111
+
112
+ export declare type MarkupTool = "none" | MarkupKind | "erase" | "sign" | "text";
113
+
114
+ /** Previous / next page and page number. */
115
+ export declare const Navigation: ToolbarToolComponent;
116
+
117
+ /** Open PDF in a new tab. */
118
+ export declare const Open: ToolbarToolComponent;
119
+
120
+ /** A single PDF page. */
121
+ export declare function Page(_props: PageProps): null;
122
+
123
+ export declare namespace Page {
124
+ var displayName: string;
125
+ }
126
+
127
+ export declare const PAGE_SIZES: Record<Exclude<PageSize, [number, number]>, [number, number]>;
128
+
129
+ export declare interface PageProps {
130
+ size?: PageSize;
131
+ orientation?: "portrait" | "landscape";
132
+ style?: Style;
133
+ wrap?: boolean;
134
+ children?: ReactNode;
135
+ }
136
+
137
+ export declare type PageSize = "A4" | "LETTER" | "LEGAL" | [number, number];
138
+
139
+ /** Render a `<Document>` tree to a `Uint8Array` PDF. */
140
+ export declare function pdf(element: ReactElement): Uint8Array;
141
+
142
+ export declare type PdfSource = string | ArrayBuffer | Uint8Array | Blob;
143
+
144
+ declare function PdfViewer({ file, fileUrl, baseUrl, fetchOptions, height, title, initialScale, withThumbnails, thumbnailWidth, maxThumbnails, className, workerSrc, enableToolbar, enableThumbnails, enableNavigation, enableZoom, enableRotate, enableReload, enablePrint, enableOpen, enableDownload, enableMarkup, enableHighlight, enableUnderline, enableSignature, enableText, enableErase, enableClear, signatureFields, textFields, onSignatureComplete, onFieldValueComplete, openSignaturePad: externalOpenSignaturePad, onSignaturePadClose, onSubmit, submitLabel, }: PdfViewerProps): JSX.Element;
145
+ export { PdfViewer }
146
+ export default PdfViewer;
147
+
148
+ export declare interface PdfViewerProps {
149
+ /** PDF path, absolute URL, blob URL, data URL, or binary source. */
150
+ file?: PdfSource;
151
+ /** Alias for `file` when passing a URL string. */
152
+ fileUrl?: string;
153
+ /** Optional base URL prepended to relative paths. */
154
+ baseUrl?: string;
155
+ /** Extra fetch options (e.g. auth headers) for remote URLs. */
156
+ fetchOptions?: RequestInit;
157
+ height?: string | number;
158
+ title?: string;
159
+ initialScale?: number;
160
+ /** Show thumbnails sidebar initially. Default false. */
161
+ withThumbnails?: boolean;
162
+ thumbnailWidth?: number;
163
+ maxThumbnails?: number;
164
+ className?: string;
165
+ workerSrc?: string;
166
+ /**
167
+ * Show the viewer toolbar.
168
+ * - `true` — default left/right layout (all tools)
169
+ * - `[[left…], [right…]]` — custom left / right tool groups
170
+ * - omit / `false` — hide toolbar
171
+ */
172
+ enableToolbar?: boolean | ToolbarLayout;
173
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
174
+ enableThumbnails?: boolean;
175
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
176
+ enableNavigation?: boolean;
177
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
178
+ enableZoom?: boolean;
179
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
180
+ enableRotate?: boolean;
181
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
182
+ enableReload?: boolean;
183
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
184
+ enablePrint?: boolean;
185
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
186
+ enableOpen?: boolean;
187
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
188
+ enableDownload?: boolean;
189
+ /** Master switch for markup features. Default true. */
190
+ enableMarkup?: boolean;
191
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
192
+ enableHighlight?: boolean;
193
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
194
+ enableUnderline?: boolean;
195
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
196
+ enableSignature?: boolean;
197
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
198
+ enableText?: boolean;
199
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
200
+ enableErase?: boolean;
201
+ /** @deprecated Prefer listing tools in `enableToolbar`. */
202
+ enableClear?: boolean;
203
+ /** Fixed signature boxes. In this mode signatures fill only these locations. */
204
+ signatureFields?: SignatureField[];
205
+ /**
206
+ * Fixed text boxes. Users can type, edit, or clear text in these locations.
207
+ * When set, freeform text placement is disabled — only these fields are editable.
208
+ */
209
+ textFields?: TextField[];
210
+ /** Called when a signature is placed (both fixed-field and free placement). */
211
+ onSignatureComplete?: (fieldId: string | undefined, signature: SignatureAnnotation) => void;
212
+ /** Called when a date/text fixed field value changes. */
213
+ onFieldValueComplete?: (fieldId: string, value: string) => void;
214
+ /** Externally trigger the signature pad to open. Toggle to `true` to open. */
215
+ openSignaturePad?: boolean;
216
+ /** Called when the signature pad closes (so parent can reset openSignaturePad). */
217
+ onSignaturePadClose?: () => void;
218
+ /**
219
+ * When provided, shows a footer submit button.
220
+ * For fixed signature fields, the footer also includes Prev/Next and progress.
221
+ */
222
+ onSubmit?: () => void;
223
+ /** Label for the footer submit button. Default "Submit". */
224
+ submitLabel?: string;
225
+ }
226
+
227
+ /** Print (includes markup). */
228
+ export declare const Print: ToolbarToolComponent;
229
+
230
+ /** Reload the PDF. */
231
+ export declare const Reload: ToolbarToolComponent;
232
+
233
+ export declare function renderToBlob(element: ReactElement): Promise<Blob>;
234
+
235
+ /** Async-friendly API mirroring common PDF libraries. */
236
+ export declare function renderToBuffer(element: ReactElement): Promise<Uint8Array>;
237
+
238
+ export declare function resolvePageSize(size?: PageSize, orientation?: "portrait" | "landscape"): [number, number];
239
+
240
+ /** Rotate pages. */
241
+ export declare const Rotate: ToolbarToolComponent;
242
+
243
+ /** Configure pdf.js worker. Call once, or pass `workerSrc` to `<PdfViewer>`. */
244
+ export declare function setPdfWorkerSrc(workerSrc: string): void;
245
+
246
+ /** E-signature tool. */
247
+ export declare const Signature: ToolbarToolComponent;
248
+
249
+ export declare interface SignatureAnnotation {
250
+ id: string;
251
+ pageNumber: number;
252
+ fieldId?: string;
253
+ /** Top-left X in page CSS pixels at scale = 1. */
254
+ x: number;
255
+ /** Top-left Y in page CSS pixels at scale = 1. */
256
+ y: number;
257
+ /** Width at scale = 1. */
258
+ width: number;
259
+ /** Height at scale = 1. */
260
+ height: number;
261
+ /** PNG data URL of the signature ink. */
262
+ imageDataUrl: string;
263
+ }
264
+
265
+ export declare interface SignatureField {
266
+ id: string;
267
+ pageNumber: number;
268
+ x: number;
269
+ y: number;
270
+ width: number;
271
+ height: number;
272
+ /** Field behavior: "sign" (default), "date" (date picker), or "text" (text input). */
273
+ type?: SignatureFieldType;
274
+ /** Placeholder text for "text" type fields. */
275
+ placeholder?: string;
276
+ }
277
+
278
+ declare type SignatureFieldType = "sign" | "date" | "text";
279
+
280
+ export declare interface Style {
281
+ flexDirection?: FlexDirection;
282
+ alignItems?: AlignItems;
283
+ justifyContent?: JustifyContent;
284
+ gap?: number;
285
+ padding?: number;
286
+ paddingTop?: number;
287
+ paddingRight?: number;
288
+ paddingBottom?: number;
289
+ paddingLeft?: number;
290
+ margin?: number;
291
+ marginTop?: number;
292
+ marginRight?: number;
293
+ marginBottom?: number;
294
+ marginLeft?: number;
295
+ width?: number | string;
296
+ height?: number | string;
297
+ flexGrow?: number;
298
+ flexShrink?: number;
299
+ backgroundColor?: string;
300
+ color?: string;
301
+ fontSize?: number;
302
+ fontFamily?: string;
303
+ fontWeight?: "normal" | "bold" | number;
304
+ textAlign?: "left" | "center" | "right";
305
+ lineHeight?: number;
306
+ borderWidth?: number;
307
+ borderColor?: string;
308
+ borderRadius?: number;
309
+ opacity?: number;
310
+ }
311
+
312
+ /** Text content. Children are flattened to a string. */
313
+ declare function Text_2(_props: TextProps): null;
314
+
315
+ declare namespace Text_2 {
316
+ var displayName: string;
317
+ }
318
+ export { Text_2 as Text }
319
+
320
+ export declare interface TextAnnotation {
321
+ id: string;
322
+ pageNumber: number;
323
+ fieldId?: string;
324
+ /** Left edge in page CSS pixels at scale = 1. */
325
+ x: number;
326
+ /** Top edge in page CSS pixels at scale = 1. */
327
+ y: number;
328
+ /** Width at scale = 1. */
329
+ width: number;
330
+ /** Height at scale = 1. */
331
+ height: number;
332
+ value: string;
333
+ fontSize: number;
334
+ color: string;
335
+ }
336
+
337
+ export declare interface TextField {
338
+ id: string;
339
+ pageNumber: number;
340
+ x: number;
341
+ y: number;
342
+ width: number;
343
+ height: number;
344
+ /** Shown when the field is empty. */
345
+ placeholder?: string;
346
+ /** Font size at scale = 1. Default 14. */
347
+ fontSize?: number;
348
+ /** CSS color. Default #111827. */
349
+ color?: string;
350
+ }
351
+
352
+ export declare interface TextProps {
353
+ style?: Style;
354
+ children?: ReactNode;
355
+ }
356
+
357
+ /** Toggle thumbnails sidebar. */
358
+ export declare const Thumbnail: ToolbarToolComponent;
359
+
360
+ /** Render to a Blob (browser). */
361
+ export declare function toBlob(element: ReactElement): Blob;
362
+
363
+ /** Brand key used to identify toolbar tool components. */
364
+ declare const TOOLBAR_TOOL_ID: "__epochsToolbarToolId";
365
+
366
+ /**
367
+ * Toolbar layout: `[leftTools, rightTools]`.
368
+ * Pass tool components imported from `epochs-pdf`
369
+ * (e.g. `Thumbnail`, `Navigation`, `Zoom`).
370
+ *
371
+ * @example
372
+ * enableToolbar={[
373
+ * [Thumbnail, Navigation],
374
+ * [Zoom, Rotate, Download],
375
+ * ]}
376
+ */
377
+ export declare type ToolbarLayout = [
378
+ ToolbarToolComponent[],
379
+ ToolbarToolComponent[]
380
+ ];
381
+
382
+ export declare type ToolbarToolComponent = {
383
+ (props?: Record<string, never>): null;
384
+ displayName: string;
385
+ readonly [TOOLBAR_TOOL_ID]: ToolbarToolId;
386
+ };
387
+
388
+ export declare type ToolbarToolId = "thumbnail" | "navigation" | "zoom" | "rotate" | "reload" | "print" | "open" | "download" | "highlight" | "underline" | "signature" | "text" | "erase" | "clear";
389
+
390
+ /** Render to an object URL for iframes / previews. */
391
+ export declare function toUrl(element: ReactElement): string;
392
+
393
+ /** Underline text markup tool. */
394
+ export declare const Underline: ToolbarToolComponent;
395
+
396
+ export declare const UNDERLINE_PRESETS: MarkupColorOption[];
397
+
398
+ /** Flexbox layout container. */
399
+ export declare function View(_props: ViewProps): null;
400
+
401
+ export declare namespace View {
402
+ var displayName: string;
403
+ }
404
+
405
+ export declare type ViewerStatus = "idle" | "loading" | "ready" | "error";
406
+
407
+ export declare interface ViewProps {
408
+ style?: Style;
409
+ children?: ReactNode;
410
+ debug?: boolean;
411
+ }
412
+
413
+ /** Zoom out, zoom %, zoom in, and fit width. */
414
+ export declare const Zoom: ToolbarToolComponent;
415
+
416
+ export { }
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "epochs-pdf",
3
+ "version": "0.1.0",
4
+ "description": "A modern React PDF library for generating and viewing PDF documents.",
5
+ "license": "MIT",
6
+ "author": "EPOCHS",
7
+ "type": "module",
8
+ "main": "./dist/epochs-pdf.cjs",
9
+ "module": "./dist/epochs-pdf.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/epochs-pdf.js",
15
+ "require": "./dist/epochs-pdf.cjs"
16
+ },
17
+ "./viewer.css": "./dist/epochs-pdf.css"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "LICENSE",
22
+ "README.md"
23
+ ],
24
+ "sideEffects": [
25
+ "**/*.css"
26
+ ],
27
+ "scripts": {
28
+ "dev": "vite",
29
+ "build": "vite build",
30
+ "playground": "vite --config playground/vite.config.ts",
31
+ "playground:build": "vite build --config playground/vite.config.ts",
32
+ "typecheck": "tsc --noEmit -p tsconfig.json",
33
+ "prepublishOnly": "npm run build"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=18.0.0",
37
+ "react-dom": ">=18.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^26.1.2",
41
+ "@types/react": "^19.1.8",
42
+ "@types/react-dom": "^19.1.6",
43
+ "@vitejs/plugin-react": "^4.6.0",
44
+ "react": "^19.1.0",
45
+ "react-dom": "^19.1.0",
46
+ "typescript": "^5.8.3",
47
+ "vite": "^6.3.5",
48
+ "vite-plugin-dts": "^4.5.4"
49
+ },
50
+ "keywords": [
51
+ "react",
52
+ "pdf",
53
+ "pdf-generator",
54
+ "pdf-viewer",
55
+ "pdfjs",
56
+ "react-pdf",
57
+ "documents"
58
+ ],
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "git+https://github.com/waleedrajput/epochs-pdf.git"
62
+ },
63
+ "bugs": {
64
+ "url": "https://github.com/waleedrajput/epochs-pdf/issues"
65
+ },
66
+ "homepage": "https://github.com/waleedrajput/epochs-pdf#readme",
67
+ "dependencies": {
68
+ "pdfjs-dist": "^4.10.38"
69
+ }
70
+ }