smartcomply-web-sdk 1.0.90 → 1.0.92

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.
Files changed (35) hide show
  1. package/dist/camera/ActionDetector.d.ts +2 -1
  2. package/dist/camera/ActionDetector.d.ts.map +1 -1
  3. package/dist/camera/ActionDetector.js +21 -5
  4. package/dist/camera/ActionDetector.js.map +1 -1
  5. package/dist/client/Smartcomply.d.ts +2 -2
  6. package/dist/client/Smartcomply.js +2 -2
  7. package/dist/esm/camera/ActionDetector.d.ts +2 -1
  8. package/dist/esm/camera/ActionDetector.d.ts.map +1 -1
  9. package/dist/esm/camera/ActionDetector.js +21 -5
  10. package/dist/esm/camera/ActionDetector.js.map +1 -1
  11. package/dist/esm/client/Smartcomply.d.ts +2 -2
  12. package/dist/esm/client/Smartcomply.js +2 -2
  13. package/dist/esm/flow/SmartComplyFlow.d.ts +10 -0
  14. package/dist/esm/flow/SmartComplyFlow.d.ts.map +1 -1
  15. package/dist/esm/flow/SmartComplyFlow.js +106 -33
  16. package/dist/esm/flow/SmartComplyFlow.js.map +1 -1
  17. package/dist/esm/flow/spinner.js +14 -14
  18. package/dist/esm/modules/liveness/LivenessUI.js +83 -83
  19. package/dist/flow/SmartComplyFlow.d.ts +10 -0
  20. package/dist/flow/SmartComplyFlow.d.ts.map +1 -1
  21. package/dist/flow/SmartComplyFlow.js +107 -33
  22. package/dist/flow/SmartComplyFlow.js.map +1 -1
  23. package/dist/flow/spinner.js +14 -14
  24. package/dist/modules/liveness/LivenessUI.js +83 -83
  25. package/dist/smartcomply.browser.js +60 -16
  26. package/dist/smartcomply.browser.js.map +2 -2
  27. package/package.json +1 -1
  28. package/dist/esm/components/CameraView.d.ts +0 -59
  29. package/dist/esm/components/CameraView.d.ts.map +0 -1
  30. package/dist/esm/components/CameraView.js +0 -238
  31. package/dist/esm/components/CameraView.js.map +0 -1
  32. package/dist/esm/components/DocumentUpload.d.ts +0 -21
  33. package/dist/esm/components/DocumentUpload.d.ts.map +0 -1
  34. package/dist/esm/components/DocumentUpload.js +0 -216
  35. package/dist/esm/components/DocumentUpload.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smartcomply-web-sdk",
3
- "version": "1.0.90",
3
+ "version": "1.0.92",
4
4
  "description": "Drop-in identity verification (KYC) widget for web apps — face liveness, NIN/BVN, document verification",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -1,59 +0,0 @@
