@drvillo/react-browser-e-signing 0.1.0 → 0.1.2
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.
- package/README.md +39 -9
- package/dist/index.d.ts +72 -13
- package/dist/index.js +303 -137
- package/dist/index.js.map +1 -1
- package/dist/styles.css +407 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ pnpm add @drvillo/react-browser-e-signing
|
|
|
21
21
|
|
|
22
22
|
```tsx
|
|
23
23
|
import { defaults, modifyPdf, sha256, useFieldPlacement } from '@drvillo/react-browser-e-signing'
|
|
24
|
+
import '@drvillo/react-browser-e-signing/styles.css'
|
|
24
25
|
```
|
|
25
26
|
|
|
26
27
|
Use the demo app for a complete end-to-end integration:
|
|
@@ -67,18 +68,46 @@ pnpm demo
|
|
|
67
68
|
- `SigningResult`
|
|
68
69
|
- `PdfPageDimensions`
|
|
69
70
|
|
|
70
|
-
##
|
|
71
|
+
## Styling and Theming
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
Library components are style-agnostic:
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
- components expose `data-slot` attributes for all key DOM parts
|
|
76
|
+
- stateful elements expose `data-state`
|
|
77
|
+
- each component root accepts `className`
|
|
78
|
+
- no Tailwind setup is required in consumer apps
|
|
79
|
+
|
|
80
|
+
### Option 1: Use default styles
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
import '@drvillo/react-browser-e-signing/styles.css'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Option 2: Bring your own styles
|
|
87
|
+
|
|
88
|
+
Skip the default stylesheet and target slots from your app CSS:
|
|
89
|
+
|
|
90
|
+
```css
|
|
91
|
+
[data-slot='field-palette-button'] {
|
|
92
|
+
border-radius: 999px;
|
|
93
|
+
border: 1px solid #111827;
|
|
94
|
+
background: #ffffff;
|
|
81
95
|
}
|
|
96
|
+
|
|
97
|
+
[data-slot='field-palette-button'][data-state='selected'] {
|
|
98
|
+
background: #111827;
|
|
99
|
+
color: #ffffff;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Slot constants
|
|
104
|
+
|
|
105
|
+
Use exported slot constants to avoid string literals:
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
import { SLOTS } from '@drvillo/react-browser-e-signing'
|
|
109
|
+
|
|
110
|
+
const selector = `[data-slot="${SLOTS.fieldPaletteButton}"]`
|
|
82
111
|
```
|
|
83
112
|
|
|
84
113
|
## Development Scripts
|
|
@@ -96,6 +125,7 @@ pnpm typecheck
|
|
|
96
125
|
|
|
97
126
|
- `PdfViewer` sets `react-pdf` worker from CDN by default using the runtime PDF.js version.
|
|
98
127
|
- Browser test config skips execution when Playwright Chromium is not available in the environment.
|
|
128
|
+
- Demo theme switcher (`default` / `custom`) shows how a container app can fully re-theme the same components.
|
|
99
129
|
|
|
100
130
|
## Limitations
|
|
101
131
|
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
|
|
5
|
+
declare const SIGNATURE_FONTS: readonly ["Caveat", "Homemade Apple", "Reenie Beanie", "Mr Dafoe", "Pacifico", "Qwitcher Grypen"];
|
|
6
|
+
declare function loadSignatureFont(fontFamily: string): Promise<void>;
|
|
7
|
+
|
|
5
8
|
interface PdfViewerProps {
|
|
6
9
|
pdfData: ArrayBuffer | null;
|
|
7
10
|
numPages: number;
|
|
@@ -14,8 +17,9 @@ interface PdfViewerProps {
|
|
|
14
17
|
heightPt: number;
|
|
15
18
|
}) => void;
|
|
16
19
|
renderOverlay?: (pageIndex: number) => ReactNode;
|
|
20
|
+
className?: string;
|
|
17
21
|
}
|
|
18
|
-
declare function PdfViewer({ pdfData, numPages, scale, onScaleChange, onDocumentLoadSuccess, onPageDimensions, renderOverlay, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
|
|
22
|
+
declare function PdfViewer({ pdfData, numPages, scale, onScaleChange, onDocumentLoadSuccess, onPageDimensions, renderOverlay, className, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
|
|
19
23
|
|
|
20
24
|
type FieldType = 'signature' | 'fullName' | 'title' | 'date';
|
|
21
25
|
interface FieldPlacement {
|
|
@@ -76,28 +80,32 @@ interface FieldOverlayProps {
|
|
|
76
80
|
onUpdateField: (fieldId: string, partial: Partial<FieldPlacement>) => void;
|
|
77
81
|
onRemoveField: (fieldId: string) => void;
|
|
78
82
|
preview: SignatureFieldPreview;
|
|
83
|
+
className?: string;
|
|
79
84
|
}
|
|
80
|
-
declare function FieldOverlay({ pageIndex, fields, selectedFieldType, onAddField, onUpdateField, onRemoveField, preview, }: FieldOverlayProps): react_jsx_runtime.JSX.Element;
|
|
85
|
+
declare function FieldOverlay({ pageIndex, fields, selectedFieldType, onAddField, onUpdateField, onRemoveField, preview, className, }: FieldOverlayProps): react_jsx_runtime.JSX.Element;
|
|
81
86
|
|
|
82
87
|
interface SignatureFieldProps {
|
|
83
88
|
field: FieldPlacement;
|
|
84
89
|
onUpdateField: (fieldId: string, partial: Partial<FieldPlacement>) => void;
|
|
85
90
|
onRemoveField: (fieldId: string) => void;
|
|
86
91
|
preview: SignatureFieldPreview;
|
|
92
|
+
className?: string;
|
|
87
93
|
}
|
|
88
|
-
declare function SignatureField({ field, onUpdateField, onRemoveField, preview }: SignatureFieldProps): react_jsx_runtime.JSX.Element;
|
|
94
|
+
declare function SignatureField({ field, onUpdateField, onRemoveField, preview, className }: SignatureFieldProps): react_jsx_runtime.JSX.Element;
|
|
89
95
|
|
|
90
96
|
interface FieldPaletteProps {
|
|
91
97
|
selectedFieldType: FieldType | null;
|
|
92
98
|
onSelectFieldType: (fieldType: FieldType | null) => void;
|
|
99
|
+
className?: string;
|
|
93
100
|
}
|
|
94
|
-
declare function FieldPalette({ selectedFieldType, onSelectFieldType }: FieldPaletteProps): react_jsx_runtime.JSX.Element;
|
|
101
|
+
declare function FieldPalette({ selectedFieldType, onSelectFieldType, className }: FieldPaletteProps): react_jsx_runtime.JSX.Element;
|
|
95
102
|
|
|
96
103
|
interface SignerDetailsPanelProps {
|
|
97
104
|
signerInfo: SignerInfo;
|
|
98
105
|
onSignerInfoChange: (nextSignerInfo: SignerInfo) => void;
|
|
106
|
+
className?: string;
|
|
99
107
|
}
|
|
100
|
-
declare function SignerDetailsPanel({ signerInfo, onSignerInfoChange }: SignerDetailsPanelProps): react_jsx_runtime.JSX.Element;
|
|
108
|
+
declare function SignerDetailsPanel({ signerInfo, onSignerInfoChange, className }: SignerDetailsPanelProps): react_jsx_runtime.JSX.Element;
|
|
101
109
|
|
|
102
110
|
interface SignaturePreviewProps {
|
|
103
111
|
signerName: string;
|
|
@@ -105,13 +113,15 @@ interface SignaturePreviewProps {
|
|
|
105
113
|
signatureDataUrl: string | null;
|
|
106
114
|
isRendering: boolean;
|
|
107
115
|
onStyleChange: (nextStyle: SignatureStyle) => void;
|
|
116
|
+
className?: string;
|
|
108
117
|
}
|
|
109
|
-
declare function SignaturePreview({ signerName, style, signatureDataUrl, isRendering, onStyleChange, }: SignaturePreviewProps): react_jsx_runtime.JSX.Element;
|
|
118
|
+
declare function SignaturePreview({ signerName, style, signatureDataUrl, isRendering, onStyleChange, className, }: SignaturePreviewProps): react_jsx_runtime.JSX.Element;
|
|
110
119
|
|
|
111
120
|
interface SignaturePadProps {
|
|
112
121
|
onDrawn: (signatureDataUrl: string) => void;
|
|
122
|
+
className?: string;
|
|
113
123
|
}
|
|
114
|
-
declare function SignaturePad({ onDrawn }: SignaturePadProps): react_jsx_runtime.JSX.Element;
|
|
124
|
+
declare function SignaturePad({ onDrawn, className }: SignaturePadProps): react_jsx_runtime.JSX.Element;
|
|
115
125
|
|
|
116
126
|
interface SigningCompleteProps {
|
|
117
127
|
signerName: string;
|
|
@@ -121,8 +131,9 @@ interface SigningCompleteProps {
|
|
|
121
131
|
downloadUrl: string;
|
|
122
132
|
fileName?: string;
|
|
123
133
|
onReset: () => void;
|
|
134
|
+
className?: string;
|
|
124
135
|
}
|
|
125
|
-
declare function SigningComplete({ signerName, fieldCount, signedAt, documentHash, downloadUrl, fileName, onReset, }: SigningCompleteProps): react_jsx_runtime.JSX.Element;
|
|
136
|
+
declare function SigningComplete({ signerName, fieldCount, signedAt, documentHash, downloadUrl, fileName, onReset, className, }: SigningCompleteProps): react_jsx_runtime.JSX.Element;
|
|
126
137
|
|
|
127
138
|
type PdfInput = File | Blob | ArrayBuffer | Uint8Array | null;
|
|
128
139
|
declare function usePdfDocument(pdfInput: PdfInput): {
|
|
@@ -178,15 +189,63 @@ declare function modifyPdf({ pdfBytes, fields, signer, signatureDataUrl, pageDim
|
|
|
178
189
|
declare function mapToPoints(field: FieldPlacement, page: PdfPageDimensions): PointRect;
|
|
179
190
|
declare function mapFromPoints(rect: PointRect, page: PdfPageDimensions): Pick<FieldPlacement, 'xPercent' | 'yPercent' | 'widthPercent' | 'heightPercent'>;
|
|
180
191
|
|
|
181
|
-
declare const SIGNATURE_FONTS: readonly ["Dancing Script", "Great Vibes", "Sacramento", "Alex Brush"];
|
|
182
|
-
declare function loadSignatureFont(fontFamily: string): Promise<void>;
|
|
183
|
-
|
|
184
192
|
declare function sha256(data: Uint8Array): Promise<string>;
|
|
185
193
|
|
|
194
|
+
declare const SLOTS: {
|
|
195
|
+
readonly pdfViewer: "pdf-viewer";
|
|
196
|
+
readonly pdfViewerEmpty: "pdf-viewer-empty";
|
|
197
|
+
readonly pdfViewerToolbar: "pdf-viewer-toolbar";
|
|
198
|
+
readonly pdfViewerPageCount: "pdf-viewer-page-count";
|
|
199
|
+
readonly pdfViewerZoom: "pdf-viewer-zoom";
|
|
200
|
+
readonly pdfViewerZoomButton: "pdf-viewer-zoom-button";
|
|
201
|
+
readonly pdfViewerZoomValue: "pdf-viewer-zoom-value";
|
|
202
|
+
readonly pdfViewerPages: "pdf-viewer-pages";
|
|
203
|
+
readonly pdfViewerPage: "pdf-viewer-page";
|
|
204
|
+
readonly pdfViewerLoading: "pdf-viewer-loading";
|
|
205
|
+
readonly pdfViewerError: "pdf-viewer-error";
|
|
206
|
+
readonly fieldOverlay: "field-overlay";
|
|
207
|
+
readonly signatureField: "signature-field";
|
|
208
|
+
readonly signatureFieldContent: "signature-field-content";
|
|
209
|
+
readonly signatureFieldLabel: "signature-field-label";
|
|
210
|
+
readonly signatureFieldPreview: "signature-field-preview";
|
|
211
|
+
readonly signatureFieldPreviewImage: "signature-field-preview-image";
|
|
212
|
+
readonly signatureFieldPreviewText: "signature-field-preview-text";
|
|
213
|
+
readonly signatureFieldRemove: "signature-field-remove";
|
|
214
|
+
readonly signatureFieldResize: "signature-field-resize";
|
|
215
|
+
readonly fieldPalette: "field-palette";
|
|
216
|
+
readonly fieldPaletteButton: "field-palette-button";
|
|
217
|
+
readonly signerPanel: "signer-panel";
|
|
218
|
+
readonly signerPanelHeading: "signer-panel-heading";
|
|
219
|
+
readonly signerPanelLabel: "signer-panel-label";
|
|
220
|
+
readonly signerPanelInput: "signer-panel-input";
|
|
221
|
+
readonly signaturePreview: "signature-preview";
|
|
222
|
+
readonly signaturePreviewHeading: "signature-preview-heading";
|
|
223
|
+
readonly signaturePreviewModeToggle: "signature-preview-mode-toggle";
|
|
224
|
+
readonly signaturePreviewModeButton: "signature-preview-mode-button";
|
|
225
|
+
readonly signaturePreviewFontLabel: "signature-preview-font-label";
|
|
226
|
+
readonly signaturePreviewFontSelect: "signature-preview-font-select";
|
|
227
|
+
readonly signaturePreviewDisplay: "signature-preview-display";
|
|
228
|
+
readonly signaturePreviewImage: "signature-preview-image";
|
|
229
|
+
readonly signaturePreviewPlaceholder: "signature-preview-placeholder";
|
|
230
|
+
readonly signaturePad: "signature-pad";
|
|
231
|
+
readonly signaturePadCanvas: "signature-pad-canvas";
|
|
232
|
+
readonly signaturePadActions: "signature-pad-actions";
|
|
233
|
+
readonly signaturePadClear: "signature-pad-clear";
|
|
234
|
+
readonly signingComplete: "signing-complete";
|
|
235
|
+
readonly signingCompleteHeading: "signing-complete-heading";
|
|
236
|
+
readonly signingCompleteDetails: "signing-complete-details";
|
|
237
|
+
readonly signingCompleteHash: "signing-complete-hash";
|
|
238
|
+
readonly signingCompleteHashLabel: "signing-complete-hash-label";
|
|
239
|
+
readonly signingCompleteHashValue: "signing-complete-hash-value";
|
|
240
|
+
readonly signingCompleteActions: "signing-complete-actions";
|
|
241
|
+
readonly signingCompleteDownload: "signing-complete-download";
|
|
242
|
+
readonly signingCompleteReset: "signing-complete-reset";
|
|
243
|
+
};
|
|
244
|
+
|
|
186
245
|
declare const defaults: {
|
|
187
|
-
readonly SIGNATURE_FONTS: readonly ["
|
|
246
|
+
readonly SIGNATURE_FONTS: readonly ["Caveat", "Homemade Apple", "Reenie Beanie", "Mr Dafoe", "Pacifico", "Qwitcher Grypen"];
|
|
188
247
|
readonly DEFAULT_FIELD_WIDTH_PERCENT: 25;
|
|
189
248
|
readonly DEFAULT_FIELD_HEIGHT_PERCENT: 5;
|
|
190
249
|
};
|
|
191
250
|
|
|
192
|
-
export { FieldOverlay, FieldPalette, type FieldPlacement, type FieldType, type PdfPageDimensions, PdfViewer, SIGNATURE_FONTS, SignatureField, type SignatureFieldPreview, SignaturePad, SignaturePreview, type SignatureStyle, SignerDetailsPanel, type SignerInfo, SigningComplete, type SigningResult, defaults, loadSignatureFont, mapFromPoints, mapToPoints, modifyPdf, sha256, useFieldPlacement, usePdfDocument, useSignatureRenderer };
|
|
251
|
+
export { FieldOverlay, FieldPalette, type FieldPlacement, type FieldType, type PdfPageDimensions, PdfViewer, SIGNATURE_FONTS, SLOTS, SignatureField, type SignatureFieldPreview, SignaturePad, SignaturePreview, type SignatureStyle, SignerDetailsPanel, type SignerInfo, SigningComplete, type SigningResult, defaults, loadSignatureFont, mapFromPoints, mapToPoints, modifyPdf, sha256, useFieldPlacement, usePdfDocument, useSignatureRenderer };
|