@fileflow/sdk 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,318 @@
1
+ import { CANADIAN_PROVINCES } from '@fileflow/shared';
2
+ import { CanadianAddress } from '@fileflow/shared';
3
+ import { CanadianProvince } from '@fileflow/shared';
4
+ import { ColumnMapping } from '@fileflow/shared';
5
+ import { default as default_2 } from 'react';
6
+ import { DOCUMENT_TYPES } from '@fileflow/shared';
7
+ import { DocumentStatus as DocumentStatus_2 } from '@fileflow/shared';
8
+ import { DocumentType as DocumentType_2 } from '@fileflow/shared';
9
+ import { DriversLicenseData } from '@fileflow/shared';
10
+ import { ExtractedData } from '@fileflow/shared';
11
+ import { FraudFlag } from '@fileflow/shared';
12
+ import { ImportResult } from '@fileflow/shared';
13
+ import { ImportSchema } from '@fileflow/shared';
14
+ import { KYCDocument } from '@fileflow/shared';
15
+ import { KYCSession } from '@fileflow/shared';
16
+ import { ParsedRow } from '@fileflow/shared';
17
+ import { PassportData } from '@fileflow/shared';
18
+ import { ProofOfAddressData } from '@fileflow/shared';
19
+ import { SchemaColumn } from '@fileflow/shared';
20
+ import { StoreApi } from 'zustand';
21
+ import { UseBoundStore } from 'zustand';
22
+ import { ValidationError } from '@fileflow/shared';
23
+ import { ValidationResults } from '@fileflow/shared';
24
+
25
+ export { CANADIAN_PROVINCES }
26
+
27
+ export { CanadianAddress }
28
+
29
+ export { CanadianProvince }
30
+
31
+ export declare const ColumnMapper: default_2.FC<ColumnMapperProps>;
32
+
33
+ declare interface ColumnMapperProps {
34
+ onMappingChange?: (sourceColumn: string, targetKey: string | null) => void;
35
+ }
36
+
37
+ export { ColumnMapping }
38
+
39
+ export declare const DataTable: default_2.FC<DataTableProps>;
40
+
41
+ declare interface DataTableProps {
42
+ editable?: boolean;
43
+ pageSize?: number;
44
+ onCellEdit?: (rowIndex: number, columnKey: string, value: string) => void;
45
+ }
46
+
47
+ export { DOCUMENT_TYPES }
48
+
49
+ declare interface DocumentState {
50
+ id: string | null;
51
+ type: DocumentType_2;
52
+ status: DocumentStatus_2;
53
+ file: File | null;
54
+ previewUrl: string | null;
55
+ extractedData: ExtractedData | null;
56
+ confidence: number;
57
+ fraudFlags: FraudFlag[];
58
+ error: string | null;
59
+ }
60
+
61
+ export declare const DocumentStatus: default_2.FC<DocumentStatusProps>;
62
+
63
+ declare interface DocumentStatusProps {
64
+ documentType: DocumentType_2;
65
+ showDetails?: boolean;
66
+ }
67
+
68
+ export { DocumentType_2 as DocumentType }
69
+
70
+ export declare const DocumentUploader: default_2.FC<DocumentUploaderProps>;
71
+
72
+ declare interface DocumentUploaderProps {
73
+ documentType: DocumentType_2;
74
+ onFileSelect?: (file: File) => void;
75
+ }
76
+
77
+ export { DriversLicenseData }
78
+
79
+ export { ExtractedData }
80
+
81
+ export declare class FileFlowClient {
82
+ private client;
83
+ constructor(config: FileFlowClientConfig);
84
+ createImportSession(schema: object, metadata?: object): Promise<{
85
+ sessionId: string;
86
+ status: string;
87
+ expiresAt: string;
88
+ }>;
89
+ uploadFile(sessionId: string, file: File): Promise<{
90
+ sessionId: string;
91
+ status: string;
92
+ file: {
93
+ name: string;
94
+ size: number;
95
+ type: string;
96
+ };
97
+ data: {
98
+ headers: string[];
99
+ totalRows: number;
100
+ sampleRows: object[];
101
+ };
102
+ }>;
103
+ matchColumns(sessionId: string): Promise<{
104
+ sessionId: string;
105
+ status: string;
106
+ sourceColumns: string[];
107
+ targetColumns: object[];
108
+ mappings: object[];
109
+ unmappedSource: string[];
110
+ unmappedTarget: string[];
111
+ suggestions: object[];
112
+ }>;
113
+ updateMappings(sessionId: string, mappings: object[]): Promise<{
114
+ sessionId: string;
115
+ status: string;
116
+ mappings: object[];
117
+ }>;
118
+ validateImport(sessionId: string): Promise<{
119
+ sessionId: string;
120
+ status: string;
121
+ validation: object;
122
+ }>;
123
+ completeImport(sessionId: string, options?: {
124
+ skipInvalidRows?: boolean;
125
+ acknowledgeWarnings?: boolean;
126
+ }): Promise<{
127
+ sessionId: string;
128
+ status: string;
129
+ totalRows: number;
130
+ importedRows: number;
131
+ skippedRows: number;
132
+ data: object[];
133
+ }>;
134
+ createKYCSession(requiredDocuments: string[], metadata?: object): Promise<{
135
+ sessionId: string;
136
+ status: string;
137
+ requiredDocuments: string[];
138
+ expiresAt: string;
139
+ }>;
140
+ uploadKYCDocument(sessionId: string, documentType: string, file: File): Promise<{
141
+ documentId: string;
142
+ sessionId: string;
143
+ type: string;
144
+ status: string;
145
+ estimatedProcessingTime: number;
146
+ }>;
147
+ getKYCDocument(documentId: string): Promise<{
148
+ document: object;
149
+ session: object;
150
+ }>;
151
+ verifyKYCSession(sessionId: string, acceptWarnings?: boolean): Promise<{
152
+ sessionId: string;
153
+ verificationStatus: object;
154
+ }>;
155
+ }
156
+
157
+ export declare interface FileFlowClientConfig {
158
+ apiKey?: string;
159
+ apiUrl?: string;
160
+ timeout?: number;
161
+ }
162
+
163
+ export declare class FileFlowError extends Error {
164
+ code: string;
165
+ status: number;
166
+ details?: object | undefined;
167
+ constructor(code: string, message: string, status: number, details?: object | undefined);
168
+ }
169
+
170
+ export declare const FileUploader: default_2.FC<FileUploaderProps>;
171
+
172
+ declare interface FileUploaderProps {
173
+ onFileSelect?: (file: File) => void;
174
+ maxSize?: number;
175
+ acceptedTypes?: string[];
176
+ }
177
+
178
+ export { FraudFlag }
179
+
180
+ export declare function getClient(): FileFlowClient;
181
+
182
+ declare interface ImportActions {
183
+ setSchema: (schema: ImportSchema) => void;
184
+ setSessionId: (sessionId: string) => void;
185
+ setFile: (file: File) => void;
186
+ setParsedData: (data: {
187
+ headers: string[];
188
+ rows: ParsedRow[];
189
+ totalRows: number;
190
+ sampleRows: ParsedRow[];
191
+ }) => void;
192
+ setMappings: (mappings: ColumnMapping[]) => void;
193
+ updateMapping: (sourceColumn: string, targetKey: string | null) => void;
194
+ setUnmapped: (source: string[], target: string[]) => void;
195
+ setValidationResults: (results: ValidationResults) => void;
196
+ setStep: (step: ImportStep) => void;
197
+ nextStep: () => void;
198
+ previousStep: () => void;
199
+ startEditing: (rowIndex: number, columnKey: string) => void;
200
+ stopEditing: () => void;
201
+ updateCell: (rowIndex: number, columnKey: string, value: unknown) => void;
202
+ setStatus: (status: string) => void;
203
+ setLoading: (loading: boolean) => void;
204
+ setError: (error: string | null) => void;
205
+ reset: () => void;
206
+ }
207
+
208
+ export { ImportResult }
209
+
210
+ export { ImportSchema }
211
+
212
+ export declare interface ImportState {
213
+ sessionId: string | null;
214
+ status: string;
215
+ step: ImportStep;
216
+ schema: ImportSchema | null;
217
+ file: File | null;
218
+ fileName: string | null;
219
+ fileSize: number | null;
220
+ headers: string[];
221
+ rows: ParsedRow[];
222
+ totalRows: number;
223
+ sampleRows: ParsedRow[];
224
+ mappings: ColumnMapping[];
225
+ unmappedSource: string[];
226
+ unmappedTarget: string[];
227
+ validationResults: ValidationResults | null;
228
+ errorsByRow: Map<number, ValidationError[]>;
229
+ isLoading: boolean;
230
+ error: string | null;
231
+ editingCell: {
232
+ rowIndex: number;
233
+ columnKey: string;
234
+ } | null;
235
+ editedRows: Set<number>;
236
+ }
237
+
238
+ export declare type ImportStep = 'upload' | 'mapping' | 'validation' | 'review' | 'complete';
239
+
240
+ export declare const ImportWizard: default_2.FC<ImportWizardProps>;
241
+
242
+ declare interface ImportWizardProps {
243
+ schema: ImportSchema;
244
+ onComplete?: (result: ImportResult) => void;
245
+ onCancel?: () => void;
246
+ onError?: (error: Error) => void;
247
+ }
248
+
249
+ export declare function initializeClient(config: FileFlowClientConfig): FileFlowClient;
250
+
251
+ declare interface KYCActions {
252
+ setSessionId: (sessionId: string) => void;
253
+ setRequiredDocuments: (documents: DocumentType_2[]) => void;
254
+ setCurrentDocumentType: (type: DocumentType_2) => void;
255
+ setDocumentFile: (type: DocumentType_2, file: File) => void;
256
+ setDocumentStatus: (type: DocumentType_2, status: DocumentStatus_2) => void;
257
+ setDocumentData: (type: DocumentType_2, data: Partial<DocumentState>) => void;
258
+ clearDocumentPreview: (type: DocumentType_2) => void;
259
+ setStep: (step: KYCStep) => void;
260
+ nextDocument: () => void;
261
+ setVerificationStatus: (status: object) => void;
262
+ setVerified: (verified: boolean) => void;
263
+ setStatus: (status: string) => void;
264
+ setLoading: (loading: boolean) => void;
265
+ setError: (error: string | null) => void;
266
+ getNextRequiredDocument: () => DocumentType_2 | null;
267
+ areAllDocumentsUploaded: () => boolean;
268
+ areAllDocumentsProcessed: () => boolean;
269
+ reset: () => void;
270
+ }
271
+
272
+ export { KYCDocument }
273
+
274
+ export { KYCSession }
275
+
276
+ export declare interface KYCState {
277
+ sessionId: string | null;
278
+ status: string;
279
+ step: KYCStep;
280
+ requiredDocuments: DocumentType_2[];
281
+ currentDocumentType: DocumentType_2 | null;
282
+ documents: Map<DocumentType_2, DocumentState>;
283
+ isVerified: boolean;
284
+ verificationStatus: object | null;
285
+ isLoading: boolean;
286
+ error: string | null;
287
+ }
288
+
289
+ export declare type KYCStep = 'select' | 'upload' | 'processing' | 'review' | 'complete';
290
+
291
+ export declare const KYCWizard: default_2.FC<KYCWizardProps>;
292
+
293
+ declare interface KYCWizardProps {
294
+ requiredDocuments: DocumentType_2[];
295
+ onComplete?: (session: KYCSession) => void;
296
+ onCancel?: () => void;
297
+ onError?: (error: Error) => void;
298
+ }
299
+
300
+ export { PassportData }
301
+
302
+ export { ProofOfAddressData }
303
+
304
+ export { SchemaColumn }
305
+
306
+ export declare const useImportStore: UseBoundStore<StoreApi<ImportState & ImportActions>>;
307
+
308
+ export declare const useKYCStore: UseBoundStore<StoreApi<KYCState & KYCActions>>;
309
+
310
+ export { ValidationResults }
311
+
312
+ export declare const ValidationSummary: default_2.FC<ValidationSummaryProps>;
313
+
314
+ declare interface ValidationSummaryProps {
315
+ showDetails?: boolean;
316
+ }
317
+
318
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./index-BdodGzlO.js"),e=require("./ImportWizard-mc9UDwP3.js"),t=require("./KYCWizard-CRBXY9Np.js");exports.FileFlowClient=r.FileFlowClient;exports.FileFlowError=r.FileFlowError;exports.getClient=r.getClient;exports.initializeClient=r.initializeClient;exports.ColumnMapper=e.ColumnMapper;exports.DataTable=e.DataTable;exports.FileUploader=e.FileUploader;exports.ImportWizard=e.ImportWizard;exports.ValidationSummary=e.ValidationSummary;exports.useImportStore=e.useImportStore;exports.CANADIAN_PROVINCES=t.CANADIAN_PROVINCES;exports.DOCUMENT_TYPES=t.DOCUMENT_TYPES;exports.DocumentStatus=t.DocumentStatus;exports.DocumentUploader=t.DocumentUploader;exports.KYCWizard=t.KYCWizard;exports.useKYCStore=t.useKYCStore;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/index.mjs ADDED
@@ -0,0 +1,22 @@
1
+ import { F as o, a as r, g as s, i as t } from "./index-CML_nPxo.mjs";
2
+ import { C as l, D as C, F as m, I as p, V as u, u as n } from "./ImportWizard-BkHlsJ8v.mjs";
3
+ import { C as F, b as S, a as d, D as I, K as E, u as N } from "./KYCWizard-D3Leb4rK.mjs";
4
+ export {
5
+ F as CANADIAN_PROVINCES,
6
+ l as ColumnMapper,
7
+ S as DOCUMENT_TYPES,
8
+ C as DataTable,
9
+ d as DocumentStatus,
10
+ I as DocumentUploader,
11
+ o as FileFlowClient,
12
+ r as FileFlowError,
13
+ m as FileUploader,
14
+ p as ImportWizard,
15
+ E as KYCWizard,
16
+ u as ValidationSummary,
17
+ s as getClient,
18
+ t as initializeClient,
19
+ n as useImportStore,
20
+ N as useKYCStore
21
+ };
22
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/dist/kyc.d.ts ADDED
@@ -0,0 +1,83 @@
1
+ import { default as default_2 } from 'react';
2
+ import { DocumentStatus as DocumentStatus_2 } from '@fileflow/shared';
3
+ import { DocumentType as DocumentType_2 } from '@fileflow/shared';
4
+ import { ExtractedData } from '@fileflow/shared';
5
+ import { FraudFlag } from '@fileflow/shared';
6
+ import { KYCSession } from '@fileflow/shared';
7
+ import { StoreApi } from 'zustand';
8
+ import { UseBoundStore } from 'zustand';
9
+
10
+ declare interface DocumentState {
11
+ id: string | null;
12
+ type: DocumentType_2;
13
+ status: DocumentStatus_2;
14
+ file: File | null;
15
+ previewUrl: string | null;
16
+ extractedData: ExtractedData | null;
17
+ confidence: number;
18
+ fraudFlags: FraudFlag[];
19
+ error: string | null;
20
+ }
21
+
22
+ export declare const DocumentStatus: default_2.FC<DocumentStatusProps>;
23
+
24
+ declare interface DocumentStatusProps {
25
+ documentType: DocumentType_2;
26
+ showDetails?: boolean;
27
+ }
28
+
29
+ export declare const DocumentUploader: default_2.FC<DocumentUploaderProps>;
30
+
31
+ declare interface DocumentUploaderProps {
32
+ documentType: DocumentType_2;
33
+ onFileSelect?: (file: File) => void;
34
+ }
35
+
36
+ declare interface KYCActions {
37
+ setSessionId: (sessionId: string) => void;
38
+ setRequiredDocuments: (documents: DocumentType_2[]) => void;
39
+ setCurrentDocumentType: (type: DocumentType_2) => void;
40
+ setDocumentFile: (type: DocumentType_2, file: File) => void;
41
+ setDocumentStatus: (type: DocumentType_2, status: DocumentStatus_2) => void;
42
+ setDocumentData: (type: DocumentType_2, data: Partial<DocumentState>) => void;
43
+ clearDocumentPreview: (type: DocumentType_2) => void;
44
+ setStep: (step: KYCStep) => void;
45
+ nextDocument: () => void;
46
+ setVerificationStatus: (status: object) => void;
47
+ setVerified: (verified: boolean) => void;
48
+ setStatus: (status: string) => void;
49
+ setLoading: (loading: boolean) => void;
50
+ setError: (error: string | null) => void;
51
+ getNextRequiredDocument: () => DocumentType_2 | null;
52
+ areAllDocumentsUploaded: () => boolean;
53
+ areAllDocumentsProcessed: () => boolean;
54
+ reset: () => void;
55
+ }
56
+
57
+ export declare interface KYCState {
58
+ sessionId: string | null;
59
+ status: string;
60
+ step: KYCStep;
61
+ requiredDocuments: DocumentType_2[];
62
+ currentDocumentType: DocumentType_2 | null;
63
+ documents: Map<DocumentType_2, DocumentState>;
64
+ isVerified: boolean;
65
+ verificationStatus: object | null;
66
+ isLoading: boolean;
67
+ error: string | null;
68
+ }
69
+
70
+ export declare type KYCStep = 'select' | 'upload' | 'processing' | 'review' | 'complete';
71
+
72
+ export declare const KYCWizard: default_2.FC<KYCWizardProps>;
73
+
74
+ declare interface KYCWizardProps {
75
+ requiredDocuments: DocumentType_2[];
76
+ onComplete?: (session: KYCSession) => void;
77
+ onCancel?: () => void;
78
+ onError?: (error: Error) => void;
79
+ }
80
+
81
+ export declare const useKYCStore: UseBoundStore<StoreApi<KYCState & KYCActions>>;
82
+
83
+ export { }
package/dist/kyc.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./KYCWizard-CRBXY9Np.js");exports.DocumentStatus=e.DocumentStatus;exports.DocumentUploader=e.DocumentUploader;exports.KYCWizard=e.KYCWizard;exports.useKYCStore=e.useKYCStore;
2
+ //# sourceMappingURL=kyc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kyc.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/kyc.mjs ADDED
@@ -0,0 +1,8 @@
1
+ import { a as o, D as s, K as t, u as r } from "./KYCWizard-D3Leb4rK.mjs";
2
+ export {
3
+ o as DocumentStatus,
4
+ s as DocumentUploader,
5
+ t as KYCWizard,
6
+ r as useKYCStore
7
+ };
8
+ //# sourceMappingURL=kyc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kyc.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,SF Mono,Monaco,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.ff-container{width:100%}@media (min-width: 640px){.ff-container{max-width:640px}}@media (min-width: 768px){.ff-container{max-width:768px}}@media (min-width: 1024px){.ff-container{max-width:1024px}}@media (min-width: 1280px){.ff-container{max-width:1280px}}@media (min-width: 1536px){.ff-container{max-width:1536px}}.ff-relative{position:relative}.ff-bottom-full{bottom:100%}.ff-left-1\/2{left:50%}.ff-mx-4{margin-left:1rem;margin-right:1rem}.ff-mx-auto{margin-left:auto;margin-right:auto}.ff-mb-2{margin-bottom:.5rem}.ff-mb-4{margin-bottom:1rem}.ff-mb-6{margin-bottom:1.5rem}.ff-mr-1{margin-right:.25rem}.ff-mr-2{margin-right:.5rem}.ff-mt-0\.5{margin-top:.125rem}.ff-mt-1{margin-top:.25rem}.ff-mt-2{margin-top:.5rem}.ff-block{display:block}.ff-flex{display:flex}.ff-table{display:table}.ff-grid{display:grid}.ff-aspect-\[3\/4\]{aspect-ratio:3/4}.ff-h-0\.5{height:.125rem}.ff-h-10{height:2.5rem}.ff-h-12{height:3rem}.ff-h-16{height:4rem}.ff-h-2{height:.5rem}.ff-h-3{height:.75rem}.ff-h-4{height:1rem}.ff-h-5{height:1.25rem}.ff-h-6{height:1.5rem}.ff-h-8{height:2rem}.ff-h-full{height:100%}.ff-max-h-96{max-height:24rem}.ff-max-h-\[500px\]{max-height:500px}.ff-max-h-\[90vh\]{max-height:90vh}.ff-min-h-0{min-height:0px}.ff-min-h-\[200px\]{min-height:200px}.ff-w-10{width:2.5rem}.ff-w-12{width:3rem}.ff-w-16{width:4rem}.ff-w-2{width:.5rem}.ff-w-3{width:.75rem}.ff-w-4{width:1rem}.ff-w-48{width:12rem}.ff-w-5{width:1.25rem}.ff-w-6{width:1.5rem}.ff-w-8{width:2rem}.ff-w-full{width:100%}.ff-min-w-0{min-width:0px}.ff-max-w-lg{max-width:32rem}.ff-max-w-xl{max-width:36rem}.ff-max-w-xs{max-width:20rem}.ff-flex-1{flex:1 1 0%}.ff-flex-shrink-0{flex-shrink:0}.ff--translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ff-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ff-animate-spin{animation:ff-spin 1s linear infinite}.ff-cursor-not-allowed{cursor:not-allowed}.ff-cursor-pointer{cursor:pointer}.ff-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ff-list-inside{list-style-position:inside}.ff-list-disc{list-style-type:disc}.ff-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.ff-flex-col{flex-direction:column}.ff-flex-wrap{flex-wrap:wrap}.ff-items-start{align-items:flex-start}.ff-items-center{align-items:center}.ff-justify-center{justify-content:center}.ff-justify-between{justify-content:space-between}.ff-gap-1{gap:.25rem}.ff-gap-1\.5{gap:.375rem}.ff-gap-2{gap:.5rem}.ff-gap-3{gap:.75rem}.ff-gap-4{gap:1rem}.ff-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.ff-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.ff-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.ff-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.ff-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.ff-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.ff-divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.ff-overflow-hidden{overflow:hidden}.ff-overflow-y-auto{overflow-y:auto}.ff-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ff-rounded{border-radius:.5rem}.ff-rounded-full{border-radius:9999px}.ff-rounded-lg{border-radius:.5rem}.ff-rounded-xl{border-radius:.75rem}.ff-border{border-width:1px}.ff-border-2{border-width:2px}.ff-border-b{border-bottom-width:1px}.ff-border-t{border-top-width:1px}.ff-border-error-200{--tw-border-opacity: 1;border-color:rgb(243 163 163 / var(--tw-border-opacity, 1))}.ff-border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.ff-border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.ff-border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.ff-border-success-200{--tw-border-opacity: 1;border-color:rgb(153 223 195 / var(--tw-border-opacity, 1))}.ff-border-success-300{--tw-border-opacity: 1;border-color:rgb(102 207 165 / var(--tw-border-opacity, 1))}.ff-border-warning-200{--tw-border-opacity: 1;border-color:rgb(251 219 153 / var(--tw-border-opacity, 1))}.ff-border-warning-300{--tw-border-opacity: 1;border-color:rgb(249 201 102 / var(--tw-border-opacity, 1))}.ff-bg-error-100{--tw-bg-opacity: 1;background-color:rgb(249 209 209 / var(--tw-bg-opacity, 1))}.ff-bg-error-50{--tw-bg-opacity: 1;background-color:rgb(252 232 232 / var(--tw-bg-opacity, 1))}.ff-bg-error-50\/30{background-color:#fce8e84d}.ff-bg-error-500{--tw-bg-opacity: 1;background-color:rgb(209 52 56 / var(--tw-bg-opacity, 1))}.ff-bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.ff-bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.ff-bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.ff-bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.ff-bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.ff-bg-success-100{--tw-bg-opacity: 1;background-color:rgb(204 239 225 / var(--tw-bg-opacity, 1))}.ff-bg-success-300{--tw-bg-opacity: 1;background-color:rgb(102 207 165 / var(--tw-bg-opacity, 1))}.ff-bg-success-50{--tw-bg-opacity: 1;background-color:rgb(230 247 240 / var(--tw-bg-opacity, 1))}.ff-bg-success-50\/50{background-color:#e6f7f080}.ff-bg-success-500{--tw-bg-opacity: 1;background-color:rgb(0 168 107 / var(--tw-bg-opacity, 1))}.ff-bg-warning-100{--tw-bg-opacity: 1;background-color:rgb(253 237 204 / var(--tw-bg-opacity, 1))}.ff-bg-warning-50{--tw-bg-opacity: 1;background-color:rgb(254 246 230 / var(--tw-bg-opacity, 1))}.ff-bg-warning-50\/50{background-color:#fef6e680}.ff-bg-warning-500{--tw-bg-opacity: 1;background-color:rgb(245 166 35 / var(--tw-bg-opacity, 1))}.ff-bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.ff-object-contain{-o-object-fit:contain;object-fit:contain}.ff-p-1{padding:.25rem}.ff-p-1\.5{padding:.375rem}.ff-p-2{padding:.5rem}.ff-p-3{padding:.75rem}.ff-p-4{padding:1rem}.ff-p-6{padding:1.5rem}.ff-px-2{padding-left:.5rem;padding-right:.5rem}.ff-px-4{padding-left:1rem;padding-right:1rem}.ff-px-6{padding-left:1.5rem;padding-right:1.5rem}.ff-py-1{padding-top:.25rem;padding-bottom:.25rem}.ff-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.ff-py-12{padding-top:3rem;padding-bottom:3rem}.ff-py-3{padding-top:.75rem;padding-bottom:.75rem}.ff-py-4{padding-top:1rem;padding-bottom:1rem}.ff-text-left{text-align:left}.ff-text-center{text-align:center}.ff-text-right{text-align:right}.ff-font-mono{font-family:JetBrains Mono,SF Mono,Monaco,monospace}.ff-text-2xl{font-size:1.5rem;line-height:2rem}.ff-text-base{font-size:1rem;line-height:1.5rem}.ff-text-lg{font-size:1.125rem;line-height:1.75rem}.ff-text-sm{font-size:.875rem;line-height:1.25rem}.ff-text-xl{font-size:1.25rem;line-height:1.75rem}.ff-text-xs{font-size:.75rem;line-height:1rem}.ff-font-bold{font-weight:700}.ff-font-medium{font-weight:500}.ff-font-semibold{font-weight:600}.ff-text-error-500{--tw-text-opacity: 1;color:rgb(209 52 56 / var(--tw-text-opacity, 1))}.ff-text-error-600{--tw-text-opacity: 1;color:rgb(167 42 45 / var(--tw-text-opacity, 1))}.ff-text-error-700{--tw-text-opacity: 1;color:rgb(125 31 34 / var(--tw-text-opacity, 1))}.ff-text-error-800{--tw-text-opacity: 1;color:rgb(84 21 22 / var(--tw-text-opacity, 1))}.ff-text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.ff-text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.ff-text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.ff-text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.ff-text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.ff-text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.ff-text-success-600{--tw-text-opacity: 1;color:rgb(0 135 85 / var(--tw-text-opacity, 1))}.ff-text-success-700{--tw-text-opacity: 1;color:rgb(0 102 64 / var(--tw-text-opacity, 1))}.ff-text-success-800{--tw-text-opacity: 1;color:rgb(0 68 42 / var(--tw-text-opacity, 1))}.ff-text-warning-500{--tw-text-opacity: 1;color:rgb(245 166 35 / var(--tw-text-opacity, 1))}.ff-text-warning-600{--tw-text-opacity: 1;color:rgb(196 133 28 / var(--tw-text-opacity, 1))}.ff-text-warning-700{--tw-text-opacity: 1;color:rgb(147 100 21 / var(--tw-text-opacity, 1))}.ff-text-warning-800{--tw-text-opacity: 1;color:rgb(98 66 14 / var(--tw-text-opacity, 1))}.ff-opacity-0{opacity:0}.ff-opacity-50{opacity:.5}.ff-shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ff-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ff-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ff-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ff-container{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));font-feature-settings:"cv02","cv03","cv04","cv11"}.ff-table-container{position:relative;overflow:auto;border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.ff-table{width:100%;font-size:.875rem;line-height:1.25rem}.ff-table thead{position:sticky;top:0;z-index:10;--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-table th{padding:.75rem 1rem;text-align:left;font-weight:600;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));border-bottom-width:2px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));font-size:.75rem;line-height:1rem;text-transform:uppercase;letter-spacing:.05em}.ff-table td{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));padding:.75rem 1rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-table tbody tr{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ff-table tbody tr:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-cell-error{border-left-width:4px;--tw-border-opacity: 1;border-left-color:rgb(239 68 68 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.ff-cell-warning{border-left-width:4px;--tw-border-opacity: 1;border-left-color:rgb(245 158 11 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.ff-cell-editing{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(52 211 153 / var(--tw-ring-opacity, 1))}.ff-cell-success{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.ff-input{width:100%;border-radius:.75rem;border-width:2px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-input::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.ff-input::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.ff-input{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.ff-input:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.ff-input:focus{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity, 1))}.ff-input-error{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.ff-input-error:focus{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1));--tw-ring-opacity: 1;--tw-ring-color: rgb(254 226 226 / var(--tw-ring-opacity, 1))}.ff-select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;border-radius:.75rem;border-width:2px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-select::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.ff-select::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity, 1))}.ff-select{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.ff-select:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.ff-select:focus{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-opacity: 1;--tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity, 1))}.ff-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .75rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem}.ff-btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.ff-btn:disabled{cursor:not-allowed;opacity:.5}.ff-btn-primary{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));background-color:#9fe870}.ff-btn-primary:hover:not(:disabled){background-color:#7ed94a;transform:translateY(-1px);box-shadow:0 4px 12px -2px #0000001f}.ff-btn-primary:active:not(:disabled){background-color:#5fc02a;transform:translateY(0)}.ff-btn-secondary{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));background-color:#0a2540}.ff-btn-secondary:hover:not(:disabled){background-color:#254063;transform:translateY(-1px);box-shadow:0 4px 12px -2px #0000001f}.ff-btn-outline{border-width:2px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-btn-outline:hover:not(:disabled){--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-btn-ghost{background-color:transparent;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.ff-btn-ghost:hover:not(:disabled){--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-btn-danger{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.ff-btn-danger:hover:not(:disabled){--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));transform:translateY(-1px)}.ff-btn-sm{border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.ff-btn-lg{border-radius:1rem;padding:1rem 2rem;font-size:1rem;line-height:1.5rem}.ff-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:1rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));padding:2.5rem;cursor:pointer;--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.ff-dropzone:hover{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.ff-dropzone-active{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1));transform:scale(1.01)}.ff-dropzone-icon{margin-bottom:1rem;height:4rem;width:4rem;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.ff-dropzone:hover .ff-dropzone-icon{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.ff-dropzone-text{margin-bottom:.25rem;font-size:1rem;line-height:1.5rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-dropzone-hint{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.ff-badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:600}.ff-badge-error{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.ff-badge-warning{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.ff-badge-success{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.ff-badge-info{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.ff-badge-neutral{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-badge-wise{background-color:#ddf9c8;color:#2e5c1b}.ff-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;background-color:#0a254099;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.ff-modal{max-height:90vh;width:100%;max-width:56rem;overflow:hidden;border-radius:1.5rem;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));margin-left:1rem;margin-right:1rem;box-shadow:0 25px 50px -12px #00000040;animation:modalSlideUp .3s ease-out}@keyframes modalSlideUp{0%{opacity:0;transform:translateY(20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ff-modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));padding:1.25rem 1.5rem}.ff-modal-title{font-size:1.25rem;line-height:1.75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-modal-body{overflow:auto;padding:1.5rem}.ff-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-progress{height:.5rem;overflow:hidden;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.ff-progress-bar{height:100%;border-radius:9999px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.5s;transition-timing-function:cubic-bezier(0,0,.2,1);background-color:#9fe870}.ff-progress-bar-animated{background:linear-gradient(90deg,#9fe870,#7ed94a,#9fe870);background-size:200% 100%;animation:shimmer 2s linear infinite}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.ff-tooltip{position:absolute;z-index:50;border-radius:.5rem;padding:.5rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));visibility:hidden;opacity:0;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;background-color:#0a2540;box-shadow:0 4px 12px -2px #0003}.ff-tooltip-visible{visibility:visible;opacity:1}.ff-spinner{height:1.25rem;width:1.25rem}@keyframes ff-spin{to{transform:rotate(360deg)}}.ff-spinner{animation:ff-spin 1s linear infinite;border-radius:9999px;border-width:2px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));border-top-color:#9fe870}.ff-spinner-lg{height:2rem;width:2rem;border-width:3px}.ff-document-preview{position:relative;overflow:hidden;border-radius:1rem;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.ff-document-preview img{height:auto;width:100%;-o-object-fit:contain;object-fit:contain}.ff-mapping-row{display:flex;align-items:center;gap:1rem;border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.ff-mapping-row:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.ff-mapping-source{flex:1 1 0%;border-radius:.5rem;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.5rem 1rem;font-family:JetBrains Mono,SF Mono,Monaco,monospace;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.ff-mapping-arrow{flex-shrink:0;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.ff-mapping-target{flex:1 1 0%}.ff-confidence{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;line-height:1rem;font-weight:500}.ff-confidence-high{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.ff-confidence-medium{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.ff-confidence-low{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.ff-confidence-bar{height:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.ff-confidence-bar-fill{height:100%;border-radius:9999px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.ff-steps{display:flex;align-items:center;gap:.5rem}.ff-step{display:flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:9999px;font-size:.875rem;line-height:1.25rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.ff-step-pending{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.ff-step-active{background-color:#9fe870;color:#163300}.ff-step-complete{background-color:#5fc02a;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.ff-step-connector{height:.125rem;width:2rem;--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.ff-step-connector-complete{background-color:#7ed94a}.ff-validation-summary{border-radius:.75rem;border-width:1px;padding:1rem}.ff-validation-summary-error{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.ff-validation-summary-warning{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.ff-validation-summary-success{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.ff-card{border-radius:1rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));box-shadow:0 2px 8px -2px #0000000a}.ff-card-hover{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.ff-card-hover:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));box-shadow:0 8px 24px -4px #00000014;transform:translateY(-2px)}.ff-status{display:inline-flex;align-items:center;gap:.5rem}.ff-status-dot{height:.5rem;width:.5rem;border-radius:9999px}.ff-status-dot-success{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.ff-status-dot-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.ff-status-dot-error{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.ff-status-dot-pending{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.ff-status-dot-processing{animation:ff-pulse 2s cubic-bezier(.4,0,.6,1) infinite;--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.ff-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:3rem;padding-bottom:3rem;text-align:center}.ff-empty-state-icon{margin-bottom:1rem;height:4rem;width:4rem;--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.ff-empty-state-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.ff-empty-state-description{max-width:24rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}@keyframes ff-pulse{50%{opacity:.5}}.ff-skeleton{animation:ff-pulse 2s cubic-bezier(.4,0,.6,1) infinite;border-radius:.5rem;--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.ff-skeleton-text{height:1rem;border-radius:.5rem}.ff-skeleton-title{height:1.5rem;width:75%;border-radius:.5rem}.ff-skeleton-avatar{height:2.5rem;width:2.5rem;border-radius:9999px}.ff-fade-in{animation:fadeIn .3s ease-out}.ff-slide-up{animation:slideUp .3s ease-out}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.hover\:ff-bg-error-50:hover{--tw-bg-opacity: 1;background-color:rgb(252 232 232 / var(--tw-bg-opacity, 1))}.hover\:ff-bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:ff-bg-green-100:hover{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.hover\:ff-bg-success-50:hover{--tw-bg-opacity: 1;background-color:rgb(230 247 240 / var(--tw-bg-opacity, 1))}.hover\:ff-text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:ff-text-green-800:hover{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.ff-group:hover .group-hover\:ff-opacity-100{opacity:1}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@fileflow/sdk",
3
+ "version": "0.1.0",
4
+ "description": "FileFlow SDK - Embeddable data import and KYC verification components",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./import": {
15
+ "import": "./dist/import.mjs",
16
+ "require": "./dist/import.js",
17
+ "types": "./dist/import.d.ts"
18
+ },
19
+ "./kyc": {
20
+ "import": "./dist/kyc.mjs",
21
+ "require": "./dist/kyc.js",
22
+ "types": "./dist/kyc.d.ts"
23
+ },
24
+ "./styles.css": "./dist/styles.css"
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "dev": "vite build --watch",
31
+ "build": "tsc && vite build",
32
+ "lint": "eslint src --ext .ts,.tsx",
33
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
34
+ "typecheck": "tsc --noEmit",
35
+ "clean": "rm -rf dist"
36
+ },
37
+ "peerDependencies": {
38
+ "react": ">=17.0.0",
39
+ "react-dom": ">=17.0.0"
40
+ },
41
+ "dependencies": {
42
+ "@fileflow/shared": "^0.1.0",
43
+ "@tanstack/react-table": "^8.11.6",
44
+ "axios": "^1.6.7",
45
+ "clsx": "^2.1.0",
46
+ "lucide-react": "^0.321.0",
47
+ "react-dropzone": "^14.2.3",
48
+ "zustand": "^4.5.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/react": "^18.2.48",
52
+ "@types/react-dom": "^18.2.18",
53
+ "@vitejs/plugin-react": "^4.2.1",
54
+ "autoprefixer": "^10.4.17",
55
+ "postcss": "^8.4.33",
56
+ "react": "^18.2.0",
57
+ "react-dom": "^18.2.0",
58
+ "tailwindcss": "^3.4.1",
59
+ "typescript": "^5.3.3",
60
+ "vite": "^5.0.12",
61
+ "vite-plugin-dts": "^3.7.1"
62
+ },
63
+ "keywords": [
64
+ "fileflow",
65
+ "csv-import",
66
+ "data-import",
67
+ "kyc",
68
+ "document-verification",
69
+ "react",
70
+ "typescript"
71
+ ],
72
+ "license": "MIT"
73
+ }