1
- /**
2
- * Camera View with Real-time Quality Feedback
3
- * Shows live quality indicators before capture
4
- */
5
- import { QualityFeedback } from "../utils/ImageQuality";
6
- export interface CameraOptions {
7
- width?: number;
8
- height?: number;
9
- facingMode?: "user" | "environment";
10
- isDocumentCapture?: boolean;
11
- }
12
- export interface CaptureResult {
13
- blob: Blob;
14
- quality: QualityFeedback;
15
- selectedFrom: number;
16
- }
17
- export declare class CameraView {
18
- private container;
19
- private video;
20
- private canvas;
21
- private stream;
22
- private qualityOverlay;
23
- private feedbackText;
24
- private isAnalyzing;
25
- private qualityCheckInterval;
26
- onQualityUpdate?: (feedback: QualityFeedback) => void;
27
- onCapture?: (result: CaptureResult) => void;
28
- onError?: (error: Error) => void;
29
- constructor(container: HTMLElement);
30
- /**
31
- * Initialize camera
32
- */
33
- initialize(options?: CameraOptions): Promise<void>;
34
- /**
35
- * Create camera UI with quality overlay
36
- */
37
- private createUI;
38
- /**
39
- * Start real-time quality monitoring
40
- */
41
- private startQualityMonitoring;
42
- /**
43
- * Update quality overlay UI
44
- */
45
- private updateQualityUI;
46
- /**
47
- * Capture multiple frames and select best
48
- */
49
- captureMultipleFrames(count?: number): Promise<CaptureResult>;
50
- /**
51
- * Single capture (for manual mode)
52
- */
53
- captureSingle(): Promise<CaptureResult>;
54
- /**
55
- * Stop camera and cleanup
56
- */
57
- stop(): void;
58
- }
59
- //# sourceMappingURL=CameraView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CameraView.d.ts","sourceRoot":"","sources":["../../../src/components/CameraView.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;IAcT,OAAO,CAAC,SAAS;IAb7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAuB;IAGnD,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBAEb,SAAS,EAAE,WAAW;IAE1C;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD5D;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiDhB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACG,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAkDtE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAI7C;;OAEG;IACH,IAAI,IAAI,IAAI;CAuBb"}
@@ -1,238 +0,0 @@
1
- /**
2
- * Camera View with Real-time Quality Feedback
3
- * Shows live quality indicators before capture
4
- */
5
- import { assessQuality, getQualityColor, getQualityMessage } from "../utils/ImageQuality";
6
- export class CameraView {
7
- constructor(container) {
8
- this.container = container;
9
- this.video = null;
10
- this.canvas = null;
11
- this.stream = null;
12
- this.qualityOverlay = null;
13
- this.feedbackText = null;
14
- this.isAnalyzing = false;
15
- this.qualityCheckInterval = null;
16
- }
17
- /**
18
- * Initialize camera
19
- */
20
- async initialize(options = {}) {
21
- try {
22
- const { isDocumentCapture = false, facingMode = "environment" } = options;
23
- // Use landscape dimensions for documents (1920x1080), portrait for selfie (1280x720)
24
- const width = isDocumentCapture ? 1920 : 1280;
25
- const height = isDocumentCapture ? 1080 : 720;
26
- // Get camera stream with landscape constraints for documents
27
- const videoConstraints = {
28
- width: { ideal: width },
29
- height: { ideal: height },
30
- facingMode: { ideal: facingMode },
31
- };
32
- // For documents, force aspect ratio to landscape
33
- if (isDocumentCapture) {
34
- videoConstraints.aspectRatio = { ideal: 1.77 }; // 16:9 landscape
35
- }
36
- this.stream = await navigator.mediaDevices.getUserMedia({
37
- video: videoConstraints,
38
- audio: false,
39
- });
40
- // Create video element
41
- this.video = document.createElement("video");
42
- this.video.srcObject = this.stream;
43
- this.video.autoplay = true;
44
- this.video.playsInline = true;
45
- // Create canvas for analysis
46
- this.canvas = document.createElement("canvas");
47
- this.canvas.width = width;
48
- this.canvas.height = height;
49
- // Create UI
50
- this.createUI();
51
- // Wait for video to be ready
52
- await new Promise((resolve) => {
53
- this.video.onloadedmetadata = () => {
54
- this.video.play();
55
- resolve(null);
56
- };
57
- });
58
- // Start quality monitoring
59
- this.startQualityMonitoring();
60
- }
61
- catch (error) {
62
- console.error("Camera initialization failed:", error);
63
- this.onError?.(error);
64
- throw error;
65
- }
66
- }
67
- /**
68
- * Create camera UI with quality overlay
69
- */
70
- createUI() {
71
- if (!this.container || !this.video)
72
- return;
73
- // Clear container
74
- this.container.innerHTML = "";
75
- this.container.style.position = "relative";
76
- this.container.style.overflow = "hidden";
77
- this.container.style.borderRadius = "12px";
78
- // Add video
79
- this.video.style.width = "100%";
80
- this.video.style.height = "100%";
81
- this.video.style.objectFit = "cover";
82
- this.container.appendChild(this.video);
83
- // Create quality overlay
84
- this.qualityOverlay = document.createElement("div");
85
- this.qualityOverlay.style.cssText = `
86
- position: absolute;
87
- top: 0;
88
- left: 0;
89
- right: 0;
90
- bottom: 0;
91
- border: 4px solid transparent;
92
- border-radius: 12px;
93
- transition: border-color 0.3s ease;
94
- pointer-events: none;
95
- `;
96
- this.container.appendChild(this.qualityOverlay);
97
- // Create feedback text
98
- this.feedbackText = document.createElement("div");
99
- this.feedbackText.style.cssText = `
100
- position: absolute;
101
- bottom: 20px;
102
- left: 50%;
103
- transform: translateX(-50%);
104
- background: rgba(0, 0, 0, 0.7);
105
- color: white;
106
- padding: 8px 16px;
107
- border-radius: 20px;
108
- font-size: 14px;
109
- font-weight: 500;
110
- white-space: nowrap;
111
- transition: all 0.3s ease;
112
- `;
113
- this.container.appendChild(this.feedbackText);
114
- }
115
- /**
116
- * Start real-time quality monitoring
117
- */
118
- startQualityMonitoring() {
119
- if (!this.video || !this.canvas)
120
- return;
121
- const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
122
- if (!ctx)
123
- return;
124
- const canvas = this.canvas; // Local reference for closure
125
- this.qualityCheckInterval = window.setInterval(() => {
126
- if (this.isAnalyzing || !this.video || this.video.paused || !this.canvas)
127
- return;
128
- this.isAnalyzing = true;
129
- try {
130
- // Draw video frame to canvas
131
- ctx.drawImage(this.video, 0, 0, canvas.width, canvas.height);
132
- // Get image data
133
- const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
134
- // Assess quality
135
- const feedback = assessQuality(imageData);
136
- // Update UI
137
- this.updateQualityUI(feedback);
138
- // Notify callback
139
- this.onQualityUpdate?.(feedback);
140
- }
141
- catch (error) {
142
- console.error("Quality analysis error:", error);
143
- }
144
- finally {
145
- this.isAnalyzing = false;
146
- }
147
- }, 500); // Check every 500ms
148
- }
149
- /**
150
- * Update quality overlay UI
151
- */
152
- updateQualityUI(feedback) {
153
- if (!this.qualityOverlay || !this.feedbackText || !this.video)
154
- return;
155
- const color = getQualityColor(feedback.quality.overallScore);
156
- const message = getQualityMessage(feedback.quality.overallScore);
157
- // Update border color
158
- this.qualityOverlay.style.borderColor = color;
159
- this.qualityOverlay.style.boxShadow = `0 0 20px ${color}40`;
160
- // Update text
161
- this.feedbackText.textContent = message;
162
- this.feedbackText.style.background = feedback.isValid
163
- ? "rgba(34, 197, 94, 0.8)" // Green
164
- : "rgba(239, 68, 68, 0.8)"; // Red
165
- }
166
- /**
167
- * Capture multiple frames and select best
168
- */
169
- async captureMultipleFrames(count = 3) {
170
- if (!this.video || !this.canvas) {
171
- throw new Error("Camera not initialized");
172
- }
173
- const ctx = this.canvas.getContext("2d");
174
- if (!ctx)
175
- throw new Error("Canvas context not available");
176
- const frames = [];
177
- // Capture multiple frames rapidly
178
- for (let i = 0; i < count; i++) {
179
- // Draw current frame
180
- ctx.drawImage(this.video, 0, 0, this.canvas.width, this.canvas.height);
181
- // Get image data for quality check
182
- const imageData = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
183
- const quality = assessQuality(imageData);
184
- // Convert to blob
185
- const blob = await new Promise((resolve) => {
186
- this.canvas.toBlob((b) => resolve(b), "image/jpeg", 0.95);
187
- });
188
- frames.push({
189
- blob,
190
- quality,
191
- timestamp: Date.now(),
192
- });
193
- // Small delay between captures
194
- if (i < count - 1) {
195
- await new Promise(r => setTimeout(r, 200));
196
- }
197
- }
198
- // Select best frame by quality score
199
- const best = frames.reduce((prev, current) => current.quality.quality.overallScore > prev.quality.quality.overallScore
200
- ? current
201
- : prev);
202
- return {
203
- blob: best.blob,
204
- quality: best.quality,
205
- selectedFrom: count,
206
- };
207
- }
208
- /**
209
- * Single capture (for manual mode)
210
- */
211
- async captureSingle() {
212
- return this.captureMultipleFrames(1);
213
- }
214
- /**
215
- * Stop camera and cleanup
216
- */
217
- stop() {
218
- // Stop quality monitoring
219
- if (this.qualityCheckInterval) {
220
- clearInterval(this.qualityCheckInterval);
221
- this.qualityCheckInterval = null;
222
- }
223
- // Stop video stream
224
- if (this.stream) {
225
- this.stream.getTracks().forEach(track => track.stop());
226
- this.stream = null;
227
- }
228
- // Stop video element
229
- if (this.video) {
230
- this.video.pause();
231
- this.video.srcObject = null;
232
- this.video = null;
233
- }
234
- // Clear container
235
- this.container.innerHTML = "";
236
- }
237
- }
238
- //# sourceMappingURL=CameraView.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../../../src/components/CameraView.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Simple document upload component
3
- * Shows file input immediately without camera permission
4
- */
5
- export interface UploadOptions {
6
- onFileSelect?: (file: File) => void;
7
- onError?: (error: string) => void;
8
- onUseCamera?: () => void;
9
- }
10
- export declare class DocumentUpload {
11
- private container;
12
- private options;
13
- private previewImage;
14
- constructor(container: HTMLElement, options?: UploadOptions);
15
- render(theme: any): void;
16
- private handleFile;
17
- private showPreview;
18
- private getTheme;
19
- destroy(): void;
20
- }
21
- //# sourceMappingURL=DocumentUpload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocumentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/DocumentUpload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAiC;gBAEzC,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAK/D,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAgJxB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,QAAQ;IAWhB,OAAO,IAAI,IAAI;CAGhB"}
@@ -1,216 +0,0 @@
1
- /**
2
- * Simple document upload component
3
- * Shows file input immediately without camera permission
4
- */
5
- export class DocumentUpload {
6
- constructor(container, options = {}) {
7
- this.previewImage = null;
8
- this.container = container;
9
- this.options = options;
10
- }
11
- render(theme) {
12
- // Clear container
13
- this.container.innerHTML = "";
14
- // Upload area
15
- const uploadArea = document.createElement("div");
16
- uploadArea.style.cssText = `
17
- width: 100%;
18
- height: 100%;
19
- display: flex;
20
- flex-direction: column;
21
- align-items: center;
22
- justify-content: center;
23
- border: 2px dashed ${theme.border};
24
- border-radius: 12px;
25
- background: ${theme.cardBg};
26
- padding: 40px 20px;
27
- cursor: pointer;
28
- transition: border-color 0.2s, background 0.2s;
29
- `;
30
- // Hover effect
31
- uploadArea.addEventListener("mouseenter", () => {
32
- uploadArea.style.borderColor = theme.primary;
33
- uploadArea.style.background = theme.surface || theme.cardBg;
34
- });
35
- uploadArea.addEventListener("mouseleave", () => {
36
- uploadArea.style.borderColor = theme.border;
37
- uploadArea.style.background = theme.cardBg;
38
- });
39
- // Icon
40
- const icon = document.createElement("div");
41
- icon.textContent = "📁";
42
- icon.style.cssText = `
43
- font-size: 48px;
44
- margin-bottom: 16px;
45
- `;
46
- uploadArea.appendChild(icon);
47
- // Title
48
- const title = document.createElement("div");
49
- title.textContent = "Upload Document";
50
- title.style.cssText = `
51
- font-size: 16px;
52
- font-weight: 600;
53
- color: ${theme.text};
54
- margin-bottom: 8px;
55
- `;
56
- uploadArea.appendChild(title);
57
- // Subtitle
58
- const subtitle = document.createElement("div");
59
- subtitle.textContent = "Click to select or drag & drop";
60
- subtitle.style.cssText = `
61
- font-size: 13px;
62
- color: ${theme.textSecondary};
63
- margin-bottom: 16px;
64
- `;
65
- uploadArea.appendChild(subtitle);
66
- // Or divider
67
- const divider = document.createElement("div");
68
- divider.style.cssText = `
69
- width: 100%;
70
- max-width: 200px;
71
- display: flex;
72
- align-items: center;
73
- gap: 12px;
74
- margin: 8px 0 16px;
75
- `;
76
- divider.innerHTML = `
77
- <span style="flex:1;height:1px;background:${theme.border};"></span>
78
- <span style="color:${theme.textSecondary};font-size:12px;">OR</span>
79
- <span style="flex:1;height:1px;background:${theme.border};"></span>
80
- `;
81
- uploadArea.appendChild(divider);
82
- // Camera button
83
- const cameraBtn = document.createElement("button");
84
- cameraBtn.textContent = "📷 Use Camera";
85
- cameraBtn.style.cssText = `
86
- padding: 10px 20px;
87
- border-radius: 8px;
88
- border: 1px solid ${theme.primary};
89
- background: transparent;
90
- color: ${theme.primary};
91
- font-size: 14px;
92
- cursor: pointer;
93
- font-weight: 500;
94
- `;
95
- cameraBtn.addEventListener("click", (e) => {
96
- e.stopPropagation();
97
- this.options.onUseCamera?.();
98
- });
99
- uploadArea.appendChild(cameraBtn);
100
- // Hidden file input
101
- const fileInput = document.createElement("input");
102
- fileInput.type = "file";
103
- fileInput.accept = "image/*";
104
- fileInput.style.display = "none";
105
- uploadArea.appendChild(fileInput);
106
- // Click handlers
107
- uploadArea.addEventListener("click", (e) => {
108
- if (e.target !== cameraBtn) {
109
- fileInput.click();
110
- }
111
- });
112
- // Drag and drop
113
- uploadArea.addEventListener("dragover", (e) => {
114
- e.preventDefault();
115
- uploadArea.style.borderColor = theme.primary;
116
- uploadArea.style.background = theme.surface || theme.cardBg;
117
- });
118
- uploadArea.addEventListener("dragleave", () => {
119
- uploadArea.style.borderColor = theme.border;
120
- uploadArea.style.background = theme.cardBg;
121
- });
122
- uploadArea.addEventListener("drop", (e) => {
123
- e.preventDefault();
124
- uploadArea.style.borderColor = theme.border;
125
- uploadArea.style.background = theme.cardBg;
126
- const files = e.dataTransfer?.files;
127
- if (files && files.length > 0) {
128
- this.handleFile(files[0]);
129
- }
130
- });
131
- // File select
132
- fileInput.addEventListener("change", () => {
133
- if (fileInput.files && fileInput.files[0]) {
134
- this.handleFile(fileInput.files[0]);
135
- }
136
- });
137
- this.container.appendChild(uploadArea);
138
- }
139
- handleFile(file) {
140
- if (!file.type.startsWith("image/")) {
141
- this.options.onError?.("Please select an image file");
142
- return;
143
- }
144
- // Show preview
145
- this.showPreview(file);
146
- // Notify
147
- this.options.onFileSelect?.(file);
148
- }
149
- showPreview(file) {
150
- const reader = new FileReader();
151
- reader.onload = (e) => {
152
- // Clear and show preview
153
- this.container.innerHTML = "";
154
- const previewContainer = document.createElement("div");
155
- previewContainer.style.cssText = `
156
- width: 100%;
157
- height: 100%;
158
- display: flex;
159
- flex-direction: column;
160
- align-items: center;
161
- gap: 12px;
162
- `;
163
- // Image
164
- const img = document.createElement("img");
165
- img.src = e.target?.result;
166
- img.style.cssText = `
167
- max-width: 100%;
168
- max-height: 70%;
169
- object-fit: contain;
170
- border-radius: 8px;
171
- border: 1px solid ${this.getTheme().border};
172
- `;
173
- previewContainer.appendChild(img);
174
- // File name
175
- const name = document.createElement("div");
176
- name.textContent = file.name;
177
- name.style.cssText = `
178
- font-size: 13px;
179
- color: ${this.getTheme().textSecondary};
180
- `;
181
- previewContainer.appendChild(name);
182
- // Change button
183
- const changeBtn = document.createElement("button");
184
- changeBtn.textContent = "Change File";
185
- changeBtn.style.cssText = `
186
- padding: 8px 16px;
187
- border-radius: 6px;
188
- border: 1px solid ${this.getTheme().border};
189
- background: ${this.getTheme().cardBg};
190
- color: ${this.getTheme().text};
191
- font-size: 13px;
192
- cursor: pointer;
193
- `;
194
- changeBtn.addEventListener("click", () => {
195
- this.render(this.getTheme());
196
- });
197
- previewContainer.appendChild(changeBtn);
198
- this.container.appendChild(previewContainer);
199
- };
200
- reader.readAsDataURL(file);
201
- }
202
- getTheme() {
203
- // Default theme fallback
204
- return {
205
- primary: "#3b82f6",
206
- text: "#1f2937",
207
- textSecondary: "#6b7280",
208
- border: "#e5e7eb",
209
- cardBg: "#ffffff",
210
- };
211
- }
212
- destroy() {
213
- this.container.innerHTML = "";
214
- }
215
- }
216
- //# sourceMappingURL=DocumentUpload.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocumentUpload.js","sourceRoot":"","sources":["../../../src/components/DocumentUpload.ts"],"names":[],"mappings":"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"}