@vpdev2/metakyc 1.0.25 → 1.0.26
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/dist/components/CreateApplicantForm.d.ts.map +1 -1
- package/dist/components/CreateCompanyApplicantForm.d.ts.map +1 -1
- package/dist/components/KycWorkflow.d.ts.map +1 -1
- package/dist/components/Logo.d.ts.map +1 -1
- package/dist/components/core/FileUpload.d.ts.map +1 -1
- package/dist/components/core/MultiSelect.d.ts.map +1 -1
- package/dist/components/core/SearchableSelect.d.ts.map +1 -1
- package/dist/components/identity/IdentityVerificationStep.d.ts.map +1 -1
- package/dist/components/status/KycStatusDisplay.d.ts.map +1 -1
- package/dist/components/steps/AppropriatenessTestStep.d.ts.map +1 -1
- package/dist/components/steps/InvestorCategorizationStep.d.ts.map +1 -1
- package/dist/components/steps/OverviewStep.d.ts.map +1 -1
- package/dist/components/steps/QuestionnaireStep.d.ts.map +1 -1
- package/dist/components/steps/RiskScoringStep.d.ts.map +1 -1
- package/dist/components/steps/UploadDocumentStep.d.ts.map +1 -1
- package/dist/context/MetaKYCProvider.d.ts.map +1 -1
- package/dist/i18n/TranslationContext.d.ts +18 -0
- package/dist/i18n/TranslationContext.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/locales/ar.d.ts +4 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -0
- package/dist/i18n/locales/da.d.ts +4 -0
- package/dist/i18n/locales/da.d.ts.map +1 -0
- package/dist/i18n/locales/de.d.ts +4 -0
- package/dist/i18n/locales/de.d.ts.map +1 -0
- package/dist/i18n/locales/en.d.ts +4 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/es.d.ts +4 -0
- package/dist/i18n/locales/es.d.ts.map +1 -0
- package/dist/i18n/locales/fi.d.ts +4 -0
- package/dist/i18n/locales/fi.d.ts.map +1 -0
- package/dist/i18n/locales/fr.d.ts +4 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -0
- package/dist/i18n/locales/it.d.ts +4 -0
- package/dist/i18n/locales/it.d.ts.map +1 -0
- package/dist/i18n/locales/ja.d.ts +4 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -0
- package/dist/i18n/locales/nl.d.ts +4 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -0
- package/dist/i18n/locales/no.d.ts +4 -0
- package/dist/i18n/locales/no.d.ts.map +1 -0
- package/dist/i18n/locales/pl.d.ts +4 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -0
- package/dist/i18n/locales/pt.d.ts +4 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -0
- package/dist/i18n/locales/ru.d.ts +4 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -0
- package/dist/i18n/locales/sv.d.ts +4 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -0
- package/dist/i18n/locales/tr.d.ts +4 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -0
- package/dist/i18n/locales/zh.d.ts +4 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +283 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/index.cjs +24 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8260 -3429
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/translation.service.d.ts +9 -0
- package/dist/services/translation.service.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/types/enums.ts","../src/types/applicant.ts","../src/types/upload-document.ts","../src/types/appropriateness-test.ts","../src/types/risk-scoring.ts","../src/types/investor-categorization.ts","../src/types/form-config.ts","../src/types/theme.ts","../src/client/config.ts","../src/client/endpoint-builder.ts","../src/client/error-handler.ts","../src/client/http-client.ts","../src/services/applicant.service.ts","../src/services/questionnaire.service.ts","../src/services/upload-document.service.ts","../src/services/appropriateness-test.service.ts","../src/services/overview.service.ts","../src/services/risk-scoring.service.ts","../src/services/identity.service.ts","../src/services/base-information.service.ts","../src/services/investor-categorization.service.ts","../src/theme/presets.ts","../src/services/theme.service.ts","../src/state/event-emitter.ts","../src/state/workflow-state.ts","../src/state/step-router.ts","../src/state/workflow-orchestrator.ts","../src/identity/load-script.ts","../src/identity/providers/sumsub.ts","../src/identity/providers/onfido.ts","../src/identity/providers/sardin-ai.ts","../src/identity/provider-manager.ts","../src/theme/theme-manager.ts","../src/context/MetaKYCContext.tsx","../src/version.ts","../src/styles/critical-css.ts","../src/context/MetaKYCProvider.tsx","../src/context/useMetaKYC.ts","../src/utils/file.ts","../src/utils/cn.ts","../src/utils/storage.ts","../src/hooks/useKycWorkflow.ts","../src/hooks/useQuestionnaire.ts","../src/hooks/useUploadDocument.ts","../src/hooks/useAppropriatenessTest.ts","../src/hooks/useOverview.ts","../src/hooks/useIdentityVerification.ts","../src/hooks/useRiskScoring.ts","../src/hooks/useApplicant.ts","../src/components/core/Button.tsx","../src/components/core/Input.tsx","../src/components/core/Card.tsx","../src/components/core/Checkbox.tsx","../src/components/core/Badge.tsx","../src/components/core/Spinner.tsx","../src/components/core/Select.tsx","../src/components/core/MultiSelect.tsx","../src/components/core/SearchableSelect.tsx","../src/components/core/FileUpload.tsx","../src/components/core/PhoneInput.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-left.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/steps/QuestionnaireStep.tsx","../src/components/steps/UploadDocumentStep.tsx","../src/components/steps/OverviewStep.tsx","../src/components/steps/RiskScoringStep.tsx","../src/components/steps/InvestorCategorizationStep.tsx","../src/components/steps/AppropriatenessTestStep.tsx","../src/components/identity/IdentityVerificationStep.tsx","../src/components/status/KycStatusDisplay.tsx","../src/components/Logo.tsx","../src/components/Header.tsx","../src/components/CreateApplicantForm.tsx","../src/components/CreateCompanyApplicantForm.tsx","../src/components/KycWorkflow.tsx","../src/validation/questionnaire-schema.ts","../src/validation/upload-document-schema.ts","../src/validation/risk-scoring-schema.ts","../src/validation/appropriateness-schema.ts"],"sourcesContent":["/**\n * Workflow step action types\n * Defines all possible workflow steps in the KYC process\n */\nexport enum WorkflowStepAction {\n IdentitySdk = 0,\n RiskScoring = 1,\n Questionaries = 2,\n AdditionalData = 3,\n AppropriatenessTest = 4,\n UploadDocument = 5,\n ManualReview = 6,\n Overview = 7,\n InvestorCategorization = 8,\n}\n\n/**\n * Workflow result types\n * Indicates the overall result/status of a workflow\n */\nexport enum WorkflowResultType {\n NotStarted = 0,\n InProgress = 1,\n Success = 2,\n PartialSuccess = 3,\n Failed = 4,\n Skipped = 5,\n AdminReview = 6,\n SkippedAndAdminReview = 7,\n}\n\n/**\n * Applicant progress status\n * Tracks the current status of an applicant's workflow progress\n */\nexport enum ApplicantProgressStatus {\n None = 0,\n InProgress = 1,\n Finished = 2,\n OnHold = 3,\n IdentityPending = 4,\n}\n\n/**\n * Reason for applicant progress being on hold\n */\nexport enum ApplicantProgressOnHoldReason {\n None = 0,\n RepresentativeKYC = 1,\n ManualRiskCriteria = 2,\n UploadDocumentReview = 3,\n AdminReview = 4,\n}\n\n/**\n * Risk level assessment\n */\nexport enum RiskLevel {\n LowRisk = 0,\n MediumRisk = 1,\n HighRisk = 2,\n Alert = 3,\n}\n\n/**\n * KYC status\n */\nexport enum KycStatus {\n None = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n ResendRequested = 4,\n Unknown = 5,\n InProgress = 6,\n}\n\n/**\n * Review status\n */\nexport enum ReviewStatus {\n Approved = 0,\n Reject = 1,\n UnderReview = 2,\n Closed = 3,\n AdminReview = 4,\n New = 5,\n InProgress = 6,\n}\n\n/**\n * Applicant status\n */\nexport enum ApplicantStatus {\n ProviderResultPending = 0,\n ProviderResultReceived = 1,\n Canceled = 2,\n ExtendedToNewApplicant = 3,\n}\n\n/**\n * KYC process status\n */\nexport enum KycProcessStatus {\n None = 0,\n ProviderResultPending = 1,\n ProviderResultReceived = 2,\n Canceled = 3,\n}\n\n/**\n * Identity verification provider types\n * IMPORTANT: These values MUST match the backend enum exactly!\n */\nexport enum IdentityVerificationProvider {\n Onfido = 0,\n Sumsub = 2, // Backend uses 2, not 1!\n SardinAI = 3, // Backend uses 3, not 2!\n}\n\n/**\n * User type\n */\nexport enum UserType {\n Individual = 0,\n Company = 1,\n}\n","/**\n * Gender type\n */\nexport enum GenderType {\n Male = 0,\n Female = 1,\n Other = 2,\n}\n\n/**\n * Tax country information\n */\nexport interface TaxCountry {\n country: string;\n taxNumber: string;\n}\n\n/**\n * Additional data for applicant\n */\nexport interface ApplicantAdditionalData {\n paramName: string;\n value: string;\n}\n\n/**\n * Applicant registration request input (Individual)\n */\nexport interface ApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n firstName: string;\n lastName: string;\n title?: string;\n email: string;\n dateOfBirth?: string;\n phonenumber: string;\n externalRefId: string; // Required: must always be provided\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n otherNationality?: string[];\n defaultLanguage?: string;\n taxCountry?: string;\n placeOfBirth?: string;\n countryOfBirth?: string;\n salutation?: GenderType | null;\n educationLevel?: string;\n occupation?: string;\n taxNumber?: string;\n otherTaxCountries?: TaxCountry[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Company applicant registration request input\n */\nexport interface CompanyApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n companyName: string;\n companyRegistrationNumber: string;\n companyEmail: string;\n companyPhone: string;\n companyCountry?: string;\n companyCity?: string;\n companyStreet?: string;\n companyZip?: string;\n legalForm?: string;\n industry?: string;\n externalRefId?: string;\n defaultLanguage?: string;\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Applicant request data DTO (nested in ApplicantDataDto)\n */\nexport interface ApplicantRequestDataDto {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n dateOfBirth?: string;\n salutation?: string;\n title?: string;\n phonenumber: string;\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n countryOfBirth?: string;\n placeOfBirth?: string;\n taxCountry?: string;\n taxNumber?: string;\n educationLevel?: string;\n occupation?: string;\n defaultLanguage?: string;\n isCompanyRepresentative: boolean;\n otherNationalities?: string[];\n otherTaxResidencies?: string[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * A single questionnaire question result (from GetApplicantData)\n */\nexport interface QuestionnaireResultItem {\n question: string;\n answers: string[];\n}\n\n/**\n * A single risk criterion result (from GetApplicantData)\n */\nexport interface RiskCriteriaResultItem {\n riskCriteriaId?: number;\n riskCriteria?: string;\n answer?: string;\n}\n\n/**\n * A risk scoring plan result (from GetApplicantData)\n */\nexport interface RiskScoringResultItem {\n riskScoringPlanId?: number;\n totalScore?: number;\n riskLevel?: number;\n riskCriteriaResults?: RiskCriteriaResultItem[];\n}\n\n/**\n * Applicant data DTO (full response from GetApplicantData)\n */\nexport interface ApplicantDataDto {\n id: number;\n providerTokenObject?: string;\n applicantStatus?: number;\n reviewStatus?: number;\n kycStatus?: number;\n storageStatus?: number;\n providerResult?: string;\n externalRefId?: string;\n workflowId: number;\n workflowName: string;\n workflowColor?: string;\n riskLevel?: number;\n relatedApplicantId?: number;\n applicantRequestData?: ApplicantRequestDataDto;\n companyApplicantRequestData?: any;\n applicantDocuments?: any[];\n riskScoringResults?: RiskScoringResultItem[];\n questionnaireResults?: QuestionnaireResultItem[];\n uploadDocumentResults?: any[];\n appropriatenessTestResults?: any[];\n kycRecords?: any[];\n progressStatus?: number;\n onHoldReason?: number;\n}\n\n/**\n * Duplicate applicant input\n */\nexport interface DuplicateApplicantInput {\n sourceApplicantId: number;\n newWorkflowKey: string;\n}\n","/**\n * File type enum\n */\nexport enum FileType {\n Image = 0,\n Video = 1,\n PDF = 2,\n OfficePDF = 3,\n Custom = 4,\n}\n\n/**\n * Document review status\n */\nexport enum DocumentReviewStatus {\n Pending = 0,\n Approved = 1,\n Rejected = 2,\n RequiresRevision = 3,\n}\n\n/**\n * Upload document file DTO\n */\nexport interface UploadDocumentFileDto {\n id: number;\n name: string;\n displayName: string;\n subtitle?: string;\n fileType: FileType;\n maxEachFileSizeByte: number;\n allowedTypes?: string;\n multipleFile: boolean;\n isRequired: boolean;\n order: number;\n pageNumber: number;\n}\n\n/**\n * Upload document output DTO\n */\nexport interface UploadDocumentOutputDto {\n id: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n uploadDocumentFiles: UploadDocumentFileDto[];\n}\n\n/**\n * Upload document file result\n */\nexport interface UploadDocumentFileResult {\n fileName: string;\n fileData: string; // base64\n}\n\n/**\n * Upload document result\n */\nexport interface UploadDocumentResult {\n uploadDocumentFileId: number;\n valueList: UploadDocumentFileResult[];\n}\n\n/**\n * Fill upload document input\n */\nexport interface FillUploadDocumentInput {\n applicantId: number;\n uploadDocumentId: number;\n uploadDocumentResults: UploadDocumentResult[];\n}\n\n/**\n * Review upload document DTO\n */\nexport interface ReviewUploadDocumentDto {\n applicantId: number;\n uploadDocumentResultId: number;\n status: DocumentReviewStatus;\n reviewNotes?: string;\n}\n","/**\n * Appropriateness question output DTO (matches backend)\n */\nexport interface AppropriatenessQuestionOutputDto {\n id: number;\n name: string;\n groupName: string;\n question: string;\n answers: string[]; // Array of shuffled answers (correct + wrong answers)\n}\n\n/**\n * Appropriateness test output DTO (matches backend)\n */\nexport interface AppropriatenessTestOutputDto {\n id: number;\n applicantId: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n testDurationSec: number;\n testAllowedMaxTry: number;\n testCorrectAnswerPassLimit: number;\n totalFailedTries: number;\n totalQuestionCount: number;\n waitTimeSpanForNextTry: string; // TimeSpan as ISO string (e.g., \"00:05:00\")\n appropriatenessQuestions: AppropriatenessQuestionOutputDto[];\n}\n\n/**\n * Appropriateness question result\n */\nexport interface AppropriatenessQuestionResult {\n appropriatenessQuestionId: number;\n value: string;\n}\n\n/**\n * Fill appropriateness test input\n */\nexport interface FillAppropriatenessTestInput {\n applicantId: number;\n appropriatenessTestId: number;\n appropriatenessQuestionResults: AppropriatenessQuestionResult[];\n}\n\n/**\n * Fill appropriateness test result\n */\nexport interface FillAppropriatenessTestResult {\n isSuccess: boolean;\n message: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum AppropriatenessQuestionType {\n SingleChoice = 0,\n MultipleChoice = 1,\n Text = 2,\n}\n\nexport interface AppropriatenessAnswerDto {\n id: number;\n text: string;\n value: string;\n order: number;\n score?: number;\n}\n\nexport interface AppropriatenessQuestionDto {\n id: number;\n text: string;\n questionType: AppropriatenessQuestionType;\n order: number;\n isRequired: boolean;\n answers: AppropriatenessAnswerDto[];\n}\n","import { RiskLevel } from './enums';\n\n/**\n * Value data type for risk criteria\n */\nexport enum ValueDataType {\n String = 0,\n Integer = 1,\n /** Backend value 2 — Money/currency type; triggers locale-aware number formatting in options */\n Money = 2,\n Boolean = 3,\n Date = 4,\n Country = 5,\n DigitOnly = 6,\n}\n\n/**\n * Risk criteria type\n */\nexport enum RiskCriteriaType {\n Text = 0,\n Radio = 1,\n Checkbox = 2,\n Dropdown = 3,\n Country = 4,\n}\n\n/**\n * Built-in criteria type enum\n */\nexport enum CriteriaBuiltInType {\n None = 0,\n Country = 1,\n // Add other built-in types as needed\n}\n\n/**\n * Risk criteria answer DTO (legacy - for full admin interface)\n */\nexport interface RiskCriteriaAnswerDto {\n id: number;\n text: string;\n value: string;\n score: number;\n order: number;\n}\n\n/**\n * Risk criteria DTO (light version from GetCriterias API)\n */\nexport interface RiskCriteriaDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n builtInType?: CriteriaBuiltInType;\n valueDataType: ValueDataType;\n defaultValues?: string[]; // Simple string array from API\n multipleValue: boolean; // Can select multiple values\n hasCustomValue: boolean;\n hideCriteriaThresholds: boolean;\n isRequired: boolean;\n pageNumber?: number;\n // Legacy fields (kept for compatibility)\n criteriaType?: RiskCriteriaType;\n order?: number;\n answers?: RiskCriteriaAnswerDto[];\n min?: number;\n max?: number;\n regex?: string;\n errorMessage?: string;\n}\n\n/**\n * Criteria value input (matches C# DTO)\n */\nexport interface CriteriaValueInput {\n riskCriteriaId: number;\n values: string[]; // Array of strings, not single string\n}\n\n/**\n * Risk calculation input (matches C# DTO exactly)\n */\nexport interface RiskCalculationInput {\n applicantId?: number;\n riskPlanId?: number;\n criteriaValueInputs: CriteriaValueInput[];\n}\n\n// Legacy types (kept for compatibility)\nexport interface RiskCalculationItem {\n criteriaId: number;\n value: string;\n}\n\n/**\n * Risk scoring result\n */\nexport interface RiskScoringResult {\n success: boolean;\n riskLevel: RiskLevel;\n totalScore: number;\n message?: string;\n}\n\n/**\n * Risk scoring plan DTO\n */\nexport interface RiskScoringPlanDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n lowRiskThreshold: number;\n mediumRiskThreshold: number;\n highRiskThreshold: number;\n}\n","/**\n * Investor categorization type (matches backend enum)\n */\nexport enum InvestorCategorizationType {\n Individual = 0,\n Sophisticated = 1,\n HighNetWorth = 2,\n Business = 3,\n}\n\n/**\n * Investor categorization input\n */\nexport interface InvestorCategorizationInput {\n applicantId: number;\n investorType: InvestorCategorizationType;\n}\n\n/**\n * Set investor categorization result\n */\nexport interface SetInvestorCategorizationResult {\n success: boolean;\n message?: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum InvestorCategoryType {\n Retail = 0,\n Professional = 1,\n EligibleCounterparty = 2,\n}\n\nexport interface InvestorCategorizationResult {\n success: boolean;\n category: InvestorCategoryType;\n message?: string;\n}\n","import type { ApplicantFormField, CompanyApplicantFormField } from '../client/config';\n\n// ── Countries type enum (mirrors backend CountiresType) ───────────────────────\n\nexport const CountriesType = {\n Nationality: 10,\n Address: 20,\n CountryOfBirth: 30,\n PhoneNumber: 40,\n UboAddress: 50,\n} as const;\n\nexport type CountriesTypeValue = typeof CountriesType[keyof typeof CountriesType];\n\n// ── Field metadata ────────────────────────────────────────────────────────────\n\nexport interface FieldMeta {\n label: string;\n type: 'text' | 'email' | 'tel' | 'date' | 'select' | 'multiselect';\n /** For select/multiselect country fields: the default CountriesType passed to the API */\n countriesType?: CountriesTypeValue;\n}\n\n// ── Review page field configuration ──────────────────────────────────────────\n\n/** A single field entry for the identity review page */\nexport interface ReviewFieldEntry {\n /** Built-in field name from FIELD_METADATA (e.g. 'firstName', 'country') */\n name: string;\n /** true = rendered as an editable input; false / absent = read-only display */\n editable?: boolean;\n /** Optional label override */\n displayText?: string;\n /** Column span in the 4-column grid (1=quarter, 2=half, 3=three-quarter, 4=full) */\n colSpan?: 1 | 2 | 3 | 4;\n}\n\nexport const FIELD_METADATA: Record<string, FieldMeta> = {\n firstName: { label: 'First Name', type: 'text' },\n lastName: { label: 'Last Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phonenumber: { label: 'Phone Number', type: 'tel' },\n dateOfBirth: { label: 'Date of Birth', type: 'date' },\n salutation: { label: 'Salutation', type: 'select' },\n title: { label: 'Title', type: 'text' },\n mobileCountryCode: { label: 'Mobile Country Code', type: 'select', countriesType: CountriesType.PhoneNumber },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n zip: { label: 'ZIP / Postal Code', type: 'text' },\n city: { label: 'City', type: 'text' },\n country: { label: 'Country', type: 'select', countriesType: CountriesType.Address },\n nationality: { label: 'Nationality', type: 'select', countriesType: CountriesType.Nationality },\n otherNationality: { label: 'Other Nationalities', type: 'multiselect', countriesType: CountriesType.Nationality },\n countryOfBirth: { label: 'Country of Birth', type: 'select', countriesType: CountriesType.CountryOfBirth },\n placeOfBirth: { label: 'Place of Birth', type: 'text' },\n taxCountry: { label: 'Tax Country', type: 'select', countriesType: CountriesType.Address },\n taxNumber: { label: 'Tax Number', type: 'text' },\n defaultLanguage: { label: 'Default Language', type: 'select' },\n educationLevel: { label: 'Education Level', type: 'text' },\n occupation: { label: 'Occupation', type: 'text' },\n};\n\nexport const COMPANY_FIELD_METADATA: Record<string, FieldMeta> = {\n companyName: { label: 'Company Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phone: { label: 'Phone', type: 'tel' },\n registrationNumber: { label: 'Registration Number', type: 'text' },\n countryResidence: { label: 'Country of Residence', type: 'select', countriesType: CountriesType.Address },\n legalAddress: { label: 'Legal Address', type: 'text' },\n incorporatedOn: { label: 'Incorporation Date', type: 'date' },\n controlScheme: { label: 'Control Scheme', type: 'text' },\n taxId: { label: 'Tax ID', type: 'text' },\n registrationLocation:{ label: 'Registration Location', type: 'text' },\n website: { label: 'Website', type: 'text' },\n postalAddress: { label: 'Postal Address', type: 'text' },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n city: { label: 'City', type: 'text' },\n state: { label: 'State / Province', type: 'text' },\n postalCode: { label: 'Postal Code', type: 'text' },\n addressCountry: { label: 'Address Country', type: 'select', countriesType: CountriesType.Address },\n lei: { label: 'LEI', type: 'text' },\n};\n\nexport const DEFAULT_COMPANY_VISIBLE_FIELDS: CompanyApplicantFormField[] = [\n 'companyName',\n 'email',\n 'phone',\n 'registrationNumber',\n];\n\nexport const DEFAULT_VISIBLE_FIELDS: ApplicantFormField[] = [\n 'firstName',\n 'lastName',\n 'email',\n 'phonenumber',\n 'dateOfBirth',\n];\n\nexport const ALLOWED_LANGUAGES: Array<{ value: string; label: string }> = [\n { value: 'EN', label: 'English' },\n { value: 'DE', label: 'German' },\n { value: 'FR', label: 'French' },\n { value: 'ES', label: 'Spanish' },\n { value: 'IT', label: 'Italian' },\n { value: 'PT', label: 'Portuguese' },\n { value: 'NL', label: 'Dutch' },\n { value: 'PL', label: 'Polish' },\n { value: 'RU', label: 'Russian' },\n { value: 'ZH', label: 'Chinese' },\n { value: 'JA', label: 'Japanese' },\n { value: 'AR', label: 'Arabic' },\n { value: 'TR', label: 'Turkish' },\n { value: 'SV', label: 'Swedish' },\n { value: 'DA', label: 'Danish' },\n { value: 'FI', label: 'Finnish' },\n { value: 'NO', label: 'Norwegian' },\n];\n\n// ── Multi-page form configuration (set via Panel SDK Config) ──────────────────\n\n/**\n * A single field entry inside a form page.\n * Either refers to a built-in applicant field (name) or a custom field.\n */\nexport interface FormFieldEntry {\n /** Built-in field identifier: 'firstName', 'lastName', 'email', etc. Omit for custom fields. */\n name?: string;\n /** Column span in the 4-column grid. 1 = quarter, 2 = half, 3 = three-quarter, 4 = full. */\n colSpan: 1 | 2 | 3 | 4;\n /** Whether this is a custom out-of-scope field */\n isCustom?: boolean;\n /** Type of custom field */\n customType?: 'text' | 'checkbox' | 'link_checkbox' | 'link' | 'group_checkbox' | 'radio_group' | 'paragraph' | 'html' | 'br';\n /** Override the label shown to the user. If empty, falls back to the default field name/label. */\n displayText?: string;\n /** Display label for the custom field */\n label?: string;\n /** Key under which the value is stored in applicantAdditionalData.paramName */\n paramName?: string;\n /** Whether the field is mandatory */\n required?: boolean;\n /** For link_checkbox: URL the hyperlink points to */\n linkUrl?: string;\n /** For link_checkbox: text of the hyperlink (e.g. \"Terms & Conditions\") */\n linkText?: string;\n /** For group_checkbox / radio_group: the selectable options */\n options?: Array<{ value: string; label: string }>;\n /**\n * For group_checkbox: when true only one option can be checked at a time\n * (mutually exclusive checkboxes, distinct from radio_group in appearance).\n */\n singleSelect?: boolean;\n /**\n * For country-type built-in fields: overrides the default CountriesType used when fetching\n * the country list from the API (e.g. Nationality=10, Address=20, CountryOfBirth=30, PhoneNumber=40).\n * If omitted, the SDK uses the default from FIELD_METADATA for that field.\n */\n countriesType?: number;\n /**\n * Optional help/tooltip text shown next to the field as a clickable ? button.\n * Applies to both built-in and custom fields.\n */\n helpText?: string;\n /**\n * Review-page mode only.\n * true = field is rendered as an editable input; false / absent = rendered as read-only text.\n */\n editable?: boolean;\n\n /**\n * Per-field label display mode.\n * 'label' (default) — a label element is shown above the input.\n * 'placeholder' — no label element; the label text is used as the input placeholder instead.\n * When absent, falls back to the global fieldLabelMode from theme/config.\n */\n labelMode?: 'label' | 'placeholder';\n}\n\n/**\n * A single page of the applicant form with optional header text and an ordered list of fields.\n */\nexport interface FormPage {\n title?: string;\n subtitle?: string;\n description?: string;\n fields: FormFieldEntry[];\n /**\n * If set, this page is only shown when the custom field with this paramName has value 'true'\n * (or any non-empty value for radio/text). Typically tied to a checkbox on a previous page.\n */\n conditionalOn?: string;\n /**\n * Optional help/tooltip text shown as a ? button next to the conditional gate checkbox.\n */\n conditionalHelpText?: string;\n}\n","/**\n * Logo configuration\n */\nexport interface LogoConfig {\n url?: string;\n width?: string;\n height?: string;\n alt?: string;\n visible?: boolean; // Show/hide logo\n}\n\n/**\n * Color palette configuration\n */\nexport interface ColorPalette {\n // Primary brand colors\n primary: string;\n primaryHover: string;\n primaryLight: string;\n primaryDark: string;\n \n // Secondary colors\n secondary: string;\n secondaryHover: string;\n \n // Semantic colors\n success: string;\n warning: string;\n danger: string;\n info: string;\n \n // UI colors\n background: string;\n surface: string;\n border: string;\n \n // Text colors\n textPrimary: string;\n textSecondary: string;\n textMuted: string;\n\n // Input-specific overrides (optional — fall back to general colors when absent)\n inputBg?: string; // input background (→ --metakyc-input-bg)\n inputText?: string; // input text color (→ --metakyc-input-text)\n inputBorder?: string; // input border (→ --metakyc-input-border)\n inputBorderFocus?: string; // focus ring/border (→ --metakyc-input-border-focus)\n inputPlaceholder?: string; // placeholder text (→ --metakyc-input-placeholder)\n}\n\n/**\n * Typography configuration\n */\nexport interface TypographyConfig {\n fontFamily: string;\n headingFont?: string;\n fontSize?: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n };\n fontWeight?: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\n/**\n * Spacing and layout configuration\n */\nexport interface SpacingConfig {\n borderRadius: string;\n cardPadding: string;\n inputHeight: string;\n}\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Theme name/identifier */\n name?: string;\n \n /** Title/heading for the SDK */\n title?: string;\n \n /** Logo configuration */\n logo?: LogoConfig;\n \n /** Color palette */\n colors: ColorPalette;\n \n /** Typography settings */\n typography?: TypographyConfig;\n \n /** Spacing and layout */\n spacing?: SpacingConfig;\n \n /** Custom CSS to inject */\n customCSS?: string;\n \n /** Dark mode color overrides */\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n\n /** Applicant form visible fields (ordered) from backend config */\n applicantFormVisibleFields?: string[];\n\n /** Applicant form client-required fields from backend config */\n applicantFormRequiredFields?: string[];\n\n /** Allowed language codes for the Default Language dropdown e.g. ['EN','DE'] */\n allowedLanguages?: string[];\n\n /** Multi-page applicant form layout configuration */\n applicantFormPages?: import('./form-config').FormPage[];\n\n /** Identity review page — single FormPage with fields + editable flags */\n reviewPageFields?: import('./form-config').FormPage[];\n\n /**\n * When true the identity review/confirmation page is skipped entirely.\n * The SDK auto-requests identity on mount and shows the provider UI directly.\n */\n reviewPageDisabled?: boolean;\n\n /**\n * Controls how field labels are rendered in the applicant form.\n * 'label' (default) — a label element is shown above each input.\n * 'placeholder' — no label element; the label text is used as the input placeholder.\n */\n fieldLabelMode?: 'label' | 'placeholder';\n\n /** Company (KYB) form visible fields (ordered) from backend config */\n companyFormVisibleFields?: string[];\n\n /** Company form client-required fields from backend config */\n companyFormRequiredFields?: string[];\n\n /** Multi-page company form layout configuration */\n companyFormPages?: import('./form-config').FormPage[];\n\n /** Company review page fields */\n companyReviewPageFields?: import('./form-config').FormPage[];\n}\n\n\n/**\n * Predefined theme presets\n */\nexport enum ThemePreset {\n Default = 'default',\n Corporate = 'corporate',\n Fintech = 'fintech',\n Healthcare = 'healthcare',\n Modern = 'modern',\n Minimal = 'minimal',\n}\n\n/**\n * Theme configuration from backend\n */\nexport interface ThemeConfigurationDto {\n tenantId?: number;\n isEnabled: boolean;\n preset?: ThemePreset;\n title?: string;\n logo?: LogoConfig;\n colors?: Partial<ColorPalette>;\n typography?: TypographyConfig;\n spacing?: SpacingConfig;\n customCSS?: string;\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n applicantFormVisibleFields?: string[];\n applicantFormRequiredFields?: string[];\n allowedLanguages?: string[];\n applicantFormPages?: import('./form-config').FormPage[];\n reviewPageFields?: import('./form-config').FormPage[];\n reviewPageDisabled?: boolean;\n fieldLabelMode?: 'label' | 'placeholder';\n companyFormVisibleFields?: string[];\n companyFormRequiredFields?: string[];\n companyFormPages?: import('./form-config').FormPage[];\n companyReviewPageFields?: import('./form-config').FormPage[];\n}\n\n","/**\n * Endpoint pattern types\n * - host-controller: /api/[Controller]/[Action]\n * - application-service: /services/app/[Service]/[Method]\n */\nexport type EndpointPattern = 'host-controller' | 'application-service' | 'custom';\n\n/**\n * Custom endpoint paths configuration\n */\nexport interface CustomEndpointPaths {\n [key: string]: string;\n}\n\n/**\n * Endpoint configuration\n */\nexport interface EndpointConfig {\n pattern: EndpointPattern;\n customPaths?: CustomEndpointPaths;\n}\n\n/**\n * SardinAI provider configuration\n */\nexport interface SardinAIProviderConfig {\n clientId: string;\n clientSecret?: string;\n environment: 'sandbox' | 'production';\n region?: 'us' | 'eu' | 'ca' | 'au';\n enableBiometrics?: boolean;\n enablePortScanning?: boolean;\n flow?: string;\n}\n\n/**\n * Sumsub provider configuration (frontend-only settings).\n * Server-side API keys are never exposed — only UI/SDK behavior config.\n */\nexport interface SumsubProviderConfig {\n /** Theme for Sumsub UI: 'light' or 'dark'. Follows device theme if omitted. */\n theme?: 'light' | 'dark';\n /** Language override (ISO 639-1). Falls back to SDK locale. */\n lang?: string;\n /**\n * WebSDK 2.0: name of a customization created in the Sumsub Dashboard.\n * This is the recommended way to style the Sumsub widget.\n */\n customizationName?: string;\n /** WebSDK 1.0 fallback: URL to an external CSS file. */\n customCss?: string;\n /** Whether to adapt Sumsub iframe height automatically (default: true). */\n adaptIframeHeight?: boolean;\n}\n\n/**\n * Identity provider configurations\n */\nexport interface IdentityProviderConfigs {\n sardinai?: SardinAIProviderConfig;\n sumsub?: SumsubProviderConfig;\n onfido?: Record<string, any>;\n}\n\n/**\n * Applicant form field name type\n */\nexport type ApplicantFormField =\n | 'firstName'\n | 'lastName'\n | 'title'\n | 'email'\n | 'dateOfBirth'\n | 'phonenumber'\n | 'mobileCountryCode'\n | 'street'\n | 'streetNumber'\n | 'zip'\n | 'city'\n | 'country'\n | 'nationality'\n | 'otherNationality'\n | 'defaultLanguage'\n | 'taxCountry'\n | 'placeOfBirth'\n | 'countryOfBirth'\n | 'salutation'\n | 'educationLevel'\n | 'occupation'\n | 'taxNumber'\n | 'externalRefId';\n\n/**\n * Company applicant form field name type\n */\nexport type CompanyApplicantFormField =\n | 'companyName'\n | 'registrationNumber'\n | 'email'\n | 'phone'\n | 'countryResidence'\n | 'legalAddress'\n | 'incorporatedOn'\n | 'controlScheme'\n | 'taxId'\n | 'registrationLocation'\n | 'website'\n | 'postalAddress'\n | 'street'\n | 'city'\n | 'state'\n | 'postalCode'\n | 'addressCountry'\n | 'lei'\n | 'streetNumber'\n | 'externalRefId';\n\n/**\n * Applicant form configuration\n */\nexport interface ApplicantFormConfig {\n /**\n * Whether this form collects data for an individual or a company.\n * - 'individual' (default): uses ApplicantRequestData fields\n * - 'company': uses CompanyApplicantRequestData fields\n */\n applicantType?: 'individual' | 'company';\n\n /** List of fields to show in the form. If not specified, shows default fields */\n visibleFields?: ApplicantFormField[];\n \n /** Default workflow key for applicant creation. Can be overridden per component instance */\n workflowKey?: string;\n \n /** Default external reference ID. Required if not shown in visible fields. */\n externalRefId?: string;\n\n /** Pre-fill the email field in the applicant form (e.g. for testing or SSO flows). */\n email?: string;\n\n /**\n * Hidden pre-filled values that are submitted with the form but never shown in the UI.\n * Built-in fields (e.g. 'country', 'firstName') are sent as top-level request fields.\n * Custom param names (any other key) are sent as applicantAdditionalDatas entries.\n * Example: { country: 'AUT', no_marketing: 'yes' }\n */\n hiddenValues?: Record<string, string>;\n\n /**\n * Controls how field labels are displayed.\n * - 'label' (default): a label element is shown above each input.\n * - 'placeholder' : no label element; the label text is used as the input placeholder instead.\n */\n fieldLabelMode?: 'label' | 'placeholder';\n\n /**\n * Pre-filled field values that are shown as **read-only** in the form.\n * If a field listed here is also in the visible fields, it appears filled and disabled.\n * The values are always included in the submission payload.\n * Works for both individual and company applicant forms.\n * Example: { firstName: 'John', lastName: 'Doe', email: 'john@example.com' }\n */\n initialValues?: Record<string, string>;\n}\n\n/**\n * MetaKYC client configuration\n */\nexport interface MetaKYCClientConfig {\n /** API key for authentication. Required unless getAccessToken is provided. */\n apiKey?: string;\n\n /** Tenant ID */\n tenantId: number;\n\n /** Base URL of the MetaKYC API */\n baseUrl: string;\n\n /**\n * Callback that returns a Bearer token for session-based authentication.\n * When provided, the SDK sends `Authorization: Bearer <token>` instead of API Key headers.\n * Useful for first-party apps where the user is already authenticated.\n * Can return null/undefined to skip the header for that request.\n */\n getAccessToken?: () => string | null | undefined;\n\n /** Endpoint configuration */\n endpoints?: EndpointConfig;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Number of retry attempts for failed requests (default: 3) */\n retries?: number;\n\n /** Locale/language code (default: 'en') */\n locale?: string;\n\n /** Identity provider configurations */\n identityProviders?: IdentityProviderConfigs;\n\n /** Applicant form configuration */\n applicantForm?: ApplicantFormConfig;\n\n /** Theme configuration (optional - will fetch from backend if not provided) */\n theme?: any; // Imported dynamically to avoid circular dependency\n\n /** Show SDK version badge at the top of the SDK content (default: false) */\n showVersion?: boolean;\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: Partial<MetaKYCClientConfig> = {\n timeout: 30000,\n retries: 3,\n locale: 'en',\n endpoints: {\n pattern: 'host-controller',\n },\n};\n","import { EndpointConfig } from './config';\n\n/**\n * Builds API endpoint URLs based on the configured pattern\n */\nexport class EndpointBuilder {\n constructor(private config: EndpointConfig) {}\n\n /**\n * Build an endpoint URL\n * @param controller - Controller name (e.g., 'Applicant')\n * @param action - Action/method name (e.g., 'GetApplicantProgress')\n * @returns The full endpoint path\n */\n build(controller: string, action: string): string {\n // Check for custom path first\n const customKey = `${controller}.${action}`;\n if (this.config.customPaths && this.config.customPaths[customKey]) {\n return this.config.customPaths[customKey];\n }\n\n // Build based on pattern\n switch (this.config.pattern) {\n case 'host-controller':\n return `/api/${controller}/${action}`;\n\n case 'application-service':\n // For application service pattern, convert controller/action to service/method\n const serviceName = this.getServiceName(controller);\n return `/services/app/${serviceName}/${action}`;\n\n case 'custom':\n throw new Error(\n `Custom endpoint path not found for ${customKey}. Please provide it in customPaths.`\n );\n\n default:\n throw new Error(`Unknown endpoint pattern: ${this.config.pattern}`);\n }\n }\n\n /**\n * Convert controller name to service name for application-service pattern\n */\n private getServiceName(controller: string): string {\n // Map controller names to service names\n const serviceMap: Record<string, string> = {\n Applicant: 'MetaKYCVerification',\n Questionnaire: 'MetaKYCVerification',\n UploadDocument: 'MetaKYCVerification',\n AppropriatenessTest: 'MetaKYCVerification',\n BaseInformation: 'MetaKYCVerification',\n };\n\n return serviceMap[controller] || controller;\n }\n}\n","import { ApiError } from '../types';\n\n/**\n * Custom error class for MetaKYC API errors\n */\nexport class MetaKYCError extends Error {\n public response?: any;\n \n constructor(\n message: string,\n public code?: number,\n public details?: string,\n public validationErrors?: Array<{ message: string; members: string[] }>,\n response?: any\n ) {\n super(message);\n this.name = 'MetaKYCError';\n this.response = response;\n Object.setPrototypeOf(this, MetaKYCError.prototype);\n }\n}\n\n/**\n * Handles API errors and converts them to MetaKYCError\n */\nexport class ErrorHandler {\n /**\n * Process an error from the API response\n */\n static handleApiError(error: ApiError): MetaKYCError {\n return new MetaKYCError(\n error.message || 'An unknown error occurred',\n error.code,\n error.details || undefined,\n error.validationErrors || undefined\n );\n }\n\n /**\n * Process an Axios error\n */\n static handleAxiosError(error: any): MetaKYCError {\n if (error.response) {\n // Server responded with error status\n const data = error.response.data;\n\n if (data && data.error) {\n return new MetaKYCError(\n data.error.message || 'An unknown error occurred',\n data.error.code,\n data.error.details || undefined,\n data.error.validationErrors || undefined,\n error.response\n );\n }\n\n // Check for result.message (common in ABP framework)\n if (data && data.result && data.result.message) {\n return new MetaKYCError(\n data.result.message,\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n }\n\n return new MetaKYCError(\n data?.message || error.message || 'Request failed',\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n } else if (error.request) {\n // Request was made but no response\n return new MetaKYCError(\n 'No response from server',\n 0,\n 'The request was made but no response was received. Please check your network connection.'\n );\n } else {\n // Something else happened\n return new MetaKYCError(error.message || 'An unexpected error occurred', 0, error.toString());\n }\n }\n\n /**\n * Check if an error is a MetaKYCError\n */\n static isMetaKYCError(error: any): error is MetaKYCError {\n return error instanceof MetaKYCError;\n }\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { MetaKYCClientConfig, defaultConfig } from './config';\nimport { EndpointBuilder } from './endpoint-builder';\nimport { ErrorHandler } from './error-handler';\nimport { ApiResponse } from '../types';\n\n/**\n * HTTP client for MetaKYC API\n * Handles all HTTP communication with configurable endpoints\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n private endpointBuilder: EndpointBuilder;\n private config: MetaKYCClientConfig;\n\n constructor(config: MetaKYCClientConfig) {\n this.config = { ...defaultConfig, ...config };\n\n // Initialize endpoint builder\n this.endpointBuilder = new EndpointBuilder(this.config.endpoints!);\n\n // Create axios instance\n this.axiosInstance = axios.create({\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor\n this.axiosInstance.interceptors.request.use(\n (config) => {\n config.headers['Abp-TenantId'] = this.config.tenantId.toString();\n\n if (this.config.getAccessToken) {\n const token = this.config.getAccessToken();\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`;\n }\n } else if (this.config.apiKey) {\n config.headers['ApiKey'] = this.config.apiKey;\n config.headers['X-API-KEY'] = this.config.apiKey;\n }\n\n if (this.config.locale) {\n config.headers['Accept-Language'] = this.config.locale;\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n // Retry logic for failed requests\n if (error.response?.status >= 500 && !originalRequest._retry) {\n originalRequest._retry = true;\n originalRequest._retryCount = (originalRequest._retryCount || 0) + 1;\n\n if (originalRequest._retryCount < (this.config.retries || 3)) {\n // Wait before retrying (exponential backoff)\n await new Promise((resolve) =>\n setTimeout(resolve, 1000 * originalRequest._retryCount)\n );\n return this.axiosInstance(originalRequest);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Build endpoint URL\n */\n buildEndpoint(controller: string, action: string): string {\n return this.endpointBuilder.build(controller, action);\n }\n\n /**\n * Make a GET request\n */\n async get<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.get(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a POST request\n */\n async post<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.post(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.put(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.delete(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Handle API response\n */\n private handleResponse<T>(response: AxiosResponse<ApiResponse<T>>): ApiResponse<T> {\n const data = response.data;\n\n // Check if response indicates an error\n if (!data.success && data.error) {\n throw ErrorHandler.handleApiError(data.error);\n }\n\n return data;\n }\n\n /**\n * Get the underlying axios instance for advanced usage\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ProgressApplicantStatusResult,\n ApplicantDataDto,\n DuplicateApplicantInput,\n} from '../types';\n\n/**\n * Applicant service\n * Handles all applicant-related API calls\n */\nexport class ApplicantService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Create a new individual applicant\n */\n async createApplicant(input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Create a new company applicant\n */\n async createCompanyApplicant(\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantCompanyRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Duplicate an existing applicant with a new workflow\n */\n async duplicateApplicant(input: DuplicateApplicantInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'DuplicateApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Get applicant progress\n */\n async getProgress(applicantId: number): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.get<ProgressApplicantResult>(\n 'Applicant',\n 'GetApplicantProgress',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant progress status (simplified)\n */\n async getProgressStatus(applicantId: number): Promise<ProgressApplicantStatusResult> {\n const response = await this.httpClient.get<ProgressApplicantStatusResult>(\n 'Applicant',\n 'GetApplicantProgressStaus', // Note: typo in API endpoint name\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant data\n */\n async getApplicantData(applicantId: number): Promise<ApplicantDataDto> {\n const response = await this.httpClient.get<ApplicantDataDto>(\n 'Applicant',\n 'GetApplicantData',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant status\n */\n async getApplicantStatus(applicantId: number): Promise<any> {\n const response = await this.httpClient.get(\n 'Applicant',\n 'GetApplicantStatus',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Stop applicant progress\n */\n async stopProgress(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'StopProgress', { applicantId });\n }\n\n /**\n * Move back one step in the workflow\n */\n async progressStepBack(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ProgressStepBack', { applicantId });\n }\n\n /**\n * Set applicant language\n */\n async setLanguage(applicantId: number, language: string): Promise<void> {\n await this.httpClient.post('Applicant', 'SetApplicantLng', {\n applicantId,\n language,\n });\n }\n\n /**\n * Activate applicant\n */\n async activateApplicant(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ActivateApplicant', { applicantId });\n }\n\n /**\n * Delete applicant\n */\n async deleteApplicant(applicantId: number): Promise<void> {\n await this.httpClient.delete('Applicant', 'DeleteApplicant', { applicantId });\n }\n\n /**\n * Check if applicant exists by external reference ID\n */\n async checkApplicantExists(externalRefId: string): Promise<boolean> {\n const response = await this.httpClient.get<boolean>(\n 'Applicant',\n 'CheckApplicantIfExists',\n { externalRefId }\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n QuestionnaireOutput,\n FillQuestionnarieInput,\n FillQuestionnairesResult,\n} from '../types';\n\n/**\n * Questionnaire service\n * Handles questionnaire-related API calls\n */\nexport class QuestionnaireService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get questionnaire for an applicant\n */\n async getQuestionnaire(applicantId: number): Promise<QuestionnaireOutput> {\n const response = await this.httpClient.get<QuestionnaireOutput>(\n 'Questionnaire',\n 'GetQuestionnaire',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit questionnaire answers\n */\n async fillQuestionnaire(input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> {\n const response = await this.httpClient.post<FillQuestionnairesResult>(\n 'Applicant',\n 'FillQuestionnarie', // Note: typo in API endpoint name\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n UploadDocumentOutputDto,\n FillUploadDocumentInput,\n ReviewUploadDocumentDto,\n} from '../types';\n\n/**\n * Upload document service\n * Handles document upload-related API calls\n */\nexport class UploadDocumentService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get upload document requirements for an applicant\n */\n async getUploadDocument(applicantId: number): Promise<UploadDocumentOutputDto> {\n const response = await this.httpClient.get<UploadDocumentOutputDto>(\n 'UploadDocument',\n 'GetUploadDocument',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit uploaded documents\n */\n async fillUploadDocument(input: FillUploadDocumentInput): Promise<void> {\n await this.httpClient.post('Applicant', 'FillUploadDocument', input);\n }\n\n /**\n * Review uploaded documents (admin function)\n */\n async reviewUploadDocument(input: ReviewUploadDocumentDto): Promise<void> {\n await this.httpClient.post('UploadDocument', 'ReviewUploadDocument', input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Appropriateness test service\n * Handles appropriateness test-related API calls\n */\nexport class AppropriatenessTestService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get appropriateness test for an applicant\n */\n async getAppropriatenessTest(applicantId: number): Promise<AppropriatenessTestOutputDto> {\n const response = await this.httpClient.get<AppropriatenessTestOutputDto>(\n 'AppropriatenessTest',\n 'GetAppropriatenessTest',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit appropriateness test answers\n */\n async fillAppropriatenessTest(\n input: FillAppropriatenessTestInput\n ): Promise<FillAppropriatenessTestResult> {\n const response = await this.httpClient.post<FillAppropriatenessTestResult>(\n 'Applicant',\n 'FillAppropriatenessTest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Overview service\n * Handles overview step-related API calls\n */\nexport class OverviewService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get overview data for an applicant\n */\n async getOverviewData(applicantId: number): Promise<OverviewDataDto> {\n const response = await this.httpClient.get<OverviewDataDto>(\n 'Applicant',\n 'GetOverviewData',\n { ApplicantId: applicantId } // Note: capital 'A' in API\n );\n return response.result;\n }\n\n /**\n * Pass the overview step\n */\n async passOverview(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'PassOverview', { applicantId });\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n RiskCriteriaDto,\n RiskCalculationInput,\n RiskScoringResult,\n RiskScoringPlanDto,\n} from '../types';\n\n/**\n * Risk scoring service\n * Handles risk scoring-related API calls\n */\nexport class RiskScoringService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get risk scoring plan information\n */\n async getRiskScoringPlan(): Promise<RiskScoringPlanDto> {\n const response = await this.httpClient.get<RiskScoringPlanDto>(\n 'Applicant',\n 'GetRiskScoringPlanInfo'\n );\n return response.result;\n }\n\n /**\n * Get risk criteria for scoring\n * Note: Requires applicantId as query parameter\n */\n async getRiskCriterias(applicantId: number): Promise<RiskCriteriaDto[]> {\n const response = await this.httpClient.get<RiskCriteriaDto[]>(\n 'Risk',\n 'GetCriterias',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Submit risk scoring calculation\n */\n async submitRiskScoring(input: RiskCalculationInput): Promise<RiskScoringResult> {\n const response = await this.httpClient.post<RiskScoringResult>(\n 'Applicant',\n 'RiskScoringRequest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { IdentityRequest, ApplicantRegistrationRequestOutput } from '../types';\n\n/**\n * Identity service\n * Handles identity verification-related API calls\n */\nexport class IdentityService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Request identity verification for individual applicant\n */\n async identityRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n console.log('[IdentityService] Calling IdentityRequest with input:', input);\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityRequest',\n input\n );\n console.log('[IdentityService] IdentityRequest response:', response);\n return response.result;\n }\n\n /**\n * Request identity verification for company applicant\n */\n async identityCompanyRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityCompanyRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Restart identity verification (individual)\n * Uses IdentityRequest with restart flag\n */\n async restartIdentityRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('[IdentityService] Restarting identity with restart=true:', input);\n return this.identityRequest(input);\n }\n\n /**\n * Restart identity verification (company)\n * Uses IdentityCompanyRequest with restart flag\n */\n async restartIdentityCompanyRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n return this.identityCompanyRequest(input);\n }\n\n /**\n * Refresh Sumsub access token for an active identity session.\n * Returns a fresh short-lived token without restarting the verification.\n */\n async refreshSumsubToken(applicantId: number): Promise<string> {\n console.log('[IdentityService] Refreshing Sumsub token for applicant:', applicantId);\n const response = await this.httpClient.post<{ accessToken: string }>(\n 'Applicant',\n 'RefreshSumsubToken',\n { applicantId }\n );\n console.log('[IdentityService] Sumsub token refresh result:', response);\n return response.result.accessToken;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { CountryDto, BranchDto, LegalEntityDto } from '../types';\n\n/**\n * Base information service\n * Handles reference data API calls (countries, branches, legal entities)\n */\nexport class BaseInformationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get all countries\n * @param filter - Optional filter string\n * @param lng - Language code (e.g., 'en', 'de')\n * @param type - Optional country type filter\n */\n async getCountries(filter?: string, lng?: string, type?: number): Promise<CountryDto[]> {\n const response = await this.httpClient.get<CountryDto[]>(\n 'BaseInformation',\n 'GetAllCountries',\n { filter: filter || '', lng: lng || 'en', type }\n );\n return response.result;\n }\n\n /**\n * Get all branches\n */\n async getBranches(): Promise<BranchDto[]> {\n const response = await this.httpClient.get<BranchDto[]>(\n 'BaseInformation',\n 'GetBranches'\n );\n return response.result;\n }\n\n /**\n * Get all legal entities\n */\n async getLegalEntities(): Promise<LegalEntityDto[]> {\n const response = await this.httpClient.get<LegalEntityDto[]>(\n 'BaseInformation',\n 'GetLegalEntities'\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n InvestorCategorizationInput,\n SetInvestorCategorizationResult,\n} from '../types';\n\n/**\n * Investor categorization service\n * Handles investor categorization-related API calls\n */\nexport class InvestorCategorizationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Set investor categorization\n */\n async setInvestorCategorization(\n input: InvestorCategorizationInput\n ): Promise<SetInvestorCategorizationResult> {\n const response = await this.httpClient.post<SetInvestorCategorizationResult>(\n 'Applicant',\n 'SetInvestorCategorization',\n input\n );\n return response.result;\n }\n\n /**\n * Get investor categorization\n */\n async getInvestorCategorization(applicantId: number): Promise<InvestorCategorizationInput> {\n const response = await this.httpClient.get<InvestorCategorizationInput>(\n 'Applicant',\n 'GetInvestorCategorisation', // Note: British spelling in API\n { applicantId }\n );\n return response.result;\n }\n}\n","import { ThemeConfig, ThemePreset } from '../types/theme';\n\n/**\n * Default theme preset\n */\nexport const defaultTheme: ThemeConfig = {\n name: 'Default',\n title: 'KYC Verification',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryLight: '#dbeafe',\n primaryDark: '#1e40af',\n \n secondary: '#64748b',\n secondaryHover: '#475569',\n \n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#3b82f6',\n \n background: '#ffffff',\n surface: '#f9fafb',\n border: '#e5e7eb',\n \n textPrimary: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n typography: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n darkMode: {\n colors: {\n background: '#111827',\n surface: '#1f2937',\n border: '#374151',\n textPrimary: '#f9fafb',\n textSecondary: '#d1d5db',\n textMuted: '#9ca3af',\n },\n },\n};\n\n/**\n * Corporate blue theme preset\n */\nexport const corporateTheme: ThemeConfig = {\n name: 'Corporate',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#0052CC',\n primaryHover: '#0747A6',\n primaryLight: '#DEEBFF',\n primaryDark: '#0747A6',\n \n secondary: '#6B778C',\n secondaryHover: '#5E6C84',\n \n success: '#00875A',\n warning: '#FF991F',\n danger: '#DE350B',\n info: '#0065FF',\n \n background: '#ffffff',\n surface: '#F4F5F7',\n border: '#DFE1E6',\n \n textPrimary: '#172B4D',\n textSecondary: '#5E6C84',\n textMuted: '#97A0AF',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n};\n\n/**\n * Fintech green theme preset\n */\nexport const fintechTheme: ThemeConfig = {\n name: 'Fintech',\n logo: {\n url: '',\n height: '36px',\n visible: true,\n },\n colors: {\n primary: '#00B386',\n primaryHover: '#009973',\n primaryLight: '#D1FAE5',\n primaryDark: '#047857',\n \n secondary: '#7C3AED',\n secondaryHover: '#6D28D9',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#F9FAFB',\n border: '#E5E7EB',\n \n textPrimary: '#111827',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n },\n typography: {\n fontFamily: 'Montserrat, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.75rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Healthcare theme preset\n */\nexport const healthcareTheme: ThemeConfig = {\n name: 'Healthcare',\n logo: {\n url: '',\n height: '44px',\n visible: true,\n },\n colors: {\n primary: '#06B6D4',\n primaryHover: '#0891B2',\n primaryLight: '#CFFAFE',\n primaryDark: '#0E7490',\n \n secondary: '#8B5CF6',\n secondaryHover: '#7C3AED',\n \n success: '#059669',\n warning: '#D97706',\n danger: '#DC2626',\n info: '#0284C7',\n \n background: '#ffffff',\n surface: '#F0F9FF',\n border: '#E0F2FE',\n \n textPrimary: '#0F172A',\n textSecondary: '#475569',\n textMuted: '#94A3B8',\n },\n typography: {\n fontFamily: 'Lato, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.75rem',\n inputHeight: '2.75rem',\n },\n darkMode: {\n colors: {\n background: '#0F172A',\n surface: '#1E293B',\n border: '#334155',\n textPrimary: '#F1F5F9',\n textSecondary: '#CBD5E1',\n },\n },\n};\n\n/**\n * Modern theme preset\n */\nexport const modernTheme: ThemeConfig = {\n name: 'Modern',\n logo: {\n url: '',\n height: '38px',\n visible: true,\n },\n colors: {\n primary: '#8B5CF6',\n primaryHover: '#7C3AED',\n primaryLight: '#EDE9FE',\n primaryDark: '#6D28D9',\n \n secondary: '#EC4899',\n secondaryHover: '#DB2777',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E5E5E5',\n \n textPrimary: '#171717',\n textSecondary: '#737373',\n textMuted: '#A3A3A3',\n },\n typography: {\n fontFamily: 'Poppins, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '1rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Minimal theme preset\n */\nexport const minimalTheme: ThemeConfig = {\n name: 'Minimal',\n logo: {\n url: '',\n height: '32px',\n visible: true,\n },\n colors: {\n primary: '#000000',\n primaryHover: '#18181B',\n primaryLight: '#F4F4F5',\n primaryDark: '#000000',\n \n secondary: '#71717A',\n secondaryHover: '#52525B',\n \n success: '#22C55E',\n warning: '#EAB308',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E4E4E7',\n \n textPrimary: '#09090B',\n textSecondary: '#71717A',\n textMuted: '#A1A1AA',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.25rem',\n inputHeight: '2.25rem',\n },\n};\n\n/**\n * Map of all theme presets\n */\nexport const themePresets: Record<ThemePreset, ThemeConfig> = {\n [ThemePreset.Default]: defaultTheme,\n [ThemePreset.Corporate]: corporateTheme,\n [ThemePreset.Fintech]: fintechTheme,\n [ThemePreset.Healthcare]: healthcareTheme,\n [ThemePreset.Modern]: modernTheme,\n [ThemePreset.Minimal]: minimalTheme,\n};\n\n/**\n * Get theme preset by name\n */\nexport function getThemePreset(preset: ThemePreset): ThemeConfig {\n return themePresets[preset] || defaultTheme;\n}\n","import { HttpClient } from '../client';\nimport { ThemeConfigurationDto, ThemeConfig, ThemePreset } from '../types/theme';\nimport { getThemePreset } from '../theme/presets';\n\n/**\n * Theme Service\n * Handles backend communication for theme configuration\n */\nexport class ThemeService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get theme configuration from backend\n */\n async getThemeConfiguration(): Promise<ThemeConfig> {\n try {\n const response = await this.httpClient.get<ThemeConfigurationDto>(\n 'Tenant',\n 'GetThemeConfiguration'\n );\n\n // If theme is disabled or not configured, return default\n if (!response.result.isEnabled) {\n return getThemePreset(ThemePreset.Default);\n }\n\n // Start with preset if specified\n let theme: ThemeConfig = response.result.preset \n ? getThemePreset(response.result.preset)\n : getThemePreset(ThemePreset.Default);\n\n // Apply custom overrides\n if (response.result.title) {\n theme.title = response.result.title;\n }\n\n if (response.result.logo) {\n theme.logo = { ...theme.logo, ...response.result.logo };\n }\n\n if (response.result.colors) {\n theme.colors = { ...theme.colors, ...response.result.colors };\n }\n\n if (response.result.typography) {\n theme.typography = { ...theme.typography, ...response.result.typography };\n }\n\n if (response.result.spacing) {\n theme.spacing = { ...theme.spacing, ...response.result.spacing };\n }\n\n if (response.result.customCSS) {\n theme.customCSS = response.result.customCSS;\n }\n\n if (response.result.darkMode) {\n theme.darkMode = {\n colors: {\n ...theme.darkMode?.colors,\n ...response.result.darkMode.colors,\n },\n };\n }\n\n if (response.result.applicantFormVisibleFields && response.result.applicantFormVisibleFields.length > 0) {\n theme.applicantFormVisibleFields = response.result.applicantFormVisibleFields;\n }\n\n if (response.result.applicantFormRequiredFields && response.result.applicantFormRequiredFields.length > 0) {\n theme.applicantFormRequiredFields = response.result.applicantFormRequiredFields;\n }\n\n if (response.result.allowedLanguages && response.result.allowedLanguages.length > 0) {\n theme.allowedLanguages = response.result.allowedLanguages;\n }\n\n if (response.result.applicantFormPages) {\n try {\n const parsed = typeof response.result.applicantFormPages === 'string'\n ? JSON.parse(response.result.applicantFormPages)\n : response.result.applicantFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Migrate old 2-column format (_v < 4): colSpan 1→2, 2→4\n theme.applicantFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — fall back to flat layout\n }\n }\n\n if (response.result.reviewPageFields) {\n try {\n const parsed = typeof response.result.reviewPageFields === 'string'\n ? JSON.parse(response.result.reviewPageFields)\n : response.result.reviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.reviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — fall back to static layout\n }\n }\n\n if (response.result.reviewPageDisabled) {\n theme.reviewPageDisabled = true;\n }\n\n if (response.result.fieldLabelMode === 'placeholder') {\n theme.fieldLabelMode = 'placeholder';\n }\n\n // Company (KYB) form configuration\n if (response.result.companyFormVisibleFields && response.result.companyFormVisibleFields.length > 0) {\n theme.companyFormVisibleFields = response.result.companyFormVisibleFields;\n }\n\n if (response.result.companyFormRequiredFields && response.result.companyFormRequiredFields.length > 0) {\n theme.companyFormRequiredFields = response.result.companyFormRequiredFields;\n }\n\n if (response.result.companyFormPages) {\n try {\n const parsed = typeof response.result.companyFormPages === 'string'\n ? JSON.parse(response.result.companyFormPages as unknown as string)\n : response.result.companyFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.companyFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — ignore\n }\n }\n\n if (response.result.companyReviewPageFields) {\n try {\n const parsed = typeof response.result.companyReviewPageFields === 'string'\n ? JSON.parse(response.result.companyReviewPageFields as unknown as string)\n : response.result.companyReviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.companyReviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — ignore\n }\n }\n\n return theme;\n } catch (error) {\n console.warn('[ThemeService] Failed to fetch theme configuration:', error);\n // Return default theme on error\n return getThemePreset(ThemePreset.Default);\n }\n }\n\n /**\n * Save theme configuration (for Panel use)\n */\n async saveThemeConfiguration(config: ThemeConfigurationDto): Promise<void> {\n await this.httpClient.post<void>('Tenant', 'SaveThemeConfiguration', config);\n }\n\n /**\n * Get available theme presets\n */\n getAvailablePresets(): Array<{ id: ThemePreset; name: string }> {\n return [\n { id: ThemePreset.Default, name: 'Default' },\n { id: ThemePreset.Corporate, name: 'Corporate' },\n { id: ThemePreset.Fintech, name: 'Fintech' },\n { id: ThemePreset.Healthcare, name: 'Healthcare' },\n { id: ThemePreset.Modern, name: 'Modern' },\n { id: ThemePreset.Minimal, name: 'Minimal' },\n ];\n }\n\n /**\n * Preview theme (doesn't save)\n */\n getPreviewTheme(preset: ThemePreset, overrides?: Partial<ThemeConfig>): ThemeConfig {\n const baseTheme = getThemePreset(preset);\n \n if (!overrides) {\n return baseTheme;\n }\n\n return {\n ...baseTheme,\n ...overrides,\n logo: { ...baseTheme.logo, ...overrides.logo },\n colors: { ...baseTheme.colors, ...overrides.colors },\n typography: overrides.typography ? \n { ...baseTheme.typography, ...overrides.typography } : \n baseTheme.typography,\n spacing: overrides.spacing ? \n { ...baseTheme.spacing, ...overrides.spacing } : \n baseTheme.spacing,\n };\n }\n}\n","/**\n * Simple event emitter for state changes\n */\nexport class EventEmitter<T = any> {\n private listeners: Map<string, Set<(data: T) => void>> = new Map();\n\n /**\n * Subscribe to an event\n */\n on(event: string, callback: (data: T) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: string, callback: (data: T) => void): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n emit(event: string, data: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${event}\":`, error);\n }\n });\n }\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Remove all listeners for a specific event\n */\n clearEvent(event: string): void {\n this.listeners.delete(event);\n }\n}\n","import {\n ProgressApplicantResult,\n FlowStep,\n StepInfo,\n ApplicantProgressStatus,\n WorkflowResultType,\n} from '../types';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * Workflow state events\n */\nexport interface WorkflowStateEvents {\n progressUpdated: ProgressApplicantResult;\n stepChanged: FlowStep | null;\n statusChanged: ApplicantProgressStatus;\n error: Error;\n completed: WorkflowResultType;\n}\n\n/**\n * Workflow state manager\n * Manages the current state of a workflow execution\n */\nexport class WorkflowState {\n private events = new EventEmitter<any>();\n private _applicantId: number | null = null;\n private _progress: ProgressApplicantResult | null = null;\n private _error: Error | null = null;\n\n constructor() {}\n\n /**\n * Get current applicant ID\n */\n get applicantId(): number | null {\n return this._applicantId;\n }\n\n /**\n * Get current progress\n */\n get progress(): ProgressApplicantResult | null {\n return this._progress;\n }\n\n /**\n * Get current step\n */\n get currentStep(): FlowStep | null {\n return this._progress?.currentStep || null;\n }\n\n /**\n * Get all workflow steps\n */\n get steps(): StepInfo[] {\n return this._progress?.stepInfoList || [];\n }\n\n /**\n * Get current status\n */\n get status(): ApplicantProgressStatus {\n return this._progress?.status || ApplicantProgressStatus.None;\n }\n\n /**\n * Get workflow result\n */\n get workflowResult(): WorkflowResultType | null {\n return this._progress?.workflowResult || null;\n }\n\n /**\n * Get current error\n */\n get error(): Error | null {\n return this._error;\n }\n\n /**\n * Check if workflow is complete\n */\n get isComplete(): boolean {\n return this.status === ApplicantProgressStatus.Finished;\n }\n\n /**\n * Check if workflow is on hold\n */\n get isOnHold(): boolean {\n return this.status === ApplicantProgressStatus.OnHold;\n }\n\n /**\n * Check if workflow is in progress\n */\n get isInProgress(): boolean {\n return this.status === ApplicantProgressStatus.InProgress;\n }\n\n /**\n * Set applicant ID\n */\n setApplicantId(applicantId: number): void {\n this._applicantId = applicantId;\n }\n\n /**\n * Update progress\n */\n updateProgress(progress: ProgressApplicantResult): void {\n const previousStep = this._progress?.currentStep;\n this._progress = progress;\n this._applicantId = progress.applicantId;\n this._error = null;\n\n // Emit progress updated event\n this.events.emit('progressUpdated', progress);\n\n // Emit step changed event if step changed\n if (previousStep?.order !== progress.currentStep?.order) {\n this.events.emit('stepChanged', progress.currentStep);\n }\n\n // Emit status changed event\n this.events.emit('statusChanged', progress.status);\n\n // Emit completed event if workflow is finished\n if (progress.status === ApplicantProgressStatus.Finished && progress.workflowResult) {\n this.events.emit('completed', progress.workflowResult);\n }\n }\n\n /**\n * Set error\n */\n setError(error: Error): void {\n this._error = error;\n this.events.emit('error', error);\n }\n\n /**\n * Clear error\n */\n clearError(): void {\n this._error = null;\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this._applicantId = null;\n this._progress = null;\n this._error = null;\n }\n\n /**\n * Subscribe to progress updates\n */\n onProgressUpdated(callback: (progress: ProgressApplicantResult) => void): () => void {\n return this.events.on('progressUpdated', callback);\n }\n\n /**\n * Subscribe to step changes\n */\n onStepChanged(callback: (step: FlowStep | null) => void): () => void {\n return this.events.on('stepChanged', callback);\n }\n\n /**\n * Subscribe to status changes\n */\n onStatusChanged(callback: (status: ApplicantProgressStatus) => void): () => void {\n return this.events.on('statusChanged', callback);\n }\n\n /**\n * Subscribe to errors\n */\n onError(callback: (error: Error) => void): () => void {\n return this.events.on('error', callback);\n }\n\n /**\n * Subscribe to completion\n */\n onCompleted(callback: (result: WorkflowResultType) => void): () => void {\n return this.events.on('completed', callback);\n }\n\n /**\n * Clear all event listeners\n */\n clearListeners(): void {\n this.events.clear();\n }\n}\n","import { WorkflowStepAction } from '../types';\n\n/**\n * Step data loader function type\n */\nexport type StepDataLoader<T> = (applicantId: number) => Promise<T>;\n\n/**\n * Step data submitter function type\n */\nexport type StepDataSubmitter<T> = (data: T) => Promise<void>;\n\n/**\n * Step handler configuration\n */\nexport interface StepHandler<TData = any, TSubmit = any> {\n loadData: StepDataLoader<TData>;\n submitData: StepDataSubmitter<TSubmit>;\n}\n\n/**\n * Step router\n * Routes workflow steps to appropriate data loaders and submitters\n */\nexport class StepRouter {\n private handlers = new Map<WorkflowStepAction, StepHandler>();\n\n /**\n * Register a step handler\n */\n registerHandler(action: WorkflowStepAction, handler: StepHandler): void {\n this.handlers.set(action, handler);\n }\n\n /**\n * Get handler for a step action\n */\n getHandler(action: WorkflowStepAction): StepHandler | undefined {\n return this.handlers.get(action);\n }\n\n /**\n * Check if a step has a handler\n */\n hasHandler(action: WorkflowStepAction): boolean {\n return this.handlers.has(action);\n }\n\n /**\n * Load data for a step\n */\n async loadStepData<T>(action: WorkflowStepAction, applicantId: number): Promise<T> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.loadData(applicantId) as Promise<T>;\n }\n\n /**\n * Submit data for a step\n */\n async submitStepData<T>(action: WorkflowStepAction, data: T): Promise<void> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.submitData(data);\n }\n}\n","import { WorkflowState } from './workflow-state';\nimport { StepRouter } from './step-router';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n InvestorCategorizationService,\n} from '../services';\nimport { WorkflowStepAction, ProgressApplicantResult } from '../types';\n\n/**\n * Workflow orchestrator\n * Manages workflow execution and step progression\n */\nexport class WorkflowOrchestrator {\n private state: WorkflowState;\n private stepRouter: StepRouter;\n\n constructor(\n private applicantService: ApplicantService,\n private questionnaireService: QuestionnaireService,\n private uploadDocumentService: UploadDocumentService,\n private appropriatenessTestService: AppropriatenessTestService,\n private overviewService: OverviewService,\n private riskScoringService: RiskScoringService,\n _identityService: IdentityService,\n private investorCategorizationService: InvestorCategorizationService\n ) {\n this.state = new WorkflowState();\n this.stepRouter = new StepRouter();\n this.registerStepHandlers();\n }\n\n /**\n * Register all step handlers\n */\n private registerStepHandlers(): void {\n // Questionnaire handler\n this.stepRouter.registerHandler(WorkflowStepAction.Questionaries, {\n loadData: (applicantId) => this.questionnaireService.getQuestionnaire(applicantId),\n submitData: async (data) => {\n await this.questionnaireService.fillQuestionnaire(data);\n },\n });\n\n // Upload document handler\n this.stepRouter.registerHandler(WorkflowStepAction.UploadDocument, {\n loadData: (applicantId) => this.uploadDocumentService.getUploadDocument(applicantId),\n submitData: (data) => this.uploadDocumentService.fillUploadDocument(data),\n });\n\n // Appropriateness test handler\n this.stepRouter.registerHandler(WorkflowStepAction.AppropriatenessTest, {\n loadData: (applicantId) =>\n this.appropriatenessTestService.getAppropriatenessTest(applicantId),\n submitData: async (data) => {\n await this.appropriatenessTestService.fillAppropriatenessTest(data);\n },\n });\n\n // Overview handler\n this.stepRouter.registerHandler(WorkflowStepAction.Overview, {\n loadData: (applicantId) => this.overviewService.getOverviewData(applicantId),\n submitData: (data: { applicantId: number }) =>\n this.overviewService.passOverview(data.applicantId),\n });\n\n // Risk scoring handler\n this.stepRouter.registerHandler(WorkflowStepAction.RiskScoring, {\n loadData: (applicantId) => this.riskScoringService.getRiskCriterias(applicantId),\n submitData: async (data) => {\n await this.riskScoringService.submitRiskScoring(data);\n },\n });\n\n // Identity SDK handler (no data loading, handled by identity service)\n this.stepRouter.registerHandler(WorkflowStepAction.IdentitySdk, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Identity verification required',\n }),\n submitData: async () => {\n // Identity verification is handled externally by provider SDKs\n // Just refresh progress after completion\n },\n });\n\n // Investor categorization handler\n this.stepRouter.registerHandler(WorkflowStepAction.InvestorCategorization, {\n loadData: (applicantId) =>\n this.investorCategorizationService.getInvestorCategorization(applicantId),\n submitData: async (data) => {\n await this.investorCategorizationService.setInvestorCategorization(data);\n },\n });\n\n // Manual review handler (no action needed from user)\n this.stepRouter.registerHandler(WorkflowStepAction.ManualReview, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Your application is under manual review',\n }),\n submitData: async () => {\n // Manual review is done by admin, no user action\n },\n });\n\n // Additional data handler (generic data collection)\n this.stepRouter.registerHandler(WorkflowStepAction.AdditionalData, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Additional data required',\n }),\n submitData: async () => {\n // Additional data submission handled separately\n },\n });\n }\n\n /**\n * Initialize workflow with applicant ID\n */\n async initialize(applicantId: number): Promise<ProgressApplicantResult> {\n try {\n this.state.setApplicantId(applicantId);\n const progress = await this.applicantService.getProgress(applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Refresh applicant progress\n */\n async refreshProgress(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized. Call initialize() first.');\n }\n\n try {\n const progress = await this.applicantService.getProgress(this.state.applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get data for current step\n */\n async getCurrentStepData<T>(): Promise<T> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n const data = await this.stepRouter.loadStepData<T>(\n this.state.currentStep.action,\n this.state.applicantId\n );\n return data;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Submit data for current step\n */\n async submitCurrentStep(data: any): Promise<void> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n try {\n await this.stepRouter.submitStepData(this.state.currentStep.action, data);\n // Refresh progress after submission\n await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Move to next step (if possible)\n */\n async moveToNextStep(): Promise<ProgressApplicantResult> {\n // Refresh progress to move to next step\n return this.refreshProgress();\n }\n\n /**\n * Move back to previous step\n */\n async moveToPreviousStep(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n await this.applicantService.progressStepBack(this.state.applicantId);\n return await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get workflow state\n */\n getState(): WorkflowState {\n return this.state;\n }\n\n /**\n * Get step router\n */\n getStepRouter(): StepRouter {\n return this.stepRouter;\n }\n}\n","/**\n * Dynamically load external scripts\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script already loaded\n if (id && document.getElementById(id)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n if (id) {\n script.id = id;\n }\n script.async = true;\n\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${src}`));\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Check if a script is already loaded\n */\nexport function isScriptLoaded(id: string): boolean {\n return !!document.getElementById(id);\n}\n\n/**\n * Remove a loaded script\n */\nexport function removeScript(id: string): void {\n const script = document.getElementById(id);\n if (script) {\n script.remove();\n }\n}\n","import { loadScript } from '../load-script';\nimport { SumsubConfig } from '../../types';\n\ndeclare global {\n interface Window {\n snsWebSdk?: any;\n }\n}\n\nconst SUMSUB_CDN = 'https://static.sumsub.com/idensic/static/sns-websdk-builder.js';\n\n/**\n * Resolve a CSS variable from the host page into a concrete color value.\n * Falls back to the provided default when the variable is not set.\n */\nfunction cssVar(name: string, fallback: string): string {\n try {\n const el = document.querySelector('.metakyc-sdk') || document.documentElement;\n const val = getComputedStyle(el).getPropertyValue(name).trim();\n return val || fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Build a CSS string with resolved (not CSS-variable) color values\n * for WebSDK 1.0 levels that still support customCssStr.\n */\nfunction buildThemeCssStr(): string {\n const primary = cssVar('--metakyc-primary', '#2563eb');\n const primaryHover = cssVar('--metakyc-primary-hover', '#1d4ed8');\n const bg = cssVar('--metakyc-background', '#ffffff');\n const surface = cssVar('--metakyc-surface', '#f9fafb');\n const textPrimary = cssVar('--metakyc-text-primary', '#111827');\n const textSecondary = cssVar('--metakyc-text-secondary', '#6b7280');\n const textMuted = cssVar('--metakyc-text-muted', '#9ca3af');\n const border = cssVar('--metakyc-border', '#e5e7eb');\n const fontFamily = cssVar('--metakyc-font-family',\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\");\n\n return `\nbody, html { font-family: ${fontFamily} !important; background-color: ${bg} !important; }\np, span, label, div { color: ${textPrimary}; }\nh1, h2, h3, h4 { color: ${textPrimary}; }\n.step-desc { color: ${textSecondary}; }\nsection.content { background-color: ${surface}; color: ${textPrimary}; padding: 32px 32px 16px; box-shadow: none; border-radius: 10px; border: 1px solid ${border}; }\ninput { color: ${textPrimary}; font-weight: 500; outline: none; background-color: ${bg}; border: 1px solid ${border}; border-radius: 6px; }\ninput:focus { border-color: ${primary}; box-shadow: 0 0 0 2px ${primary}33; }\nbutton.submit, button.back { border-radius: 8px; height: 44px; padding: 0 24px; font-size: 14px; font-weight: 600; background-image: none !important; transform: none !important; box-shadow: none !important; transition: all 0.15s ease; cursor: pointer; }\nbutton.submit { min-width: 120px; background: none; background-color: ${primary}; color: #ffffff; border: none; }\nbutton.submit:hover { background-color: ${primaryHover}; }\nbutton.back { background: none; background-color: ${bg}; border: 1px solid ${border}; color: ${textPrimary}; }\nbutton.back:hover { background-color: ${surface}; }\n.round-icon { background-color: ${primary} !important; background-image: none !important; }\n.upload-item, .document-status { border-color: ${border} !important; }\nselect { background-color: ${bg}; color: ${textPrimary}; border: 1px solid ${border}; border-radius: 6px; }\n.description { color: ${textSecondary}; }\n.subtitle { color: ${textMuted}; }\na { color: ${primary}; }\na:hover { color: ${primaryHover}; }\n`.trim();\n}\n\n/**\n * Sumsub Web SDK provider integration.\n *\n * - WebSDK 2.0 (default since Oct 2025): uses `customizationName` referencing\n * a visual customization created in the Sumsub Dashboard. Also supports\n * `theme: 'light' | 'dark'`.\n *\n * - WebSDK 1.0 (legacy): uses `uiConf.customCssStr` / `uiConf.customCss`\n * for inline CSS theming. Included as a fallback when no customizationName\n * is provided, in case the tenant's level still runs WebSDK 1.0.\n */\nexport class SumsubProvider {\n private sdk: any = null;\n private config: SumsubConfig;\n private completeCallback: ((payload: any) => void) | null = null;\n private errorCallback: ((error: any) => void) | null = null;\n\n constructor(config: SumsubConfig) {\n this.config = config;\n }\n\n async loadSDK(): Promise<void> {\n if (window.snsWebSdk) return;\n await loadScript(SUMSUB_CDN, 'sumsub-websdk');\n if (!window.snsWebSdk) {\n throw new Error('Sumsub Web SDK failed to load from CDN');\n }\n }\n\n async initialize(containerId: string): Promise<void> {\n await this.loadSDK();\n\n const conf: Record<string, any> = {\n lang: this.config.lang || 'en',\n };\n\n if (this.config.applicantEmail) conf.email = this.config.applicantEmail;\n if (this.config.applicantPhone) conf.phone = this.config.applicantPhone;\n if (this.config.theme) conf.theme = this.config.theme;\n\n // WebSDK 2.0: reference a Dashboard customization by name\n if (this.config.customizationName) {\n conf.customizationName = this.config.customizationName;\n }\n\n // WebSDK 1.0 fallback: inject CSS via uiConf when no customizationName\n // is provided. If the level is 2.0 these are silently ignored.\n if (!this.config.customizationName) {\n const uiConf: Record<string, any> = {};\n if (this.config.customCss) uiConf.customCss = this.config.customCss;\n if (this.config.customCssStr) uiConf.customCssStr = this.config.customCssStr;\n if (!uiConf.customCssStr) uiConf.customCssStr = buildThemeCssStr();\n conf.uiConf = uiConf;\n }\n\n const builder = window.snsWebSdk\n .init(\n this.config.accessToken,\n () => this.config.onTokenRefresh(),\n )\n .withConf(conf)\n .withOptions({\n addViewportTag: false,\n adaptIframeHeight: this.config.adaptIframeHeight !== false,\n })\n .on('idCheck.onStepCompleted', (payload: any) => {\n console.log('[Sumsub] Step completed:', payload);\n })\n .on('idCheck.applicantStatus', (payload: any) => {\n console.log('[Sumsub] Applicant status:', payload);\n if (\n payload?.reviewStatus === 'completed' ||\n payload?.reviewResult?.reviewAnswer === 'GREEN'\n ) {\n this.completeCallback?.(payload);\n }\n })\n .on('idCheck.onError', (error: any) => {\n console.error('[Sumsub] Error:', error);\n this.errorCallback?.(error);\n })\n .onMessage((type: string, payload: any) => {\n console.log('[Sumsub] Message:', type, payload);\n if (type === 'idCheck.onApplicantSubmitted') {\n this.completeCallback?.(payload);\n }\n });\n\n this.sdk = builder.build();\n this.sdk.launch(`#${containerId}`);\n }\n\n destroy(): void {\n if (this.sdk) {\n try { this.sdk.destroy(); } catch { /* ignore */ }\n this.sdk = null;\n }\n }\n\n onComplete(callback: (payload: any) => void): void {\n this.completeCallback = callback;\n }\n\n onError(callback: (error: any) => void): void {\n this.errorCallback = callback;\n }\n}\n","import { loadScript } from '../load-script';\nimport { OnfidoConfig } from '../../types';\n\ndeclare global {\n interface Window {\n Onfido?: any;\n }\n}\n\n/**\n * Onfido provider integration\n */\nexport class OnfidoProvider {\n private sdk: any = null;\n private config: OnfidoConfig;\n\n constructor(config: OnfidoConfig) {\n this.config = config;\n }\n\n /**\n * Load Onfido SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://sdk.onfido.com/v12.0.0/onfido.min.js',\n 'onfido-sdk'\n );\n }\n\n /**\n * Initialize Onfido SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.Onfido) {\n await this.loadSDK();\n }\n\n if (!window.Onfido) {\n throw new Error('Onfido SDK failed to load');\n }\n\n this.sdk = window.Onfido.init({\n token: this.config.token,\n containerId: containerId,\n steps: this.config.steps || [\n {\n type: 'welcome',\n options: {\n title: 'Identity Verification',\n },\n },\n {\n type: 'document',\n options: {\n documentTypes: {\n passport: true,\n driving_licence: true,\n national_identity_card: true,\n },\n },\n },\n {\n type: 'face',\n options: {\n requestedVariant: 'standard',\n },\n },\n {\n type: 'complete',\n },\n ],\n onComplete: () => {\n if (this.config.onComplete) {\n this.config.onComplete();\n }\n },\n onError: (error: any) => {\n if (this.config.onError) {\n this.config.onError(error);\n }\n },\n });\n }\n\n /**\n * Destroy Onfido SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.tearDown();\n this.sdk = null;\n }\n }\n}\n","import { SardinAIConfig } from '../../types';\n\ndeclare global {\n interface Window {\n _Sardine?: {\n createContext: (config: any) => any;\n };\n }\n}\n\n/**\n * SardinAI Risk SDK provider integration\n * Implements Sardine's JavaScript SDK for device risk detection\n */\nexport class SardinAIProvider {\n private sardineContext: any = null;\n private config: SardinAIConfig;\n private sessionKey: string;\n\n constructor(config: SardinAIConfig) {\n this.config = config;\n this.sessionKey = config.sessionKey || this.generateSessionKey();\n }\n\n /**\n * Generate a UUID for session key\n */\n private generateSessionKey(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Get Sardine host based on environment and region\n */\n private getSardineHost(): string {\n const { environment, region } = this.config;\n const isSandbox = environment === 'sandbox';\n \n if (isSandbox) {\n return 'api.sandbox.sardine.ai';\n }\n \n switch (region) {\n case 'eu':\n return 'api.eu.sardine.ai';\n case 'ca':\n return 'api.ca.sardine.ai';\n case 'au':\n return 'api.au.sardine.ai';\n default:\n return 'api.sardine.ai';\n }\n }\n\n /**\n * Load SardinAI Risk SDK script\n */\n async loadSDK(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already loaded\n if (window._Sardine) {\n resolve();\n return;\n }\n\n const sardineHost = this.getSardineHost();\n const loader = document.createElement('script');\n loader.type = 'text/javascript';\n loader.async = true;\n loader.src = `https://${sardineHost}/assets/loader.min.js`;\n \n loader.onload = () => {\n console.log('[SardinAI] SDK loaded successfully');\n resolve();\n };\n \n loader.onerror = () => {\n reject(new Error('Failed to load SardinAI SDK'));\n };\n\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(loader, firstScript);\n } else {\n document.head.appendChild(loader);\n }\n });\n }\n\n /**\n * Initialize SardinAI Risk SDK\n */\n async initialize(): Promise<void> {\n try {\n await this.loadSDK();\n\n if (!window._Sardine) {\n throw new Error('SardinAI SDK not available after loading');\n }\n\n const sardineHost = this.getSardineHost();\n const { clientId, environment, flow, enableBiometrics, enablePortScanning } = this.config;\n\n this.sardineContext = window._Sardine.createContext({\n clientId,\n sessionKey: this.sessionKey,\n userIdHash: undefined, // Will be set later via updateConfig\n flow: flow || window.location.pathname,\n environment: environment || 'production',\n parentElement: document.body,\n enableBiometrics: enableBiometrics !== false, // Default true\n enablePortScanning: enablePortScanning === true, // Default false\n region: this.config.region,\n \n // Callback for device response (deprecated but kept for compatibility)\n onDeviceResponse: (data: any) => {\n console.log(`[SardinAI] Device ID: ${data.deviceId}`);\n },\n \n // New callback for session updates\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Session update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Session updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No session update');\n break;\n default:\n console.warn('[SardinAI] Unknown event:', event);\n }\n }\n });\n\n // Add noscript fallback image\n this.addNoScriptFallback(sardineHost);\n\n console.log('[SardinAI] SDK initialized with sessionKey:', this.sessionKey);\n } catch (error) {\n console.error('[SardinAI] Initialization failed:', error);\n throw error;\n }\n }\n\n /**\n * Add noscript fallback for cases where JS is disabled\n */\n private addNoScriptFallback(sardineHost: string): void {\n const noscript = document.createElement('noscript');\n const img = document.createElement('img');\n const { clientId, flow } = this.config;\n \n img.src = `https://${sardineHost}/v1/a.png?clientId=${clientId}&sessionKey=${this.sessionKey}&flow=${flow || 'kyc'}&ns=1`;\n img.style.display = 'none';\n \n noscript.appendChild(img);\n document.body.appendChild(noscript);\n }\n\n /**\n * Update configuration (e.g., set userIdHash after login)\n */\n updateConfig(options: { flow?: string; userIdHash?: string | null; sessionKey?: string }): void {\n if (!this.sardineContext) {\n console.warn('[SardinAI] Cannot update config - SDK not initialized');\n return;\n }\n\n if (options.sessionKey) {\n this.sessionKey = options.sessionKey;\n }\n\n this.sardineContext.updateConfig({\n ...options,\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Config update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Config updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No config update needed');\n break;\n }\n }\n });\n }\n\n /**\n * Get current session key\n */\n getSessionKey(): string {\n return this.sessionKey;\n }\n\n /**\n * Destroy SardinAI SDK instance\n */\n destroy(): void {\n if (this.sardineContext) {\n // SardinAI SDK cleanup if needed\n this.sardineContext = null;\n }\n }\n}\n","import { IdentityVerificationProvider } from '../types';\nimport { SumsubProvider } from './providers/sumsub';\nimport { OnfidoProvider } from './providers/onfido';\nimport { SardinAIProvider } from './providers/sardin-ai';\n\n/**\n * Identity provider manager\n * Factory for creating and managing identity verification providers\n */\nexport class IdentityProviderManager {\n /**\n * Create a provider instance\n */\n static createProvider(\n provider: IdentityVerificationProvider,\n config: any\n ): SumsubProvider | OnfidoProvider | SardinAIProvider {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return new SumsubProvider(config);\n\n case IdentityVerificationProvider.Onfido:\n return new OnfidoProvider(config);\n\n case IdentityVerificationProvider.SardinAI:\n return new SardinAIProvider(config);\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n\n /**\n * Get provider configuration from API token object\n */\n static parseProviderConfig(\n provider: IdentityVerificationProvider,\n tokenObject: Record<string, any>,\n contextConfig?: any\n ): any {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n const sumsubCtx = contextConfig?.identityProviders?.sumsub || {};\n return {\n accessToken: tokenObject.accessToken || tokenObject.token,\n applicantEmail: tokenObject.email,\n applicantPhone: tokenObject.phone,\n externalUserId: tokenObject.externalUserId,\n lang: sumsubCtx.lang || tokenObject.lang || 'en',\n theme: sumsubCtx.theme,\n customizationName: sumsubCtx.customizationName,\n customCss: sumsubCtx.customCss,\n adaptIframeHeight: sumsubCtx.adaptIframeHeight,\n };\n\n case IdentityVerificationProvider.Onfido:\n return {\n token: tokenObject.token || tokenObject.sdkToken,\n };\n\n case IdentityVerificationProvider.SardinAI:\n // Prioritize context config over backend response\n const sardinConfig = contextConfig?.identityProviders?.sardinai || {};\n return {\n clientId: sardinConfig.clientId || tokenObject.clientId,\n sessionKey: sardinConfig.sessionKey || tokenObject.sessionKey,\n environment: sardinConfig.environment || tokenObject.environment || 'production',\n flow: sardinConfig.flow || tokenObject.flow,\n region: sardinConfig.region,\n enableBiometrics: sardinConfig.enableBiometrics,\n enablePortScanning: sardinConfig.enablePortScanning,\n };\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n}\n","import { ThemeConfig } from '../types/theme';\nimport { defaultTheme } from './presets';\n\n/**\n * Theme Manager\n * Handles theme application and CSS variable management.\n * All CSS variables are scoped to .metakyc-sdk via injected <style> tags\n * to prevent host-app interference.\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = defaultTheme;\n private customStyleElement: HTMLStyleElement | null = null;\n private themeStyleElement: HTMLStyleElement | null = null;\n\n constructor() {}\n\n /**\n * Apply theme configuration\n */\n applyTheme(theme: Partial<ThemeConfig>): void {\n this.currentTheme = this.mergeWithDefault(theme);\n this.injectThemeCSS();\n\n if (this.currentTheme.customCSS) {\n this.injectCustomCSS(this.currentTheme.customCSS);\n }\n\n console.log('[ThemeManager] Theme applied:', this.currentTheme.name || 'Custom');\n }\n\n /**\n * Build and inject a single <style> tag that sets all CSS variables on\n * .metakyc-sdk AND re-asserts critical input/portal rules.\n * Scoping to .metakyc-sdk means host-app variables can never interfere.\n */\n private injectThemeCSS(): void {\n if (this.themeStyleElement) {\n this.themeStyleElement.remove();\n }\n\n const colors = this.currentTheme.colors;\n const typo = this.currentTheme.typography;\n const space = this.currentTheme.spacing;\n\n const varMap: Record<string, string | undefined> = {\n 'primary': colors.primary,\n 'primary-hover': colors.primaryHover,\n 'primary-light': colors.primaryLight,\n 'primary-dark': colors.primaryDark,\n 'secondary': colors.secondary,\n 'secondary-hover': colors.secondaryHover,\n 'success': colors.success,\n 'warning': colors.warning,\n 'danger': colors.danger,\n 'info': colors.info,\n 'background': colors.background,\n 'surface': colors.surface,\n 'border': colors.border,\n 'text-primary': colors.textPrimary,\n 'text-secondary': colors.textSecondary,\n 'text-muted': colors.textMuted,\n 'input-bg': colors.inputBg || colors.background,\n 'input-text': colors.inputText || colors.textPrimary,\n 'input-border': colors.inputBorder || colors.border,\n 'input-border-focus': colors.inputBorderFocus || colors.primary,\n 'input-placeholder': colors.inputPlaceholder || colors.textMuted,\n };\n\n if (typo?.fontFamily) varMap['font-family'] = typo.fontFamily;\n if (typo?.headingFont) varMap['heading-font'] = typo.headingFont;\n if (typo?.fontSize) {\n Object.entries(typo.fontSize).forEach(([k, v]) => { varMap[`font-size-${k}`] = v; });\n }\n if (typo?.fontWeight) {\n Object.entries(typo.fontWeight).forEach(([k, v]) => { varMap[`font-weight-${k}`] = String(v); });\n }\n if (space) {\n Object.entries(space).forEach(([k, v]) => { varMap[this.kebabCase(k)] = v; });\n }\n\n const varLines = Object.entries(varMap)\n .filter(([, v]) => !!v)\n .map(([k, v]) => ` --metakyc-${k}: ${v} !important;`)\n .join('\\n');\n\n const css = `\n/* ── metakyc-theme-vars: scoped CSS variables ──────────────────────────────── */\n.metakyc-sdk,\n.metakyc-searchable-select-dropdown,\n.metakyc-multiselect-dropdown {\n${varLines}\n}\n\n/* ── metakyc-input-overrides: hardened input styling ───────────────────────── */\n.metakyc-sdk input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]):not([type=\"range\"]),\n.metakyc-sdk select,\n.metakyc-sdk textarea,\n.metakyc-sdk .metakyc-searchable-select-trigger,\n.metakyc-sdk .metakyc-multiselect-trigger {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"],\n.metakyc-sdk input[type=\"radio\"] {\n appearance: none !important;\n -webkit-appearance: none !important;\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n border: 1.5px solid var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n accent-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"]:checked,\n.metakyc-sdk input[type=\"radio\"]:checked {\n background-color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk .metakyc-help-btn {\n color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n background: transparent !important;\n position: relative !important;\n z-index: 2 !important;\n}\n\n/* ── Portal dropdowns (rendered at document.body, outside .metakyc-sdk) ────── */\n.metakyc-searchable-select-dropdown,\n.metakyc-multiselect-dropdown {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n}\n.metakyc-searchable-select-dropdown input,\n.metakyc-multiselect-dropdown input {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n}\n`;\n\n this.themeStyleElement = document.createElement('style');\n this.themeStyleElement.id = 'metakyc-theme-vars';\n this.themeStyleElement.textContent = css;\n\n if (this.customStyleElement?.parentNode) {\n document.head.insertBefore(this.themeStyleElement, this.customStyleElement);\n } else {\n document.head.appendChild(this.themeStyleElement);\n }\n }\n\n /**\n * Inject custom CSS into document\n */\n private injectCustomCSS(css: string): void {\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n }\n this.customStyleElement = document.createElement('style');\n this.customStyleElement.id = 'metakyc-custom-css';\n this.customStyleElement.textContent = css;\n document.head.appendChild(this.customStyleElement);\n }\n\n /**\n * Merge partial theme with default theme\n */\n private mergeWithDefault(theme: Partial<ThemeConfig>): ThemeConfig {\n return {\n name: theme.name || defaultTheme.name,\n title: theme.title || defaultTheme.title,\n logo: { ...defaultTheme.logo, ...theme.logo },\n colors: { ...defaultTheme.colors, ...theme.colors },\n typography: theme.typography ? \n { ...defaultTheme.typography, ...theme.typography } : \n defaultTheme.typography,\n spacing: theme.spacing ? \n { ...defaultTheme.spacing, ...theme.spacing } : \n defaultTheme.spacing,\n customCSS: theme.customCSS,\n darkMode: theme.darkMode ? {\n colors: { \n ...defaultTheme.darkMode?.colors, \n ...theme.darkMode.colors \n }\n } : defaultTheme.darkMode,\n applicantFormVisibleFields: theme.applicantFormVisibleFields,\n applicantFormRequiredFields: theme.applicantFormRequiredFields,\n allowedLanguages: theme.allowedLanguages,\n applicantFormPages: theme.applicantFormPages,\n reviewPageFields: theme.reviewPageFields,\n reviewPageDisabled: theme.reviewPageDisabled,\n fieldLabelMode: theme.fieldLabelMode,\n companyFormVisibleFields: theme.companyFormVisibleFields,\n companyFormRequiredFields: theme.companyFormRequiredFields,\n companyFormPages: theme.companyFormPages,\n companyReviewPageFields: theme.companyReviewPageFields,\n };\n }\n\n /**\n * Get current theme configuration\n */\n getCurrentTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * Reset to default theme\n */\n resetTheme(): void {\n this.applyTheme(defaultTheme);\n }\n\n /**\n * Remove all custom styles\n */\n cleanup(): void {\n if (this.themeStyleElement) {\n this.themeStyleElement.remove();\n this.themeStyleElement = null;\n }\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n this.customStyleElement = null;\n }\n }\n\n /**\n * Convert camelCase to kebab-case\n */\n private kebabCase(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}\n","import { createContext } from 'react';\nimport { HttpClient } from '../client/http-client';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { MetaKYCClientConfig } from '../client/config';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * MetaKYC context value\n */\nexport interface MetaKYCContextValue {\n config: MetaKYCClientConfig;\n httpClient: HttpClient;\n applicantService: ApplicantService;\n questionnaireService: QuestionnaireService;\n uploadDocumentService: UploadDocumentService;\n appropriatenessTestService: AppropriatenessTestService;\n overviewService: OverviewService;\n riskScoringService: RiskScoringService;\n identityService: IdentityService;\n baseInformationService: BaseInformationService;\n investorCategorizationService: InvestorCategorizationService;\n themeService: ThemeService;\n themeManager: ThemeManager;\n currentTheme: ThemeConfig | null;\n createOrchestrator: () => WorkflowOrchestrator;\n}\n\n/**\n * MetaKYC context\n */\nexport const MetaKYCContext = createContext<MetaKYCContextValue | null>(null);\n","export const SDK_VERSION = '1.0.25';\n","import cssText from './globals.css?inline';\n\nconst STYLE_ID = 'metakyc-sdk-styles';\nlet injected = false;\n\nexport function injectCriticalCSS(): void {\n if (injected) return;\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) { injected = true; return; }\n\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = cssText;\n document.head.appendChild(style);\n injected = true;\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\nimport { HttpClient } from '../client/http-client';\nimport { MetaKYCClientConfig } from '../client/config';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\nimport { defaultTheme } from '../theme/presets';\nimport { SDK_VERSION } from '../version';\nimport { injectCriticalCSS } from '../styles/critical-css';\n\nconst THEME_CACHE_KEY = 'metakyc-theme-cache';\n\n/**\n * Props for MetaKYCProvider\n */\nexport interface MetaKYCProviderProps {\n config: MetaKYCClientConfig;\n children: React.ReactNode;\n}\n\n/**\n * MetaKYC Provider Component\n * Provides MetaKYC client and services to all child components\n */\nexport const MetaKYCProvider: React.FC<MetaKYCProviderProps> = ({ config, children }) => {\n injectCriticalCSS();\n\n const [currentTheme, setCurrentTheme] = useState<ThemeConfig | null>(null);\n const isLoadingThemeRef = React.useRef(false);\n const hasLoadedThemeRef = React.useRef(false);\n \n // Initialize services once - don't recreate on theme changes\n const services = useMemo(() => {\n const httpClient = new HttpClient(config);\n\n const applicantService = new ApplicantService(httpClient);\n const questionnaireService = new QuestionnaireService(httpClient);\n const uploadDocumentService = new UploadDocumentService(httpClient);\n const appropriatenessTestService = new AppropriatenessTestService(httpClient);\n const overviewService = new OverviewService(httpClient);\n const riskScoringService = new RiskScoringService(httpClient);\n const identityService = new IdentityService(httpClient);\n const baseInformationService = new BaseInformationService(httpClient);\n const investorCategorizationService = new InvestorCategorizationService(httpClient);\n const themeService = new ThemeService(httpClient);\n const themeManager = new ThemeManager();\n\n // Apply theme synchronously before first render to prevent flash.\n // Priority: static config theme → localStorage cache → default theme.\n if (typeof document !== 'undefined') {\n if (config.theme) {\n themeManager.applyTheme(config.theme);\n } else {\n try {\n const cached = localStorage.getItem(THEME_CACHE_KEY);\n themeManager.applyTheme(cached ? JSON.parse(cached) : defaultTheme);\n } catch {\n themeManager.applyTheme(defaultTheme);\n }\n }\n }\n\n return {\n httpClient,\n applicantService,\n questionnaireService,\n uploadDocumentService,\n appropriatenessTestService,\n overviewService,\n riskScoringService,\n identityService,\n baseInformationService,\n investorCategorizationService,\n themeService,\n themeManager,\n };\n }, [config]);\n\n // Create context value with current theme\n const value = useMemo<MetaKYCContextValue>(() => {\n return {\n config,\n ...services,\n currentTheme,\n createOrchestrator: () =>\n new WorkflowOrchestrator(\n services.applicantService,\n services.questionnaireService,\n services.uploadDocumentService,\n services.appropriatenessTestService,\n services.overviewService,\n services.riskScoringService,\n services.identityService,\n services.investorCategorizationService\n ),\n };\n }, [config, services, currentTheme]);\n\n // Load and apply theme on mount (only once)\n useEffect(() => {\n const loadTheme = async () => {\n // Prevent duplicate theme loading\n if (isLoadingThemeRef.current || hasLoadedThemeRef.current) {\n console.log('[MetaKYC] Theme already loading or loaded, skipping...');\n return;\n }\n \n isLoadingThemeRef.current = true;\n \n try {\n // If static theme provided in config, use it\n if (config.theme) {\n console.log('[MetaKYC] Applying static theme from config');\n services.themeManager.applyTheme(config.theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n return;\n }\n\n // Otherwise, fetch from backend (default behavior)\n console.log('[MetaKYC] Fetching theme from backend...');\n const theme = await services.themeService.getThemeConfiguration();\n services.themeManager.applyTheme(theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n // Cache for next visit so the correct theme is applied instantly\n try { localStorage.setItem(THEME_CACHE_KEY, JSON.stringify(theme)); } catch { /* ignore */ }\n console.log('[MetaKYC] Theme loaded and applied', theme);\n } catch (error) {\n console.warn('[MetaKYC] Failed to load theme, using default:', error);\n // Set default theme\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n } finally {\n isLoadingThemeRef.current = false;\n }\n };\n\n loadTheme();\n\n // Cleanup on unmount\n return () => {\n services.themeManager.cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <MetaKYCContext.Provider value={value}>\n {config.showVersion && (\n <div\n style={{\n fontSize: '0.625rem',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n opacity: 0.5,\n textAlign: 'right',\n padding: '2px 8px',\n userSelect: 'none',\n pointerEvents: 'none',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}\n >\n SDK v{SDK_VERSION}\n </div>\n )}\n {children}\n </MetaKYCContext.Provider>\n );\n};\n","import { useContext } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\n\n/**\n * Hook to access MetaKYC context\n * @throws Error if used outside MetaKYCProvider\n */\nexport function useMetaKYC(): MetaKYCContextValue {\n const context = useContext(MetaKYCContext);\n\n if (!context) {\n throw new Error('useMetaKYC must be used within a MetaKYCProvider');\n }\n\n return context;\n}\n","/**\n * Convert file to base64 string\n */\nexport async function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const result = reader.result as string;\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = (error) => reject(error);\n });\n}\n\n/**\n * Validate file size\n */\nexport function validateFileSize(file: File, maxSizeBytes: number): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Validate file type\n */\nexport function validateFileType(file: File, allowedTypes: string): boolean {\n const mimeTypes = allowedTypes.split(',').map((type) => type.trim());\n return mimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n // Wildcard type (e.g., image/*)\n const prefix = type.slice(0, -2);\n return file.type.startsWith(prefix);\n }\n return file.type === type;\n });\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Get accept attribute string for file input\n */\nexport function getAcceptString(allowedTypes: string): string {\n return allowedTypes;\n}\n","/**\n * Simple class name utility\n * Combines class names and filters out falsy values\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Local storage utilities for persisting workflow state\n */\n\nconst STORAGE_KEYS = {\n APPLICANT_ID: 'metakyc_applicant_id',\n WORKFLOW_STATE: 'metakyc_workflow_state',\n} as const;\n\n/**\n * Save applicant ID to local storage\n */\nexport function saveApplicantId(applicantId: number): void {\n try {\n localStorage.setItem(STORAGE_KEYS.APPLICANT_ID, applicantId.toString());\n } catch (error) {\n console.warn('Failed to save applicant ID to storage:', error);\n }\n}\n\n/**\n * Get applicant ID from local storage\n */\nexport function getApplicantId(): number | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.APPLICANT_ID);\n return stored ? parseInt(stored, 10) : null;\n } catch (error) {\n console.warn('Failed to retrieve applicant ID from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear applicant ID from local storage\n */\nexport function clearApplicantId(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.APPLICANT_ID);\n } catch (error) {\n console.warn('Failed to clear applicant ID from storage:', error);\n }\n}\n\n/**\n * Persisted workflow state interface\n */\nexport interface PersistedWorkflowState {\n applicantId: number;\n currentStepOrder?: number;\n status: number;\n lastUpdated: string;\n workflowKey?: string;\n nextWorkflowKey?: string;\n}\n\n/**\n * Save workflow state to local storage\n */\nexport function saveWorkflowState(state: PersistedWorkflowState): void {\n try {\n localStorage.setItem(STORAGE_KEYS.WORKFLOW_STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to save workflow state to storage:', error);\n }\n}\n\n/**\n * Get workflow state from local storage\n */\nexport function getWorkflowState(): PersistedWorkflowState | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.WORKFLOW_STATE);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.warn('Failed to retrieve workflow state from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear workflow state from local storage\n */\nexport function clearWorkflowState(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.WORKFLOW_STATE);\n } catch (error) {\n console.warn('Failed to clear workflow state from storage:', error);\n }\n}\n\n/**\n * Clear all MetaKYC data from local storage\n */\nexport function clearAllStorage(): void {\n clearApplicantId();\n clearWorkflowState();\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport * as React from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ProgressApplicantResult,\n ApplicantProgressStatus,\n} from '../types';\nimport { WorkflowOrchestrator } from '../state';\nimport { saveApplicantId, getApplicantId, saveWorkflowState } from '../utils';\n\n/**\n * Hook to manage KYC workflow state and progression with automatic persistence\n */\nexport function useKycWorkflow(applicantId?: number) {\n const { createOrchestrator } = useMetaKYC();\n const [progress, setProgress] = useState<ProgressApplicantResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const orchestratorRef = useRef<WorkflowOrchestrator | null>(null);\n \n // Get persisted applicant ID if not provided\n const effectiveApplicantId = applicantId || getApplicantId();\n\n // Initialize orchestrator\n useEffect(() => {\n if (!orchestratorRef.current) {\n orchestratorRef.current = createOrchestrator();\n }\n }, [createOrchestrator]);\n\n // Save progress to localStorage whenever it changes\n useEffect(() => {\n if (progress && effectiveApplicantId) {\n saveApplicantId(effectiveApplicantId);\n saveWorkflowState({\n applicantId: effectiveApplicantId,\n currentStepOrder: progress.currentStep?.order,\n status: progress.status,\n lastUpdated: new Date().toISOString(),\n workflowKey: progress.workFlowKey,\n nextWorkflowKey: progress.nextWorkflowKey,\n });\n }\n }, [progress, effectiveApplicantId]);\n\n // Track if we're currently loading to prevent duplicate requests\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef(false);\n\n // Load progress\n const loadProgress = useCallback(async () => {\n if (!effectiveApplicantId || !orchestratorRef.current) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.initialize(effectiveApplicantId);\n setProgress(result);\n hasLoadedRef.current = true;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [effectiveApplicantId]);\n\n // Load progress on mount or when applicantId changes\n useEffect(() => {\n if (effectiveApplicantId && !hasLoadedRef.current) {\n loadProgress();\n }\n }, [effectiveApplicantId, loadProgress]);\n\n // Refresh progress\n const refreshProgress = useCallback(async () => {\n if (!orchestratorRef.current) return;\n \n // Prevent duplicate refresh requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Refresh already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, []);\n\n // Move to next step\n const moveToNext = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToNextStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Move to previous step\n const moveBack = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToPreviousStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Submit current step data\n const submitCurrentStep = useCallback(async (data: any) => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n await orchestratorRef.current.submitCurrentStep(data);\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Sort steps by order\n const sortedSteps = React.useMemo(() => {\n if (!progress?.stepInfoList) return [];\n return [...progress.stepInfoList].sort((a, b) => a.order - b.order);\n }, [progress?.stepInfoList]);\n\n // Check if workflow has changed\n const hasWorkflowChanged = React.useMemo(() => {\n if (!progress) return false;\n return progress.nextWorkflowKey && progress.nextWorkflowKey !== progress.workFlowKey;\n }, [progress]);\n\n return {\n progress,\n applicantId: effectiveApplicantId,\n currentStep: progress?.currentStep || null,\n steps: sortedSteps,\n status: progress?.status || ApplicantProgressStatus.None,\n workflowResult: progress?.workflowResult || null,\n workflowKey: progress?.workFlowKey,\n nextWorkflowKey: progress?.nextWorkflowKey,\n hasWorkflowChanged,\n isLoading,\n error,\n isComplete: progress?.status === ApplicantProgressStatus.Finished,\n isOnHold: progress?.status === ApplicantProgressStatus.OnHold,\n refreshProgress,\n moveToNext,\n moveBack,\n submitCurrentStep,\n orchestrator: orchestratorRef.current,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { QuestionnaireOutput, FillQuestionnarieInput, FillQuestionnairesResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage questionnaire data and submission\n */\nexport function useQuestionnaire(applicantId?: number) {\n const { questionnaireService, applicantService } = useMetaKYC();\n const [questionnaire, setQuestionnaire] = useState<QuestionnaireOutput | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load questionnaire + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Questionnaire] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [result, applicantData] = await Promise.all([\n questionnaireService.getQuestionnaire(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setQuestionnaire(result);\n\n // Build initial answers by matching question text to existing results\n if (applicantData?.questionnaireResults?.length && result) {\n const textToAnswers = new Map<string, string[]>();\n for (const qr of applicantData.questionnaireResults) {\n if (qr.question && qr.answers?.length) {\n textToAnswers.set(qr.question.trim().toLowerCase(), qr.answers);\n }\n }\n\n const answers: InitialAnswers = {};\n const allQuestions = result.questionGroups.flatMap(g => g.questions ?? []);\n for (const q of allQuestions) {\n const key = q.text.trim().toLowerCase();\n if (textToAnswers.has(key)) {\n answers[q.id] = textToAnswers.get(key)!;\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, questionnaireService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit questionnaire\n const submit = useCallback(\n async (input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const result = await questionnaireService.fillQuestionnaire(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [questionnaireService]\n );\n\n return {\n questionnaire,\n initialAnswers,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { UploadDocumentOutputDto, FillUploadDocumentInput } from '../types';\n\n/**\n * Hook to manage upload document data and submission\n */\nexport function useUploadDocument(applicantId?: number) {\n const { uploadDocumentService } = useMetaKYC();\n const [uploadDocument, setUploadDocument] = useState<UploadDocumentOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load upload document requirements\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[UploadDocument] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await uploadDocumentService.getUploadDocument(applicantId);\n setUploadDocument(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, uploadDocumentService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit uploaded documents\n const submit = useCallback(\n async (input: FillUploadDocumentInput): Promise<void> => {\n setIsSubmitting(true);\n setUploadProgress(0);\n setError(null);\n\n try {\n await uploadDocumentService.fillUploadDocument(input);\n setUploadProgress(100);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [uploadDocumentService]\n );\n\n return {\n uploadDocument,\n isLoading,\n isSubmitting,\n uploadProgress,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Hook to manage appropriateness test data and submission\n */\nexport function useAppropriatenessTest(applicantId?: number) {\n const { appropriatenessTestService } = useMetaKYC();\n const [test, setTest] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<FillAppropriatenessTestResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load appropriateness test\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[AppropriatenessTest] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTest(data);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, appropriatenessTestService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit appropriateness test\n const submit = useCallback(\n async (input: FillAppropriatenessTestInput): Promise<FillAppropriatenessTestResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await appropriatenessTestService.fillAppropriatenessTest(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [appropriatenessTestService]\n );\n\n return {\n test,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Hook to manage overview data and submission\n */\nexport function useOverview(applicantId?: number) {\n const { overviewService } = useMetaKYC();\n const [overview, setOverview] = useState<OverviewDataDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load overview data\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Overview] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await overviewService.getOverviewData(applicantId);\n setOverview(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, overviewService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Pass overview (confirm and continue)\n const passOverview = useCallback(async () => {\n if (!applicantId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n await overviewService.passOverview(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n }, [applicantId, overviewService]);\n\n return {\n overview,\n isLoading,\n isSubmitting,\n error,\n load,\n passOverview,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { ApplicantRegistrationRequestOutput, IdentityRequest } from '../types';\n\n/**\n * Hook to manage identity verification\n */\nexport function useIdentityVerification(applicantId?: number) {\n const { identityService } = useMetaKYC();\n const [identityData, setIdentityData] = useState<ApplicantRegistrationRequestOutput | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isRequestingRef = useRef(false);\n\n // Request identity verification (individual)\n const requestIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n \n // Prevent duplicate requests using ref\n if (isRequestingRef.current) {\n console.log('[Identity] Request already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl: redirectUrl || '',\n ttl: ttl || 7 * 24 * 3600, // Default: 7 days\n };\n console.log('Identity request input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Identity request result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n },\n [applicantId, identityService]\n );\n\n // Request company identity verification\n const requestCompanyIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl,\n ttl,\n };\n const result = await identityService.identityCompanyRequest(input);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantId, identityService]\n );\n\n // Restart identity verification\n const restartIdentity = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isRequestingRef.current) {\n console.log('[Identity] Restart already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('Restarting identity with input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Restart identity result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n }, [applicantId, identityService]);\n\n return {\n identityData,\n provider: identityData?.provider || null,\n token: identityData?.publicProviderTokenObject || null,\n isLoading,\n error,\n requestIdentity,\n requestCompanyIdentity,\n restartIdentity,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { RiskCriteriaDto, RiskCalculationInput, RiskScoringResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage risk scoring\n */\nexport function useRiskScoring(applicantId?: number) {\n const { riskScoringService, applicantService } = useMetaKYC();\n const [criteria, setCriteria] = useState<RiskCriteriaDto[] | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<RiskScoringResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load risk criteria + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[RiskScoring] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [data, applicantData] = await Promise.all([\n riskScoringService.getRiskCriterias(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setCriteria(data);\n\n // Build initial answers from the latest risk scoring result\n if (applicantData?.riskScoringResults?.length) {\n const latestResult = applicantData.riskScoringResults[0];\n const answers: InitialAnswers = {};\n for (const cr of latestResult.riskCriteriaResults ?? []) {\n if (cr.riskCriteriaId != null && cr.answer != null && cr.answer !== '') {\n // answer may be comma-separated for multi-value criteria — split, trim, and deduplicate\n const values = [...new Set(\n cr.answer.split(',').map((v: string) => v.trim()).filter((v: string) => v !== '')\n )];\n if (values.length > 0) {\n answers[cr.riskCriteriaId] = values;\n }\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, riskScoringService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit risk scoring\n const submit = useCallback(\n async (input: RiskCalculationInput): Promise<RiskScoringResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await riskScoringService.submitRiskScoring(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [riskScoringService]\n );\n\n return {\n criteria,\n initialAnswers,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ApplicantDataDto,\n} from '../types';\n\n/**\n * Hook to manage applicant operations\n */\nexport function useApplicant() {\n const { applicantService, config } = useMetaKYC();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isCreatingRef = useRef(false);\n const isLoadingDataRef = useRef(false);\n\n /**\n * Generate session key for SardinAI if configured\n */\n const generateSardinAISessionKey = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n // Create individual applicant\n const createApplicant = useCallback(\n async (input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> => {\n // Prevent duplicate requests\n if (isCreatingRef.current) {\n console.log('[Applicant] Create already in progress, skipping...');\n throw new Error('Creation already in progress');\n }\n\n isCreatingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n // Ensure applicantAdditionalDatas is always initialized (even if empty)\n if (!input.applicantAdditionalDatas) {\n input.applicantAdditionalDatas = [];\n }\n\n // If SardinAI is configured, add session key to additional data\n if (config.identityProviders?.sardinai) {\n const sessionKey = generateSardinAISessionKey();\n console.log('[SardinAI] Generated session key:', sessionKey);\n \n input.applicantAdditionalDatas.push({\n paramName: 'sessionKey',\n value: sessionKey,\n });\n }\n\n const result = await applicantService.createApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isCreatingRef.current = false;\n }\n },\n [applicantService, config]\n );\n\n // Create company applicant\n const createCompanyApplicant = useCallback(\n async (\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.createCompanyApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n // Get applicant data\n const getApplicantData = useCallback(\n async (applicantId: number): Promise<ApplicantDataDto> => {\n // Prevent duplicate requests\n if (isLoadingDataRef.current) {\n console.log('[Applicant] Data load already in progress, skipping...');\n throw new Error('Data load already in progress');\n }\n\n isLoadingDataRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.getApplicantData(applicantId);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isLoadingDataRef.current = false;\n }\n },\n [applicantService]\n );\n\n // Stop progress\n const stopProgress = useCallback(\n async (applicantId: number): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await applicantService.stopProgress(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n return {\n isLoading,\n error,\n createApplicant,\n createCompanyApplicant,\n getApplicantData,\n stopProgress,\n };\n}\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n color: '#ffffff',\n borderColor: 'transparent',\n },\n secondary: {\n backgroundColor: 'var(--metakyc-surface, #f3f4f6)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #e5e7eb)',\n },\n outline: {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n borderColor: 'var(--metakyc-primary, #2563eb)',\n },\n danger: {\n backgroundColor: 'var(--metakyc-danger, #ef4444)',\n color: '#ffffff',\n borderColor: 'transparent',\n },\n ghost: {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n borderColor: 'transparent',\n },\n};\n\n/**\n * Button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant = 'primary',\n size = 'md',\n isLoading = false,\n disabled,\n className,\n style,\n ...props\n}) => {\n const baseStyles =\n 'inline-flex items-center justify-center rounded-lg font-medium transition-opacity border focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed';\n\n const sizeStyles = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n };\n\n const sizeInline: Record<string, React.CSSProperties> = {\n sm: { padding: '0.375rem 0.75rem', fontSize: '0.875rem' },\n md: { padding: '0.5rem 1rem', fontSize: '0.875rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1rem' },\n };\n\n return (\n <button\n className={cn(baseStyles, sizeStyles[size], className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.5rem',\n fontWeight: 500,\n borderWidth: '1px',\n borderStyle: 'solid',\n cursor: disabled || isLoading ? 'not-allowed' : 'pointer',\n opacity: disabled || isLoading ? 0.5 : 1,\n lineHeight: '1.25rem',\n ...sizeInline[size],\n ...VARIANT_STYLES[variant],\n ...style,\n }}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * Input component — uses CSS variables so it follows the SDK theme.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ label, error, helperText, leftIcon, rightIcon, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n className\n )}\n style={{\n minHeight: '38px',\n backgroundColor: props.readOnly\n ? 'var(--metakyc-surface, #f3f4f6)'\n : 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n cursor: props.readOnly ? 'default' : undefined,\n ...style,\n }}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n {rightIcon}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * Card component\n */\nexport const Card: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('metakyc-card rounded-xl shadow-sm border', className)}\n style={{\n backgroundColor: 'var(--metakyc-surface, #ffffff)',\n borderColor: 'var(--metakyc-border, #e5e7eb)',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: '0.75rem',\n overflow: 'hidden',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card header component\n */\nexport const CardHeader: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4 border-b', className)}\n style={{\n padding: '1rem 1.5rem',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: 'var(--metakyc-border, #e5e7eb)',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content component\n */\nexport const CardContent: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4', className)}\n style={{ padding: '1rem 1.5rem', ...style }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card footer component\n */\nexport const CardFooter: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4 border-t', className)}\n style={{\n padding: '1rem 1.5rem',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: 'var(--metakyc-border, #e5e7eb)',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import React from 'react';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nconst BOX_BASE: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 16,\n height: 16,\n minWidth: 16,\n minHeight: 16,\n maxWidth: 16,\n maxHeight: 16,\n borderRadius: 4,\n borderWidth: '1.5px',\n borderStyle: 'solid',\n cursor: 'pointer',\n flexShrink: 0,\n position: 'relative',\n transition: 'background-color 0.15s, border-color 0.15s',\n boxSizing: 'border-box',\n padding: 0,\n margin: 0,\n verticalAlign: 'middle',\n};\n\n/**\n * Fully inline-styled checkbox — immune to host-app CSS interference.\n * Uses a hidden native input for accessibility + a visual span with SVG checkmark.\n */\nexport const Checkbox: React.FC<CheckboxProps> = ({ checked, onChange, disabled, style }) => {\n const uncheckedBorder = 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))';\n const uncheckedBg = 'var(--metakyc-input-bg, var(--metakyc-background, #ffffff))';\n const checkedColor = 'var(--metakyc-primary, #2563eb)';\n\n return (\n <span\n role=\"checkbox\"\n aria-checked={checked}\n tabIndex={0}\n onClick={() => !disabled && onChange(!checked)}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n if (!disabled) onChange(!checked);\n }\n }}\n style={{\n ...BOX_BASE,\n backgroundColor: checked ? checkedColor : uncheckedBg,\n borderColor: checked ? checkedColor : uncheckedBorder,\n opacity: disabled ? 0.5 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n >\n {checked && (\n <svg\n width=\"10\"\n height=\"8\"\n viewBox=\"0 0 10 8\"\n fill=\"none\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M1 4L3.5 6.5L9 1\"\n stroke=\"#ffffff\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'success' | 'danger' | 'warning' | 'info';\n children: React.ReactNode;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n default: {\n backgroundColor: 'var(--metakyc-surface, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n },\n // Inherits input styling — matches inputs/selects visually\n info: {\n backgroundColor: 'var(--metakyc-input-bg, var(--metakyc-surface, #f9fafb))',\n color: 'var(--metakyc-input-text, var(--metakyc-text-secondary, #6b7280))',\n border: '1px solid var(--metakyc-input-border, var(--metakyc-border, #e5e7eb))',\n },\n success: {\n backgroundColor: 'var(--metakyc-input-bg, var(--metakyc-surface, #f9fafb))',\n color: 'var(--metakyc-input-text, var(--metakyc-text-secondary, #6b7280))',\n border: '1px solid var(--metakyc-input-border, var(--metakyc-border, #e5e7eb))',\n },\n danger: {\n backgroundColor: '#fee2e2',\n color: '#991b1b',\n },\n warning: {\n backgroundColor: '#fef3c7',\n color: '#92400e',\n },\n};\n\n/**\n * Badge component\n */\nexport const Badge: React.FC<BadgeProps> = ({ children, variant = 'default', className, style, ...props }) => {\n return (\n <span\n className={cn(\n 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium',\n className\n )}\n style={{ ...VARIANT_STYLES[variant], ...style }}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className, ...props }) => {\n const sizeStyles = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className={cn('flex items-center justify-center', className)} {...props}>\n <svg\n className={cn('animate-spin text-primary-500', sizeStyles[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n helperText?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * Select component — uses CSS variables so it follows the SDK theme.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ label, error, helperText, options, placeholder, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <select\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n error ? 'border-danger-500' : '',\n className\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n ...style,\n }}\n {...props}\n >\n {placeholder && (\n <option\n key=\"__placeholder__\"\n value=\"\"\n disabled\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >\n {placeholder}\n </option>\n )}\n {options.map((option, idx) => (\n <option\n key={option.value || `option-${idx}`}\n value={option.value}\n disabled={option.disabled}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: option.disabled\n ? 'var(--metakyc-text-muted, #9ca3af)'\n : 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n }}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Checkbox } from './Checkbox';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nexport interface MultiSelectProps {\n label?: string;\n value: string[];\n onChange: (values: string[]) => void;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 280;\n\nexport const MultiSelect: React.FC<MultiSelectProps> = ({\n label,\n value,\n onChange,\n options,\n placeholder = 'Select...',\n disabled: disabledProp = false,\n readOnly = false,\n required = false,\n}) => {\n const disabled = disabledProp || readOnly;\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff', borderColor: '#d1d5db', textPrimary: '#111827',\n textSecondary: '#6b7280', primaryColor: '#2563eb',\n primaryLight: '#eff6ff', hoverBg: '#f9fafb',\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const calcPos = useCallback((): DropdownPos | null => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return { top: openUp ? rect.top : rect.bottom + 4, left: rect.left, width: rect.width, openUp };\n }, []);\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const v = (name: string, fallback: string) => s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n borderColor: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n textPrimary: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primaryColor: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!containerRef.current?.contains(target) && !dropdownRef.current?.contains(target)) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n useEffect(() => {\n if (!isOpen) return;\n const update = () => { const p = calcPos(); if (p) setPos(p); };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => { window.removeEventListener('scroll', update, true); window.removeEventListener('resize', update); };\n }, [isOpen, calcPos]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const toggleOption = (optionValue: string) => {\n if (disabled) return;\n onChange(value.includes(optionValue) ? value.filter(v => v !== optionValue) : [...value, optionValue]);\n };\n\n const removeValue = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) onChange(value.filter(v => v !== optionValue));\n };\n\n const getLabel = (val: string) => options.find(o => o.value === val)?.label || val;\n\n const { bg, borderColor, textPrimary, textSecondary, primaryColor, primaryLight, hoverBg } = portalColors;\n\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-multiselect-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${borderColor}` }}>\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n autoFocus\n onClick={e => e.stopPropagation()}\n className=\"metakyc-multiselect-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n onFocus={e => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const focusBorder = s.getPropertyValue('--metakyc-input-border-focus').trim()\n || s.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = focusBorder;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = `0 0 0 2px ${focusBorder}33`;\n }}\n onBlur={e => {\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = borderColor;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Options */}\n <ul style={{ listStyle: 'none', margin: 0, padding: '4px 0', maxHeight: '192px', overflowY: 'auto' }}>\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>No results</li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = value.includes(option.value);\n return (\n <li\n key={option.value}\n onClick={() => toggleOption(option.value)}\n className=\"metakyc-multiselect-option\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '13px',\n cursor: 'pointer',\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primaryColor : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent'; }}\n >\n <Checkbox\n checked={isSelected}\n onChange={() => {}}\n />\n <span>{option.label}</span>\n </li>\n );\n })\n )}\n </ul>\n\n {/* Clear all */}\n {value.length > 0 && (\n <div style={{ padding: '6px 12px', borderTop: `1px solid ${borderColor}` }}>\n <button\n type=\"button\"\n onClick={() => { onChange([]); setSearch(''); }}\n style={{ fontSize: '12px', color: '#ef4444', background: 'none', border: 'none', cursor: 'pointer', padding: 0 }}\n >\n Clear all ({value.length} selected)\n </button>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full metakyc-multiselect\" ref={containerRef}>\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n 'metakyc-multiselect-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors relative',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n borderColor: isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n {value.length === 0 ? (\n <span\n className=\"metakyc-multiselect-placeholder leading-6\"\n style={{ color: 'var(--metakyc-text-secondary, #9ca3af)' }}\n >\n {placeholder}\n </span>\n ) : (\n <div className=\"flex flex-wrap gap-1 pr-6\">\n {value.map(v => (\n <span\n key={v}\n className=\"metakyc-multiselect-chip inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: 'var(--metakyc-primary-light, #eff6ff)',\n color: 'var(--metakyc-primary, #2563eb)',\n }}\n >\n {getLabel(v)}\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(v, e)}\n className=\"metakyc-multiselect-chip-remove\"\n style={{\n background: 'transparent', border: 'none',\n padding: '0 0 0 2px', margin: 0,\n cursor: 'pointer', fontSize: '14px',\n lineHeight: 1, fontWeight: 'bold',\n display: 'inline-flex', alignItems: 'center',\n boxShadow: 'none', transform: 'none',\n minWidth: 0, width: 'auto', height: 'auto',\n letterSpacing: 'normal', textTransform: 'none',\n }}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n <span\n className=\"metakyc-multiselect-arrow absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-xs\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils';\n\nexport interface SearchableSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SearchableSelectProps {\n label?: string;\n error?: string;\n helperText?: string;\n options: SearchableSelectOption[];\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n className?: string;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 260; // px — search (44) + list (max-h-52 = 208) + padding\n\n/**\n * Single-value searchable dropdown — follows SDK CSS variable theming.\n * The dropdown panel is rendered via a React portal at document.body level\n * so it is never clipped by overflow:hidden parents or stacking contexts.\n */\nexport const SearchableSelect: React.FC<SearchableSelectProps> = ({\n label,\n error,\n helperText,\n options,\n placeholder = 'Select...',\n value,\n onChange,\n disabled: disabledProp = false,\n readOnly = false,\n required = false,\n className,\n}) => {\n const disabled = disabledProp || readOnly;\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n\n // Concrete color values snapped from CSS variables when the dropdown opens.\n // Reading from document.documentElement guarantees we get the ThemeManager's values\n // even though the portal renders outside .metakyc-sdk.\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff',\n border: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n primary: '#2563eb',\n primaryLight: '#eff6ff',\n hoverBg: '#f9fafb',\n });\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const v = (name: string, fallback: string) =>\n s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n border: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n text: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primary: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n // ── Position calculation ──────────────────────────────────────────────────\n const calcPos = useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return {\n top: openUp ? rect.top : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n openUp,\n };\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n const handleToggle = () => (isOpen ? close() : open());\n\n // ── Close on outside click ────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !containerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n // ── Reposition on scroll / resize ────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const update = () => {\n const p = calcPos();\n if (p) setPos(p);\n };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [isOpen, calcPos]);\n\n // ── Focus search on open ──────────────────────────────────────────────────\n useEffect(() => {\n if (isOpen && searchRef.current) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n const selectedLabel = options.find(o => o.value === value)?.label;\n\n const handleSelect = (optValue: string, optDisabled?: boolean) => {\n if (disabled || optDisabled) return;\n onChange(optValue);\n close();\n };\n\n // Destructure snapped concrete values for the portal\n const { bg, border, text: textPrimary, textSecondary, primary, primaryLight, hoverBg } = portalColors;\n\n // ── Portal dropdown panel ─────────────────────────────────────────────────\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-searchable-select-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search input */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${border}` }}>\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n onClick={e => e.stopPropagation()}\n className=\"metakyc-searchable-select-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n onFocus={e => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const focusBorder = s.getPropertyValue('--metakyc-input-border-focus').trim()\n || s.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = focusBorder;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = `0 0 0 2px ${focusBorder}33`;\n }}\n onBlur={e => {\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = border;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Options list */}\n <ul\n style={{\n listStyle: 'none',\n margin: 0,\n padding: '4px 0',\n maxHeight: '208px',\n overflowY: 'auto',\n }}\n >\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>\n No results\n </li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = option.value === value;\n return (\n <li\n key={option.value}\n className=\"metakyc-searchable-select-option\"\n onClick={() => handleSelect(option.value, option.disabled)}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n opacity: option.disabled ? 0.4 : 1,\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primary : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => {\n if (!isSelected && !option.disabled)\n (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg;\n }}\n onMouseLeave={e => {\n if (!isSelected)\n (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n\n return (\n <div\n className={cn('w-full metakyc-searchable-select', className)}\n ref={containerRef}\n >\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && (\n <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>\n )}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleToggle(); }\n if (e.key === 'Escape') close();\n }}\n className={cn(\n 'metakyc-searchable-select-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors text-left',\n 'flex items-center justify-between gap-2',\n 'focus:outline-none',\n disabled ? 'opacity-60 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: selectedLabel\n ? 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))'\n : 'var(--metakyc-input-placeholder, var(--metakyc-text-muted, #9ca3af))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n minHeight: '38px',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n <span className=\"truncate flex-1\">{selectedLabel || placeholder}</span>\n <span\n className=\"flex-shrink-0 text-xs pointer-events-none\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Portal dropdown */}\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n};\n\nSearchableSelect.displayName = 'SearchableSelect';\n","import React, { useRef, useState, useCallback } from 'react';\nimport { cn, formatFileSize } from '../../utils';\n\nexport interface FileUploadProps {\n label?: string;\n subtitle?: string;\n error?: string;\n accept?: string;\n multiple?: boolean;\n maxSize?: number;\n required?: boolean;\n onChange?: (files: File[]) => void;\n value?: File[];\n className?: string;\n}\n\nfunction getFileIcon(file: File) {\n const type = file.type;\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf') return 'pdf';\n return 'file';\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n label,\n subtitle,\n error,\n accept,\n multiple = false,\n maxSize,\n required,\n onChange,\n value = [],\n className,\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const [sizeError, setSizeError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files) return;\n setSizeError(null);\n\n const fileArray = Array.from(files);\n\n if (maxSize) {\n const oversized = fileArray.filter((f) => f.size > maxSize);\n if (oversized.length > 0) {\n setSizeError(`File exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return;\n }\n }\n\n onChange?.(multiple ? [...value, ...fileArray] : [fileArray[0]]);\n }, [maxSize, multiple, onChange, value]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const removeFile = (index: number) => {\n setSizeError(null);\n const newFiles = value.filter((_, i) => i !== index);\n onChange?.(newFiles);\n };\n\n const displayError = error || sizeError;\n const hasFiles = value.length > 0;\n\n return (\n <div className={cn('metakyc-file-upload', className)} style={{ width: '100%' }}>\n {label && (\n <div style={{ marginBottom: '8px' }}>\n <label\n style={{\n display: 'block',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--metakyc-text-primary, #111827)',\n }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-danger, #ef4444)', marginLeft: '2px' }}>*</span>}\n </label>\n {subtitle && (\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '2px' }}>\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n <div\n className=\"metakyc-file-dropzone\"\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n border: `2px dashed ${\n displayError\n ? 'var(--metakyc-danger, #ef4444)'\n : isDragging\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #d1d5db)'\n }`,\n borderRadius: '12px',\n padding: hasFiles ? '20px' : '32px 20px',\n textAlign: 'center',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: isDragging\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))'\n : 'var(--metakyc-background, #ffffff)',\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n style={{ display: 'none' }}\n accept={accept}\n multiple={multiple}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n />\n\n {/* Upload icon */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '12px' }}>\n <div\n style={{\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isDragging\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)'\n : 'var(--metakyc-surface, #f9fafb)',\n transition: 'background-color 0.2s ease',\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isDragging ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-text-muted, #9ca3af)'}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transition: 'stroke 0.2s ease' }}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div>\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-secondary, #6b7280)', margin: 0 }}>\n <span style={{ fontWeight: 600, color: 'var(--metakyc-primary, #2563eb)' }}>Click to upload</span>\n {' '}or drag and drop\n </p>\n {(accept || maxSize) && (\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '4px' }}>\n {accept && <span>{accept}</span>}\n {accept && maxSize && <span> · </span>}\n {maxSize && <span>Max {formatFileSize(maxSize)}</span>}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* File list */}\n {hasFiles && (\n <div style={{ marginTop: '12px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {value.map((file, index) => {\n const icon = getFileIcon(file);\n const isImage = icon === 'image';\n const previewUrl = isImage ? URL.createObjectURL(file) : null;\n\n return (\n <div\n key={`${file.name}-${index}`}\n className=\"metakyc-file-item\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 12px',\n borderRadius: '10px',\n backgroundColor: 'var(--metakyc-surface, #f9fafb)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n transition: 'background-color 0.15s ease',\n }}\n >\n {/* Thumbnail / icon */}\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '8px',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n backgroundColor: isImage ? 'transparent' : 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 10%, transparent)',\n }}\n >\n {isImage && previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n style={{ width: '100%', height: '100%', objectFit: 'cover', borderRadius: '8px' }}\n />\n ) : icon === 'pdf' ? (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n ) : (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-primary, #2563eb)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n )}\n </div>\n\n {/* File info */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <p style={{\n fontSize: '13px',\n fontWeight: 500,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {file.name}\n </p>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', margin: 0, marginTop: '2px' }}>\n {formatFileSize(file.size)}\n </p>\n </div>\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeFile(index); }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'all 0.15s ease',\n padding: 0,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)';\n e.currentTarget.style.color = 'var(--metakyc-danger, #ef4444)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = 'var(--metakyc-text-muted, #9ca3af)';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n );\n })}\n </div>\n )}\n\n {displayError && (\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', marginTop: '6px' }}>\n {displayError}\n </p>\n )}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport { Input, InputProps } from './Input';\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'leftIcon'> {\n countryCode?: string;\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone input component with country code\n */\nexport const PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode = '+1', onCountryCodeChange, className, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {props.label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {props.label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={countryCode}\n onChange={(e) => onCountryCodeChange?.(e.target.value)}\n className={cn(\n 'w-20 rounded-lg border px-3 py-2 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0'\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #d1d5db)',\n }}\n placeholder=\"+1\"\n />\n <Input\n ref={ref}\n type=\"tel\"\n className={cn('flex-1', className)}\n {...props}\n label=\"\"\n />\n </div>\n\n {props.error && <p className=\"mt-1 text-sm text-danger-500\">{props.error}</p>}\n </div>\n );\n }\n);\n\nPhoneInput.displayName = 'PhoneInput';\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useQuestionnaire } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { FillQuestionnarieInput, QuestionDto, QuestionGroupDto } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface QuestionnaireStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedQuestion {\n question: QuestionDto;\n groupIndex: number;\n qIdx: number;\n}\n\ntype Answers = Record<number, string[]>; // questionId → values\ntype Errors = Record<number, string>; // questionId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateQuestion(question: QuestionDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (question.isRequired && isEmpty) {\n return question.errorMessage || 'This field is required';\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n if (first && question.regex) {\n try {\n if (!new RegExp(question.regex).test(first)) {\n return question.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n if (first !== '') {\n const num = Number(first);\n if (!isNaN(num) && first.trim() !== '') {\n if (question.min !== undefined && question.min !== null && num < question.min) {\n return `Minimum value is ${question.min}`;\n }\n if (question.max !== undefined && question.max !== null && num > question.max) {\n return `Maximum value is ${question.max}`;\n }\n } else {\n if (question.min !== undefined && question.min !== null && first.length < question.min) {\n return `Minimum length is ${question.min} characters`;\n }\n if (question.max !== undefined && question.max !== null && first.length > question.max) {\n return `Maximum length is ${question.max} characters`;\n }\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(groups: QuestionGroupDto[]): PagedQuestion[][] {\n const flat: PagedQuestion[] = groups.flatMap((g, gi) =>\n (g.questions ?? []).map((q, qi) => ({ question: q, groupIndex: gi, qIdx: qi }))\n );\n\n const map = new Map<number, PagedQuestion[]>();\n for (const pq of flat) {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (pq.question.pageNumber != null && pq.question.pageNumber > 0) ? pq.question.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(pq);\n }\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, qs]) => qs);\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const QuestionnaireStep: React.FC<QuestionnaireStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { questionnaire, initialAnswers, isLoading, isSubmitting, error, submit } = useQuestionnaire(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (questionnaire ? buildPages(questionnaire.questionGroups) : []),\n [questionnaire]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentQuestions = pages[currentPage] ?? [];\n\n const setAnswer = useCallback((questionId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [questionId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[questionId]; return e; });\n }, []);\n\n // Validate just the questions on the current page\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { question } of currentQuestions) {\n const err = validateQuestion(question, answers[question.id] ?? []);\n if (err) newErrors[question.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentQuestions, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !questionnaire) return;\n\n try {\n const questionResults = questionnaire.questionGroups.flatMap(g =>\n (g.questions ?? []).map(q => ({\n questionId: q.id,\n values: answers[q.id] ?? [],\n }))\n );\n\n const input: FillQuestionnarieInput = {\n applicantId,\n questionnarieId: questionnaire.id,\n questionResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Questionnaire submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading questionnaire: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!questionnaire) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{questionnaire.displayName}</h2>\n {questionnaire.subtitle && (\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {questionnaire.subtitle}\n </p>\n )}\n\n {/* Page indicator — only shown when there are multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Questions for current page */}\n <CardContent className=\"space-y-6\">\n {currentQuestions.map(({ question }) => (\n <QuestionField\n key={question.id}\n question={question}\n value={answers[question.id] ?? []}\n error={fieldErrors[question.id]}\n onChange={vals => setAnswer(question.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── QuestionField ──────────────────────────────────────────────────────────\n\ninterface QuestionFieldProps {\n question: QuestionDto;\n value: string[];\n error?: string;\n onChange: (values: string[]) => void;\n}\n\nconst QuestionField: React.FC<QuestionFieldProps> = ({ question, value, error, onChange }) => {\n const hasDefaultAnswers = (question.defaultAnswers?.length ?? 0) > 0;\n\n const qType = !hasDefaultAnswers\n ? 'text'\n : question.showAsDropdown\n ? question.canMultipleAnswer ? 'multi-select' : 'single-select'\n : question.canMultipleAnswer ? 'checkbox' : 'radio';\n\n return (\n <div className=\"space-y-2\">\n {/* Question label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {question.text}\n {question.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Subtitle / description */}\n {question.subtitle && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {question.subtitle}\n </p>\n )}\n {question.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {question.description}\n </p>\n )}\n\n {/* Text input */}\n {qType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n placeholder={question.subtitle ? undefined : 'Enter your answer…'}\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Dropdown — single select */}\n {qType === 'single-select' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={(question.defaultAnswers ?? []).map(a => ({ value: a, label: a }))}\n placeholder=\"Select an option…\"\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Radio buttons — single choice without dropdown */}\n {qType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes — multiple choice */}\n {(qType === 'checkbox' || qType === 'multi-select') && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={value.includes(answer)}\n onChange={v => {\n if (v) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v2 => v2 !== answer));\n }\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Inline error for input types (radio/checkbox handle their own) */}\n {error && qType === 'text' && null /* already shown in Input */}\n </div>\n );\n};\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { useUploadDocument } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, FileUpload, Spinner } from '../core';\nimport { FillUploadDocumentInput, UploadDocumentFileDto } from '../../types';\nimport { fileToBase64 } from '../../utils';\n\nexport interface UploadDocumentStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\nfunction buildPages(docFiles: UploadDocumentFileDto[]): UploadDocumentFileDto[][] {\n const map = new Map<number, UploadDocumentFileDto[]>();\n for (const df of docFiles) {\n const p = (df.pageNumber != null && df.pageNumber > 0) ? df.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(df);\n }\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, files]) => files);\n}\n\nexport const UploadDocumentStep: React.FC<UploadDocumentStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { uploadDocument, isLoading, isSubmitting, error, submit } = useUploadDocument(applicantId);\n const [files, setFiles] = useState<Record<number, File[]>>({});\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<number, string>>({});\n\n const pages = useMemo(\n () => (uploadDocument ? buildPages(uploadDocument.uploadDocumentFiles) : []),\n [uploadDocument]\n );\n\n const currentDocs = pages[currentPage] ?? [];\n const isLastPage = currentPage === pages.length - 1;\n const totalPages = pages.length;\n\n const validateCurrentPage = useCallback((): boolean => {\n const errs: Record<number, string> = {};\n for (const df of currentDocs) {\n if (df.isRequired && (files[df.id] || []).length === 0) {\n errs[df.id] = `${df.displayName} is required`;\n }\n }\n setPageErrors(errs);\n return Object.keys(errs).length === 0;\n }, [currentDocs, files]);\n\n const handleNext = () => {\n if (validateCurrentPage()) {\n setCurrentPage((p) => p + 1);\n setPageErrors({});\n }\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage((p) => p - 1);\n setPageErrors({});\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validateCurrentPage() || !uploadDocument) return;\n setSubmitError(null);\n\n try {\n const uploadDocumentResults = await Promise.all(\n uploadDocument.uploadDocumentFiles.map(async (docFile) => {\n const fileList = files[docFile.id] || [];\n const valueList = await Promise.all(\n fileList.map(async (file) => ({\n fileName: file.name,\n fileData: await fileToBase64(file),\n }))\n );\n return {\n uploadDocumentFileId: docFile.id,\n valueList,\n };\n })\n );\n\n const input: FillUploadDocumentInput = {\n applicantId,\n uploadDocumentId: uploadDocument.id,\n uploadDocumentResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (err: any) {\n setSubmitError(err?.message || 'Failed to submit documents. Please try again.');\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', padding: '48px 0', gap: '16px' }}>\n <Spinner className=\"my-8\" />\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>Loading document requirements...</p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '32px 0',\n gap: '12px',\n textAlign: 'center',\n }}>\n <div style={{\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <p style={{ fontSize: '14px', color: 'var(--metakyc-danger, #ef4444)', fontWeight: 500 }}>\n Error loading document requirements\n </p>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {error.message}\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (!uploadDocument) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 style={{\n fontSize: '18px',\n fontWeight: 700,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n }}>\n {uploadDocument.displayName || 'Upload Documents'}\n </h2>\n {uploadDocument.subtitle && (\n <p style={{\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n marginTop: '4px',\n }}>\n {uploadDocument.subtitle}\n </p>\n )}\n\n {/* Page indicator */}\n {totalPages > 1 && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: '12px',\n }}>\n <span style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {totalPages}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {pages.map((_, i) => (\n <div\n key={i}\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n borderRadius: '999px',\n transition: 'all 0.2s ease',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Description banner */}\n {uploadDocument.description && currentPage === 0 && (\n <div style={{\n margin: '0 24px',\n marginTop: '4px',\n display: 'flex',\n gap: '10px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))',\n border: '1px solid color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)',\n }}>\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"var(--metakyc-primary, #2563eb)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0, marginTop: '1px' }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-text-secondary, #374151)',\n margin: 0,\n lineHeight: 1.5,\n }}>\n {uploadDocument.description}\n </p>\n </div>\n )}\n\n {/* Document upload fields for current page */}\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '24px' }}>\n {currentDocs.map((docFile) => (\n <FileUpload\n key={docFile.id}\n label={docFile.displayName}\n subtitle={docFile.subtitle}\n accept={docFile.allowedTypes}\n multiple={docFile.multipleFile}\n maxSize={docFile.maxEachFileSizeByte}\n required={docFile.isRequired}\n error={pageErrors[docFile.id]}\n value={files[docFile.id] || []}\n onChange={(newFiles) => {\n setSubmitError(null);\n setPageErrors((prev) => { const e = { ...prev }; delete e[docFile.id]; return e; });\n setFiles((prev) => ({ ...prev, [docFile.id]: newFiles }));\n }}\n />\n ))}\n </div>\n </CardContent>\n\n {/* Error message */}\n {submitError && (\n <div style={{\n margin: '0 24px',\n padding: '10px 14px',\n borderRadius: '8px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>\n {submitError}\n </p>\n </div>\n )}\n\n {/* Footer navigation */}\n <CardFooter>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n >\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n {isSubmitting ? 'Uploading...' : 'Continue'}\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n >\n Next\n </Button>\n )}\n </div>\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { useOverview } from '../../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\n\nexport interface OverviewStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Overview step component\n */\nexport const OverviewStep: React.FC<OverviewStepProps> = ({ applicantId, onComplete, onBack }) => {\n const { overview, isLoading, isSubmitting, error, passOverview } = useOverview(applicantId);\n\n const handleConfirm = async () => {\n await passOverview();\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading overview: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!overview) return null;\n\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{overview.title || 'Overview'}</h2>\n {overview.description && (\n <p className=\"mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{overview.description}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-8\">\n {overview.steps && overview.steps.length > 0 ? (\n overview.steps\n .sort((a, b) => a.order - b.order)\n .map((step) => (\n <div key={step.order} className=\"metakyc-overview-step-item flex items-center space-x-3\">\n <div className=\"metakyc-step-icon flex-shrink-0\">\n <div\n className=\"w-8 h-8 rounded-full flex items-center justify-center font-medium text-sm\"\n style={{ backgroundColor: 'var(--metakyc-primary, #2563eb)', color: '#ffffff' }}\n >\n {step.order + 1}\n </div>\n </div>\n <div \n className=\"metakyc-step-content\"\n style={{\n flex: 1,\n border: 'none',\n height: 'auto',\n background: 'transparent',\n }}\n >\n <span className=\"metakyc-step-title text-sm font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {step.title}\n </span>\n {step.description && (\n <p className=\"metakyc-step-description text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-center py-8\">\n <p style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>Loading overview data...</p>\n </div>\n )}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button onClick={handleConfirm} isLoading={isSubmitting}>\n Continue\n </Button>\n </CardFooter>\n </Card>\n );\n};\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useRiskScoring } from '../../hooks';\nimport { useMetaKYC } from '../../context/useMetaKYC';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { RiskCalculationInput, RiskCriteriaDto, ValueDataType } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface RiskScoringStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Money formatting helpers ───────────────────────────────────────────────\n\n/**\n * Converts a locale string (e.g. \"de\", \"de-AT\", \"EN\") to a BCP-47 tag.\n * Falls back to 'en' if the tag is invalid.\n */\nfunction resolveLocale(locale: string | undefined): string {\n const tag = (locale ?? 'en').toLowerCase().replace('_', '-');\n try {\n Intl.NumberFormat.supportedLocalesOf([tag]);\n return tag;\n } catch {\n return 'en';\n }\n}\n\n/**\n * Returns true when the criterion uses Money / Decimal data type AND has\n * pre-defined string options (radio / checkbox) that may contain numbers.\n */\nfunction isMoneyWithOptions(criterion: RiskCriteriaDto): boolean {\n return (\n criterion.valueDataType === ValueDataType.Money &&\n Array.isArray(criterion.defaultValues) &&\n criterion.defaultValues.length > 0\n );\n}\n\n/**\n * Formats every standalone integer/decimal number inside a label string\n * according to the given locale.\n * Examples (locale = \"de\"):\n * \"5000 - 10000\" → \"5.000 – 10.000\"\n * \"up to 5000\" → \"up to 5.000\"\n * \"> 30000\" → \"> 30.000\"\n *\n * The regex matches numbers that are NOT already formatted with separators so\n * we only touch plain digits (possibly with a decimal dot, e.g. \"1234.56\").\n */\nfunction formatMoneyLabel(raw: string, locale: string): string {\n const fmt = new Intl.NumberFormat(resolveLocale(locale), {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n // Match bare numbers: optional leading sign, digits, optional decimal part.\n return raw.replace(/([\\d]+(?:\\.\\d+)?)/g, (match) => {\n const num = parseFloat(match);\n return isNaN(num) ? match : fmt.format(num);\n });\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedCriterion {\n criterion: RiskCriteriaDto;\n idx: number;\n}\n\ntype Answers = Record<number, string[]>; // criteriaId → values\ntype Errors = Record<number, string>; // criteriaId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateCriterion(criterion: RiskCriteriaDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (criterion.isRequired && isEmpty) {\n return criterion.errorMessage || `${criterion.displayName} is required`;\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n // Regex validation (string types)\n if (first && criterion.regex) {\n try {\n if (!new RegExp(criterion.regex).test(first)) {\n return criterion.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n // Numeric min/max for Integer/Money/DigitOnly types\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n if (isNumeric && first.trim() !== '') {\n const num = Number(first);\n if (!isNaN(num)) {\n if (criterion.min !== undefined && criterion.min !== null && num < criterion.min) {\n return `Minimum value is ${criterion.min}`;\n }\n if (criterion.max !== undefined && criterion.max !== null && num > criterion.max) {\n return `Maximum value is ${criterion.max}`;\n }\n }\n } else if (!isNumeric && first !== '') {\n // String length bounds for text types\n if (criterion.min !== undefined && criterion.min !== null && first.length < criterion.min) {\n return `Minimum length is ${criterion.min} characters`;\n }\n if (criterion.max !== undefined && criterion.max !== null && first.length > criterion.max) {\n return `Maximum length is ${criterion.max} characters`;\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(criteria: RiskCriteriaDto[]): PagedCriterion[][] {\n const map = new Map<number, PagedCriterion[]>();\n criteria.forEach((criterion, idx) => {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (criterion.pageNumber != null && criterion.pageNumber > 0) ? criterion.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push({ criterion, idx });\n });\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, cs]) => cs);\n}\n\nfunction getInputType(criterion: RiskCriteriaDto): 'text' | 'radio' | 'checkbox' | 'country' {\n if (criterion.builtInType === 1) return 'country';\n if (!criterion.defaultValues || criterion.defaultValues.length === 0) return 'text';\n return criterion.multipleValue ? 'checkbox' : 'radio';\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const RiskScoringStep: React.FC<RiskScoringStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { config } = useMetaKYC();\n const locale = config.locale ?? 'en';\n const { criteria, initialAnswers, isLoading, isSubmitting, error, submit } = useRiskScoring(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n const [autoSubmitted, setAutoSubmitted] = useState(false);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (criteria && criteria.length > 0 ? buildPages(criteria) : []),\n [criteria]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentCriteria = pages[currentPage] ?? [];\n\n // Auto-submit when no criteria exist\n React.useEffect(() => {\n if (!isLoading && criteria && criteria.length === 0 && !autoSubmitted && !isSubmitting) {\n setAutoSubmitted(true);\n submit({ applicantId, criteriaValueInputs: [] })\n .then(() => onComplete?.())\n .catch(console.error);\n }\n }, [isLoading, criteria, autoSubmitted, isSubmitting, submit, applicantId, onComplete]);\n\n const setAnswer = useCallback((criteriaId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [criteriaId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[criteriaId]; return e; });\n }, []);\n\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { criterion } of currentCriteria) {\n const err = validateCriterion(criterion, answers[criterion.id] ?? []);\n if (err) newErrors[criterion.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentCriteria, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !criteria) return;\n\n try {\n const criteriaValueInputs = criteria\n .map(c => {\n const vals = (answers[c.id] ?? []).filter(v => v && v.trim());\n return vals.length > 0 ? { riskCriteriaId: c.id, values: vals } : null;\n })\n .filter((x): x is NonNullable<typeof x> => x !== null);\n\n const input: RiskCalculationInput = { applicantId, criteriaValueInputs };\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Risk scoring submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Loading risk scoring criteria…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!isLoading && criteria && criteria.length === 0) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n No criteria required. Moving to next step…\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error loading criteria: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!criteria) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">Risk Assessment</h2>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please answer the following questions for risk evaluation\n </p>\n\n {/* Page indicator — only when multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n Page {currentPage + 1} of {pages.length}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Criteria for current page */}\n <CardContent className=\"space-y-6\">\n {currentCriteria.map(({ criterion }) => (\n <CriterionField\n key={criterion.id}\n criterion={criterion}\n value={answers[criterion.id] ?? []}\n error={fieldErrors[criterion.id]}\n locale={locale}\n onChange={vals => setAnswer(criterion.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? 'Previous' : 'Back'}\n </Button>\n\n {isLastPage ? (\n <Button type=\"button\" isLoading={isSubmitting} onClick={handleSubmit}>\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n Next\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── CriterionField ─────────────────────────────────────────────────────────\n\ninterface CriterionFieldProps {\n criterion: RiskCriteriaDto;\n value: string[];\n error?: string;\n locale: string;\n onChange: (values: string[]) => void;\n}\n\nconst CriterionField: React.FC<CriterionFieldProps> = ({ criterion, value, error, locale, onChange }) => {\n const inputType = getInputType(criterion);\n\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n // When this criterion has Money type + predefined options, show locale-formatted\n // labels but keep the original API string as the stored/submitted value.\n const moneyOptions = isMoneyWithOptions(criterion);\n const getLabel = (raw: string) =>\n moneyOptions ? formatMoneyLabel(raw, locale) : raw;\n\n return (\n <div className=\"space-y-2\">\n {/* Label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {criterion.displayName}\n {criterion.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Description */}\n {criterion.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {criterion.description}\n </p>\n )}\n\n {/* min/max hint for numeric fields */}\n {isNumeric && (criterion.min !== undefined || criterion.max !== undefined) && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {criterion.min !== undefined && criterion.max !== undefined\n ? `Range: ${criterion.min} – ${criterion.max}`\n : criterion.min !== undefined\n ? `Minimum: ${criterion.min}`\n : `Maximum: ${criterion.max}`}\n </p>\n )}\n\n {/* Text / numeric input */}\n {inputType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n type={isNumeric ? 'number' : 'text'}\n placeholder=\"Enter your answer…\"\n error={error}\n required={criterion.isRequired}\n min={criterion.min}\n max={criterion.max}\n onKeyDown={e => {\n if (criterion.valueDataType === ValueDataType.DigitOnly) {\n if (['e', 'E', '+', '-', '.'].includes(e.key)) e.preventDefault();\n }\n }}\n />\n )}\n\n {/* Radio buttons */}\n {inputType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes */}\n {inputType === 'checkbox' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={value.includes(answer)}\n onChange={v => {\n if (v) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v2 => v2 !== answer));\n }\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Country dropdown */}\n {inputType === 'country' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={[\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'United Arab Emirates' },\n ]}\n placeholder=\"Select a country…\"\n error={error}\n required={criterion.isRequired}\n />\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button } from '../core';\nimport { InvestorCategorizationType, InvestorCategorizationInput } from '../../types';\n\nexport interface InvestorCategorizationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Investor Categorization step component\n * Static UI for selecting investor type\n */\nexport const InvestorCategorizationStep: React.FC<InvestorCategorizationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { investorCategorizationService } = useMetaKYC();\n const [selectedType, setSelectedType] = useState<InvestorCategorizationType | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (selectedType === null) {\n setError('Please select an investor type');\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const input: InvestorCategorizationInput = {\n applicantId,\n investorType: selectedType,\n };\n\n console.log('Submitting investor categorization:', input);\n const result = await investorCategorizationService.setInvestorCategorization(input);\n console.log('Investor categorization result:', result);\n\n onComplete?.();\n } catch (err: any) {\n console.error('Error submitting investor categorization:', err);\n setError(err.message || 'Failed to submit investor categorization');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Which statement best describes you?\n </h2>\n <p className=\"mt-2\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n All Tokenise clients are treated as Retail Investors under EU regulation, which gives you the \n highest level of investor protection. For our internal purposes, we ask you to select the \n description that best matches your situation\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm font-medium mb-3\" style={{ color: 'var(--metakyc-text-secondary, #374151)' }}>\n Choose one\n </p>\n\n {/* Individual Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.Individual\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.Individual\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Individual}\n checked={selectedType === InvestorCategorizationType.Individual}\n onChange={() => setSelectedType(InvestorCategorizationType.Individual)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Individual investor\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n (Recommended) Most of our clients choose this option. Provides the strongest protection \n and aligns with our mission to make investing accessible to everyone.\n </div>\n </div>\n </div>\n </label>\n\n {/* Sophisticated Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.Sophisticated\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.Sophisticated\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Sophisticated}\n checked={selectedType === InvestorCategorizationType.Sophisticated}\n onChange={() => setSelectedType(InvestorCategorizationType.Sophisticated)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Sophisticated investor\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n In the last 2 years, I have done one or more of the following:\n </div>\n <ul className=\"text-sm mt-2 space-y-1 list-none\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n <li>Worked in private equity or provided capital to small and medium enterprises, and/or</li>\n <li>Been the director of a company with an annual turnover of at least (USD) $2m million, and/or</li>\n <li>Invested directly in at least 2 private (not listed) companies.</li>\n </ul>\n </div>\n </div>\n </label>\n\n {/* High Networth Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.HighNetWorth\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.HighNetWorth\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.HighNetWorth}\n checked={selectedType === InvestorCategorizationType.HighNetWorth}\n onChange={() => setSelectedType(InvestorCategorizationType.HighNetWorth)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n High networth investor\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n I earn more than (USD/EUR) $150,000 per year, and/or<br />\n I have net assets (excluding my main property) of at least $/EUR 300,000\n </div>\n </div>\n </div>\n </label>\n\n {/* Error Display */}\n {error && (\n <div className=\"p-4 rounded-lg\" style={{ backgroundColor: '#fee2e2', border: '1px solid #fca5a5' }}>\n <p className=\"text-sm\" style={{ color: '#991b1b' }}>\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button \n type=\"submit\" \n isLoading={isSubmitting}\n disabled={selectedType === null}\n >\n Submit\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n AppropriatenessQuestionResult,\n AppropriatenessQuestionOutputDto,\n} from '../../types';\n\nexport interface AppropriatenessTestStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\nfunction parseTimeSpan(ts: string): number {\n const parts = ts.split(':').map(Number);\n if (parts.length === 3) return parts[0] * 3600 + parts[1] * 60 + parts[2];\n return 0;\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n}\n\nexport const AppropriatenessTestStep: React.FC<AppropriatenessTestStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { appropriatenessTestService } = useMetaKYC();\n\n const [testData, setTestData] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [answers, setAnswers] = useState<Record<number, string>>({});\n const [timeRemaining, setTimeRemaining] = useState(0);\n const [isTestStarted, setIsTestStarted] = useState(false);\n const [isTestExpired, setIsTestExpired] = useState(false);\n const [waitTimeRemaining, setWaitTimeRemaining] = useState(0);\n const [currentQ, setCurrentQ] = useState(0);\n const [resultScreen, setResultScreen] = useState<{ success: boolean; message: string } | null>(null);\n\n // ── Load test ─────────────────────────────────────────────────────────\n\n useEffect(() => {\n (async () => {\n try {\n setIsLoading(true);\n setError(null);\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTestData(data);\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const w = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (w > 0) setWaitTimeRemaining(w);\n }\n } catch (err: any) {\n setError(err.message || 'Failed to load appropriateness test');\n } finally {\n setIsLoading(false);\n }\n })();\n }, [applicantId, appropriatenessTestService]);\n\n // ── Timer ─────────────────────────────────────────────────────────────\n\n useEffect(() => {\n if (!isTestStarted || timeRemaining <= 0) return;\n const id = setInterval(() => {\n setTimeRemaining((p) => {\n if (p <= 1) { setIsTestExpired(true); return 0; }\n return p - 1;\n });\n }, 1000);\n return () => clearInterval(id);\n }, [isTestStarted, timeRemaining]);\n\n useEffect(() => {\n if (waitTimeRemaining <= 0) return;\n const id = setInterval(() => {\n setWaitTimeRemaining((p) => (p <= 1 ? 0 : p - 1));\n }, 1000);\n return () => clearInterval(id);\n }, [waitTimeRemaining]);\n\n // Auto-submit on expire\n useEffect(() => {\n if (isTestExpired && !isSubmitting) handleSubmit();\n }, [isTestExpired]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Handlers ──────────────────────────────────────────────────────────\n\n const handleStartTest = () => {\n if (!testData) return;\n setIsTestStarted(true);\n setTimeRemaining(testData.testDurationSec);\n setCurrentQ(0);\n setAnswers({});\n setError(null);\n };\n\n const handleAnswerChange = (qId: number, val: string) => {\n setAnswers((prev) => ({ ...prev, [qId]: val }));\n };\n\n const reloadTestData = useCallback(async () => {\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTestData(data);\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const w = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (w > 0) setWaitTimeRemaining(w);\n }\n } catch { }\n }, [applicantId, appropriatenessTestService]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n if (!testData) return;\n\n if (!isTestExpired) {\n const unanswered = testData.appropriatenessQuestions.length - Object.keys(answers).length;\n if (unanswered > 0) {\n setError(`Please answer all questions. ${unanswered} remaining.`);\n return;\n }\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const questionResults: AppropriatenessQuestionResult[] = testData.appropriatenessQuestions.map(\n (q) => ({ appropriatenessQuestionId: q.id, value: answers[q.id] || '' })\n );\n const input: FillAppropriatenessTestInput = {\n applicantId,\n appropriatenessTestId: testData.id,\n appropriatenessQuestionResults: questionResults,\n };\n\n try {\n const result = await appropriatenessTestService.fillAppropriatenessTest(input);\n if (result.isSuccess) {\n setResultScreen({ success: true, message: result.message || 'Congratulations! You have passed the test.' });\n } else {\n setResultScreen({ success: false, message: result.message || 'You did not pass the test.' });\n setTimeout(() => reloadTestData(), 1000);\n }\n } catch (err: any) {\n if (err.code === 400 && err.message) {\n setResultScreen({ success: false, message: err.message });\n setTimeout(() => reloadTestData(), 1500);\n } else {\n throw err;\n }\n }\n } catch (err: any) {\n setError(err.message || 'Failed to submit test. Please try again.');\n resetTest();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const resetTest = () => {\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n setCurrentQ(0);\n };\n\n // ── Loading ───────────────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', padding: '48px 0', gap: '16px' }}>\n <Spinner className=\"my-8\" />\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>Loading test...</p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (!testData) {\n return (\n <Card>\n <CardContent>\n <div style={{ textAlign: 'center', padding: '48px 0' }}>\n <p style={{ fontSize: '16px', fontWeight: 600, color: 'var(--metakyc-danger, #ef4444)' }}>No test data available</p>\n {error && <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '8px' }}>{error}</p>}\n </div>\n </CardContent>\n </Card>\n );\n }\n\n const attemptsRemaining = testData.testAllowedMaxTry - testData.totalFailedTries;\n const totalQ = testData.appropriatenessQuestions.length;\n const answeredCount = Object.keys(answers).length;\n\n // ── Wait screen ───────────────────────────────────────────────────────\n\n if (waitTimeRemaining > 0) {\n return (\n <Card>\n <CardHeader>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n </CardHeader>\n <CardContent>\n <div style={{ textAlign: 'center', padding: '32px 0' }}>\n <div style={{\n width: '100px',\n height: '100px',\n borderRadius: '50%',\n margin: '0 auto 20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 8%, transparent)',\n }}>\n <span style={{\n fontSize: '28px',\n fontWeight: 700,\n color: 'var(--metakyc-primary, #2563eb)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {formatTime(waitTimeRemaining)}\n </span>\n </div>\n <p style={{ fontSize: '15px', fontWeight: 500, color: 'var(--metakyc-text-primary, #111827)' }}>\n Please wait before retrying\n </p>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '4px' }}>\n You can attempt the test again once the timer expires\n </p>\n {error && (\n <div style={{\n marginTop: '20px',\n padding: '12px 16px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>{error}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // ── Result screen ─────────────────────────────────────────────────────\n\n if (resultScreen) {\n const handleRetake = () => {\n setResultScreen(null);\n resetTest();\n setError(null);\n };\n\n return (\n <Card>\n <CardContent>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n padding: '40px 16px',\n gap: '16px',\n }}>\n {/* Icon */}\n <div style={{\n width: '72px',\n height: '72px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: resultScreen.success\n ? 'color-mix(in srgb, var(--metakyc-success, #10b981) 12%, transparent)'\n : 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)',\n }}>\n {resultScreen.success ? (\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-success, #10b981)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n ) : (\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n )}\n </div>\n\n {/* Title */}\n <h2 style={{\n fontSize: '20px',\n fontWeight: 700,\n color: resultScreen.success\n ? 'var(--metakyc-success, #10b981)'\n : 'var(--metakyc-danger, #ef4444)',\n margin: 0,\n }}>\n {resultScreen.success ? 'Test Passed' : 'Test Failed'}\n </h2>\n\n {/* Message */}\n <p style={{\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n margin: 0,\n lineHeight: 1.6,\n maxWidth: '400px',\n whiteSpace: 'pre-line',\n }}>\n {resultScreen.message}\n </p>\n\n {/* Attempts info for failure */}\n {!resultScreen.success && attemptsRemaining > 0 && (\n <div style={{\n marginTop: '4px',\n padding: '10px 20px',\n borderRadius: '10px',\n backgroundColor: 'var(--metakyc-surface, #f9fafb)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n margin: 0,\n }}>\n You have <strong style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{attemptsRemaining}</strong> attempt{attemptsRemaining !== 1 ? 's' : ''} remaining\n </p>\n </div>\n )}\n\n {!resultScreen.success && attemptsRemaining <= 0 && (\n <div style={{\n marginTop: '4px',\n padding: '10px 20px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-danger, #ef4444)',\n margin: 0,\n }}>\n No attempts remaining. Please contact support for assistance.\n </p>\n </div>\n )}\n </div>\n </CardContent>\n <CardFooter>\n <div style={{ display: 'flex', justifyContent: 'center', width: '100%', gap: '12px' }}>\n {resultScreen.success ? (\n <Button type=\"button\" onClick={() => onComplete?.()}>\n Continue\n </Button>\n ) : (\n <>\n {attemptsRemaining > 0 && waitTimeRemaining <= 0 && (\n <Button type=\"button\" onClick={handleRetake}>\n Retake Test\n </Button>\n )}\n {attemptsRemaining > 0 && waitTimeRemaining > 0 && (\n <Button type=\"button\" onClick={handleRetake}>\n OK\n </Button>\n )}\n {attemptsRemaining <= 0 && onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n </>\n )}\n </div>\n </CardFooter>\n </Card>\n );\n }\n\n // ── Start screen ──────────────────────────────────────────────────────\n\n if (!isTestStarted) {\n return (\n <Card>\n <CardHeader>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-secondary, #6b7280)', marginTop: '4px' }}>\n {testData.subtitle}\n </p>\n )}\n </CardHeader>\n <CardContent>\n {/* Description */}\n {testData.description && (\n <div style={{\n marginBottom: '20px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))',\n border: '1px solid color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)',\n display: 'flex',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-primary, #2563eb)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, marginTop: '1px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-secondary, #374151)', margin: 0, lineHeight: 1.5 }}>\n {testData.description}\n </p>\n </div>\n )}\n\n {/* Stats grid */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px', marginBottom: '20px' }}>\n <StatCard icon=\"questions\" label=\"Questions\" value={String(testData.totalQuestionCount)} />\n <StatCard icon=\"time\" label=\"Time Limit\" value={formatTime(testData.testDurationSec)} />\n <StatCard icon=\"target\" label=\"Pass Requirement\" value={`${testData.testCorrectAnswerPassLimit} correct`} />\n <StatCard\n icon=\"retry\"\n label=\"Attempts Left\"\n value={String(attemptsRemaining)}\n variant={attemptsRemaining <= 1 ? 'warning' : 'default'}\n />\n </div>\n\n {/* Error from previous attempt */}\n {error && (\n <div style={{\n marginBottom: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n display: 'flex',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, marginTop: '1px' }}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" /><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0, lineHeight: 1.5 }}>\n <strong>Previous attempt:</strong> {error}\n </p>\n </div>\n )}\n\n {/* No attempts left */}\n {attemptsRemaining <= 0 && (\n <div style={{\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>\n You have used all your attempts. Please contact support for assistance.\n </p>\n </div>\n )}\n </CardContent>\n <CardFooter>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: onBack ? 'space-between' : 'flex-end', width: '100%' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>Back</Button>\n )}\n <Button type=\"button\" onClick={handleStartTest} disabled={attemptsRemaining <= 0}>\n Start Test\n </Button>\n </div>\n </CardFooter>\n </Card>\n );\n }\n\n // ── Active test ───────────────────────────────────────────────────────\n\n const question = testData.appropriatenessQuestions[currentQ];\n const isLastQ = currentQ === totalQ - 1;\n const allAnswered = answeredCount === totalQ;\n const timerWarning = timeRemaining <= 60;\n\n return (\n <Card>\n {/* Header with timer */}\n <CardHeader>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '2px' }}>\n Question {currentQ + 1} of {totalQ}\n </p>\n </div>\n\n {/* Timer */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 14px',\n borderRadius: '999px',\n backgroundColor: timerWarning\n ? 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)'\n : 'var(--metakyc-surface, #f3f4f6)',\n transition: 'all 0.3s ease',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke={timerWarning ? 'var(--metakyc-danger, #ef4444)' : 'var(--metakyc-text-muted, #9ca3af)'}\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <span style={{\n fontSize: '16px',\n fontWeight: 700,\n fontVariantNumeric: 'tabular-nums',\n color: timerWarning ? 'var(--metakyc-danger, #ef4444)' : 'var(--metakyc-text-primary, #111827)',\n transition: 'color 0.3s ease',\n }}>\n {formatTime(timeRemaining)}\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div style={{ marginTop: '12px' }}>\n <div style={{\n height: '4px',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-border, #e5e7eb)',\n overflow: 'hidden',\n }}>\n <div style={{\n height: '100%',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n width: `${(answeredCount / totalQ) * 100}%`,\n transition: 'width 0.3s ease',\n }} />\n </div>\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: '4px',\n }}>\n <span style={{ fontSize: '11px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {answeredCount} answered\n </span>\n <span style={{ fontSize: '11px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {attemptsRemaining} attempt{attemptsRemaining !== 1 ? 's' : ''} left\n </span>\n </div>\n </div>\n </CardHeader>\n\n <CardContent>\n {question && (\n <QuestionCard\n question={question}\n index={currentQ}\n selectedAnswer={answers[question.id]}\n onSelect={(val) => handleAnswerChange(question.id, val)}\n disabled={isSubmitting}\n />\n )}\n\n {/* Quick nav dots */}\n {totalQ > 1 && (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n gap: '6px',\n marginTop: '20px',\n flexWrap: 'wrap',\n }}>\n {testData.appropriatenessQuestions.map((q, i) => (\n <button\n key={q.id}\n type=\"button\"\n onClick={() => setCurrentQ(i)}\n style={{\n width: '28px',\n height: '28px',\n borderRadius: '8px',\n border: i === currentQ\n ? '2px solid var(--metakyc-primary, #2563eb)'\n : '1px solid var(--metakyc-border, #e5e7eb)',\n backgroundColor: answers[q.id]\n ? (i === currentQ\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)'\n : 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 8%, transparent)')\n : (i === currentQ\n ? 'var(--metakyc-surface, #f9fafb)'\n : 'var(--metakyc-background, #ffffff)'),\n color: answers[q.id]\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-text-muted, #9ca3af)',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {i + 1}\n </button>\n ))}\n </div>\n )}\n\n {/* Time expired banner */}\n {isTestExpired && (\n <div style={{\n marginTop: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, #f59e0b 10%, transparent)',\n border: '1px solid color-mix(in srgb, #f59e0b 25%, transparent)',\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#f59e0b\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <p style={{ fontSize: '13px', color: '#b45309', margin: 0, fontWeight: 500 }}>\n Time's up! Your answers are being submitted.\n </p>\n </div>\n )}\n\n {/* Error */}\n {error && !isTestExpired && (\n <div style={{\n marginTop: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>{error}</p>\n </div>\n )}\n </CardContent>\n\n {/* Footer */}\n <CardFooter>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n if (currentQ > 0) setCurrentQ((p) => p - 1);\n else onBack?.();\n }}\n disabled={isSubmitting}\n >\n {currentQ > 0 ? 'Previous' : 'Cancel'}\n </Button>\n\n <div style={{ display: 'flex', gap: '8px' }}>\n {!isLastQ && (\n <Button\n type=\"button\"\n onClick={() => setCurrentQ((p) => p + 1)}\n >\n Next\n </Button>\n )}\n {(isLastQ || allAnswered) && (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={() => handleSubmit()}\n disabled={!allAnswered && !isTestExpired}\n style={{ opacity: (allAnswered || isTestExpired) ? 1 : 0.5 }}\n >\n {isTestExpired ? 'Submitting...' : 'Submit Test'}\n </Button>\n )}\n </div>\n </div>\n </CardFooter>\n </Card>\n );\n};\n\n// ── StatCard ──────────────────────────────────────────────────────────────\n\nconst STAT_ICONS: Record<string, React.ReactNode> = {\n questions: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\" /><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\n </svg>\n ),\n time: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n ),\n target: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><circle cx=\"12\" cy=\"12\" r=\"6\" /><circle cx=\"12\" cy=\"12\" r=\"2\" />\n </svg>\n ),\n retry: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" /><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </svg>\n ),\n};\n\ninterface StatCardProps {\n icon: string;\n label: string;\n value: string;\n variant?: 'default' | 'warning';\n}\n\nconst StatCard: React.FC<StatCardProps> = ({ icon, label, value, variant = 'default' }) => {\n const isWarning = variant === 'warning';\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '14px',\n borderRadius: '10px',\n backgroundColor: isWarning\n ? 'color-mix(in srgb, #f59e0b 8%, transparent)'\n : 'var(--metakyc-surface, #f9fafb)',\n border: isWarning\n ? '1px solid color-mix(in srgb, #f59e0b 20%, transparent)'\n : '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <div style={{\n color: isWarning ? '#f59e0b' : 'var(--metakyc-primary, #2563eb)',\n flexShrink: 0,\n }}>\n {STAT_ICONS[icon]}\n </div>\n <div>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', margin: 0 }}>{label}</p>\n <p style={{\n fontSize: '15px',\n fontWeight: 600,\n color: isWarning ? '#b45309' : 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n marginTop: '1px',\n }}>\n {value}\n </p>\n </div>\n </div>\n );\n};\n\n// ── QuestionCard ──────────────────────────────────────────────────────────\n\ninterface QuestionCardProps {\n question: AppropriatenessQuestionOutputDto;\n index: number;\n selectedAnswer?: string;\n onSelect: (val: string) => void;\n disabled: boolean;\n}\n\nconst QuestionCard: React.FC<QuestionCardProps> = ({ question, selectedAnswer, onSelect, disabled }) => {\n return (\n <div>\n {/* Question header */}\n <div style={{ marginBottom: '16px' }}>\n {question.groupName && (\n <span style={{\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n color: 'var(--metakyc-primary, #2563eb)',\n marginBottom: '8px',\n }}>\n {question.groupName}\n </span>\n )}\n <h3 style={{\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n lineHeight: 1.5,\n }}>\n {question.question}\n </h3>\n </div>\n\n {/* Answer options */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {question.answers.map((answer, ai) => {\n const isSelected = selectedAnswer === answer;\n return (\n <label\n key={ai}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '14px 16px',\n borderRadius: '10px',\n border: `2px solid ${isSelected ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-border, #e5e7eb)'}`,\n backgroundColor: isSelected\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))'\n : 'var(--metakyc-background, #ffffff)',\n cursor: disabled ? 'default' : 'pointer',\n transition: 'all 0.15s ease',\n opacity: disabled ? 0.6 : 1,\n }}\n onMouseEnter={(e) => {\n if (!disabled && !isSelected) {\n e.currentTarget.style.borderColor = 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 50%, var(--metakyc-border, #e5e7eb))';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.borderColor = 'var(--metakyc-border, #e5e7eb)';\n }\n }}\n >\n {/* Custom radio */}\n <div style={{\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n border: `2px solid ${isSelected ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-border, #d1d5db)'}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'border-color 0.15s ease',\n }}>\n {isSelected && (\n <div style={{\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n }} />\n )}\n </div>\n <input\n type=\"radio\"\n name={`q-${question.id}`}\n value={answer}\n checked={isSelected}\n onChange={() => onSelect(answer)}\n disabled={disabled}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span style={{\n fontSize: '14px',\n color: isSelected\n ? 'var(--metakyc-text-primary, #111827)'\n : 'var(--metakyc-text-secondary, #6b7280)',\n fontWeight: isSelected ? 500 : 400,\n transition: 'color 0.15s ease',\n }}>\n {answer}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useIdentityVerification } from '../../hooks';\nimport { useMetaKYC } from '../../context';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { SearchableSelect } from '../core/SearchableSelect';\nimport { IdentityProviderManager } from '../../identity/provider-manager';\nimport { IdentityVerificationProvider, ApplicantDataDto } from '../../types';\nimport { FormPage, FormFieldEntry, FIELD_METADATA } from '../../types/form-config';\n\nexport interface IdentityVerificationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Identity verification step component\n * Shows review/confirm form BEFORE calling identity request\n */\nexport const IdentityVerificationStep: React.FC<IdentityVerificationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { applicantService, baseInformationService, identityService, config, currentTheme } = useMetaKYC();\n const { identityData, provider, token, isLoading: identityLoading, error, requestIdentity, restartIdentity } =\n useIdentityVerification(applicantId);\n const [providerInstance, setProviderInstance] = useState<any>(null);\n const [applicantData, setApplicantData] = useState<ApplicantDataDto | null>(null);\n const [countries, setCountries] = useState<Array<{ value: string; label: string }>>([]);\n // Phone-number country list (value = countryCode e.g. \"+43\", label = \"+43 – Austria\")\n const [phoneCountries, setPhoneCountries] = useState<Array<{ value: string; label: string }>>([]);\n const [isLoadingData, setIsLoadingData] = useState(true);\n const [showProvider, setShowProvider] = useState(false);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n const hasAutoRequestedRef = React.useRef(false);\n\n // Dynamic review-form data (built-in editable field values)\n const [reviewData, setReviewData] = useState<Record<string, any>>({});\n // State for interactive custom fields on the review page (keyed by paramName)\n const [customData, setCustomData] = useState<Record<string, any>>({});\n\n // The configured review page (from theme) — first element is the single page\n const reviewPage: FormPage | null =\n (currentTheme?.reviewPageFields && currentTheme.reviewPageFields.length > 0)\n ? currentTheme.reviewPageFields[0]\n : null;\n\n // When review page is disabled: skip the review UI and auto-request identity\n const reviewPageDisabled = !!currentTheme?.reviewPageDisabled;\n // Keep a ref so async callbacks always read the latest value\n const reviewPageDisabledRef = useRef(false);\n reviewPageDisabledRef.current = reviewPageDisabled;\n\n const form = useForm({\n defaultValues: {\n street: '',\n streetNumber: '',\n city: '',\n zip: '',\n country: '',\n nationality: '',\n phonenumber: '',\n },\n });\n\n // Load applicant data and countries\n useEffect(() => {\n // ── Review page disabled: skip review UI, auto-request identity directly ──\n if (reviewPageDisabled) {\n if (!hasAutoRequestedRef.current) {\n hasAutoRequestedRef.current = true;\n requestIdentity()\n .then(() => setShowProvider(true))\n .catch(err => console.error('[Identity] Auto-request failed:', err))\n .finally(() => setIsLoadingData(false));\n }\n return;\n }\n\n const loadData = async () => {\n try {\n const [data, countriesData, phoneData] = await Promise.all([\n applicantService.getApplicantData(applicantId),\n baseInformationService.getCountries('', 'en'),\n baseInformationService.getCountries('', 'en', 40), // CountriesType.PhoneNumber\n ]);\n setApplicantData(data);\n \n // Build a deduplicated country option list (abbreviation3 as value)\n const seen = new Set<string>();\n const countryOptions = countriesData\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n setCountries(countryOptions);\n\n // Build phone-number country option list (countryCode as value, e.g. \"+43\")\n const phoneSeen = new Set<string>();\n const phoneOptions = phoneData\n .filter(c => c.countryCode)\n .map(c => ({ value: c.countryCode!, label: `${c.countryCode} – ${c.name}` }))\n .filter(c => {\n if (phoneSeen.has(c.value)) return false;\n phoneSeen.add(c.value);\n return true;\n });\n setPhoneCountries(phoneOptions);\n \n // Extract data from nested ApplicantRequestData\n const requestData = data.applicantRequestData;\n \n // Populate dynamic review-form data from applicant data\n setReviewData({\n firstName: requestData?.firstName || '',\n lastName: requestData?.lastName || '',\n email: requestData?.email || '',\n dateOfBirth: requestData?.dateOfBirth || '',\n title: requestData?.title || '',\n salutation: requestData?.salutation || '',\n phonenumber: requestData?.phonenumber || '',\n mobileCountryCode: requestData?.mobileCountryCode || '',\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n taxCountry: requestData?.taxCountry || '',\n countryOfBirth: requestData?.countryOfBirth || '',\n placeOfBirth: requestData?.placeOfBirth || '',\n educationLevel: requestData?.educationLevel || '',\n occupation: requestData?.occupation || '',\n taxNumber: requestData?.taxNumber || '',\n defaultLanguage: requestData?.defaultLanguage || '',\n });\n\n // Set form default values from applicant request data (static fallback)\n form.reset({\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n phonenumber: requestData?.phonenumber || '',\n });\n\n // Auto-skip to provider only when the review page is explicitly disabled\n // AND the applicant already has an active identity session.\n // When the review page is enabled (default), always show it first.\n const hasExistingIdentity =\n data.kycRecords &&\n data.kycRecords.length > 0 &&\n data.kycRecords[0].providerTokenObject !== null;\n\n if (hasExistingIdentity && !hasAutoRequestedRef.current && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled + existing identity — auto-requesting...');\n hasAutoRequestedRef.current = true;\n try {\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('[Identity] Auto-request failed:', err);\n }\n }\n } catch (err) {\n console.error('Error loading applicant data:', err);\n } finally {\n setIsLoadingData(false);\n }\n };\n loadData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Only auto-show provider from cached hook state when the review page is disabled.\n // When review page is enabled the user must click Confirm to proceed.\n useEffect(() => {\n if (identityData && !showProvider && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled — showing cached provider');\n setShowProvider(true);\n }\n }, [identityData, showProvider]);\n\n // Check if token is expired or about to expire\n useEffect(() => {\n if (token) {\n // Check expiresAt field\n if (token.expiresAt) {\n const expirationTime = new Date(token.expiresAt).getTime();\n const now = Date.now();\n \n if (now >= expirationTime) {\n console.warn('[Identity] Token has expired (expiresAt)');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n\n // Check for expired token in URL or config\n if (token.url) {\n try {\n const url = new URL(token.url);\n // Check if URL contains expiration indicators\n const urlString = url.toString().toLowerCase();\n if (\n urlString.includes('expired') ||\n urlString.includes('invalid') ||\n urlString.includes('error')\n ) {\n console.warn('[Identity] Token URL indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification link has expired. Please restart.');\n return;\n }\n } catch (err) {\n console.error('[Identity] Invalid token URL');\n }\n }\n\n // Check token object for expiration indicators\n if (\n token.status === 'expired' ||\n token.error === 'expired' ||\n token.expired === true\n ) {\n console.warn('[Identity] Token object indicates expiration');\n setIsExpired(true);\n setProviderError('Your verification session has expired. Please restart.');\n return;\n }\n }\n }, [token]);\n\n // When the provider is Sumsub, always use the inline Web SDK within the MetaKYC SDK.\n // The link/iframe approach remains available for direct API consumers outside the SDK.\n const useSumsubSdk =\n provider !== null &&\n (provider as number) === IdentityVerificationProvider.Sumsub;\n\n // Initialize identity provider when ready\n useEffect(() => {\n if (provider !== null && token && !providerInstance && showProvider && !isExpired) {\n const providerType = provider as number;\n\n // ── Sumsub JS SDK mode (opt-in via config.identityProviders.sumsub) ─\n if (useSumsubSdk) {\n console.log('[Sumsub] Fetching access token for Web SDK…');\n setProviderError(null);\n\n (async () => {\n try {\n const accessToken = await identityService.refreshSumsubToken(applicantId);\n\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n providerConfig.accessToken = accessToken;\n providerConfig.onTokenRefresh = () =>\n identityService.refreshSumsubToken(applicantId);\n\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n instance.onComplete((payload: any) => {\n console.log('[Sumsub] Verification complete:', payload);\n onComplete?.();\n });\n instance.onError((err: any) => {\n console.error('[Sumsub] SDK error:', err);\n const msg = typeof err === 'string' ? err : err?.message || 'Unknown error';\n if (msg.toLowerCase().includes('expired')) {\n setIsExpired(true);\n setProviderError('Session expired. Please restart.');\n }\n });\n\n await instance.initialize('sumsub-websdk-container');\n console.log('[Sumsub] Web SDK launched');\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Sumsub] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message || err}`);\n if (String(err.message || err).toLowerCase().includes('expired')) {\n setIsExpired(true);\n }\n }\n })();\n return;\n }\n\n // ── URL-based verification (iframe) for any provider ────────────────\n if (token.url) {\n console.log('[Identity] Loading provider URL for user verification:', token.url);\n setProviderError(null);\n\n try {\n new URL(token.url);\n\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] Initializing Risk SDK in background...');\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n instance.initialize()\n .then(() => console.log('[SardinAI] Risk SDK initialized in background'))\n .catch((err: Error) => console.warn('[SardinAI] Risk SDK init failed (non-blocking):', err));\n } catch (err: any) {\n console.warn('[SardinAI] Risk SDK setup failed (non-blocking):', err);\n }\n }\n\n setProviderInstance({ type: 'url', url: token.url });\n } catch (err: any) {\n console.error('[Identity] Invalid URL:', err);\n setProviderError('Invalid verification URL. Please restart.');\n setIsExpired(true);\n }\n return;\n }\n\n // ── SardinAI without URL: Risk SDK only (no UI) ─────────────────────\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] No URL provided - initializing Risk SDK only...');\n setProviderError(null);\n\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully');\n setProviderInstance(instance);\n setTimeout(() => onComplete?.(), 2000);\n })\n .catch((err: Error) => {\n console.error('[SardinAI] Failed to initialize:', err);\n const errorMessage = err.message?.toLowerCase() || '';\n if (errorMessage.includes('expired') || errorMessage.includes('invalid') || errorMessage.includes('401') || errorMessage.includes('400')) {\n setIsExpired(true);\n setProviderError('Session expired or invalid. Please restart verification.');\n } else {\n setProviderError(`Failed to initialize: ${err.message}`);\n }\n });\n } catch (err: any) {\n console.error('[SardinAI] Error creating provider:', err);\n setProviderError(`Configuration error: ${err.message}`);\n }\n return;\n }\n\n // ── Fallback: other JS SDK providers (Onfido etc.) ──────────────────\n try {\n setProviderError(null);\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n if (providerType === IdentityVerificationProvider.Onfido) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Onfido] Initialization error:', err);\n setProviderError(`Failed to initialize: ${err.message}`);\n });\n }\n\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Identity] Provider setup error:', err);\n setProviderError(`Setup error: ${err.message}`);\n }\n }\n\n return () => {\n if (providerInstance && providerInstance.destroy) {\n try {\n providerInstance.destroy();\n } catch (err) {\n console.error('[Identity] Error destroying provider:', err);\n }\n }\n };\n }, [provider, token, providerInstance, showProvider, onComplete, isExpired, useSumsubSdk, applicantId, config, identityService]);\n\n // Handle confirm and start identity verification\n const handleConfirm = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n // Request identity verification\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('Error starting identity verification:', err);\n }\n };\n\n // Handle restart verification\n const handleRestart = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n setProviderInstance(null);\n \n console.log('[Identity] Restarting verification...');\n \n // Call restart identity endpoint\n await restartIdentity();\n setShowProvider(true);\n } catch (err: any) {\n console.error('Error restarting identity verification:', err);\n setProviderError(err.message || 'Failed to restart verification');\n }\n };\n\n if (isLoadingData || identityLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n Loading identity verification...\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n // Show error/expired state with restart option\n if (showProvider && (providerError || isExpired)) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n Verification Session Issue\n </h2>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg mb-6\">\n <div className=\"flex items-start\">\n <svg\n className=\"h-6 w-6 text-red-600 dark:text-red-400 mr-3 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-1\">\n {isExpired ? 'Session Expired' : 'Verification Error'}\n </h3>\n <p className=\"text-red-800 dark:text-red-200 text-sm\">\n {providerError || 'Your verification session has expired and needs to be restarted.'}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What to do next:\n </h3>\n <ul className=\"text-blue-800 dark:text-blue-200 text-sm space-y-1 list-disc list-inside\">\n <li>Click \"Restart Verification\" below to generate a new session</li>\n <li>Complete the verification process without delays</li>\n <li>If issues persist, contact support</li>\n </ul>\n </div>\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"button\" onClick={handleRestart} disabled={identityLoading}>\n {identityLoading ? 'Restarting...' : 'Restart Verification'}\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show identity provider if already requested\n if (showProvider && identityData) {\n const providerType = provider as number;\n\n // ── Sumsub JS SDK mode: render inline container ───────────────────────\n if (useSumsubSdk) {\n return (\n <div style={{\n background: 'var(--metakyc-background, #ffffff)',\n borderRadius: '12px',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n overflow: 'hidden',\n }}>\n {/* Header */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '20px 24px',\n borderBottom: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <div>\n <h2 style={{\n margin: 0,\n fontSize: '20px',\n fontWeight: 700,\n color: 'var(--metakyc-text-primary, #111827)',\n }}>\n Identity Verification\n </h2>\n <p style={{\n margin: '4px 0 0',\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}>\n Please complete the identity verification process\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleRestart}\n disabled={identityLoading}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n border: '1px solid var(--metakyc-border, #d1d5db)',\n background: 'var(--metakyc-background, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n cursor: identityLoading ? 'not-allowed' : 'pointer',\n opacity: identityLoading ? 0.5 : 1,\n }}\n >\n {identityLoading ? 'Restarting…' : 'Restart'}\n </button>\n </div>\n\n {/* Sumsub SDK renders its own iframe here */}\n <div\n id=\"sumsub-websdk-container\"\n style={{\n minHeight: '520px',\n width: '100%',\n padding: '16px 24px',\n background: 'var(--metakyc-background, #ffffff)',\n }}\n />\n\n {/* Footer */}\n {onBack && (\n <div style={{\n padding: '16px 24px',\n borderTop: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </div>\n )}\n </div>\n );\n }\n\n // ── URL-based verification: show in iframe (any provider) ─────────────\n if (token?.url) {\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRestart}\n disabled={identityLoading}\n >\n Restart\n </Button>\n </div>\n </CardHeader>\n\n <CardContent>\n {/* Info box about expiration */}\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-800 dark:text-yellow-200 text-sm\">\n <strong>Important:</strong> If you see an \"expired\" or \"invalid link\" message below, \n click the \"Restart\" button above to generate a new verification session.\n </p>\n </div>\n\n <div className=\"w-full\" style={{ height: '600px' }}>\n <iframe\n src={token.url}\n className=\"w-full h-full border-0 rounded-lg\"\n allow=\"camera; microphone; geolocation\"\n title=\"Identity Verification\"\n onLoad={(e) => {\n console.log('[Identity] Iframe loaded');\n // Try to detect expiration from iframe content (limited by CORS)\n try {\n const iframe = e.target as HTMLIFrameElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (iframeDoc) {\n const text = iframeDoc.body?.textContent?.toLowerCase() || '';\n if (\n text.includes('expired') ||\n text.includes('invalid') ||\n text.includes('error')\n ) {\n console.warn('[Identity] Iframe shows expiration message');\n setIsExpired(true);\n setProviderError('Your verification link has expired.');\n }\n }\n } catch (err) {\n // CORS restriction - can't access iframe content\n console.log('[Identity] Cannot check iframe content (CORS)');\n }\n }}\n />\n </div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // For SardinAI without URL: Show loading indicator while SDK collects data\n if (providerType === IdentityVerificationProvider.SardinAI) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Device Risk Assessment</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Analyzing device security and behavioral patterns...\n </p>\n </CardHeader>\n\n <CardContent>\n <div className=\"text-center py-12\">\n <Spinner className=\"mb-4\" />\n <p className=\"text-gray-600 dark:text-gray-400\">\n Please wait while we verify your device security\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-500 mt-2\">\n This process is automatic and will complete in a few seconds\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Otherwise, show SDK container (Onfido, etc.)\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">Identity Verification</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n Please complete the identity verification process\n </p>\n </CardHeader>\n\n <CardContent>\n <div id=\"identity-container\" className=\"min-h-[400px]\"></div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // ── Helpers for the dynamic review page ───────────────────────────────────\n\n const COUNTRY_FIELD_META_TYPES = new Set(['country', 'nationality', 'taxCountry', 'countryOfBirth', 'mobileCountryCode', 'otherNationality']);\n\n const colStyle = (span: number | string | undefined = 4): React.CSSProperties => {\n const s = Math.min(4, Math.max(1, Number(span) || 4));\n return { gridColumn: `span ${s} / span ${s}` };\n };\n\n /** Format a raw field value for read-only display */\n const formatDisplayValue = (name: string, value: any): string => {\n if (!value && value !== 0) return '—';\n if (COUNTRY_FIELD_META_TYPES.has(name) && name !== 'mobileCountryCode') {\n const opt = countries.find(c => c.value === value);\n return opt ? opt.label : String(value);\n }\n return String(value);\n };\n\n // ── Help-text portal (inline ? button + modal) ────────────────────────────\n\n const ReviewHelpButton: React.FC<{ helpText: string }> = ({ helpText }) => {\n const [open, setOpen] = useState(false);\n const btnRef = useRef<HTMLButtonElement>(null);\n const [, setPos] = useState({ top: 0, left: 0 });\n\n const openModal = () => {\n if (btnRef.current) {\n const r = btnRef.current.getBoundingClientRect();\n setPos({ top: r.bottom + window.scrollY + 6, left: r.left + window.scrollX });\n }\n setOpen(true);\n };\n\n return (\n <>\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n ref={btnRef}\n onClick={openModal}\n style={{\n width: 18, height: 18, borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent', color: 'var(--metakyc-primary, #2563eb)',\n fontSize: 11, fontWeight: 700, cursor: 'pointer',\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0, lineHeight: 1,\n position: 'relative', zIndex: 2,\n }}\n >?</button>\n {open && ReactDOM.createPortal(\n <div\n style={{\n position: 'fixed', inset: 0, zIndex: 99999,\n background: 'rgba(0,0,0,0.55)',\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n onClick={() => setOpen(false)}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 8px)',\n padding: '20px 24px', maxWidth: 400, width: '90%',\n boxShadow: '0 24px 64px rgba(0,0,0,0.4)',\n }}\n >\n <div dangerouslySetInnerHTML={{ __html: helpText }} style={{ fontSize: 13, color: 'var(--metakyc-text-primary, #111827)', lineHeight: 1.6 }} />\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n style={{\n marginTop: 12, padding: '4px 12px', fontSize: 12,\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 6px)',\n background: 'transparent', cursor: 'pointer',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >Close</button>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n };\n\n /** Wrap any field content with optional help text */\n const withHelp = (content: React.ReactNode, helpText?: string) => {\n if (!helpText) return content;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 5, flexWrap: 'nowrap' }}>\n <div style={{ flex: 1, minWidth: 0 }}>{content}</div>\n <div style={{ paddingTop: 24 }}>\n <ReviewHelpButton helpText={helpText} />\n </div>\n </div>\n );\n };\n\n // ── Interactive custom field renderer ─────────────────────────────────────\n\n const renderCustomField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n const key = `cf-${idx}`;\n const pn = f.paramName ?? '';\n const val = customData[pn];\n\n if (f.customType === 'br') {\n return <div key={key} style={{ ...colStyle(f.colSpan), minHeight: '0.5rem' }} />;\n }\n\n if (f.customType === 'paragraph') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n <div\n className=\"text-sm\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n </div>\n );\n }\n\n if (f.customType === 'html') {\n return (\n <div key={key} style={colStyle(f.colSpan)}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n if (f.customType === 'link') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <a\n href={f.linkUrl ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm underline\"\n style={{ color: 'var(--metakyc-primary, #6366f1)' }}\n >\n {f.displayText || f.label || f.linkText || f.linkUrl}\n </a>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n const checked = val === 'true' || val === true;\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <Checkbox\n checked={!!checked}\n onChange={v => setCustomData(prev => ({ ...prev, [pn]: String(v) }))}\n style={{ marginTop: 2 }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {f.customType === 'link_checkbox' && f.linkUrl ? (\n <><a href={f.linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--metakyc-primary, #6366f1)', textDecoration: 'underline' }}>{f.linkText || f.label}</a>{f.label && f.linkText ? ` ${f.label}` : ''}</>\n ) : (\n f.displayText || f.label\n )}\n </span>\n </label>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'group_checkbox') {\n const selected: string[] = Array.isArray(val) ? val : (val ? [val] : []);\n const toggleOpt = (v: string) => {\n if (f.singleSelect) {\n setCustomData(prev => ({ ...prev, [pn]: selected[0] === v ? [] : [v] }));\n } else {\n setCustomData(prev => ({\n ...prev,\n [pn]: selected.includes(v) ? selected.filter(x => x !== v) : [...selected, v],\n }));\n }\n };\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <Checkbox\n checked={selected.includes(opt.value)}\n onChange={() => toggleOpt(opt.value)}\n style={{ marginTop: 2 }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'radio_group') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={`rg-${pn}`}\n value={opt.value}\n checked={val === opt.value}\n onChange={() => setCustomData(prev => ({ ...prev, [pn]: opt.value }))}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n // text input custom field\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <Input\n label={f.displayText || f.label || pn}\n value={String(val ?? '')}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Full field renderer (built-in + custom) ────────────────────────────────\n\n const renderReviewField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n // Route custom fields\n if (f.isCustom) return renderCustomField(f, idx);\n\n const name = f.name ?? '';\n const meta = FIELD_METADATA[name];\n const label = f.displayText || meta?.label || name;\n const value = reviewData[name] ?? '';\n const isPhoneCountry = name === 'mobileCountryCode';\n const isCountry = !!meta?.countriesType && !isPhoneCountry;\n\n if (!f.editable) {\n return (\n <div key={`ro-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <>\n <label className=\"block text-sm font-medium mb-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{label}</label>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)', minHeight: '1.5rem' }}>\n {formatDisplayValue(name, value)}\n </p>\n </>,\n f.helpText\n )}\n </div>\n );\n }\n\n // Mobile country code: searchable phone-number dropdown (value = \"+43\", label = \"+43 – Austria\")\n if (isPhoneCountry) {\n return (\n <div key={`epc-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: 'Select country code…' }, ...phoneCountries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n if (isCountry) {\n return (\n <div key={`ec-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: `Select ${label.toLowerCase()}…` }, ...countries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n return (\n <div key={`ei-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <Input\n label={label}\n type={meta?.type === 'date' ? 'date' : meta?.type === 'email' ? 'email' : 'text'}\n value={String(value)}\n onChange={e => setReviewData(prev => ({ ...prev, [name]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Dynamic review page ────────────────────────────────────────────────────\n\n if (reviewPage) {\n const pageTitle = reviewPage.title || 'Review Your Information';\n const pageSubtitle = reviewPage.subtitle || 'Please review and confirm your information before starting identity verification';\n return (\n <form onSubmit={e => { e.preventDefault(); handleConfirm(); }}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {pageTitle}\n </h2>\n {pageSubtitle && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {pageSubtitle}\n </p>\n )}\n </CardHeader>\n\n <CardContent>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {reviewPage.fields.map((f, idx) => renderReviewField(f, idx))}\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n }\n\n // ── Static review page (fallback when no config) ────────────────────────\n\n return (\n <form onSubmit={form.handleSubmit(handleConfirm)}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Review Your Information\n </h2>\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Please review and confirm your information before starting identity verification\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Read-only section */}\n <div className=\"space-y-4 pb-4\" style={{ borderBottom: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n {[\n { label: 'Name', value: `${applicantData?.applicantRequestData?.firstName || ''} ${applicantData?.applicantRequestData?.lastName || ''}`.trim() },\n { label: 'Email', value: applicantData?.applicantRequestData?.email },\n { label: 'Date of Birth', value: applicantData?.applicantRequestData?.dateOfBirth || 'Not provided' },\n ].map(({ label, value }) => (\n <div key={label}>\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {label}\n </label>\n <p className=\"mt-1 text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{value}</p>\n </div>\n ))}\n </div>\n\n {/* Editable address fields */}\n <div className=\"space-y-4\">\n <h3 className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Address Information\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller\n control={form.control}\n name=\"country\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Country\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select country…' }, ...countries]}\n />\n )}\n />\n <Controller\n control={form.control}\n name=\"nationality\"\n render={({ field }) => (\n <SearchableSelect\n label=\"Nationality\"\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: 'Select nationality…' }, ...countries]}\n />\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"street\" render={({ field }) => <Input {...field} label=\"Street\" />} />\n <Controller control={form.control} name=\"streetNumber\" render={({ field }) => <Input {...field} label=\"Street Number\" />} />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"city\" render={({ field }) => <Input {...field} label=\"City\" />} />\n <Controller control={form.control} name=\"zip\" render={({ field }) => <Input {...field} label=\"ZIP / Postal Code\" />} />\n </div>\n\n <Controller control={form.control} name=\"phonenumber\" render={({ field }) => <Input {...field} label=\"Phone Number\" type=\"tel\" />} />\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n Confirm and Start Verification\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { Card, CardContent, CardFooter, Button, Badge } from '../core';\nimport { KycStatus, ReviewStatus, WorkflowResultType } from '../../types';\n\nexport interface KycStatusDisplayProps {\n kycStatus: KycStatus | null;\n reviewStatus: ReviewStatus;\n workflowResult: WorkflowResultType | null;\n customMessage?: string;\n onContinue?: () => void;\n onContactSupport?: () => void;\n}\n\n/**\n * KYC Status Display Component\n * Shows appropriate UI based on KYC verification status\n */\nexport const KycStatusDisplay: React.FC<KycStatusDisplayProps> = ({\n kycStatus,\n reviewStatus,\n workflowResult,\n customMessage,\n onContinue,\n onContactSupport,\n}) => {\n // Determine the primary status to display\n const getStatusInfo = () => {\n // Check KYC status first\n if (kycStatus === KycStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Verification Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your identity verification has been successfully approved.',\n };\n }\n\n if (kycStatus === KycStatus.Rejected) {\n return {\n type: 'error' as const,\n title: 'Verification Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Unfortunately, your identity verification was not approved.',\n };\n }\n\n if (kycStatus === KycStatus.Pending || kycStatus === KycStatus.InProgress) {\n return {\n type: 'pending' as const,\n title: 'Verification Pending',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your identity verification is currently being processed.',\n };\n }\n\n // Check review status\n if (reviewStatus === ReviewStatus.Approved) {\n return {\n type: 'success' as const,\n title: 'Application Approved',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your application has been approved.',\n };\n }\n\n if (reviewStatus === ReviewStatus.Reject) {\n return {\n type: 'error' as const,\n title: 'Application Rejected',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'Your application has been rejected.',\n };\n }\n\n if (reviewStatus === ReviewStatus.UnderReview || reviewStatus === ReviewStatus.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Under Review',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application is currently under manual review.',\n };\n }\n\n // Check workflow result\n if (workflowResult === WorkflowResultType.Success) {\n return {\n type: 'success' as const,\n title: 'Process Complete',\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: 'Your verification process has been completed successfully.',\n };\n }\n\n if (workflowResult === WorkflowResultType.Failed) {\n return {\n type: 'error' as const,\n title: 'Process Failed',\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: 'The verification process could not be completed.',\n };\n }\n\n if (workflowResult === WorkflowResultType.AdminReview) {\n return {\n type: 'pending' as const,\n title: 'Admin Review Required',\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: 'Your application requires administrator review.',\n };\n }\n\n // Default waiting state\n // Note: This should only show for non-workflow completion states\n return {\n type: 'pending' as const,\n title: 'Processing',\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: 'Your application is being reviewed.',\n };\n };\n\n const statusInfo = getStatusInfo();\n\n return (\n <Card>\n <CardContent className=\"py-12\">\n {/* Status Icon */}\n <div className=\"flex justify-center mb-6\">\n <div\n className={`w-24 h-24 rounded-full flex items-center justify-center ${statusInfo.iconBg}`}\n >\n <span className={`text-5xl ${statusInfo.iconColor}`}>{statusInfo.icon}</span>\n </div>\n </div>\n\n {/* Title */}\n <h2 className=\"text-3xl font-bold text-center mb-4\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {statusInfo.title}\n </h2>\n\n {/* Status Badge */}\n <div className=\"flex justify-center mb-6\">\n <Badge\n variant={\n statusInfo.type === 'success'\n ? 'success'\n : statusInfo.type === 'error'\n ? 'danger'\n : statusInfo.type === 'pending'\n ? 'warning'\n : 'info'\n }\n >\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : ReviewStatus[reviewStatus]}\n </Badge>\n </div>\n\n {/* Message */}\n <p className=\"text-center mb-6 max-w-md mx-auto\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {customMessage || statusInfo.message}\n </p>\n\n {/* Status-specific content */}\n {statusInfo.type === 'success' && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-green-900 dark:text-green-100 mb-2\">\n What's Next?\n </h3>\n <ul className=\"text-sm text-green-800 dark:text-green-200 space-y-1\">\n <li>✓ Your identity has been verified</li>\n <li>✓ You can now proceed with your application</li>\n <li>✓ All features are now accessible</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'error' && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-2\">\n What Can You Do?\n </h3>\n <ul className=\"text-sm text-red-800 dark:text-red-200 space-y-2\">\n <li>• Review the requirements and ensure all information is correct</li>\n <li>• Contact our support team for assistance</li>\n <li>• You may be able to resubmit your application</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n What Happens Next?\n </h3>\n <ul className=\"text-sm text-blue-800 dark:text-blue-200 space-y-2\">\n <li>• Our team is reviewing your information</li>\n <li>• You will be notified via email once the review is complete</li>\n <li>• This typically takes 24-48 hours</li>\n <li>• No action is required from you at this time</li>\n </ul>\n </div>\n )}\n\n {/* Additional details */}\n <div className=\"mt-6 pt-6\" style={{ borderTop: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>KYC Status:</span>\n <div className=\"font-medium mt-1\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : 'Not Available'}\n </div>\n </div>\n <div>\n <span style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>Review Status:</span>\n <div className=\"font-medium mt-1\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {ReviewStatus[reviewStatus]}\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'center', gap: '1rem' }}>\n {statusInfo.type === 'success' && onContinue && (\n <Button onClick={onContinue} size=\"lg\">\n Continue\n </Button>\n )}\n\n {statusInfo.type === 'error' && (\n <>\n {onContactSupport && (\n <Button variant=\"outline\" onClick={onContactSupport}>\n Contact Support\n </Button>\n )}\n {onContinue && (\n <Button onClick={onContinue}>\n Try Again\n </Button>\n )}\n </>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Please check back later or wait for our email notification\n </p>\n </div>\n )}\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { LogoConfig } from '../types/theme';\n\nexport interface LogoProps {\n config?: LogoConfig;\n className?: string;\n}\n\n/**\n * Logo Component\n * Displays the configured logo in the top-left position\n */\nexport const Logo: React.FC<LogoProps> = ({ config, className = '' }) => {\n // Don't render if logo is not visible or no URL provided\n if (!config?.visible || !config?.url) {\n return null;\n }\n\n return (\n <div className={`metakyc-logo ${className}`}>\n <img\n src={config.url}\n alt={config.alt || 'Company Logo'}\n style={{\n width: config.width || 'auto',\n height: config.height || '40px',\n maxWidth: '100%',\n objectFit: 'contain',\n }}\n onError={(e) => {\n console.warn('[Logo] Failed to load logo:', config.url);\n // Hide on error\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { Logo } from './Logo';\nimport { useMetaKYC } from '../context';\n\nexport interface HeaderProps {\n /** Override the default title from theme */\n title?: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Header Component\n * Displays logo and title inline, separated by | when both are present\n */\nexport const Header: React.FC<HeaderProps> = ({ \n title: titleProp, \n subtitle,\n className = '' \n}) => {\n const { currentTheme } = useMetaKYC();\n \n const title = titleProp || currentTheme?.title || '';\n const hasLogo = !!(currentTheme?.logo && currentTheme.logo.visible && currentTheme.logo.url);\n const hasTitle = !!title;\n\n if (!hasLogo && !hasTitle) return null;\n \n return (\n <div className={`metakyc-header ${className}`}>\n <div\n className=\"metakyc-header-title flex items-center text-xl font-bold\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {hasLogo && (\n <Logo config={currentTheme!.logo} />\n )}\n {hasLogo && hasTitle && (\n <span\n style={{ fontSize: '1.5rem', fontWeight: 300, color: 'var(--metakyc-text-muted, #9ca3af)', margin: '0 12px' }}\n >\n |\n </span>\n )}\n {hasTitle && (\n <span style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{title}</span>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {subtitle}\n </p>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, MultiSelect, Spinner, SearchableSelect } from './core';\nimport { Checkbox } from './core/Checkbox';\nimport { ApplicantRegistrationRequestInput, GenderType } from '../types';\nimport type { ApplicantFormField } from '../client/config';\nimport {\n FIELD_METADATA, DEFAULT_VISIBLE_FIELDS, ALLOWED_LANGUAGES,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\n\nexport interface CreateApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst SYSTEM_REQUIRED: ApplicantFormField[] = ['firstName', 'lastName', 'email', 'phonenumber', 'dateOfBirth'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\n// Shared option input style — matches QuestionnaireStep / RiskScoringStep\nconst OPTION_INPUT_STYLE: React.CSSProperties = {\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n};\n\n// ── Per-field help modal ──────────────────────────────────────────────────────\n\nconst FieldHelpWrapper: React.FC<{ helpText?: string; children: React.ReactNode }> = ({ helpText, children }) => {\n const [open, setOpen] = React.useState(false);\n if (!helpText) return <>{children}</>;\n\n const modal = open ? (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => setOpen(false)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999999,\n background: 'rgba(0, 0, 0, 0.55)',\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: '12px',\n padding: '28px 24px 24px',\n maxWidth: '480px',\n width: '100%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 24px 64px rgba(0,0,0,0.4)',\n position: 'relative',\n }}\n >\n {/* Close button */}\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n style={{\n position: 'absolute',\n top: '12px',\n right: '12px',\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n background: 'var(--metakyc-input-bg, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n fontSize: '16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n\n {/* HTML content */}\n <div\n style={{\n color: 'var(--metakyc-text-primary, #111827)',\n fontSize: '14px',\n lineHeight: 1.75,\n }}\n dangerouslySetInnerHTML={{ __html: helpText }}\n />\n </div>\n </div>\n ) : null;\n\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '5px', flexWrap: 'nowrap' }}>\n {/* Field content — takes natural width so ? sits right next to short text */}\n {children}\n\n {/* Circular ? button — inline, immediately after the component */}\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n onClick={() => setOpen(true)}\n aria-label=\"Help\"\n style={{\n flexShrink: 0,\n marginTop: '2px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '10px',\n fontWeight: '700',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n padding: 0,\n position: 'relative',\n zIndex: 2,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'var(--metakyc-primary, #2563eb)';\n (e.currentTarget as HTMLButtonElement).style.color = '#ffffff';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n (e.currentTarget as HTMLButtonElement).style.color = 'var(--metakyc-primary, #2563eb)';\n }}\n >\n ?\n </button>\n\n {typeof document !== 'undefined' && modal ? createPortal(modal, document.body) : null}\n </div>\n );\n};\n\n// ── CreateApplicantForm ───────────────────────────────────────────────────────\n\nexport const CreateApplicantForm: React.FC<CreateApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createApplicant, isLoading: isCreatingApplicant } = useApplicant();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n /** Values that are pre-filled and never shown in the UI. */\n const hiddenValues: Record<string, string> = config.applicantForm?.hiddenValues || {};\n\n /** Values that are pre-filled and shown as read-only when the field is visible. */\n const initialValues: Record<string, string> = config.applicantForm?.initialValues || {};\n\n /**\n * Label display mode: client config takes precedence; otherwise falls back to\n * the tenant-wide setting from the backend theme; defaults to 'label'.\n */\n const fieldLabelMode = config.applicantForm?.fieldLabelMode || currentTheme?.fieldLabelMode || 'label';\n const showLabels = fieldLabelMode !== 'placeholder';\n\n // ── Theme-derived config ───────────────────────────────────────────────────\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.applicantFormPages && currentTheme.applicantFormPages.length > 0\n ? currentTheme.applicantFormPages\n : null),\n [currentTheme?.applicantFormPages]\n );\n\n const requiredFields: ApplicantFormField[] = useMemo(() => {\n const set = new Set<ApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.applicantFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as ApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as ApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.applicantFormRequiredFields, formPages]);\n\n const flatVisibleFields: ApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as ApplicantFormField);\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n let fields: ApplicantFormField[];\n if (config.applicantForm?.visibleFields) {\n fields = config.applicantForm.visibleFields;\n } else if (currentTheme?.applicantFormVisibleFields && currentTheme.applicantFormVisibleFields.length > 0) {\n fields = currentTheme.applicantFormVisibleFields as ApplicantFormField[];\n } else {\n fields = DEFAULT_VISIBLE_FIELDS;\n }\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }, [config.applicantForm?.visibleFields, currentTheme?.applicantFormVisibleFields, formPages]);\n\n // ── Countries (per-type map) ───────────────────────────────────────────────\n // Each country-type field passes its own CountriesType to the API.\n // We deduplicate by type and load all needed lists in parallel.\n\n const COUNTRY_FIELD_NAMES = new Set([\n 'country', 'nationality', 'taxCountry', 'countryOfBirth',\n 'mobileCountryCode', 'otherNationality',\n ]);\n\n /** Distinct CountriesType values needed for the current form configuration */\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n\n if (types.size === 0) types.add(undefined); // fallback: load all\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n // Track which types are currently in-flight (not yet resolved). Separate from\n // loadedTypesRef so concurrent loads of *different* types are all allowed.\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return; // wait for theme before loading countries\n\n // Only queue types that are neither already loaded nor currently in-flight\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n\n if (typesToLoad.length === 0) {\n // All needed types are loaded (or in-flight) — check if we can clear the spinner\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const isPhoneType = type === 40; // CountriesType.PhoneNumber\n const seen = new Set<string>();\n const list = data\n .map(c => {\n // For phone-number lists use countryCode (+43) as the stored value\n // and show it prominently in the label so the user can search by code.\n if (isPhoneType && c.countryCode) {\n return {\n value: c.countryCode,\n label: `${c.countryCode} – ${c.name}`,\n };\n }\n return { value: c.abbreviation3 || c.abbreviation, label: c.name };\n })\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n // Clear spinner only when *all currently needed* types are fully loaded\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n /** Get the countries list for a given field, respecting any per-entry type override. */\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ─────────────────────────────────────────────────────────────\n const BUILT_IN_FIELD_SET: Record<string, 1> = {\n firstName: 1, lastName: 1, title: 1, email: 1, dateOfBirth: 1,\n phonenumber: 1, mobileCountryCode: 1, street: 1, streetNumber: 1,\n zip: 1, city: 1, country: 1, nationality: 1, otherNationality: 1,\n defaultLanguage: 1, taxCountry: 1, placeOfBirth: 1, countryOfBirth: 1,\n salutation: 1, educationLevel: 1, occupation: 1, taxNumber: 1,\n };\n\n // Merge hidden built-in field values into the initial formData.\n const hiddenBuiltInFields = Object.fromEntries(\n Object.entries(hiddenValues).filter(([k]) => k in BUILT_IN_FIELD_SET)\n );\n\n // Built-in fields from initialValues (shown as read-only)\n const initialBuiltInFields = Object.fromEntries(\n Object.entries(initialValues).filter(([k]) => k in BUILT_IN_FIELD_SET)\n );\n\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n firstName: '', lastName: '', title: '', email: initialEmail, dateOfBirth: '',\n phonenumber: '', externalRefId: initialExternalRefId, mobileCountryCode: '',\n street: '', streetNumber: '', zip: '', city: '', country: '', nationality: '',\n otherNationality: [], defaultLanguage: 'EN', taxCountry: '', placeOfBirth: '',\n countryOfBirth: '', salutation: null, educationLevel: '', occupation: '', taxNumber: '',\n ...hiddenBuiltInFields,\n ...initialBuiltInFields,\n });\n\n // Custom field values — keyed by paramName\n // Pre-seed with any hidden custom param values.\n const hiddenCustomFields = Object.fromEntries(\n Object.entries(hiddenValues).filter(([k]) => !(k in hiddenBuiltInFields) && k !== 'externalRefId' && k !== 'workflowKey')\n );\n const [customData, setCustomData] = useState<Record<string, string>>({ ...hiddenCustomFields });\n\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n // Sequential navigation — every page is always reachable; conditional pages\n // show a gate checkbox at the top; if unchecked their fields are hidden and\n // the user can skip with \"Skip\" or fill in after checking.\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages\n ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1)\n : -1;\n\n const prevPageIndex = formPages\n ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1)\n : -1;\n\n // ── Per-page validation ────────────────────────────────────────────────────\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n\n for (const f of page.fields) {\n if (f.isCustom) {\n // display-only types — skip validation\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n }\n } else if (f.name) {\n const fieldName = f.name as ApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = `${label} is required.`;\n }\n }\n }\n }\n\n return errs;\n };\n\n // ── Submit / navigate ──────────────────────────────────────────────────────\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n\n // If this page is conditional and condition not met, skip validation (user is skipping)\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n return;\n }\n\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n };\n\n const doSubmit = async () => {\n // Final validation: only pages whose condition is met\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) {\n allErrs = { ...allErrs, ...validatePage(page) };\n }\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n\n try {\n if (!formData.externalRefId || formData.externalRefId.trim() === '') {\n setGlobalError('External Reference ID is required. Please pass it via config.applicantForm.externalRefId.');\n return;\n }\n\n const requestData: Partial<ApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId.trim(),\n };\n\n if (formPages) {\n // Page-based mode: collect fields from condition-met pages\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom && f.name) {\n const field = f.name as ApplicantFormField;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n }\n // Always include pre-filled required fields even if not on any page\n // (e.g. email pre-filled via config.applicantForm.email)\n for (const field of SYSTEM_REQUIRED) {\n if ((requestData as any)[field] === undefined) {\n const value = formData[field as ApplicantFormField];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n } else {\n // Flat mode: use all visible fields\n flatVisibleFields.forEach(field => {\n if (field === 'externalRefId') return;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n });\n }\n\n // Merge custom field values from visible pages into applicantAdditionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n // Skip display-only types\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n const raw = customData[f.paramName] ?? '';\n let value: string;\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n // Boolean checkbox → human-readable yes/no\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n // text, group_checkbox, radio_group — pass the actual value\n value = raw;\n // Skip empty optional text fields instead of sending a blank value\n if (!value && !f.required) continue;\n }\n\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n // Inject hidden built-in field values that are not already in requestData.\n for (const [field, value] of Object.entries(hiddenBuiltInFields)) {\n if ((requestData as any)[field] === undefined && !isEmpty(value)) {\n (requestData as any)[field] = value;\n }\n }\n\n // Inject hidden custom param values into additionalDatas.\n const existingParams = new Set(additionalDatas.map(d => d.paramName));\n for (const [paramName, value] of Object.entries(hiddenCustomFields)) {\n if (!existingParams.has(paramName) && value) {\n additionalDatas.push({ paramName, value });\n }\n }\n\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createApplicant(requestData as ApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating applicant:', err);\n setGlobalError(err.message || 'Failed to create applicant');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Flat mode submit handler\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Flat mode: validate all required fields\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = FIELD_METADATA[field]?.label || field;\n setGlobalError(`${label} is required.`);\n return;\n }\n }\n\n await doSubmit();\n };\n\n // ── Built-in field renderer ────────────────────────────────────────────────\n const renderBuiltInField = (\n field: ApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n fieldLabelModeOverride?: 'label' | 'placeholder',\n ) => {\n const metadata = FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n const isReadOnly = field in initialBuiltInFields;\n\n const elementKey = key ?? field;\n const commonProps = { required: isRequired };\n // Per-field mode takes priority; falls back to global showLabels.\n const fieldShowLabels = fieldLabelModeOverride ? fieldLabelModeOverride !== 'placeholder' : showLabels;\n const labelProp = fieldShowLabels ? labelText : undefined;\n const placeholderSuffix = fieldShowLabels ? '...' : labelText;\n\n switch (metadata.type) {\n case 'select':\n if (\n field === 'country' ||\n field === 'nationality' ||\n field === 'taxCountry' ||\n field === 'countryOfBirth' ||\n field === 'mobileCountryCode'\n ) {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${placeholderSuffix.toLowerCase()}` }, ...countryList]}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n if (field === 'salutation') {\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field]?.toString() || ''}\n onChange={val => handleChange(field, val ? Number(val) : null)}\n options={[\n { value: '', label: fieldShowLabels ? 'Select salutation...' : labelText },\n { value: GenderType.Male.toString(), label: 'Male' },\n { value: GenderType.Female.toString(), label: 'Female' },\n { value: GenderType.Other.toString(), label: 'Other' },\n ]}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n if (field === 'defaultLanguage') {\n const langOptions = currentTheme?.allowedLanguages && currentTheme.allowedLanguages.length > 0\n ? ALLOWED_LANGUAGES.filter(l => currentTheme.allowedLanguages!.includes(l.value))\n : ALLOWED_LANGUAGES;\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: fieldShowLabels ? 'Select language...' : labelText }, ...langOptions]}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n return null;\n\n case 'multiselect':\n if (field === 'otherNationality') {\n const nationalityList = getCountriesForField(field, countriesTypeOverride);\n return (\n <MultiSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || []}\n onChange={values => handleChange(field, values)}\n options={nationalityList}\n placeholder={fieldShowLabels ? 'Select other nationalities...' : labelText}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n />\n );\n }\n return null;\n\n case 'date':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"date\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n case 'email':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"email\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n case 'tel':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"tel\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n default:\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"text\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer ──────────────────────────────────────────────────\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n // Per-field labelMode takes priority over global showLabels.\n const fieldShowLabels = f.labelMode ? f.labelMode !== 'placeholder' : showLabels;\n\n // ── Paragraph (display-only text block) ──────────────────────────────────\n if (f.customType === 'paragraph') {\n const text = f.displayText || f.label || '';\n return (\n <p\n key={`custom-${idx}`}\n className=\"metakyc-paragraph\"\n style={{\n fontSize: '14px',\n lineHeight: '1.7',\n margin: 0,\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n dangerouslySetInnerHTML={{ __html: text }}\n />\n );\n }\n\n // ── Raw HTML block (no additional wrapper styling) ────────────────────────\n if (f.customType === 'html') {\n return (\n <div\n key={`custom-${idx}`}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n // ── Line break / spacer ──────────────────────────────────────────────────\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n\n // ── Standalone hyperlink (display-only) ──────────────────────────────────\n if (f.customType === 'link') {\n const linkLabel = f.displayText || f.label || f.linkText || f.linkUrl || '';\n return (\n <div key={`custom-${idx}`} className=\"metakyc-link-field\">\n <a\n href={f.linkUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '14px',\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n >\n {linkLabel}\n <span style={{ fontSize: '10px', opacity: 0.7 }}>↗</span>\n </a>\n </div>\n );\n }\n\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n\n // Single checkbox\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Link + checkbox\n if (f.customType === 'link_checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{' '}\n {f.linkUrl && (\n <a\n href={f.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline\"\n style={{ color: 'var(--metakyc-primary, #2563eb)' }}\n onClick={e => e.stopPropagation()}\n >\n {f.linkText || f.linkUrl}\n </a>\n )}\n {f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Checkbox group (multi-select OR single-select when f.singleSelect is true)\n if (f.customType === 'group_checkbox') {\n const selectedValues = (customData[f.paramName] || '').split(',').filter(Boolean);\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n {fieldShowLabels && (\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n )}\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => {\n const isChecked = f.singleSelect\n ? customData[f.paramName!] === opt.value\n : selectedValues.includes(opt.value);\n\n return (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={isChecked}\n onChange={v => {\n if (f.singleSelect) {\n handleCustomChange(f.paramName!, v ? opt.value : '');\n } else {\n const next = v\n ? [...selectedValues, opt.value]\n : selectedValues.filter(v2 => v2 !== opt.value);\n handleCustomChange(f.paramName!, next.join(','));\n }\n }}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n );\n })}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Radio group (single-select)\n if (f.customType === 'radio_group') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n {fieldShowLabels && (\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n )}\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={customData[f.paramName!] === opt.value}\n onChange={() => handleCustomChange(f.paramName!, opt.value)}\n name={`radio-group-${f.paramName}-${idx}`}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n ))}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Default: text input\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={fieldShowLabels ? `${displayLabel}${f.required ? ' *' : ''}` : undefined}\n placeholder={fieldShowLabels ? undefined : displayLabel}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Render a page's fields in a 2-col grid ────────────────────────────────\n // For conditional pages: shows the gate checkbox at the TOP of the page.\n // Fields are only revealed once the checkbox is checked.\n const renderPageFields = (page: FormPage, _pageIndex: number) => {\n const conditionMet = isConditionMet(page);\n\n return (\n <div className=\"space-y-4\">\n {/* Gate checkbox — shown at top when this page has a condition */}\n {page.conditionalOn && (\n <FieldHelpWrapper helpText={page.conditionalHelpText}>\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={conditionMet}\n onChange={v => handleCustomChange(page.conditionalOn!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', fontWeight: 500 }}\n >\n {page.conditionalOn}\n </span>\n </label>\n </FieldHelpWrapper>\n )}\n\n {/* Fields — only shown when condition is met (or page has no condition) */}\n {conditionMet && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {page.fields.map((f, idx) => {\n const span = Math.min(4, Math.max(1, Number(f.colSpan) || 4));\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} style={{ gridColumn: `span ${span} / span ${span}` }}>\n <FieldHelpWrapper helpText={f.helpText}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as ApplicantFormField, key, f.displayText, f.countriesType, f.labelMode)}\n </FieldHelpWrapper>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ────────────────────────────────────────────────────────────────\n // Wait for theme and countries before deciding which mode to render.\n // Without this guard the flat form could flash briefly while the paged\n // configuration is still arriving from the backend.\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n Loading form…\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ────────────────────────────────────────────────────────\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n {/* SDK main title from theme config */}\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {/* Per-page title / subtitle — compact, inside content area */}\n {(page.title || page.subtitle || page.description) && (\n <div className=\"mb-4\">\n {page.title && (\n <h3\n className=\"font-semibold text-base\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {page.title}\n </h3>\n )}\n {page.subtitle && (\n <p\n className=\"text-sm mt-0.5\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.subtitle}\n </p>\n )}\n {page.description && page.description !== page.subtitle && (\n <p\n className=\"text-xs mt-1\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.description}\n </p>\n )}\n </div>\n )}\n\n {/* Page progress indicator (dot/segment style) */}\n {totalPages > 1 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '1rem' }}>\n {formPages.map((_, idx) => (\n <div\n key={idx}\n style={{\n height: '0.375rem',\n borderRadius: '9999px',\n transition: 'all 150ms',\n ...(idx === currentPageIndex\n ? { flex: '1 1 0%', backgroundColor: 'var(--metakyc-primary, #2563eb)',opacity: 0.3 }\n : idx < currentPageIndex\n ? { width: '2rem', backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { width: '2rem', backgroundColor: '#e5e7eb', opacity: 0.3 }),\n }}\n />\n ))}\n <span style={{ fontSize: '0.75rem', color: 'var(--metakyc-text-muted, #9ca3af)', flexShrink: 0 }}>\n {currentPageIndex + 1} / {totalPages}\n </span>\n </div>\n )}\n\n {/* Error summary */}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => (\n <p key={i} className=\"text-red-600 text-sm\">{msg}</p>\n ))}\n </div>\n )}\n\n {renderPageFields(page, currentPageIndex)}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n {!isFirst && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}\n >\n Previous\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button\n type=\"button\"\n isLoading={isSubmitting || isCreatingApplicant}\n onClick={isLast ? doSubmit : handleNext}\n >\n {isLast\n ? (page.conditionalOn && !condMet ? 'Skip & Submit' : 'Submit')\n : (page.conditionalOn && !condMet ? 'Skip' : 'Next')}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ────────────────────────────────────────────────────\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || 'Create Applicant'} />\n </CardHeader>\n\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>\n </div>\n )}\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {flatVisibleFields.map(field => (\n <div key={field} style={{ gridColumn: 'span 4 / span 4' }}>\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n Create Applicant\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner, SearchableSelect } from './core';\nimport { Checkbox } from './core/Checkbox';\nimport { CompanyApplicantRegistrationRequestInput } from '../types';\nimport type { CompanyApplicantFormField } from '../client/config';\nimport {\n COMPANY_FIELD_METADATA, DEFAULT_COMPANY_VISIBLE_FIELDS,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\n\nexport interface CreateCompanyApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\nconst SYSTEM_REQUIRED: CompanyApplicantFormField[] = ['companyName', 'email'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\nexport const CreateCompanyApplicantForm: React.FC<CreateCompanyApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createCompanyApplicant, isLoading: isCreatingApplicant } = useApplicant();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateCompanyApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n /** Values that are pre-filled and shown as read-only when the field is visible. */\n const initialValues: Record<string, string> = config.applicantForm?.initialValues || {};\n\n const fieldLabelMode = config.applicantForm?.fieldLabelMode || currentTheme?.fieldLabelMode || 'label';\n const showLabels = fieldLabelMode !== 'placeholder';\n\n // ── Theme-derived config ──\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.companyFormPages && currentTheme.companyFormPages.length > 0\n ? currentTheme.companyFormPages\n : null),\n [currentTheme?.companyFormPages]\n );\n\n const requiredFields: CompanyApplicantFormField[] = useMemo(() => {\n const set = new Set<CompanyApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.companyFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as CompanyApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as CompanyApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.companyFormRequiredFields, formPages]);\n\n const flatVisibleFields: CompanyApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as CompanyApplicantFormField);\n const set = new Set<CompanyApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n if (config.applicantForm?.visibleFields) {\n return config.applicantForm.visibleFields as unknown as CompanyApplicantFormField[];\n }\n if (currentTheme?.companyFormVisibleFields && currentTheme.companyFormVisibleFields.length > 0) {\n return currentTheme.companyFormVisibleFields as CompanyApplicantFormField[];\n }\n return DEFAULT_COMPANY_VISIBLE_FIELDS;\n }, [config.applicantForm?.visibleFields, currentTheme?.companyFormVisibleFields, formPages]);\n\n // ── Countries ──\n const COUNTRY_FIELD_NAMES = new Set(['countryResidence', 'addressCountry']);\n\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? COMPANY_FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(COMPANY_FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n if (types.size === 0) types.add(undefined);\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return;\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n if (typesToLoad.length === 0) {\n const allReady = neededCountryTypes.every(t => loadedTypesRef.current.has(t != null ? String(t) : 'all'));\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const seen = new Set<string>();\n const list = data\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => { if (!c.value || seen.has(c.value)) return false; seen.add(c.value); return true; });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n const allReady = neededCountryTypes.every(t => loadedTypesRef.current.has(t != null ? String(t) : 'all'));\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? COMPANY_FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ──\n const COMPANY_BUILT_IN_FIELD_SET: Record<string, 1> = {\n companyName: 1, registrationNumber: 1, email: 1, phone: 1,\n countryResidence: 1, legalAddress: 1, incorporatedOn: 1,\n controlScheme: 1, taxId: 1, registrationLocation: 1, website: 1,\n postalAddress: 1, street: 1, streetNumber: 1, city: 1, state: 1,\n postalCode: 1, addressCountry: 1, lei: 1,\n };\n\n const initialBuiltInFields = Object.fromEntries(\n Object.entries(initialValues).filter(([k]) => k in COMPANY_BUILT_IN_FIELD_SET)\n );\n\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n companyName: '', email: initialEmail, phone: '',\n registrationNumber: '', countryResidence: '',\n legalAddress: '', incorporatedOn: '', controlScheme: '',\n taxId: '', registrationLocation: '', website: '',\n postalAddress: '', street: '', streetNumber: '',\n city: '', state: '', postalCode: '', addressCountry: '',\n lei: '', externalRefId: initialExternalRefId,\n ...initialBuiltInFields,\n });\n const [customData, setCustomData] = useState<Record<string, string>>({});\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1) : -1;\n const prevPageIndex = formPages ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1) : -1;\n\n // ── Per-page validation ──\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n for (const f of page.fields) {\n if (f.isCustom) {\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') errs[f.paramName] = `${displayLabel} is required.`;\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = `${displayLabel} is required.`;\n }\n }\n } else if (f.name) {\n const fieldName = f.name as CompanyApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || COMPANY_FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = `${label} is required.`;\n }\n }\n }\n }\n return errs;\n };\n\n // ── Submit / navigate ──\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) setCurrentPageIndex(nextPageIndex);\n else await doSubmit();\n return;\n }\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n if (nextPageIndex >= 0) setCurrentPageIndex(nextPageIndex);\n else await doSubmit();\n };\n\n const doSubmit = async () => {\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) allErrs = { ...allErrs, ...validatePage(page) };\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n try {\n const requestData: Partial<CompanyApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId?.trim() || undefined,\n };\n\n const fieldsToCollect = formPages\n ? formPages.filter(p => isConditionMet(p)).flatMap(p => p.fields).filter(f => !f.isCustom && f.name).map(f => f.name!)\n : flatVisibleFields as string[];\n\n for (const field of fieldsToCollect) {\n const value = formData[field];\n if (!isEmpty(value)) {\n // Map SDK field names to the backend DTO property names\n switch (field) {\n case 'companyName': (requestData as any).companyName = value; break;\n case 'email': (requestData as any).companyEmail = value; break;\n case 'phone': (requestData as any).companyPhone = value; break;\n case 'registrationNumber': (requestData as any).companyRegistrationNumber = value; break;\n case 'countryResidence': (requestData as any).companyCountry = value; break;\n case 'city': (requestData as any).companyCity = value; break;\n case 'street': (requestData as any).companyStreet = value; break;\n case 'postalCode': (requestData as any).companyZip = value; break;\n default: (requestData as any)[field] = value; break;\n }\n }\n }\n\n // Custom fields → additionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n const raw = customData[f.paramName] ?? '';\n let value: string;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n value = raw;\n if (!value && !f.required) continue;\n }\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createCompanyApplicant(requestData as CompanyApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating company applicant:', err);\n setGlobalError(err.message || 'Failed to create company applicant');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = COMPANY_FIELD_METADATA[field]?.label || field;\n setGlobalError(`${label} is required.`);\n return;\n }\n }\n await doSubmit();\n };\n\n // ── Built-in field renderer ──\n const renderBuiltInField = (\n field: CompanyApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n fieldLabelModeOverride?: 'label' | 'placeholder',\n ) => {\n const metadata = COMPANY_FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n const isReadOnly = field in initialBuiltInFields;\n const elementKey = key ?? field;\n const fieldShowLabels = fieldLabelModeOverride ? fieldLabelModeOverride !== 'placeholder' : showLabels;\n const labelProp = fieldShowLabels ? labelText : undefined;\n const placeholderSuffix = fieldShowLabels ? '...' : labelText;\n\n switch (metadata.type) {\n case 'select':\n if (field === 'countryResidence' || field === 'addressCountry') {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n required={isRequired}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${placeholderSuffix.toLowerCase()}` }, ...countryList]}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n return null;\n case 'date':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"date\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n case 'email':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"email\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n case 'tel':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"tel\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n default:\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"text\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer (simplified — same structure as individual) ──\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n if (f.customType === 'paragraph') {\n return (\n <p key={`custom-${idx}`} style={{ fontSize: '14px', lineHeight: '1.7', margin: 0, color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.displayText || f.label || '' }} />\n );\n }\n if (f.customType === 'html') {\n return <div key={`custom-${idx}`} dangerouslySetInnerHTML={{ __html: f.label || '' }} />;\n }\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n if (f.customType === 'link') {\n return (\n <div key={`custom-${idx}`}>\n <a href={f.linkUrl || '#'} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: 'var(--metakyc-primary, #2563eb)', fontSize: '14px', textDecoration: 'underline' }}>\n {f.displayText || f.label || f.linkText || f.linkUrl || ''}\n </a>\n </div>\n );\n }\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n const fieldShowLabels = f.labelMode ? f.labelMode !== 'placeholder' : showLabels;\n\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer' }}>\n <Checkbox checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')} />\n <span style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)' }}>\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={fieldShowLabels ? `${displayLabel}${f.required ? ' *' : ''}` : undefined}\n placeholder={fieldShowLabels ? undefined : displayLabel}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Page field rendering ──\n const renderPageFields = (page: FormPage) => {\n const conditionMet = isConditionMet(page);\n return (\n <div className=\"space-y-4\">\n {page.conditionalOn && (\n <label style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer' }}>\n <Checkbox checked={conditionMet}\n onChange={v => handleCustomChange(page.conditionalOn!, v ? 'true' : 'false')} />\n <span style={{ fontSize: '14px', fontWeight: 500 }}>{page.conditionalOn}</span>\n </label>\n )}\n {conditionMet && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {page.fields.map((f, idx) => {\n const span = Math.min(4, Math.max(1, Number(f.colSpan) || 4));\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} style={{ gridColumn: `span ${span} / span ${span}` }}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as CompanyApplicantFormField, key, f.displayText, f.countriesType, f.labelMode)}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ──\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n Loading form…\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ──\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || 'Company Registration'} />\n </CardHeader>\n <CardContent>\n {(page.title || page.subtitle) && (\n <div className=\"mb-4\">\n {page.title && <h3 className=\"font-semibold text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{page.title}</h3>}\n {page.subtitle && <p className=\"text-sm mt-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{page.subtitle}</p>}\n </div>\n )}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => <p key={i} className=\"text-red-600 text-sm\">{msg}</p>)}\n </div>\n )}\n {totalPages > 1 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '1rem' }}>\n {formPages.map((_, idx) => (\n <div key={idx}\n style={{\n height: '0.375rem',\n borderRadius: '9999px',\n transition: 'all 150ms',\n ...(idx === currentPageIndex\n ? { flex: '1 1 0%', backgroundColor: 'var(--metakyc-primary, #2563eb)', opacity: 0.3 }\n : idx < currentPageIndex\n ? { width: '2rem', backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { width: '2rem', backgroundColor: '#e5e7eb', opacity: 0.3 }),\n }}\n />\n ))}\n <span style={{ fontSize: '0.75rem', color: 'var(--metakyc-text-muted, #9ca3af)', flexShrink: 0 }}>{currentPageIndex + 1} / {totalPages}</span>\n </div>\n )}\n {renderPageFields(page)}\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n {!isFirst && (\n <Button type=\"button\" variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}>\n Previous\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button type=\"button\" isLoading={isSubmitting || isCreatingApplicant} onClick={isLast ? doSubmit : handleNext}>\n {isLast ? (page.conditionalOn && !condMet ? 'Skip & Submit' : 'Submit') : (page.conditionalOn && !condMet ? 'Skip' : 'Next')}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ──\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || 'Company Registration'} />\n </CardHeader>\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>Error:</strong> {globalError}</p>\n </div>\n )}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {flatVisibleFields.map(field => (\n <div key={field} style={{ gridColumn: 'span 4 / span 4' }}>\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n Register Company\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { useKycWorkflow } from '../hooks';\nimport { WorkflowStepAction, WorkflowResultType, ApplicantProgressStatus } from '../types';\nimport { QuestionnaireStep, UploadDocumentStep, OverviewStep, RiskScoringStep, InvestorCategorizationStep, AppropriatenessTestStep } from './steps';\nimport { IdentityVerificationStep } from './identity';\nimport { KycStatusDisplay } from './status';\nimport { Card, CardContent, Spinner, Badge } from './core';\nimport { Header } from './Header';\n\nexport interface KycWorkflowProps {\n applicantId: number;\n onComplete?: (result: WorkflowResultType) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\n/**\n * Main KYC workflow component\n * Automatically renders the current step and handles progression\n */\nexport const KycWorkflow: React.FC<KycWorkflowProps> = ({\n applicantId,\n onComplete,\n onError,\n className,\n}) => {\n const { \n progress, \n currentStep, \n steps, \n workflowKey,\n nextWorkflowKey,\n hasWorkflowChanged,\n isLoading, \n error, \n moveBack, \n refreshProgress \n } = useKycWorkflow(applicantId);\n \n const [workflowChangeAcknowledged, setWorkflowChangeAcknowledged] = React.useState(false);\n const stepperScrollRef = React.useRef<HTMLDivElement>(null);\n\n // Handle errors\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Handle completion\n React.useEffect(() => {\n if (progress?.workflowResult && onComplete) {\n onComplete(progress.workflowResult);\n }\n }, [progress?.workflowResult, onComplete]);\n\n // Reset workflow change acknowledgment when workflow actually changes\n React.useEffect(() => {\n if (hasWorkflowChanged) {\n setWorkflowChangeAcknowledged(false);\n }\n }, [hasWorkflowChanged]);\n\n if (isLoading || !progress) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>Loading workflow...</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <p className=\"text-lg mb-4\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>An error occurred</p>\n <p style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{error.message}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show workflow change notification if workflow has changed and not acknowledged\n if (hasWorkflowChanged && !workflowChangeAcknowledged) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <div className=\"mb-6\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\" style={{ backgroundColor: 'var(--metakyc-primary-light, #dbeafe)' }}>\n <svg className=\"w-8 h-8\" style={{ color: 'var(--metakyc-primary, #2563eb)' }} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n </div>\n \n <h3 className=\"text-xl font-semibold mb-2\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n Workflow Transition\n </h3>\n \n <p className=\"mb-6\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n Your application workflow has been updated based on your progress.\n </p>\n \n <div className=\"rounded-lg p-4 mb-6 max-w-md mx-auto\" style={{ backgroundColor: 'var(--metakyc-surface, #f9fafb)' }}>\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-left\">\n <p className=\"mb-1\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>Previous Workflow</p>\n <p className=\"font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{workflowKey}</p>\n </div>\n <svg className=\"w-6 h-6 mx-4\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n <div className=\"text-right\">\n <p className=\"mb-1\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>New Workflow</p>\n <p className=\"font-medium\" style={{ color: 'var(--metakyc-primary, #2563eb)' }}>{nextWorkflowKey}</p>\n </div>\n </div>\n {progress.nextWorkflowName && (\n <p className=\"text-center mt-2 text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {progress.nextWorkflowName}\n </p>\n )}\n </div>\n \n <button\n onClick={() => setWorkflowChangeAcknowledged(true)}\n className=\"px-6 py-3 font-medium rounded-lg transition-opacity hover:opacity-90\"\n style={{ backgroundColor: 'var(--metakyc-primary, #2563eb)', color: '#ffffff' }}\n >\n Continue with New Workflow\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show status display ONLY for finished or on hold states\n // IdentityPending should show the identity verification step\n // InProgress should show the workflow steps\n if (\n progress.status === ApplicantProgressStatus.Finished ||\n progress.status === ApplicantProgressStatus.OnHold\n ) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n onContinue={\n onComplete && progress.workflowResult\n ? () => onComplete(progress.workflowResult!)\n : undefined\n }\n onContactSupport={() => {\n // Could be configured via props\n if (typeof window !== 'undefined') {\n window.location.href = 'mailto:support@example.com';\n }\n }}\n />\n </div>\n );\n }\n\n // For InProgress and IdentityPending status, show the workflow steps\n if (!currentStep) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {progress.status === ApplicantProgressStatus.IdentityPending\n ? 'Loading identity verification...'\n : 'Loading current step...'}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Get a human-readable fallback name based on step action type\n const getStepFallbackName = (action: WorkflowStepAction): string => {\n switch (action) {\n case WorkflowStepAction.Overview: return 'Overview';\n case WorkflowStepAction.Questionaries: return 'Questionnaire';\n case WorkflowStepAction.UploadDocument: return 'Documents';\n case WorkflowStepAction.IdentitySdk: return 'Identity';\n case WorkflowStepAction.RiskScoring: return 'Risk Assessment';\n case WorkflowStepAction.InvestorCategorization: return 'Investor Categorization';\n case WorkflowStepAction.AppropriatenessTest: return 'Appropriateness Test';\n case WorkflowStepAction.AdditionalData: return 'Additional Data';\n case WorkflowStepAction.ManualReview: return 'Review';\n default: return '';\n }\n };\n\n // Render workflow progress\n const renderProgress = () => {\n const visibleSteps = steps.filter(step => step.visibility !== false);\n const currentVisibleStepIndex = visibleSteps.findIndex(s => s.order === currentStep.order);\n const currentStepNumber = currentVisibleStepIndex >= 0 ? currentVisibleStepIndex + 1 : 1;\n const totalVisibleSteps = visibleSteps.length;\n // Inclusive progress: step 1 of 3 → 33%, step 2 of 3 → 67%, step 3 of 3 → 100%\n const progressPercent = totalVisibleSteps > 1\n ? ((currentVisibleStepIndex + 1) / totalVisibleSteps) * 100\n : 100;\n\n return (\n <div style={{\n marginBottom: '24px',\n backgroundColor: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n borderRadius: '0.75rem',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n padding: '1rem 1.5rem',\n overflow: 'hidden',\n }}>\n {/* Header row */}\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', marginBottom: '16px' }}>\n <Header />\n <Badge variant={progress.status === 1 ? 'info' : 'success'}>\n Step {currentStepNumber} of {totalVisibleSteps}\n </Badge>\n </div>\n\n {/* Overall progress bar — track at 0.3 opacity, fill full opacity */}\n <div style={{ position: 'relative', height: '4px', borderRadius: '999px', overflow: 'hidden', marginBottom: '16px' }}>\n <div style={{ position: 'absolute', inset: 0, backgroundColor: 'var(--metakyc-border, #e5e7eb)', opacity: 0.3 }} />\n <div style={{\n position: 'absolute', top: 0, left: 0, bottom: 0,\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n opacity: 0.3,\n width: `${progressPercent}%`,\n transition: 'width 0.4s ease',\n }} />\n </div>\n\n {/* Stepper — scrollable container */}\n <StepperNav\n ref={stepperScrollRef}\n visibleSteps={visibleSteps}\n currentVisibleStepIndex={currentVisibleStepIndex}\n getStepFallbackName={getStepFallbackName}\n />\n </div>\n );\n };\n\n // Render current step\n const renderCurrentStep = () => {\n const stepProps = {\n applicantId,\n onComplete: async () => {\n // Refresh progress after each step completion\n await refreshProgress();\n },\n onBack: currentStep.order > 0 ? moveBack : undefined,\n };\n\n switch (currentStep.action) {\n case WorkflowStepAction.Questionaries:\n return <QuestionnaireStep {...stepProps} />;\n\n case WorkflowStepAction.UploadDocument:\n return <UploadDocumentStep {...stepProps} />;\n\n case WorkflowStepAction.Overview:\n return <OverviewStep {...stepProps} />;\n\n case WorkflowStepAction.IdentitySdk:\n return <IdentityVerificationStep {...stepProps} />;\n\n case WorkflowStepAction.RiskScoring:\n return <RiskScoringStep {...stepProps} />;\n\n case WorkflowStepAction.AdditionalData:\n case WorkflowStepAction.InvestorCategorization:\n return <InvestorCategorizationStep {...stepProps} />;\n\n case WorkflowStepAction.AppropriatenessTest:\n return <AppropriatenessTestStep {...stepProps} />;\n\n case WorkflowStepAction.ManualReview:\n // ManualReview shows status display\n return (\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n />\n );\n\n default:\n // Unknown step - show message but don't show status display\n // This should be a workflow step, not a final status\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-4\">\n <Spinner />\n </div>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">\n Processing step: {currentStep.title || currentStep.name}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Action type: {WorkflowStepAction[currentStep.action]}\n </p>\n </CardContent>\n </Card>\n );\n }\n };\n\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n {renderProgress()}\n {renderCurrentStep()}\n </div>\n );\n};\n\n// ── StepperNav ────────────────────────────────────────────────────────────\n\ninterface StepperNavProps {\n visibleSteps: import('../types').StepInfo[];\n currentVisibleStepIndex: number;\n getStepFallbackName: (action: WorkflowStepAction) => string;\n}\n\nconst StepperNav = React.forwardRef<HTMLDivElement, StepperNavProps>(\n ({ visibleSteps, currentVisibleStepIndex, getStepFallbackName }, ref) => {\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const activeRef = React.useRef<HTMLDivElement>(null);\n\n React.useImperativeHandle(ref, () => scrollContainerRef.current!);\n\n React.useEffect(() => {\n if (activeRef.current && scrollContainerRef.current) {\n const container = scrollContainerRef.current;\n const el = activeRef.current;\n const scrollLeft = el.offsetLeft - container.offsetWidth / 2 + el.offsetWidth / 2;\n container.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });\n }\n }, [currentVisibleStepIndex]);\n\n return (\n <div\n ref={scrollContainerRef}\n className=\"metakyc-stepper-scroll\"\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n WebkitOverflowScrolling: 'touch',\n padding: '4px 0',\n gap: '0',\n }}\n >\n {visibleSteps.map((step, index) => {\n const isCompleted = index < currentVisibleStepIndex;\n const isCurrent = index === currentVisibleStepIndex;\n const isActive = isCompleted || isCurrent;\n const label = step.displayName || step.name || getStepFallbackName(step.action) || `Step ${index + 1}`;\n\n return (\n <React.Fragment key={step.order}>\n <div\n ref={isCurrent ? activeRef : undefined}\n style={{\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n {/* Circle */}\n <div style={{\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 600,\n flexShrink: 0,\n transition: 'all 0.2s ease',\n ...(isActive ? {\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n color: '#ffffff',\n border: 'none',\n } : {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n border: '2px solid var(--metakyc-border, #e5e7eb)',\n }),\n }}>\n {isCompleted ? (\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n index + 1\n )}\n </div>\n\n {/* Label */}\n <span style={{\n marginLeft: '6px',\n fontSize: '13px',\n whiteSpace: 'nowrap',\n fontWeight: isCurrent ? 600 : 400,\n color: isCurrent\n ? 'var(--metakyc-text-primary, #111827)'\n : isCompleted\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-text-muted, #9ca3af)',\n transition: 'color 0.2s ease',\n }}>\n {label}\n </span>\n </div>\n\n {/* Connector line */}\n {index < visibleSteps.length - 1 && (\n <div style={{\n flex: '1 1 0%',\n minWidth: '16px',\n height: '2px',\n margin: '0 8px',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n opacity: isCompleted ? 1 : 0.25,\n transition: 'opacity 0.2s ease',\n }} />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n);\n","import { z } from 'zod';\nimport { QuestionnaireOutput } from '../types';\n\n/**\n * Generate zod schema for question values (reserved for future use)\n */\n/* Commented out for future use\nfunction generateQuestionValuesSchema(question: QuestionDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.string());\n\n // Apply required validation\n if (question.isRequired) {\n schema = (schema as z.ZodArray<any>).min(1, question.errorMessage || 'This field is required');\n } else {\n schema = schema.optional();\n }\n\n // Apply regex validation for the first value (single answer)\n if (!question.canMultipleAnswer && question.regex) {\n const regex = new RegExp(question.regex);\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || regex.test(val[0]),\n { message: question.errorMessage || 'Invalid format' }\n );\n }\n\n // Apply min/max validation for string length\n if (!question.canMultipleAnswer) {\n if (question.min !== undefined && question.min !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length >= question.min!,\n { message: `Minimum length is ${question.min}` }\n );\n }\n if (question.max !== undefined && question.max !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length <= question.max!,\n { message: `Maximum length is ${question.max}` }\n );\n }\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from questionnaire with grouped questions support\n */\nexport function generateQuestionnaireSchema(_questionnaire: QuestionnaireOutput) {\n // Generate schema for grouped questions structure\n // questionResults: [[{questionId, values}], [{questionId, values}], ...]\n return z.object({\n questionResults: z.any(),\n }).passthrough(); // Allow extra fields\n}\n","import { z } from 'zod';\nimport { UploadDocumentOutputDto, UploadDocumentFileDto } from '../types';\n\n/**\n * Generate zod schema for a single upload document file\n */\nfunction generateUploadDocumentFileSchema(file: UploadDocumentFileDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.instanceof(File));\n\n if (file.isRequired) {\n schema = (schema as z.ZodArray<any>).min(\n 1,\n `${file.displayName} is required`\n );\n } else {\n schema = schema.optional();\n }\n\n // Validate multiple files\n if (!file.multipleFile) {\n schema = (schema as z.ZodArray<any> | z.ZodOptional<z.ZodArray<any>>).refine(\n (files) => !files || files.length <= 1,\n { message: 'Only one file is allowed' }\n );\n }\n\n // Validate file size\n if (file.maxEachFileSizeByte > 0) {\n schema = (schema as any).refine(\n (files: File[] | undefined) =>\n !files || files.every((f) => f.size <= file.maxEachFileSizeByte),\n { message: `File size must not exceed ${Math.round(file.maxEachFileSizeByte / 1024 / 1024)}MB` }\n );\n }\n\n // Validate file type\n if (file.allowedTypes) {\n const allowedMimeTypes = file.allowedTypes.split(',').map((t) => t.trim());\n schema = (schema as any).refine(\n (files: File[] | undefined) => {\n if (!files) return true;\n return files.every((f) =>\n allowedMimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n return f.type.startsWith(type.slice(0, -2));\n }\n return f.type === type;\n })\n );\n },\n { message: 'Invalid file type' }\n );\n }\n\n return schema;\n}\n\n/**\n * Generate zod schema from upload document\n */\nexport function generateUploadDocumentSchema(uploadDocument: UploadDocumentOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n uploadDocument.uploadDocumentFiles.forEach((file) => {\n const fieldName = `file_${file.id}`;\n schemaObject[fieldName] = generateUploadDocumentFileSchema(file);\n });\n\n return z.object(schemaObject);\n}\n","import { z } from 'zod';\nimport { RiskCriteriaDto } from '../types';\n\n/**\n * Generate zod schema for a single risk criterion (reserved for future use)\n */\n/* Commented out for future use\nfunction generateCriterionSchema(criterion: RiskCriteriaDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n // Base schema based on value data type\n switch (criterion.valueDataType) {\n case ValueDataType.Integer:\n schema = z.coerce.number().int();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Money:\n schema = z.coerce.number();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Boolean:\n schema = z.boolean();\n break;\n\n case ValueDataType.Date:\n schema = z.string();\n break;\n\n case ValueDataType.Country:\n case ValueDataType.String:\n default:\n schema = z.string();\n if (criterion.regex) {\n const regex = new RegExp(criterion.regex);\n schema = (schema as z.ZodString).regex(regex, 'Invalid format');\n }\n break;\n }\n\n // Apply required validation\n if (criterion.isRequired) {\n if (schema instanceof z.ZodString) {\n schema = schema.min(1, `${criterion.displayName} is required`);\n }\n } else {\n schema = schema.optional();\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from risk criteria\n * Only validates user inputs (values), not metadata (riskCriteriaId)\n */\nexport function generateRiskScoringSchema(_criteria: RiskCriteriaDto[]) {\n // Don't validate the structure - just allow any data\n // Individual field validation happens during rendering\n return z.any();\n}\n","import { z } from 'zod';\nimport { AppropriatenessTestOutputDto, AppropriatenessQuestionOutputDto } from '../types';\n\n/**\n * Generate zod schema for a single appropriateness question\n */\nfunction generateQuestionSchema(_question: AppropriatenessQuestionOutputDto): z.ZodTypeAny {\n // All questions are required in the appropriateness test\n return z.string().min(1, 'This question is required');\n}\n\n/**\n * Generate zod schema from appropriateness test\n */\nexport function generateAppropriatenessSchema(test: AppropriatenessTestOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n test.appropriatenessQuestions.forEach((question) => {\n const fieldName = `question_${question.id}`;\n schemaObject[fieldName] = generateQuestionSchema(question);\n });\n\n return z.object(schemaObject);\n}\n\n// Simple schema for compatibility\nexport const appropriatenessTestSchema = z.any();\n"],"names":["WorkflowStepAction","WorkflowResultType","ApplicantProgressStatus","ApplicantProgressOnHoldReason","RiskLevel","KycStatus","ReviewStatus","ApplicantStatus","KycProcessStatus","IdentityVerificationProvider","UserType","GenderType","FileType","DocumentReviewStatus","AppropriatenessQuestionType","ValueDataType","RiskCriteriaType","CriteriaBuiltInType","InvestorCategorizationType","InvestorCategoryType","CountriesType","FIELD_METADATA","COMPANY_FIELD_METADATA","DEFAULT_COMPANY_VISIBLE_FIELDS","DEFAULT_VISIBLE_FIELDS","ALLOWED_LANGUAGES","ThemePreset","defaultConfig","EndpointBuilder","config","controller","action","customKey","MetaKYCError","message","code","details","validationErrors","response","__publicField","ErrorHandler","error","data","HttpClient","axios","token","originalRequest","_a","resolve","params","url","ApplicantService","httpClient","input","applicantId","language","externalRefId","QuestionnaireService","UploadDocumentService","AppropriatenessTestService","OverviewService","RiskScoringService","IdentityService","BaseInformationService","filter","lng","type","InvestorCategorizationService","defaultTheme","corporateTheme","fintechTheme","healthcareTheme","modernTheme","minimalTheme","themePresets","getThemePreset","preset","ThemeService","theme","parsed","p","isOldFormat","f","overrides","baseTheme","EventEmitter","event","callback","callbacks","WorkflowState","progress","previousStep","_b","StepRouter","handler","WorkflowOrchestrator","applicantService","questionnaireService","uploadDocumentService","appropriatenessTestService","overviewService","riskScoringService","_identityService","investorCategorizationService","loadScript","src","id","reject","script","isScriptLoaded","removeScript","SUMSUB_CDN","cssVar","name","fallback","el","buildThemeCssStr","primary","primaryHover","bg","surface","textPrimary","textSecondary","textMuted","border","SumsubProvider","containerId","conf","uiConf","builder","payload","OnfidoProvider","SardinAIProvider","c","r","environment","region","sardineHost","loader","firstScript","clientId","flow","enableBiometrics","enablePortScanning","noscript","img","options","IdentityProviderManager","provider","tokenObject","contextConfig","sumsubCtx","sardinConfig","ThemeManager","colors","typo","space","varMap","k","v","css","str","MetaKYCContext","createContext","SDK_VERSION","STYLE_ID","injected","injectCriticalCSS","style","cssText","THEME_CACHE_KEY","MetaKYCProvider","children","currentTheme","setCurrentTheme","useState","isLoadingThemeRef","React","hasLoadedThemeRef","services","useMemo","identityService","baseInformationService","themeService","themeManager","cached","value","useEffect","jsxs","useMetaKYC","context","useContext","fileToBase64","file","reader","base64","validateFileSize","maxSizeBytes","validateFileType","allowedTypes","prefix","formatFileSize","bytes","sizes","i","getAcceptString","cn","classes","STORAGE_KEYS","saveApplicantId","getApplicantId","stored","clearApplicantId","saveWorkflowState","state","getWorkflowState","clearWorkflowState","clearAllStorage","useKycWorkflow","createOrchestrator","setProgress","isLoading","setIsLoading","setError","orchestratorRef","useRef","effectiveApplicantId","isLoadingRef","hasLoadedRef","loadProgress","useCallback","result","err","refreshProgress","moveToNext","moveBack","submitCurrentStep","sortedSteps","a","b","hasWorkflowChanged","useQuestionnaire","questionnaire","setQuestionnaire","initialAnswers","setInitialAnswers","isSubmitting","setIsSubmitting","load","applicantData","textToAnswers","qr","answers","allQuestions","g","q","key","submit","useUploadDocument","uploadDocument","setUploadDocument","uploadProgress","setUploadProgress","useAppropriatenessTest","test","setTest","setResult","submitResult","useOverview","overview","setOverview","passOverview","useIdentityVerification","identityData","setIdentityData","isRequestingRef","requestIdentity","redirectUrl","ttl","requestCompanyIdentity","restartIdentity","useRiskScoring","criteria","setCriteria","latestResult","cr","values","useApplicant","isCreatingRef","isLoadingDataRef","generateSardinAISessionKey","createApplicant","sessionKey","createCompanyApplicant","getApplicantData","stopProgress","VARIANT_STYLES","Button","variant","size","disabled","className","props","baseStyles","sizeStyles","sizeInline","jsx","Input","forwardRef","label","helperText","leftIcon","rightIcon","ref","Card","CardHeader","CardContent","CardFooter","BOX_BASE","Checkbox","checked","onChange","uncheckedBorder","uncheckedBg","checkedColor","e","Badge","Spinner","Select","placeholder","option","idx","DROPDOWN_MAX_HEIGHT","MultiSelect","disabledProp","readOnly","required","isOpen","setIsOpen","search","setSearch","pos","setPos","portalColors","setPortalColors","containerRef","triggerRef","dropdownRef","calcPos","rect","openUp","snapPortalColors","s","open","close","target","update","filteredOptions","o","toggleOption","optionValue","removeValue","getLabel","val","borderColor","primaryColor","primaryLight","hoverBg","dropdownPanel","focusBorder","isSelected","createPortal","SearchableSelect","searchRef","handleToggle","selectedLabel","handleSelect","optValue","optDisabled","getFileIcon","FileUpload","subtitle","accept","multiple","maxSize","isDragging","setIsDragging","sizeError","setSizeError","inputRef","handleFiles","files","fileArray","handleDragOver","handleDragLeave","handleDrop","handleClick","removeFile","index","newFiles","_","displayError","hasFiles","icon","isImage","previewUrl","PhoneInput","countryCode","onCountryCodeChange","mergeClasses","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronLeft","ChevronRight","validateQuestion","question","isEmpty","first","num","buildPages","groups","flat","gi","qi","map","pq","qs","QuestionnaireStep","onComplete","onBack","setAnswers","fieldErrors","setFieldErrors","currentPage","setCurrentPage","pages","isLastPage","currentQuestions","setAnswer","questionId","prev","validatePage","newErrors","handleNext","handleBack","handleSubmit","questionResults","QuestionField","vals","qType","answer","v2","docFiles","df","UploadDocumentStep","setFiles","submitError","setSubmitError","pageErrors","setPageErrors","currentDocs","totalPages","validateCurrentPage","errs","uploadDocumentResults","docFile","fileList","valueList","OverviewStep","handleConfirm","step","resolveLocale","locale","isMoneyWithOptions","criterion","formatMoneyLabel","raw","fmt","validateCriterion","isNumeric","cs","getInputType","RiskScoringStep","autoSubmitted","setAutoSubmitted","currentCriteria","criteriaId","criteriaValueInputs","x","CriterionField","inputType","moneyOptions","InvestorCategorizationStep","selectedType","setSelectedType","parseTimeSpan","ts","parts","formatTime","seconds","m","AppropriatenessTestStep","testData","setTestData","timeRemaining","setTimeRemaining","isTestStarted","setIsTestStarted","isTestExpired","setIsTestExpired","waitTimeRemaining","setWaitTimeRemaining","currentQ","setCurrentQ","resultScreen","setResultScreen","w","handleStartTest","handleAnswerChange","qId","reloadTestData","unanswered","resetTest","attemptsRemaining","totalQ","answeredCount","handleRetake","Fragment","StatCard","isLastQ","allAnswered","timerWarning","QuestionCard","STAT_ICONS","isWarning","selectedAnswer","onSelect","ai","IdentityVerificationStep","identityLoading","providerInstance","setProviderInstance","setApplicantData","countries","setCountries","phoneCountries","setPhoneCountries","isLoadingData","setIsLoadingData","showProvider","setShowProvider","providerError","setProviderError","isExpired","setIsExpired","hasAutoRequestedRef","reviewData","setReviewData","customData","setCustomData","reviewPage","reviewPageDisabled","reviewPageDisabledRef","form","useForm","countriesData","phoneData","seen","countryOptions","phoneSeen","phoneOptions","requestData","expirationTime","urlString","useSumsubSdk","providerType","accessToken","providerConfig","instance","errorMessage","handleRestart","iframe","iframeDoc","text","_c","COUNTRY_FIELD_META_TYPES","colStyle","span","formatDisplayValue","opt","ReviewHelpButton","helpText","setOpen","btnRef","openModal","ReactDOM","withHelp","content","renderCustomField","pn","selected","toggleOpt","renderReviewField","meta","isPhoneCountry","isCountry","pageTitle","pageSubtitle","_d","Controller","field","KycStatusDisplay","kycStatus","reviewStatus","workflowResult","customMessage","onContinue","onContactSupport","statusInfo","Logo","Header","titleProp","title","hasLogo","hasTitle","SYSTEM_REQUIRED","OPTION_INPUT_STYLE","FieldHelpWrapper","modal","CreateApplicantForm","workflowKeyProp","externalRefIdProp","onSuccess","onCancel","isCreatingApplicant","workflowKey","initialExternalRefId","initialEmail","hiddenValues","initialValues","_e","showLabels","_f","formPages","requiredFields","set","clientReq","page","flatVisibleFields","fields","_g","COUNTRY_FIELD_NAMES","neededCountryTypes","types","countriesMap","setCountriesMap","isLoadingCountries","setIsLoadingCountries","loadingTypesRef","loadedTypesRef","typesToLoad","t","keys","entries","isPhoneType","list","getCountriesForField","override","BUILT_IN_FIELD_SET","hiddenBuiltInFields","initialBuiltInFields","formData","setFormData","hiddenCustomFields","currentPageIndex","setCurrentPageIndex","globalError","setGlobalError","handleChange","handleCustomChange","paramName","isConditionMet","nextPageIndex","prevPageIndex","displayLabel","fieldName","doSubmit","allErrs","additionalDatas","existingParams","d","handleFlatSubmit","renderBuiltInField","displayText","countriesTypeOverride","fieldLabelModeOverride","metadata","isRequired","fieldError","labelText","isReadOnly","elementKey","commonProps","fieldShowLabels","labelProp","placeholderSuffix","countryList","langOptions","l","nationalityList","linkLabel","selectedValues","isChecked","next","renderPageFields","_pageIndex","conditionMet","isFirst","isLast","condMet","errorMessages","msg","CreateCompanyApplicantForm","COMPANY_BUILT_IN_FIELD_SET","fieldsToCollect","KycWorkflow","onError","currentStep","steps","nextWorkflowKey","workflowChangeAcknowledged","setWorkflowChangeAcknowledged","stepperScrollRef","getStepFallbackName","renderProgress","visibleSteps","currentVisibleStepIndex","currentStepNumber","totalVisibleSteps","progressPercent","StepperNav","renderCurrentStep","stepProps","scrollContainerRef","activeRef","container","scrollLeft","isCompleted","isCurrent","isActive","generateQuestionnaireSchema","_questionnaire","z","generateUploadDocumentFileSchema","schema","allowedMimeTypes","generateUploadDocumentSchema","schemaObject","generateRiskScoringSchema","_criteria","generateQuestionSchema","_question","generateAppropriatenessSchema","appropriatenessTestSchema"],"mappings":"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","x_google_ignoreList":[60,61,62,63,64,65,66,67,68,69]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/types/enums.ts","../src/types/applicant.ts","../src/types/upload-document.ts","../src/types/appropriateness-test.ts","../src/types/risk-scoring.ts","../src/types/investor-categorization.ts","../src/types/form-config.ts","../src/types/theme.ts","../src/client/config.ts","../src/client/endpoint-builder.ts","../src/client/error-handler.ts","../src/client/http-client.ts","../src/services/applicant.service.ts","../src/services/questionnaire.service.ts","../src/services/upload-document.service.ts","../src/services/appropriateness-test.service.ts","../src/services/overview.service.ts","../src/services/risk-scoring.service.ts","../src/services/identity.service.ts","../src/services/base-information.service.ts","../src/services/investor-categorization.service.ts","../src/theme/presets.ts","../src/services/theme.service.ts","../src/services/translation.service.ts","../src/state/event-emitter.ts","../src/state/workflow-state.ts","../src/state/step-router.ts","../src/state/workflow-orchestrator.ts","../src/identity/load-script.ts","../src/identity/providers/sumsub.ts","../src/identity/providers/onfido.ts","../src/identity/providers/sardin-ai.ts","../src/identity/provider-manager.ts","../src/theme/theme-manager.ts","../src/i18n/locales/en.ts","../src/i18n/locales/de.ts","../src/i18n/locales/fr.ts","../src/i18n/locales/es.ts","../src/i18n/locales/it.ts","../src/i18n/locales/pt.ts","../src/i18n/locales/nl.ts","../src/i18n/locales/pl.ts","../src/i18n/locales/ru.ts","../src/i18n/locales/zh.ts","../src/i18n/locales/ja.ts","../src/i18n/locales/ar.ts","../src/i18n/locales/tr.ts","../src/i18n/locales/sv.ts","../src/i18n/locales/da.ts","../src/i18n/locales/fi.ts","../src/i18n/locales/no.ts","../src/i18n/index.ts","../src/i18n/TranslationContext.tsx","../src/context/MetaKYCContext.tsx","../src/version.ts","../src/styles/critical-css.ts","../src/context/MetaKYCProvider.tsx","../src/context/useMetaKYC.ts","../src/utils/file.ts","../src/utils/cn.ts","../src/utils/storage.ts","../src/hooks/useKycWorkflow.ts","../src/hooks/useQuestionnaire.ts","../src/hooks/useUploadDocument.ts","../src/hooks/useAppropriatenessTest.ts","../src/hooks/useOverview.ts","../src/hooks/useIdentityVerification.ts","../src/hooks/useRiskScoring.ts","../src/hooks/useApplicant.ts","../src/components/core/Button.tsx","../src/components/core/Input.tsx","../src/components/core/Card.tsx","../src/components/core/Checkbox.tsx","../src/components/core/Badge.tsx","../src/components/core/Spinner.tsx","../src/components/core/Select.tsx","../src/components/core/MultiSelect.tsx","../src/components/core/SearchableSelect.tsx","../src/components/core/FileUpload.tsx","../src/components/core/PhoneInput.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-left.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/steps/QuestionnaireStep.tsx","../src/components/steps/UploadDocumentStep.tsx","../src/components/steps/OverviewStep.tsx","../src/components/steps/RiskScoringStep.tsx","../src/components/steps/InvestorCategorizationStep.tsx","../src/components/steps/AppropriatenessTestStep.tsx","../src/components/identity/IdentityVerificationStep.tsx","../src/components/status/KycStatusDisplay.tsx","../src/components/Logo.tsx","../src/components/Header.tsx","../src/components/CreateApplicantForm.tsx","../src/components/CreateCompanyApplicantForm.tsx","../src/components/KycWorkflow.tsx","../src/validation/questionnaire-schema.ts","../src/validation/upload-document-schema.ts","../src/validation/risk-scoring-schema.ts","../src/validation/appropriateness-schema.ts"],"sourcesContent":["/**\n * Workflow step action types\n * Defines all possible workflow steps in the KYC process\n */\nexport enum WorkflowStepAction {\n IdentitySdk = 0,\n RiskScoring = 1,\n Questionaries = 2,\n AdditionalData = 3,\n AppropriatenessTest = 4,\n UploadDocument = 5,\n ManualReview = 6,\n Overview = 7,\n InvestorCategorization = 8,\n}\n\n/**\n * Workflow result types\n * Indicates the overall result/status of a workflow\n */\nexport enum WorkflowResultType {\n NotStarted = 0,\n InProgress = 1,\n Success = 2,\n PartialSuccess = 3,\n Failed = 4,\n Skipped = 5,\n AdminReview = 6,\n SkippedAndAdminReview = 7,\n}\n\n/**\n * Applicant progress status\n * Tracks the current status of an applicant's workflow progress\n */\nexport enum ApplicantProgressStatus {\n None = 0,\n InProgress = 1,\n Finished = 2,\n OnHold = 3,\n IdentityPending = 4,\n}\n\n/**\n * Reason for applicant progress being on hold\n */\nexport enum ApplicantProgressOnHoldReason {\n None = 0,\n RepresentativeKYC = 1,\n ManualRiskCriteria = 2,\n UploadDocumentReview = 3,\n AdminReview = 4,\n}\n\n/**\n * Risk level assessment\n */\nexport enum RiskLevel {\n LowRisk = 0,\n MediumRisk = 1,\n HighRisk = 2,\n Alert = 3,\n}\n\n/**\n * KYC status\n */\nexport enum KycStatus {\n None = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n ResendRequested = 4,\n Unknown = 5,\n InProgress = 6,\n}\n\n/**\n * Review status\n */\nexport enum ReviewStatus {\n Approved = 0,\n Reject = 1,\n UnderReview = 2,\n Closed = 3,\n AdminReview = 4,\n New = 5,\n InProgress = 6,\n}\n\n/**\n * Applicant status\n */\nexport enum ApplicantStatus {\n ProviderResultPending = 0,\n ProviderResultReceived = 1,\n Canceled = 2,\n ExtendedToNewApplicant = 3,\n}\n\n/**\n * KYC process status\n */\nexport enum KycProcessStatus {\n None = 0,\n ProviderResultPending = 1,\n ProviderResultReceived = 2,\n Canceled = 3,\n}\n\n/**\n * Identity verification provider types\n * IMPORTANT: These values MUST match the backend enum exactly!\n */\nexport enum IdentityVerificationProvider {\n Onfido = 0,\n Sumsub = 2, // Backend uses 2, not 1!\n SardinAI = 3, // Backend uses 3, not 2!\n}\n\n/**\n * User type\n */\nexport enum UserType {\n Individual = 0,\n Company = 1,\n}\n","/**\n * Gender type\n */\nexport enum GenderType {\n Male = 0,\n Female = 1,\n Other = 2,\n}\n\n/**\n * Tax country information\n */\nexport interface TaxCountry {\n country: string;\n taxNumber: string;\n}\n\n/**\n * Additional data for applicant\n */\nexport interface ApplicantAdditionalData {\n paramName: string;\n value: string;\n}\n\n/**\n * Applicant registration request input (Individual)\n */\nexport interface ApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n firstName: string;\n lastName: string;\n title?: string;\n email: string;\n dateOfBirth?: string;\n phonenumber: string;\n externalRefId: string; // Required: must always be provided\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n otherNationality?: string[];\n defaultLanguage?: string;\n taxCountry?: string;\n placeOfBirth?: string;\n countryOfBirth?: string;\n salutation?: GenderType | null;\n educationLevel?: string;\n occupation?: string;\n taxNumber?: string;\n otherTaxCountries?: TaxCountry[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Company applicant registration request input\n */\nexport interface CompanyApplicantRegistrationRequestInput {\n applicantId?: number | null;\n ownerClientId?: number | null;\n workflowKey: string;\n companyName: string;\n companyRegistrationNumber: string;\n companyEmail: string;\n companyPhone: string;\n companyCountry?: string;\n companyCity?: string;\n companyStreet?: string;\n companyZip?: string;\n legalForm?: string;\n industry?: string;\n externalRefId?: string;\n defaultLanguage?: string;\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * Applicant request data DTO (nested in ApplicantDataDto)\n */\nexport interface ApplicantRequestDataDto {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n dateOfBirth?: string;\n salutation?: string;\n title?: string;\n phonenumber: string;\n mobileCountryCode?: string;\n street?: string;\n streetNumber?: string;\n zip?: string;\n city?: string;\n country?: string;\n nationality?: string;\n countryOfBirth?: string;\n placeOfBirth?: string;\n taxCountry?: string;\n taxNumber?: string;\n educationLevel?: string;\n occupation?: string;\n defaultLanguage?: string;\n isCompanyRepresentative: boolean;\n otherNationalities?: string[];\n otherTaxResidencies?: string[];\n applicantAdditionalDatas?: ApplicantAdditionalData[];\n}\n\n/**\n * A single questionnaire question result (from GetApplicantData)\n */\nexport interface QuestionnaireResultItem {\n question: string;\n answers: string[];\n}\n\n/**\n * A single risk criterion result (from GetApplicantData)\n */\nexport interface RiskCriteriaResultItem {\n riskCriteriaId?: number;\n riskCriteria?: string;\n answer?: string;\n}\n\n/**\n * A risk scoring plan result (from GetApplicantData)\n */\nexport interface RiskScoringResultItem {\n riskScoringPlanId?: number;\n totalScore?: number;\n riskLevel?: number;\n riskCriteriaResults?: RiskCriteriaResultItem[];\n}\n\n/**\n * Applicant data DTO (full response from GetApplicantData)\n */\nexport interface ApplicantDataDto {\n id: number;\n providerTokenObject?: string;\n applicantStatus?: number;\n reviewStatus?: number;\n kycStatus?: number;\n storageStatus?: number;\n providerResult?: string;\n externalRefId?: string;\n workflowId: number;\n workflowName: string;\n workflowColor?: string;\n riskLevel?: number;\n relatedApplicantId?: number;\n applicantRequestData?: ApplicantRequestDataDto;\n companyApplicantRequestData?: any;\n applicantDocuments?: any[];\n riskScoringResults?: RiskScoringResultItem[];\n questionnaireResults?: QuestionnaireResultItem[];\n uploadDocumentResults?: any[];\n appropriatenessTestResults?: any[];\n kycRecords?: any[];\n progressStatus?: number;\n onHoldReason?: number;\n}\n\n/**\n * Duplicate applicant input\n */\nexport interface DuplicateApplicantInput {\n sourceApplicantId: number;\n newWorkflowKey: string;\n}\n","/**\n * File type enum\n */\nexport enum FileType {\n Image = 0,\n Video = 1,\n PDF = 2,\n OfficePDF = 3,\n Custom = 4,\n}\n\n/**\n * Document review status\n */\nexport enum DocumentReviewStatus {\n Pending = 0,\n Approved = 1,\n Rejected = 2,\n RequiresRevision = 3,\n}\n\n/**\n * Upload document file DTO\n */\nexport interface UploadDocumentFileDto {\n id: number;\n name: string;\n displayName: string;\n subtitle?: string;\n fileType: FileType;\n maxEachFileSizeByte: number;\n allowedTypes?: string;\n multipleFile: boolean;\n isRequired: boolean;\n order: number;\n pageNumber: number;\n}\n\n/**\n * Upload document output DTO\n */\nexport interface UploadDocumentOutputDto {\n id: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n uploadDocumentFiles: UploadDocumentFileDto[];\n}\n\n/**\n * Upload document file result\n */\nexport interface UploadDocumentFileResult {\n fileName: string;\n fileData: string; // base64\n}\n\n/**\n * Upload document result\n */\nexport interface UploadDocumentResult {\n uploadDocumentFileId: number;\n valueList: UploadDocumentFileResult[];\n}\n\n/**\n * Fill upload document input\n */\nexport interface FillUploadDocumentInput {\n applicantId: number;\n uploadDocumentId: number;\n uploadDocumentResults: UploadDocumentResult[];\n}\n\n/**\n * Review upload document DTO\n */\nexport interface ReviewUploadDocumentDto {\n applicantId: number;\n uploadDocumentResultId: number;\n status: DocumentReviewStatus;\n reviewNotes?: string;\n}\n","/**\n * Appropriateness question output DTO (matches backend)\n */\nexport interface AppropriatenessQuestionOutputDto {\n id: number;\n name: string;\n groupName: string;\n question: string;\n answers: string[]; // Array of shuffled answers (correct + wrong answers)\n}\n\n/**\n * Appropriateness test output DTO (matches backend)\n */\nexport interface AppropriatenessTestOutputDto {\n id: number;\n applicantId: number;\n name: string;\n displayName: string;\n subtitle: string;\n description: string;\n testDurationSec: number;\n testAllowedMaxTry: number;\n testCorrectAnswerPassLimit: number;\n totalFailedTries: number;\n totalQuestionCount: number;\n waitTimeSpanForNextTry: string; // TimeSpan as ISO string (e.g., \"00:05:00\")\n appropriatenessQuestions: AppropriatenessQuestionOutputDto[];\n}\n\n/**\n * Appropriateness question result\n */\nexport interface AppropriatenessQuestionResult {\n appropriatenessQuestionId: number;\n value: string;\n}\n\n/**\n * Fill appropriateness test input\n */\nexport interface FillAppropriatenessTestInput {\n applicantId: number;\n appropriatenessTestId: number;\n appropriatenessQuestionResults: AppropriatenessQuestionResult[];\n}\n\n/**\n * Fill appropriateness test result\n */\nexport interface FillAppropriatenessTestResult {\n isSuccess: boolean;\n message: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum AppropriatenessQuestionType {\n SingleChoice = 0,\n MultipleChoice = 1,\n Text = 2,\n}\n\nexport interface AppropriatenessAnswerDto {\n id: number;\n text: string;\n value: string;\n order: number;\n score?: number;\n}\n\nexport interface AppropriatenessQuestionDto {\n id: number;\n text: string;\n questionType: AppropriatenessQuestionType;\n order: number;\n isRequired: boolean;\n answers: AppropriatenessAnswerDto[];\n}\n","import { RiskLevel } from './enums';\n\n/**\n * Value data type for risk criteria\n */\nexport enum ValueDataType {\n String = 0,\n Integer = 1,\n /** Backend value 2 — Money/currency type; triggers locale-aware number formatting in options */\n Money = 2,\n Boolean = 3,\n Date = 4,\n Country = 5,\n DigitOnly = 6,\n}\n\n/**\n * Risk criteria type\n */\nexport enum RiskCriteriaType {\n Text = 0,\n Radio = 1,\n Checkbox = 2,\n Dropdown = 3,\n Country = 4,\n}\n\n/**\n * Built-in criteria type enum\n */\nexport enum CriteriaBuiltInType {\n None = 0,\n Country = 1,\n // Add other built-in types as needed\n}\n\n/**\n * Risk criteria answer DTO (legacy - for full admin interface)\n */\nexport interface RiskCriteriaAnswerDto {\n id: number;\n text: string;\n value: string;\n score: number;\n order: number;\n}\n\n/**\n * Risk criteria DTO (light version from GetCriterias API)\n */\nexport interface RiskCriteriaDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n builtInType?: CriteriaBuiltInType;\n valueDataType: ValueDataType;\n defaultValues?: string[]; // Simple string array from API\n multipleValue: boolean; // Can select multiple values\n hasCustomValue: boolean;\n hideCriteriaThresholds: boolean;\n isRequired: boolean;\n pageNumber?: number;\n // Legacy fields (kept for compatibility)\n criteriaType?: RiskCriteriaType;\n order?: number;\n answers?: RiskCriteriaAnswerDto[];\n min?: number;\n max?: number;\n regex?: string;\n errorMessage?: string;\n}\n\n/**\n * Criteria value input (matches C# DTO)\n */\nexport interface CriteriaValueInput {\n riskCriteriaId: number;\n values: string[]; // Array of strings, not single string\n}\n\n/**\n * Risk calculation input (matches C# DTO exactly)\n */\nexport interface RiskCalculationInput {\n applicantId?: number;\n riskPlanId?: number;\n criteriaValueInputs: CriteriaValueInput[];\n}\n\n// Legacy types (kept for compatibility)\nexport interface RiskCalculationItem {\n criteriaId: number;\n value: string;\n}\n\n/**\n * Risk scoring result\n */\nexport interface RiskScoringResult {\n success: boolean;\n riskLevel: RiskLevel;\n totalScore: number;\n message?: string;\n}\n\n/**\n * Risk scoring plan DTO\n */\nexport interface RiskScoringPlanDto {\n id: number;\n name: string;\n displayName: string;\n description?: string;\n lowRiskThreshold: number;\n mediumRiskThreshold: number;\n highRiskThreshold: number;\n}\n","/**\n * Investor categorization type (matches backend enum)\n */\nexport enum InvestorCategorizationType {\n Individual = 0,\n Sophisticated = 1,\n HighNetWorth = 2,\n Business = 3,\n}\n\n/**\n * Investor categorization input\n */\nexport interface InvestorCategorizationInput {\n applicantId: number;\n investorType: InvestorCategorizationType;\n}\n\n/**\n * Set investor categorization result\n */\nexport interface SetInvestorCategorizationResult {\n success: boolean;\n message?: string;\n}\n\n// Legacy types (kept for compatibility)\nexport enum InvestorCategoryType {\n Retail = 0,\n Professional = 1,\n EligibleCounterparty = 2,\n}\n\nexport interface InvestorCategorizationResult {\n success: boolean;\n category: InvestorCategoryType;\n message?: string;\n}\n","import type { ApplicantFormField, CompanyApplicantFormField } from '../client/config';\n\n// ── Countries type enum (mirrors backend CountiresType) ───────────────────────\n\nexport const CountriesType = {\n Nationality: 10,\n Address: 20,\n CountryOfBirth: 30,\n PhoneNumber: 40,\n UboAddress: 50,\n} as const;\n\nexport type CountriesTypeValue = typeof CountriesType[keyof typeof CountriesType];\n\n// ── Field metadata ────────────────────────────────────────────────────────────\n\nexport interface FieldMeta {\n label: string;\n type: 'text' | 'email' | 'tel' | 'date' | 'select' | 'multiselect';\n /** For select/multiselect country fields: the default CountriesType passed to the API */\n countriesType?: CountriesTypeValue;\n}\n\n// ── Review page field configuration ──────────────────────────────────────────\n\n/** A single field entry for the identity review page */\nexport interface ReviewFieldEntry {\n /** Built-in field name from FIELD_METADATA (e.g. 'firstName', 'country') */\n name: string;\n /** true = rendered as an editable input; false / absent = read-only display */\n editable?: boolean;\n /** Optional label override */\n displayText?: string;\n /** Column span in the 4-column grid (1=quarter, 2=half, 3=three-quarter, 4=full) */\n colSpan?: 1 | 2 | 3 | 4;\n}\n\nexport const FIELD_METADATA: Record<string, FieldMeta> = {\n firstName: { label: 'First Name', type: 'text' },\n lastName: { label: 'Last Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phonenumber: { label: 'Phone Number', type: 'tel' },\n dateOfBirth: { label: 'Date of Birth', type: 'date' },\n salutation: { label: 'Salutation', type: 'select' },\n title: { label: 'Title', type: 'text' },\n mobileCountryCode: { label: 'Mobile Country Code', type: 'select', countriesType: CountriesType.PhoneNumber },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n zip: { label: 'ZIP / Postal Code', type: 'text' },\n city: { label: 'City', type: 'text' },\n country: { label: 'Country', type: 'select', countriesType: CountriesType.Address },\n nationality: { label: 'Nationality', type: 'select', countriesType: CountriesType.Nationality },\n otherNationality: { label: 'Other Nationalities', type: 'multiselect', countriesType: CountriesType.Nationality },\n countryOfBirth: { label: 'Country of Birth', type: 'select', countriesType: CountriesType.CountryOfBirth },\n placeOfBirth: { label: 'Place of Birth', type: 'text' },\n taxCountry: { label: 'Tax Country', type: 'select', countriesType: CountriesType.Address },\n taxNumber: { label: 'Tax Number', type: 'text' },\n defaultLanguage: { label: 'Default Language', type: 'select' },\n educationLevel: { label: 'Education Level', type: 'text' },\n occupation: { label: 'Occupation', type: 'text' },\n};\n\nexport const COMPANY_FIELD_METADATA: Record<string, FieldMeta> = {\n companyName: { label: 'Company Name', type: 'text' },\n email: { label: 'Email', type: 'email' },\n phone: { label: 'Phone', type: 'tel' },\n registrationNumber: { label: 'Registration Number', type: 'text' },\n countryResidence: { label: 'Country of Residence', type: 'select', countriesType: CountriesType.Address },\n legalAddress: { label: 'Legal Address', type: 'text' },\n incorporatedOn: { label: 'Incorporation Date', type: 'date' },\n controlScheme: { label: 'Control Scheme', type: 'text' },\n taxId: { label: 'Tax ID', type: 'text' },\n registrationLocation:{ label: 'Registration Location', type: 'text' },\n website: { label: 'Website', type: 'text' },\n postalAddress: { label: 'Postal Address', type: 'text' },\n street: { label: 'Street', type: 'text' },\n streetNumber: { label: 'Street Number', type: 'text' },\n city: { label: 'City', type: 'text' },\n state: { label: 'State / Province', type: 'text' },\n postalCode: { label: 'Postal Code', type: 'text' },\n addressCountry: { label: 'Address Country', type: 'select', countriesType: CountriesType.Address },\n lei: { label: 'LEI', type: 'text' },\n};\n\nexport const DEFAULT_COMPANY_VISIBLE_FIELDS: CompanyApplicantFormField[] = [\n 'companyName',\n 'email',\n 'phone',\n 'registrationNumber',\n];\n\nexport const DEFAULT_VISIBLE_FIELDS: ApplicantFormField[] = [\n 'firstName',\n 'lastName',\n 'email',\n 'phonenumber',\n 'dateOfBirth',\n];\n\nexport const ALLOWED_LANGUAGES: Array<{ value: string; label: string }> = [\n { value: 'EN', label: 'English' },\n { value: 'DE', label: 'German' },\n { value: 'FR', label: 'French' },\n { value: 'ES', label: 'Spanish' },\n { value: 'IT', label: 'Italian' },\n { value: 'PT', label: 'Portuguese' },\n { value: 'NL', label: 'Dutch' },\n { value: 'PL', label: 'Polish' },\n { value: 'RU', label: 'Russian' },\n { value: 'ZH', label: 'Chinese' },\n { value: 'JA', label: 'Japanese' },\n { value: 'AR', label: 'Arabic' },\n { value: 'TR', label: 'Turkish' },\n { value: 'SV', label: 'Swedish' },\n { value: 'DA', label: 'Danish' },\n { value: 'FI', label: 'Finnish' },\n { value: 'NO', label: 'Norwegian' },\n];\n\n// ── Multi-page form configuration (set via Panel SDK Config) ──────────────────\n\n/**\n * A single field entry inside a form page.\n * Either refers to a built-in applicant field (name) or a custom field.\n */\nexport interface FormFieldEntry {\n /** Built-in field identifier: 'firstName', 'lastName', 'email', etc. Omit for custom fields. */\n name?: string;\n /** Column span in the 4-column grid. 1 = quarter, 2 = half, 3 = three-quarter, 4 = full. */\n colSpan: 1 | 2 | 3 | 4;\n /** Whether this is a custom out-of-scope field */\n isCustom?: boolean;\n /** Type of custom field */\n customType?: 'text' | 'checkbox' | 'link_checkbox' | 'link' | 'group_checkbox' | 'radio_group' | 'paragraph' | 'html' | 'br';\n /** Override the label shown to the user. If empty, falls back to the default field name/label. */\n displayText?: string;\n /** Display label for the custom field */\n label?: string;\n /** Key under which the value is stored in applicantAdditionalData.paramName */\n paramName?: string;\n /** Whether the field is mandatory */\n required?: boolean;\n /** For link_checkbox: URL the hyperlink points to */\n linkUrl?: string;\n /** For link_checkbox: text of the hyperlink (e.g. \"Terms & Conditions\") */\n linkText?: string;\n /** For group_checkbox / radio_group: the selectable options */\n options?: Array<{ value: string; label: string }>;\n /**\n * For group_checkbox: when true only one option can be checked at a time\n * (mutually exclusive checkboxes, distinct from radio_group in appearance).\n */\n singleSelect?: boolean;\n /**\n * For country-type built-in fields: overrides the default CountriesType used when fetching\n * the country list from the API (e.g. Nationality=10, Address=20, CountryOfBirth=30, PhoneNumber=40).\n * If omitted, the SDK uses the default from FIELD_METADATA for that field.\n */\n countriesType?: number;\n /**\n * Optional help/tooltip text shown next to the field as a clickable ? button.\n * Applies to both built-in and custom fields.\n */\n helpText?: string;\n /**\n * Review-page mode only.\n * true = field is rendered as an editable input; false / absent = rendered as read-only text.\n */\n editable?: boolean;\n\n /**\n * Per-field label display mode.\n * 'label' (default) — a label element is shown above the input.\n * 'placeholder' — no label element; the label text is used as the input placeholder instead.\n * When absent, falls back to the global fieldLabelMode from theme/config.\n */\n labelMode?: 'label' | 'placeholder';\n}\n\n/**\n * A single page of the applicant form with optional header text and an ordered list of fields.\n */\nexport interface FormPage {\n title?: string;\n subtitle?: string;\n description?: string;\n fields: FormFieldEntry[];\n /**\n * If set, this page is only shown when the custom field with this paramName has value 'true'\n * (or any non-empty value for radio/text). Typically tied to a checkbox on a previous page.\n */\n conditionalOn?: string;\n /**\n * Optional help/tooltip text shown as a ? button next to the conditional gate checkbox.\n */\n conditionalHelpText?: string;\n}\n","/**\n * Logo configuration\n */\nexport interface LogoConfig {\n url?: string;\n width?: string;\n height?: string;\n alt?: string;\n visible?: boolean; // Show/hide logo\n}\n\n/**\n * Color palette configuration\n */\nexport interface ColorPalette {\n // Primary brand colors\n primary: string;\n primaryHover: string;\n primaryLight: string;\n primaryDark: string;\n \n // Secondary colors\n secondary: string;\n secondaryHover: string;\n \n // Semantic colors\n success: string;\n warning: string;\n danger: string;\n info: string;\n \n // UI colors\n background: string;\n surface: string;\n border: string;\n \n // Text colors\n textPrimary: string;\n textSecondary: string;\n textMuted: string;\n\n // Input-specific overrides (optional — fall back to general colors when absent)\n inputBg?: string; // input background (→ --metakyc-input-bg)\n inputText?: string; // input text color (→ --metakyc-input-text)\n inputBorder?: string; // input border (→ --metakyc-input-border)\n inputBorderFocus?: string; // focus ring/border (→ --metakyc-input-border-focus)\n inputPlaceholder?: string; // placeholder text (→ --metakyc-input-placeholder)\n}\n\n/**\n * Typography configuration\n */\nexport interface TypographyConfig {\n fontFamily: string;\n headingFont?: string;\n fontSize?: {\n xs: string;\n sm: string;\n base: string;\n lg: string;\n xl: string;\n '2xl': string;\n '3xl': string;\n };\n fontWeight?: {\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n}\n\n/**\n * Spacing and layout configuration\n */\nexport interface SpacingConfig {\n borderRadius: string;\n cardPadding: string;\n inputHeight: string;\n}\n\n/**\n * Complete theme configuration\n */\nexport interface ThemeConfig {\n /** Theme name/identifier */\n name?: string;\n \n /** Title/heading for the SDK */\n title?: string;\n \n /** Logo configuration */\n logo?: LogoConfig;\n \n /** Color palette */\n colors: ColorPalette;\n \n /** Typography settings */\n typography?: TypographyConfig;\n \n /** Spacing and layout */\n spacing?: SpacingConfig;\n \n /** Custom CSS to inject */\n customCSS?: string;\n \n /** Dark mode color overrides */\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n\n /** Applicant form visible fields (ordered) from backend config */\n applicantFormVisibleFields?: string[];\n\n /** Applicant form client-required fields from backend config */\n applicantFormRequiredFields?: string[];\n\n /** Allowed language codes for the Default Language dropdown e.g. ['EN','DE'] */\n allowedLanguages?: string[];\n\n /** Multi-page applicant form layout configuration */\n applicantFormPages?: import('./form-config').FormPage[];\n\n /** Identity review page — single FormPage with fields + editable flags */\n reviewPageFields?: import('./form-config').FormPage[];\n\n /**\n * When true the identity review/confirmation page is skipped entirely.\n * The SDK auto-requests identity on mount and shows the provider UI directly.\n */\n reviewPageDisabled?: boolean;\n\n /**\n * Controls how field labels are rendered in the applicant form.\n * 'label' (default) — a label element is shown above each input.\n * 'placeholder' — no label element; the label text is used as the input placeholder.\n */\n fieldLabelMode?: 'label' | 'placeholder';\n\n /** Company (KYB) form visible fields (ordered) from backend config */\n companyFormVisibleFields?: string[];\n\n /** Company form client-required fields from backend config */\n companyFormRequiredFields?: string[];\n\n /** Multi-page company form layout configuration */\n companyFormPages?: import('./form-config').FormPage[];\n\n /** Company review page fields */\n companyReviewPageFields?: import('./form-config').FormPage[];\n}\n\n\n/**\n * Predefined theme presets\n */\nexport enum ThemePreset {\n Default = 'default',\n Corporate = 'corporate',\n Fintech = 'fintech',\n Healthcare = 'healthcare',\n Modern = 'modern',\n Minimal = 'minimal',\n}\n\n/**\n * Theme configuration from backend\n */\nexport interface ThemeConfigurationDto {\n tenantId?: number;\n isEnabled: boolean;\n preset?: ThemePreset;\n title?: string;\n logo?: LogoConfig;\n colors?: Partial<ColorPalette>;\n typography?: TypographyConfig;\n spacing?: SpacingConfig;\n customCSS?: string;\n darkMode?: {\n colors: Partial<ColorPalette>;\n };\n applicantFormVisibleFields?: string[];\n applicantFormRequiredFields?: string[];\n allowedLanguages?: string[];\n applicantFormPages?: import('./form-config').FormPage[];\n reviewPageFields?: import('./form-config').FormPage[];\n reviewPageDisabled?: boolean;\n fieldLabelMode?: 'label' | 'placeholder';\n companyFormVisibleFields?: string[];\n companyFormRequiredFields?: string[];\n companyFormPages?: import('./form-config').FormPage[];\n companyReviewPageFields?: import('./form-config').FormPage[];\n}\n\n","/**\n * Endpoint pattern types\n * - host-controller: /api/[Controller]/[Action]\n * - application-service: /services/app/[Service]/[Method]\n */\nexport type EndpointPattern = 'host-controller' | 'application-service' | 'custom';\n\n/**\n * Custom endpoint paths configuration\n */\nexport interface CustomEndpointPaths {\n [key: string]: string;\n}\n\n/**\n * Endpoint configuration\n */\nexport interface EndpointConfig {\n pattern: EndpointPattern;\n customPaths?: CustomEndpointPaths;\n}\n\n/**\n * SardinAI provider configuration\n */\nexport interface SardinAIProviderConfig {\n clientId: string;\n clientSecret?: string;\n environment: 'sandbox' | 'production';\n region?: 'us' | 'eu' | 'ca' | 'au';\n enableBiometrics?: boolean;\n enablePortScanning?: boolean;\n flow?: string;\n}\n\n/**\n * Sumsub provider configuration (frontend-only settings).\n * Server-side API keys are never exposed — only UI/SDK behavior config.\n */\nexport interface SumsubProviderConfig {\n /** Theme for Sumsub UI: 'light' or 'dark'. Follows device theme if omitted. */\n theme?: 'light' | 'dark';\n /** Language override (ISO 639-1). Falls back to SDK locale. */\n lang?: string;\n /**\n * WebSDK 2.0: name of a customization created in the Sumsub Dashboard.\n * This is the recommended way to style the Sumsub widget.\n */\n customizationName?: string;\n /** WebSDK 1.0 fallback: URL to an external CSS file. */\n customCss?: string;\n /** Whether to adapt Sumsub iframe height automatically (default: true). */\n adaptIframeHeight?: boolean;\n}\n\n/**\n * Identity provider configurations\n */\nexport interface IdentityProviderConfigs {\n sardinai?: SardinAIProviderConfig;\n sumsub?: SumsubProviderConfig;\n onfido?: Record<string, any>;\n}\n\n/**\n * Applicant form field name type\n */\nexport type ApplicantFormField =\n | 'firstName'\n | 'lastName'\n | 'title'\n | 'email'\n | 'dateOfBirth'\n | 'phonenumber'\n | 'mobileCountryCode'\n | 'street'\n | 'streetNumber'\n | 'zip'\n | 'city'\n | 'country'\n | 'nationality'\n | 'otherNationality'\n | 'defaultLanguage'\n | 'taxCountry'\n | 'placeOfBirth'\n | 'countryOfBirth'\n | 'salutation'\n | 'educationLevel'\n | 'occupation'\n | 'taxNumber'\n | 'externalRefId';\n\n/**\n * Company applicant form field name type\n */\nexport type CompanyApplicantFormField =\n | 'companyName'\n | 'registrationNumber'\n | 'email'\n | 'phone'\n | 'countryResidence'\n | 'legalAddress'\n | 'incorporatedOn'\n | 'controlScheme'\n | 'taxId'\n | 'registrationLocation'\n | 'website'\n | 'postalAddress'\n | 'street'\n | 'city'\n | 'state'\n | 'postalCode'\n | 'addressCountry'\n | 'lei'\n | 'streetNumber'\n | 'externalRefId';\n\n/**\n * Applicant form configuration\n */\nexport interface ApplicantFormConfig {\n /**\n * Whether this form collects data for an individual or a company.\n * - 'individual' (default): uses ApplicantRequestData fields\n * - 'company': uses CompanyApplicantRequestData fields\n */\n applicantType?: 'individual' | 'company';\n\n /** List of fields to show in the form. If not specified, shows default fields */\n visibleFields?: ApplicantFormField[];\n \n /** Default workflow key for applicant creation. Can be overridden per component instance */\n workflowKey?: string;\n \n /** Default external reference ID. Required if not shown in visible fields. */\n externalRefId?: string;\n\n /** Pre-fill the email field in the applicant form (e.g. for testing or SSO flows). */\n email?: string;\n\n /**\n * Hidden pre-filled values that are submitted with the form but never shown in the UI.\n * Built-in fields (e.g. 'country', 'firstName') are sent as top-level request fields.\n * Custom param names (any other key) are sent as applicantAdditionalDatas entries.\n * Example: { country: 'AUT', no_marketing: 'yes' }\n */\n hiddenValues?: Record<string, string>;\n\n /**\n * Controls how field labels are displayed.\n * - 'label' (default): a label element is shown above each input.\n * - 'placeholder' : no label element; the label text is used as the input placeholder instead.\n */\n fieldLabelMode?: 'label' | 'placeholder';\n\n /**\n * Pre-filled field values that are shown as **read-only** in the form.\n * If a field listed here is also in the visible fields, it appears filled and disabled.\n * The values are always included in the submission payload.\n * Works for both individual and company applicant forms.\n * Example: { firstName: 'John', lastName: 'Doe', email: 'john@example.com' }\n */\n initialValues?: Record<string, string>;\n}\n\n/**\n * MetaKYC client configuration\n */\nexport interface MetaKYCClientConfig {\n /** API key for authentication. Required unless getAccessToken is provided. */\n apiKey?: string;\n\n /** Tenant ID */\n tenantId: number;\n\n /** Base URL of the MetaKYC API */\n baseUrl: string;\n\n /**\n * Callback that returns a Bearer token for session-based authentication.\n * When provided, the SDK sends `Authorization: Bearer <token>` instead of API Key headers.\n * Useful for first-party apps where the user is already authenticated.\n * Can return null/undefined to skip the header for that request.\n */\n getAccessToken?: () => string | null | undefined;\n\n /** Endpoint configuration */\n endpoints?: EndpointConfig;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Number of retry attempts for failed requests (default: 3) */\n retries?: number;\n\n /** Locale/language code (default: 'en') */\n locale?: string;\n\n /** Identity provider configurations */\n identityProviders?: IdentityProviderConfigs;\n\n /** Applicant form configuration */\n applicantForm?: ApplicantFormConfig;\n\n /** Theme configuration (optional - will fetch from backend if not provided) */\n theme?: any; // Imported dynamically to avoid circular dependency\n\n /** Show SDK version badge at the top of the SDK content (default: false) */\n showVersion?: boolean;\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: Partial<MetaKYCClientConfig> = {\n timeout: 30000,\n retries: 3,\n locale: 'en',\n endpoints: {\n pattern: 'host-controller',\n },\n};\n","import { EndpointConfig } from './config';\n\n/**\n * Builds API endpoint URLs based on the configured pattern\n */\nexport class EndpointBuilder {\n constructor(private config: EndpointConfig) {}\n\n /**\n * Build an endpoint URL\n * @param controller - Controller name (e.g., 'Applicant')\n * @param action - Action/method name (e.g., 'GetApplicantProgress')\n * @returns The full endpoint path\n */\n build(controller: string, action: string): string {\n // Check for custom path first\n const customKey = `${controller}.${action}`;\n if (this.config.customPaths && this.config.customPaths[customKey]) {\n return this.config.customPaths[customKey];\n }\n\n // Build based on pattern\n switch (this.config.pattern) {\n case 'host-controller':\n return `/api/${controller}/${action}`;\n\n case 'application-service':\n // For application service pattern, convert controller/action to service/method\n const serviceName = this.getServiceName(controller);\n return `/services/app/${serviceName}/${action}`;\n\n case 'custom':\n throw new Error(\n `Custom endpoint path not found for ${customKey}. Please provide it in customPaths.`\n );\n\n default:\n throw new Error(`Unknown endpoint pattern: ${this.config.pattern}`);\n }\n }\n\n /**\n * Convert controller name to service name for application-service pattern\n */\n private getServiceName(controller: string): string {\n // Map controller names to service names\n const serviceMap: Record<string, string> = {\n Applicant: 'MetaKYCVerification',\n Questionnaire: 'MetaKYCVerification',\n UploadDocument: 'MetaKYCVerification',\n AppropriatenessTest: 'MetaKYCVerification',\n BaseInformation: 'MetaKYCVerification',\n };\n\n return serviceMap[controller] || controller;\n }\n}\n","import { ApiError } from '../types';\n\n/**\n * Custom error class for MetaKYC API errors\n */\nexport class MetaKYCError extends Error {\n public response?: any;\n \n constructor(\n message: string,\n public code?: number,\n public details?: string,\n public validationErrors?: Array<{ message: string; members: string[] }>,\n response?: any\n ) {\n super(message);\n this.name = 'MetaKYCError';\n this.response = response;\n Object.setPrototypeOf(this, MetaKYCError.prototype);\n }\n}\n\n/**\n * Handles API errors and converts them to MetaKYCError\n */\nexport class ErrorHandler {\n /**\n * Process an error from the API response\n */\n static handleApiError(error: ApiError): MetaKYCError {\n return new MetaKYCError(\n error.message || 'An unknown error occurred',\n error.code,\n error.details || undefined,\n error.validationErrors || undefined\n );\n }\n\n /**\n * Process an Axios error\n */\n static handleAxiosError(error: any): MetaKYCError {\n if (error.response) {\n // Server responded with error status\n const data = error.response.data;\n\n if (data && data.error) {\n return new MetaKYCError(\n data.error.message || 'An unknown error occurred',\n data.error.code,\n data.error.details || undefined,\n data.error.validationErrors || undefined,\n error.response\n );\n }\n\n // Check for result.message (common in ABP framework)\n if (data && data.result && data.result.message) {\n return new MetaKYCError(\n data.result.message,\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n }\n\n return new MetaKYCError(\n data?.message || error.message || 'Request failed',\n error.response.status,\n `HTTP ${error.response.status}: ${error.response.statusText}`,\n undefined,\n error.response\n );\n } else if (error.request) {\n // Request was made but no response\n return new MetaKYCError(\n 'No response from server',\n 0,\n 'The request was made but no response was received. Please check your network connection.'\n );\n } else {\n // Something else happened\n return new MetaKYCError(error.message || 'An unexpected error occurred', 0, error.toString());\n }\n }\n\n /**\n * Check if an error is a MetaKYCError\n */\n static isMetaKYCError(error: any): error is MetaKYCError {\n return error instanceof MetaKYCError;\n }\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { MetaKYCClientConfig, defaultConfig } from './config';\nimport { EndpointBuilder } from './endpoint-builder';\nimport { ErrorHandler } from './error-handler';\nimport { ApiResponse } from '../types';\n\n/**\n * HTTP client for MetaKYC API\n * Handles all HTTP communication with configurable endpoints\n */\nexport class HttpClient {\n private axiosInstance: AxiosInstance;\n private endpointBuilder: EndpointBuilder;\n private config: MetaKYCClientConfig;\n\n constructor(config: MetaKYCClientConfig) {\n this.config = { ...defaultConfig, ...config };\n\n // Initialize endpoint builder\n this.endpointBuilder = new EndpointBuilder(this.config.endpoints!);\n\n // Create axios instance\n this.axiosInstance = axios.create({\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor\n this.axiosInstance.interceptors.request.use(\n (config) => {\n config.headers['Abp-TenantId'] = this.config.tenantId.toString();\n\n if (this.config.getAccessToken) {\n const token = this.config.getAccessToken();\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`;\n }\n } else if (this.config.apiKey) {\n config.headers['ApiKey'] = this.config.apiKey;\n config.headers['X-API-KEY'] = this.config.apiKey;\n }\n\n if (this.config.locale) {\n config.headers['Accept-Language'] = this.config.locale;\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n // Add response interceptor\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n // Retry logic for failed requests\n if (error.response?.status >= 500 && !originalRequest._retry) {\n originalRequest._retry = true;\n originalRequest._retryCount = (originalRequest._retryCount || 0) + 1;\n\n if (originalRequest._retryCount < (this.config.retries || 3)) {\n // Wait before retrying (exponential backoff)\n await new Promise((resolve) =>\n setTimeout(resolve, 1000 * originalRequest._retryCount)\n );\n return this.axiosInstance(originalRequest);\n }\n }\n\n return Promise.reject(error);\n }\n );\n }\n\n /**\n * Build endpoint URL\n */\n buildEndpoint(controller: string, action: string): string {\n return this.endpointBuilder.build(controller, action);\n }\n\n /**\n * Make a GET request\n */\n async get<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.get(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a POST request\n */\n async post<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.post(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(controller: string, action: string, data?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.put(url, data);\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(controller: string, action: string, params?: any): Promise<ApiResponse<T>> {\n try {\n const url = this.buildEndpoint(controller, action);\n const response: AxiosResponse<ApiResponse<T>> = await this.axiosInstance.delete(url, {\n params,\n });\n return this.handleResponse(response);\n } catch (error) {\n throw ErrorHandler.handleAxiosError(error);\n }\n }\n\n /**\n * Handle API response\n */\n private handleResponse<T>(response: AxiosResponse<ApiResponse<T>>): ApiResponse<T> {\n const data = response.data;\n\n // Check if response indicates an error\n if (!data.success && data.error) {\n throw ErrorHandler.handleApiError(data.error);\n }\n\n return data;\n }\n\n /**\n * Get the underlying axios instance for advanced usage\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ProgressApplicantStatusResult,\n ApplicantDataDto,\n DuplicateApplicantInput,\n} from '../types';\n\n/**\n * Applicant service\n * Handles all applicant-related API calls\n */\nexport class ApplicantService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Create a new individual applicant\n */\n async createApplicant(input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Create a new company applicant\n */\n async createCompanyApplicant(\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'ApplicantCompanyRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Duplicate an existing applicant with a new workflow\n */\n async duplicateApplicant(input: DuplicateApplicantInput): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.post<ProgressApplicantResult>(\n 'Applicant',\n 'DuplicateApplicantRegistrationRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Get applicant progress\n */\n async getProgress(applicantId: number): Promise<ProgressApplicantResult> {\n const response = await this.httpClient.get<ProgressApplicantResult>(\n 'Applicant',\n 'GetApplicantProgress',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant progress status (simplified)\n */\n async getProgressStatus(applicantId: number): Promise<ProgressApplicantStatusResult> {\n const response = await this.httpClient.get<ProgressApplicantStatusResult>(\n 'Applicant',\n 'GetApplicantProgressStaus', // Note: typo in API endpoint name\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant data\n */\n async getApplicantData(applicantId: number): Promise<ApplicantDataDto> {\n const response = await this.httpClient.get<ApplicantDataDto>(\n 'Applicant',\n 'GetApplicantData',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Get applicant status\n */\n async getApplicantStatus(applicantId: number): Promise<any> {\n const response = await this.httpClient.get(\n 'Applicant',\n 'GetApplicantStatus',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Stop applicant progress\n */\n async stopProgress(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'StopProgress', { applicantId });\n }\n\n /**\n * Move back one step in the workflow\n */\n async progressStepBack(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ProgressStepBack', { applicantId });\n }\n\n /**\n * Set applicant language\n */\n async setLanguage(applicantId: number, language: string): Promise<void> {\n await this.httpClient.post('Applicant', 'SetApplicantLng', {\n applicantId,\n language,\n });\n }\n\n /**\n * Activate applicant\n */\n async activateApplicant(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'ActivateApplicant', { applicantId });\n }\n\n /**\n * Delete applicant\n */\n async deleteApplicant(applicantId: number): Promise<void> {\n await this.httpClient.delete('Applicant', 'DeleteApplicant', { applicantId });\n }\n\n /**\n * Check if applicant exists by external reference ID\n */\n async checkApplicantExists(externalRefId: string): Promise<boolean> {\n const response = await this.httpClient.get<boolean>(\n 'Applicant',\n 'CheckApplicantIfExists',\n { externalRefId }\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n QuestionnaireOutput,\n FillQuestionnarieInput,\n FillQuestionnairesResult,\n} from '../types';\n\n/**\n * Questionnaire service\n * Handles questionnaire-related API calls\n */\nexport class QuestionnaireService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get questionnaire for an applicant\n */\n async getQuestionnaire(applicantId: number): Promise<QuestionnaireOutput> {\n const response = await this.httpClient.get<QuestionnaireOutput>(\n 'Questionnaire',\n 'GetQuestionnaire',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit questionnaire answers\n */\n async fillQuestionnaire(input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> {\n const response = await this.httpClient.post<FillQuestionnairesResult>(\n 'Applicant',\n 'FillQuestionnarie', // Note: typo in API endpoint name\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n UploadDocumentOutputDto,\n FillUploadDocumentInput,\n ReviewUploadDocumentDto,\n} from '../types';\n\n/**\n * Upload document service\n * Handles document upload-related API calls\n */\nexport class UploadDocumentService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get upload document requirements for an applicant\n */\n async getUploadDocument(applicantId: number): Promise<UploadDocumentOutputDto> {\n const response = await this.httpClient.get<UploadDocumentOutputDto>(\n 'UploadDocument',\n 'GetUploadDocument',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit uploaded documents\n */\n async fillUploadDocument(input: FillUploadDocumentInput): Promise<void> {\n await this.httpClient.post('Applicant', 'FillUploadDocument', input);\n }\n\n /**\n * Review uploaded documents (admin function)\n */\n async reviewUploadDocument(input: ReviewUploadDocumentDto): Promise<void> {\n await this.httpClient.post('UploadDocument', 'ReviewUploadDocument', input);\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Appropriateness test service\n * Handles appropriateness test-related API calls\n */\nexport class AppropriatenessTestService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get appropriateness test for an applicant\n */\n async getAppropriatenessTest(applicantId: number): Promise<AppropriatenessTestOutputDto> {\n const response = await this.httpClient.get<AppropriatenessTestOutputDto>(\n 'AppropriatenessTest',\n 'GetAppropriatenessTest',\n { applicantid: applicantId } // Note: lowercase 'id' in API\n );\n return response.result;\n }\n\n /**\n * Submit appropriateness test answers\n */\n async fillAppropriatenessTest(\n input: FillAppropriatenessTestInput\n ): Promise<FillAppropriatenessTestResult> {\n const response = await this.httpClient.post<FillAppropriatenessTestResult>(\n 'Applicant',\n 'FillAppropriatenessTest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Overview service\n * Handles overview step-related API calls\n */\nexport class OverviewService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get overview data for an applicant\n */\n async getOverviewData(applicantId: number): Promise<OverviewDataDto> {\n const response = await this.httpClient.get<OverviewDataDto>(\n 'Applicant',\n 'GetOverviewData',\n { ApplicantId: applicantId } // Note: capital 'A' in API\n );\n return response.result;\n }\n\n /**\n * Pass the overview step\n */\n async passOverview(applicantId: number): Promise<void> {\n await this.httpClient.get('Applicant', 'PassOverview', { applicantId });\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n RiskCriteriaDto,\n RiskCalculationInput,\n RiskScoringResult,\n RiskScoringPlanDto,\n} from '../types';\n\n/**\n * Risk scoring service\n * Handles risk scoring-related API calls\n */\nexport class RiskScoringService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get risk scoring plan information\n */\n async getRiskScoringPlan(): Promise<RiskScoringPlanDto> {\n const response = await this.httpClient.get<RiskScoringPlanDto>(\n 'Applicant',\n 'GetRiskScoringPlanInfo'\n );\n return response.result;\n }\n\n /**\n * Get risk criteria for scoring\n * Note: Requires applicantId as query parameter\n */\n async getRiskCriterias(applicantId: number): Promise<RiskCriteriaDto[]> {\n const response = await this.httpClient.get<RiskCriteriaDto[]>(\n 'Risk',\n 'GetCriterias',\n { applicantId }\n );\n return response.result;\n }\n\n /**\n * Submit risk scoring calculation\n */\n async submitRiskScoring(input: RiskCalculationInput): Promise<RiskScoringResult> {\n const response = await this.httpClient.post<RiskScoringResult>(\n 'Applicant',\n 'RiskScoringRequest',\n input\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { IdentityRequest, ApplicantRegistrationRequestOutput } from '../types';\n\n/**\n * Identity service\n * Handles identity verification-related API calls\n */\nexport class IdentityService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Request identity verification for individual applicant\n */\n async identityRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n console.log('[IdentityService] Calling IdentityRequest with input:', input);\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityRequest',\n input\n );\n console.log('[IdentityService] IdentityRequest response:', response);\n return response.result;\n }\n\n /**\n * Request identity verification for company applicant\n */\n async identityCompanyRequest(input: IdentityRequest): Promise<ApplicantRegistrationRequestOutput> {\n const response = await this.httpClient.post<ApplicantRegistrationRequestOutput>(\n 'Applicant',\n 'IdentityCompanyRequest',\n input\n );\n return response.result;\n }\n\n /**\n * Restart identity verification (individual)\n * Uses IdentityRequest with restart flag\n */\n async restartIdentityRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('[IdentityService] Restarting identity with restart=true:', input);\n return this.identityRequest(input);\n }\n\n /**\n * Restart identity verification (company)\n * Uses IdentityCompanyRequest with restart flag\n */\n async restartIdentityCompanyRequest(applicantId: number): Promise<ApplicantRegistrationRequestOutput> {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n return this.identityCompanyRequest(input);\n }\n\n /**\n * Refresh Sumsub access token for an active identity session.\n * Returns a fresh short-lived token without restarting the verification.\n */\n async refreshSumsubToken(applicantId: number): Promise<string> {\n console.log('[IdentityService] Refreshing Sumsub token for applicant:', applicantId);\n const response = await this.httpClient.post<{ accessToken: string }>(\n 'Applicant',\n 'RefreshSumsubToken',\n { applicantId }\n );\n console.log('[IdentityService] Sumsub token refresh result:', response);\n return response.result.accessToken;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport { CountryDto, BranchDto, LegalEntityDto } from '../types';\n\n/**\n * Base information service\n * Handles reference data API calls (countries, branches, legal entities)\n */\nexport class BaseInformationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get all countries\n * @param filter - Optional filter string\n * @param lng - Language code (e.g., 'en', 'de')\n * @param type - Optional country type filter\n */\n async getCountries(filter?: string, lng?: string, type?: number): Promise<CountryDto[]> {\n const response = await this.httpClient.get<CountryDto[]>(\n 'BaseInformation',\n 'GetAllCountries',\n { filter: filter || '', lng: lng || 'en', type }\n );\n return response.result;\n }\n\n /**\n * Get all branches\n */\n async getBranches(): Promise<BranchDto[]> {\n const response = await this.httpClient.get<BranchDto[]>(\n 'BaseInformation',\n 'GetBranches'\n );\n return response.result;\n }\n\n /**\n * Get all legal entities\n */\n async getLegalEntities(): Promise<LegalEntityDto[]> {\n const response = await this.httpClient.get<LegalEntityDto[]>(\n 'BaseInformation',\n 'GetLegalEntities'\n );\n return response.result;\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport {\n InvestorCategorizationInput,\n SetInvestorCategorizationResult,\n} from '../types';\n\n/**\n * Investor categorization service\n * Handles investor categorization-related API calls\n */\nexport class InvestorCategorizationService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Set investor categorization\n */\n async setInvestorCategorization(\n input: InvestorCategorizationInput\n ): Promise<SetInvestorCategorizationResult> {\n const response = await this.httpClient.post<SetInvestorCategorizationResult>(\n 'Applicant',\n 'SetInvestorCategorization',\n input\n );\n return response.result;\n }\n\n /**\n * Get investor categorization\n */\n async getInvestorCategorization(applicantId: number): Promise<InvestorCategorizationInput> {\n const response = await this.httpClient.get<InvestorCategorizationInput>(\n 'Applicant',\n 'GetInvestorCategorisation', // Note: British spelling in API\n { applicantId }\n );\n return response.result;\n }\n}\n","import { ThemeConfig, ThemePreset } from '../types/theme';\n\n/**\n * Default theme preset\n */\nexport const defaultTheme: ThemeConfig = {\n name: 'Default',\n title: 'KYC Verification',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryLight: '#dbeafe',\n primaryDark: '#1e40af',\n \n secondary: '#64748b',\n secondaryHover: '#475569',\n \n success: '#10b981',\n warning: '#f59e0b',\n danger: '#ef4444',\n info: '#3b82f6',\n \n background: '#ffffff',\n surface: '#f9fafb',\n border: '#e5e7eb',\n \n textPrimary: '#111827',\n textSecondary: '#6b7280',\n textMuted: '#9ca3af',\n },\n typography: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n darkMode: {\n colors: {\n background: '#111827',\n surface: '#1f2937',\n border: '#374151',\n textPrimary: '#f9fafb',\n textSecondary: '#d1d5db',\n textMuted: '#9ca3af',\n },\n },\n};\n\n/**\n * Corporate blue theme preset\n */\nexport const corporateTheme: ThemeConfig = {\n name: 'Corporate',\n logo: {\n url: '',\n height: '40px',\n visible: true,\n },\n colors: {\n primary: '#0052CC',\n primaryHover: '#0747A6',\n primaryLight: '#DEEBFF',\n primaryDark: '#0747A6',\n \n secondary: '#6B778C',\n secondaryHover: '#5E6C84',\n \n success: '#00875A',\n warning: '#FF991F',\n danger: '#DE350B',\n info: '#0065FF',\n \n background: '#ffffff',\n surface: '#F4F5F7',\n border: '#DFE1E6',\n \n textPrimary: '#172B4D',\n textSecondary: '#5E6C84',\n textMuted: '#97A0AF',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.5rem',\n inputHeight: '2.5rem',\n },\n};\n\n/**\n * Fintech green theme preset\n */\nexport const fintechTheme: ThemeConfig = {\n name: 'Fintech',\n logo: {\n url: '',\n height: '36px',\n visible: true,\n },\n colors: {\n primary: '#00B386',\n primaryHover: '#009973',\n primaryLight: '#D1FAE5',\n primaryDark: '#047857',\n \n secondary: '#7C3AED',\n secondaryHover: '#6D28D9',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#F9FAFB',\n border: '#E5E7EB',\n \n textPrimary: '#111827',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n },\n typography: {\n fontFamily: 'Montserrat, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.75rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Healthcare theme preset\n */\nexport const healthcareTheme: ThemeConfig = {\n name: 'Healthcare',\n logo: {\n url: '',\n height: '44px',\n visible: true,\n },\n colors: {\n primary: '#06B6D4',\n primaryHover: '#0891B2',\n primaryLight: '#CFFAFE',\n primaryDark: '#0E7490',\n \n secondary: '#8B5CF6',\n secondaryHover: '#7C3AED',\n \n success: '#059669',\n warning: '#D97706',\n danger: '#DC2626',\n info: '#0284C7',\n \n background: '#ffffff',\n surface: '#F0F9FF',\n border: '#E0F2FE',\n \n textPrimary: '#0F172A',\n textSecondary: '#475569',\n textMuted: '#94A3B8',\n },\n typography: {\n fontFamily: 'Lato, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '0.5rem',\n cardPadding: '1.75rem',\n inputHeight: '2.75rem',\n },\n darkMode: {\n colors: {\n background: '#0F172A',\n surface: '#1E293B',\n border: '#334155',\n textPrimary: '#F1F5F9',\n textSecondary: '#CBD5E1',\n },\n },\n};\n\n/**\n * Modern theme preset\n */\nexport const modernTheme: ThemeConfig = {\n name: 'Modern',\n logo: {\n url: '',\n height: '38px',\n visible: true,\n },\n colors: {\n primary: '#8B5CF6',\n primaryHover: '#7C3AED',\n primaryLight: '#EDE9FE',\n primaryDark: '#6D28D9',\n \n secondary: '#EC4899',\n secondaryHover: '#DB2777',\n \n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E5E5E5',\n \n textPrimary: '#171717',\n textSecondary: '#737373',\n textMuted: '#A3A3A3',\n },\n typography: {\n fontFamily: 'Poppins, system-ui, sans-serif',\n },\n spacing: {\n borderRadius: '1rem',\n cardPadding: '2rem',\n inputHeight: '3rem',\n },\n};\n\n/**\n * Minimal theme preset\n */\nexport const minimalTheme: ThemeConfig = {\n name: 'Minimal',\n logo: {\n url: '',\n height: '32px',\n visible: true,\n },\n colors: {\n primary: '#000000',\n primaryHover: '#18181B',\n primaryLight: '#F4F4F5',\n primaryDark: '#000000',\n \n secondary: '#71717A',\n secondaryHover: '#52525B',\n \n success: '#22C55E',\n warning: '#EAB308',\n danger: '#EF4444',\n info: '#3B82F6',\n \n background: '#ffffff',\n surface: '#FAFAFA',\n border: '#E4E4E7',\n \n textPrimary: '#09090B',\n textSecondary: '#71717A',\n textMuted: '#A1A1AA',\n },\n typography: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n spacing: {\n borderRadius: '0.25rem',\n cardPadding: '1.25rem',\n inputHeight: '2.25rem',\n },\n};\n\n/**\n * Map of all theme presets\n */\nexport const themePresets: Record<ThemePreset, ThemeConfig> = {\n [ThemePreset.Default]: defaultTheme,\n [ThemePreset.Corporate]: corporateTheme,\n [ThemePreset.Fintech]: fintechTheme,\n [ThemePreset.Healthcare]: healthcareTheme,\n [ThemePreset.Modern]: modernTheme,\n [ThemePreset.Minimal]: minimalTheme,\n};\n\n/**\n * Get theme preset by name\n */\nexport function getThemePreset(preset: ThemePreset): ThemeConfig {\n return themePresets[preset] || defaultTheme;\n}\n","import { HttpClient } from '../client';\nimport { ThemeConfigurationDto, ThemeConfig, ThemePreset } from '../types/theme';\nimport { getThemePreset } from '../theme/presets';\n\n/**\n * Theme Service\n * Handles backend communication for theme configuration\n */\nexport class ThemeService {\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Get theme configuration from backend\n */\n async getThemeConfiguration(): Promise<ThemeConfig> {\n try {\n const response = await this.httpClient.get<ThemeConfigurationDto>(\n 'Tenant',\n 'GetThemeConfiguration'\n );\n\n // If theme is disabled or not configured, return default\n if (!response.result.isEnabled) {\n return getThemePreset(ThemePreset.Default);\n }\n\n // Start with preset if specified\n let theme: ThemeConfig = response.result.preset \n ? getThemePreset(response.result.preset)\n : getThemePreset(ThemePreset.Default);\n\n // Apply custom overrides\n if (response.result.title) {\n theme.title = response.result.title;\n }\n\n if (response.result.logo) {\n theme.logo = { ...theme.logo, ...response.result.logo };\n }\n\n if (response.result.colors) {\n theme.colors = { ...theme.colors, ...response.result.colors };\n }\n\n if (response.result.typography) {\n theme.typography = { ...theme.typography, ...response.result.typography };\n }\n\n if (response.result.spacing) {\n theme.spacing = { ...theme.spacing, ...response.result.spacing };\n }\n\n if (response.result.customCSS) {\n theme.customCSS = response.result.customCSS;\n }\n\n if (response.result.darkMode) {\n theme.darkMode = {\n colors: {\n ...theme.darkMode?.colors,\n ...response.result.darkMode.colors,\n },\n };\n }\n\n if (response.result.applicantFormVisibleFields && response.result.applicantFormVisibleFields.length > 0) {\n theme.applicantFormVisibleFields = response.result.applicantFormVisibleFields;\n }\n\n if (response.result.applicantFormRequiredFields && response.result.applicantFormRequiredFields.length > 0) {\n theme.applicantFormRequiredFields = response.result.applicantFormRequiredFields;\n }\n\n if (response.result.allowedLanguages && response.result.allowedLanguages.length > 0) {\n theme.allowedLanguages = response.result.allowedLanguages;\n }\n\n if (response.result.applicantFormPages) {\n try {\n const parsed = typeof response.result.applicantFormPages === 'string'\n ? JSON.parse(response.result.applicantFormPages)\n : response.result.applicantFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Migrate old 2-column format (_v < 4): colSpan 1→2, 2→4\n theme.applicantFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — fall back to flat layout\n }\n }\n\n if (response.result.reviewPageFields) {\n try {\n const parsed = typeof response.result.reviewPageFields === 'string'\n ? JSON.parse(response.result.reviewPageFields)\n : response.result.reviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.reviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — fall back to static layout\n }\n }\n\n if (response.result.reviewPageDisabled) {\n theme.reviewPageDisabled = true;\n }\n\n if (response.result.fieldLabelMode === 'placeholder') {\n theme.fieldLabelMode = 'placeholder';\n }\n\n // Company (KYB) form configuration\n if (response.result.companyFormVisibleFields && response.result.companyFormVisibleFields.length > 0) {\n theme.companyFormVisibleFields = response.result.companyFormVisibleFields;\n }\n\n if (response.result.companyFormRequiredFields && response.result.companyFormRequiredFields.length > 0) {\n theme.companyFormRequiredFields = response.result.companyFormRequiredFields;\n }\n\n if (response.result.companyFormPages) {\n try {\n const parsed = typeof response.result.companyFormPages === 'string'\n ? JSON.parse(response.result.companyFormPages as unknown as string)\n : response.result.companyFormPages;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.companyFormPages = parsed.map((p: any) => {\n const isOldFormat = !p._v || p._v < 4;\n return {\n ...p,\n fields: (p.fields || []).map((f: any) => ({\n ...f,\n colSpan: isOldFormat\n ? (f.colSpan === 1 ? 2 : 4)\n : Math.min(4, Math.max(1, f.colSpan ?? 4)),\n })),\n };\n });\n }\n } catch {\n // malformed JSON — ignore\n }\n }\n\n if (response.result.companyReviewPageFields) {\n try {\n const parsed = typeof response.result.companyReviewPageFields === 'string'\n ? JSON.parse(response.result.companyReviewPageFields as unknown as string)\n : response.result.companyReviewPageFields;\n if (Array.isArray(parsed) && parsed.length > 0) {\n theme.companyReviewPageFields = parsed;\n }\n } catch {\n // malformed JSON — ignore\n }\n }\n\n return theme;\n } catch (error) {\n console.warn('[ThemeService] Failed to fetch theme configuration:', error);\n // Return default theme on error\n return getThemePreset(ThemePreset.Default);\n }\n }\n\n /**\n * Save theme configuration (for Panel use)\n */\n async saveThemeConfiguration(config: ThemeConfigurationDto): Promise<void> {\n await this.httpClient.post<void>('Tenant', 'SaveThemeConfiguration', config);\n }\n\n /**\n * Get available theme presets\n */\n getAvailablePresets(): Array<{ id: ThemePreset; name: string }> {\n return [\n { id: ThemePreset.Default, name: 'Default' },\n { id: ThemePreset.Corporate, name: 'Corporate' },\n { id: ThemePreset.Fintech, name: 'Fintech' },\n { id: ThemePreset.Healthcare, name: 'Healthcare' },\n { id: ThemePreset.Modern, name: 'Modern' },\n { id: ThemePreset.Minimal, name: 'Minimal' },\n ];\n }\n\n /**\n * Preview theme (doesn't save)\n */\n getPreviewTheme(preset: ThemePreset, overrides?: Partial<ThemeConfig>): ThemeConfig {\n const baseTheme = getThemePreset(preset);\n \n if (!overrides) {\n return baseTheme;\n }\n\n return {\n ...baseTheme,\n ...overrides,\n logo: { ...baseTheme.logo, ...overrides.logo },\n colors: { ...baseTheme.colors, ...overrides.colors },\n typography: overrides.typography ? \n { ...baseTheme.typography, ...overrides.typography } : \n baseTheme.typography,\n spacing: overrides.spacing ? \n { ...baseTheme.spacing, ...overrides.spacing } : \n baseTheme.spacing,\n };\n }\n}\n","import { HttpClient } from '../client/http-client';\nimport type { PartialTranslationDictionary } from '../i18n/types';\n\nexport class TranslationService {\n constructor(private httpClient: HttpClient) {}\n\n async getTranslations(locale: string): Promise<PartialTranslationDictionary> {\n try {\n const response = await this.httpClient.get<PartialTranslationDictionary>(\n 'SdkConfiguration',\n 'GetTranslations',\n { locale },\n );\n return (response as any).result ?? response;\n } catch (error) {\n console.warn('[MetaKYC TranslationService] Failed to fetch translations:', error);\n return {};\n }\n }\n}\n","/**\n * Simple event emitter for state changes\n */\nexport class EventEmitter<T = any> {\n private listeners: Map<string, Set<(data: T) => void>> = new Map();\n\n /**\n * Subscribe to an event\n */\n on(event: string, callback: (data: T) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: string, callback: (data: T) => void): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n }\n\n /**\n * Emit an event\n */\n emit(event: string, data: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event listener for \"${event}\":`, error);\n }\n });\n }\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Remove all listeners for a specific event\n */\n clearEvent(event: string): void {\n this.listeners.delete(event);\n }\n}\n","import {\n ProgressApplicantResult,\n FlowStep,\n StepInfo,\n ApplicantProgressStatus,\n WorkflowResultType,\n} from '../types';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * Workflow state events\n */\nexport interface WorkflowStateEvents {\n progressUpdated: ProgressApplicantResult;\n stepChanged: FlowStep | null;\n statusChanged: ApplicantProgressStatus;\n error: Error;\n completed: WorkflowResultType;\n}\n\n/**\n * Workflow state manager\n * Manages the current state of a workflow execution\n */\nexport class WorkflowState {\n private events = new EventEmitter<any>();\n private _applicantId: number | null = null;\n private _progress: ProgressApplicantResult | null = null;\n private _error: Error | null = null;\n\n constructor() {}\n\n /**\n * Get current applicant ID\n */\n get applicantId(): number | null {\n return this._applicantId;\n }\n\n /**\n * Get current progress\n */\n get progress(): ProgressApplicantResult | null {\n return this._progress;\n }\n\n /**\n * Get current step\n */\n get currentStep(): FlowStep | null {\n return this._progress?.currentStep || null;\n }\n\n /**\n * Get all workflow steps\n */\n get steps(): StepInfo[] {\n return this._progress?.stepInfoList || [];\n }\n\n /**\n * Get current status\n */\n get status(): ApplicantProgressStatus {\n return this._progress?.status || ApplicantProgressStatus.None;\n }\n\n /**\n * Get workflow result\n */\n get workflowResult(): WorkflowResultType | null {\n return this._progress?.workflowResult || null;\n }\n\n /**\n * Get current error\n */\n get error(): Error | null {\n return this._error;\n }\n\n /**\n * Check if workflow is complete\n */\n get isComplete(): boolean {\n return this.status === ApplicantProgressStatus.Finished;\n }\n\n /**\n * Check if workflow is on hold\n */\n get isOnHold(): boolean {\n return this.status === ApplicantProgressStatus.OnHold;\n }\n\n /**\n * Check if workflow is in progress\n */\n get isInProgress(): boolean {\n return this.status === ApplicantProgressStatus.InProgress;\n }\n\n /**\n * Set applicant ID\n */\n setApplicantId(applicantId: number): void {\n this._applicantId = applicantId;\n }\n\n /**\n * Update progress\n */\n updateProgress(progress: ProgressApplicantResult): void {\n const previousStep = this._progress?.currentStep;\n this._progress = progress;\n this._applicantId = progress.applicantId;\n this._error = null;\n\n // Emit progress updated event\n this.events.emit('progressUpdated', progress);\n\n // Emit step changed event if step changed\n if (previousStep?.order !== progress.currentStep?.order) {\n this.events.emit('stepChanged', progress.currentStep);\n }\n\n // Emit status changed event\n this.events.emit('statusChanged', progress.status);\n\n // Emit completed event if workflow is finished\n if (progress.status === ApplicantProgressStatus.Finished && progress.workflowResult) {\n this.events.emit('completed', progress.workflowResult);\n }\n }\n\n /**\n * Set error\n */\n setError(error: Error): void {\n this._error = error;\n this.events.emit('error', error);\n }\n\n /**\n * Clear error\n */\n clearError(): void {\n this._error = null;\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this._applicantId = null;\n this._progress = null;\n this._error = null;\n }\n\n /**\n * Subscribe to progress updates\n */\n onProgressUpdated(callback: (progress: ProgressApplicantResult) => void): () => void {\n return this.events.on('progressUpdated', callback);\n }\n\n /**\n * Subscribe to step changes\n */\n onStepChanged(callback: (step: FlowStep | null) => void): () => void {\n return this.events.on('stepChanged', callback);\n }\n\n /**\n * Subscribe to status changes\n */\n onStatusChanged(callback: (status: ApplicantProgressStatus) => void): () => void {\n return this.events.on('statusChanged', callback);\n }\n\n /**\n * Subscribe to errors\n */\n onError(callback: (error: Error) => void): () => void {\n return this.events.on('error', callback);\n }\n\n /**\n * Subscribe to completion\n */\n onCompleted(callback: (result: WorkflowResultType) => void): () => void {\n return this.events.on('completed', callback);\n }\n\n /**\n * Clear all event listeners\n */\n clearListeners(): void {\n this.events.clear();\n }\n}\n","import { WorkflowStepAction } from '../types';\n\n/**\n * Step data loader function type\n */\nexport type StepDataLoader<T> = (applicantId: number) => Promise<T>;\n\n/**\n * Step data submitter function type\n */\nexport type StepDataSubmitter<T> = (data: T) => Promise<void>;\n\n/**\n * Step handler configuration\n */\nexport interface StepHandler<TData = any, TSubmit = any> {\n loadData: StepDataLoader<TData>;\n submitData: StepDataSubmitter<TSubmit>;\n}\n\n/**\n * Step router\n * Routes workflow steps to appropriate data loaders and submitters\n */\nexport class StepRouter {\n private handlers = new Map<WorkflowStepAction, StepHandler>();\n\n /**\n * Register a step handler\n */\n registerHandler(action: WorkflowStepAction, handler: StepHandler): void {\n this.handlers.set(action, handler);\n }\n\n /**\n * Get handler for a step action\n */\n getHandler(action: WorkflowStepAction): StepHandler | undefined {\n return this.handlers.get(action);\n }\n\n /**\n * Check if a step has a handler\n */\n hasHandler(action: WorkflowStepAction): boolean {\n return this.handlers.has(action);\n }\n\n /**\n * Load data for a step\n */\n async loadStepData<T>(action: WorkflowStepAction, applicantId: number): Promise<T> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.loadData(applicantId) as Promise<T>;\n }\n\n /**\n * Submit data for a step\n */\n async submitStepData<T>(action: WorkflowStepAction, data: T): Promise<void> {\n const handler = this.getHandler(action);\n if (!handler) {\n throw new Error(`No handler registered for step action: ${WorkflowStepAction[action]}`);\n }\n return handler.submitData(data);\n }\n}\n","import { WorkflowState } from './workflow-state';\nimport { StepRouter } from './step-router';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n InvestorCategorizationService,\n} from '../services';\nimport { WorkflowStepAction, ProgressApplicantResult } from '../types';\n\n/**\n * Workflow orchestrator\n * Manages workflow execution and step progression\n */\nexport class WorkflowOrchestrator {\n private state: WorkflowState;\n private stepRouter: StepRouter;\n\n constructor(\n private applicantService: ApplicantService,\n private questionnaireService: QuestionnaireService,\n private uploadDocumentService: UploadDocumentService,\n private appropriatenessTestService: AppropriatenessTestService,\n private overviewService: OverviewService,\n private riskScoringService: RiskScoringService,\n _identityService: IdentityService,\n private investorCategorizationService: InvestorCategorizationService\n ) {\n this.state = new WorkflowState();\n this.stepRouter = new StepRouter();\n this.registerStepHandlers();\n }\n\n /**\n * Register all step handlers\n */\n private registerStepHandlers(): void {\n // Questionnaire handler\n this.stepRouter.registerHandler(WorkflowStepAction.Questionaries, {\n loadData: (applicantId) => this.questionnaireService.getQuestionnaire(applicantId),\n submitData: async (data) => {\n await this.questionnaireService.fillQuestionnaire(data);\n },\n });\n\n // Upload document handler\n this.stepRouter.registerHandler(WorkflowStepAction.UploadDocument, {\n loadData: (applicantId) => this.uploadDocumentService.getUploadDocument(applicantId),\n submitData: (data) => this.uploadDocumentService.fillUploadDocument(data),\n });\n\n // Appropriateness test handler\n this.stepRouter.registerHandler(WorkflowStepAction.AppropriatenessTest, {\n loadData: (applicantId) =>\n this.appropriatenessTestService.getAppropriatenessTest(applicantId),\n submitData: async (data) => {\n await this.appropriatenessTestService.fillAppropriatenessTest(data);\n },\n });\n\n // Overview handler\n this.stepRouter.registerHandler(WorkflowStepAction.Overview, {\n loadData: (applicantId) => this.overviewService.getOverviewData(applicantId),\n submitData: (data: { applicantId: number }) =>\n this.overviewService.passOverview(data.applicantId),\n });\n\n // Risk scoring handler\n this.stepRouter.registerHandler(WorkflowStepAction.RiskScoring, {\n loadData: (applicantId) => this.riskScoringService.getRiskCriterias(applicantId),\n submitData: async (data) => {\n await this.riskScoringService.submitRiskScoring(data);\n },\n });\n\n // Identity SDK handler (no data loading, handled by identity service)\n this.stepRouter.registerHandler(WorkflowStepAction.IdentitySdk, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Identity verification required',\n }),\n submitData: async () => {\n // Identity verification is handled externally by provider SDKs\n // Just refresh progress after completion\n },\n });\n\n // Investor categorization handler\n this.stepRouter.registerHandler(WorkflowStepAction.InvestorCategorization, {\n loadData: (applicantId) =>\n this.investorCategorizationService.getInvestorCategorization(applicantId),\n submitData: async (data) => {\n await this.investorCategorizationService.setInvestorCategorization(data);\n },\n });\n\n // Manual review handler (no action needed from user)\n this.stepRouter.registerHandler(WorkflowStepAction.ManualReview, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Your application is under manual review',\n }),\n submitData: async () => {\n // Manual review is done by admin, no user action\n },\n });\n\n // Additional data handler (generic data collection)\n this.stepRouter.registerHandler(WorkflowStepAction.AdditionalData, {\n loadData: async (applicantId) => ({\n applicantId,\n message: 'Additional data required',\n }),\n submitData: async () => {\n // Additional data submission handled separately\n },\n });\n }\n\n /**\n * Initialize workflow with applicant ID\n */\n async initialize(applicantId: number): Promise<ProgressApplicantResult> {\n try {\n this.state.setApplicantId(applicantId);\n const progress = await this.applicantService.getProgress(applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Refresh applicant progress\n */\n async refreshProgress(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized. Call initialize() first.');\n }\n\n try {\n const progress = await this.applicantService.getProgress(this.state.applicantId);\n this.state.updateProgress(progress);\n return progress;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get data for current step\n */\n async getCurrentStepData<T>(): Promise<T> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n const data = await this.stepRouter.loadStepData<T>(\n this.state.currentStep.action,\n this.state.applicantId\n );\n return data;\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Submit data for current step\n */\n async submitCurrentStep(data: any): Promise<void> {\n if (!this.state.currentStep) {\n throw new Error('No current step available');\n }\n\n try {\n await this.stepRouter.submitStepData(this.state.currentStep.action, data);\n // Refresh progress after submission\n await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Move to next step (if possible)\n */\n async moveToNextStep(): Promise<ProgressApplicantResult> {\n // Refresh progress to move to next step\n return this.refreshProgress();\n }\n\n /**\n * Move back to previous step\n */\n async moveToPreviousStep(): Promise<ProgressApplicantResult> {\n if (!this.state.applicantId) {\n throw new Error('Workflow not initialized');\n }\n\n try {\n await this.applicantService.progressStepBack(this.state.applicantId);\n return await this.refreshProgress();\n } catch (error) {\n this.state.setError(error as Error);\n throw error;\n }\n }\n\n /**\n * Get workflow state\n */\n getState(): WorkflowState {\n return this.state;\n }\n\n /**\n * Get step router\n */\n getStepRouter(): StepRouter {\n return this.stepRouter;\n }\n}\n","/**\n * Dynamically load external scripts\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script already loaded\n if (id && document.getElementById(id)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n if (id) {\n script.id = id;\n }\n script.async = true;\n\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load script: ${src}`));\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Check if a script is already loaded\n */\nexport function isScriptLoaded(id: string): boolean {\n return !!document.getElementById(id);\n}\n\n/**\n * Remove a loaded script\n */\nexport function removeScript(id: string): void {\n const script = document.getElementById(id);\n if (script) {\n script.remove();\n }\n}\n","import { loadScript } from '../load-script';\nimport { SumsubConfig } from '../../types';\n\ndeclare global {\n interface Window {\n snsWebSdk?: any;\n }\n}\n\nconst SUMSUB_CDN = 'https://static.sumsub.com/idensic/static/sns-websdk-builder.js';\n\n/**\n * Resolve a CSS variable from the host page into a concrete color value.\n * Falls back to the provided default when the variable is not set.\n */\nfunction cssVar(name: string, fallback: string): string {\n try {\n const el = document.querySelector('.metakyc-sdk') || document.documentElement;\n const val = getComputedStyle(el).getPropertyValue(name).trim();\n return val || fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Build a CSS string with resolved (not CSS-variable) color values\n * for WebSDK 1.0 levels that still support customCssStr.\n */\nfunction buildThemeCssStr(): string {\n const primary = cssVar('--metakyc-primary', '#2563eb');\n const primaryHover = cssVar('--metakyc-primary-hover', '#1d4ed8');\n const bg = cssVar('--metakyc-background', '#ffffff');\n const surface = cssVar('--metakyc-surface', '#f9fafb');\n const textPrimary = cssVar('--metakyc-text-primary', '#111827');\n const textSecondary = cssVar('--metakyc-text-secondary', '#6b7280');\n const textMuted = cssVar('--metakyc-text-muted', '#9ca3af');\n const border = cssVar('--metakyc-border', '#e5e7eb');\n const fontFamily = cssVar('--metakyc-font-family',\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\");\n\n return `\nbody, html { font-family: ${fontFamily} !important; background-color: ${bg} !important; }\np, span, label, div { color: ${textPrimary}; }\nh1, h2, h3, h4 { color: ${textPrimary}; }\n.step-desc { color: ${textSecondary}; }\nsection.content { background-color: ${surface}; color: ${textPrimary}; padding: 32px 32px 16px; box-shadow: none; border-radius: 10px; border: 1px solid ${border}; }\ninput { color: ${textPrimary}; font-weight: 500; outline: none; background-color: ${bg}; border: 1px solid ${border}; border-radius: 6px; }\ninput:focus { border-color: ${primary}; box-shadow: 0 0 0 2px ${primary}33; }\nbutton.submit, button.back { border-radius: 8px; height: 44px; padding: 0 24px; font-size: 14px; font-weight: 600; background-image: none !important; transform: none !important; box-shadow: none !important; transition: all 0.15s ease; cursor: pointer; }\nbutton.submit { min-width: 120px; background: none; background-color: ${primary}; color: #ffffff; border: none; }\nbutton.submit:hover { background-color: ${primaryHover}; }\nbutton.back { background: none; background-color: ${bg}; border: 1px solid ${border}; color: ${textPrimary}; }\nbutton.back:hover { background-color: ${surface}; }\n.round-icon { background-color: ${primary} !important; background-image: none !important; }\n.upload-item, .document-status { border-color: ${border} !important; }\nselect { background-color: ${bg}; color: ${textPrimary}; border: 1px solid ${border}; border-radius: 6px; }\n.description { color: ${textSecondary}; }\n.subtitle { color: ${textMuted}; }\na { color: ${primary}; }\na:hover { color: ${primaryHover}; }\n`.trim();\n}\n\n/**\n * Sumsub Web SDK provider integration.\n *\n * - WebSDK 2.0 (default since Oct 2025): uses `customizationName` referencing\n * a visual customization created in the Sumsub Dashboard. Also supports\n * `theme: 'light' | 'dark'`.\n *\n * - WebSDK 1.0 (legacy): uses `uiConf.customCssStr` / `uiConf.customCss`\n * for inline CSS theming. Included as a fallback when no customizationName\n * is provided, in case the tenant's level still runs WebSDK 1.0.\n */\nexport class SumsubProvider {\n private sdk: any = null;\n private config: SumsubConfig;\n private completeCallback: ((payload: any) => void) | null = null;\n private errorCallback: ((error: any) => void) | null = null;\n\n constructor(config: SumsubConfig) {\n this.config = config;\n }\n\n async loadSDK(): Promise<void> {\n if (window.snsWebSdk) return;\n await loadScript(SUMSUB_CDN, 'sumsub-websdk');\n if (!window.snsWebSdk) {\n throw new Error('Sumsub Web SDK failed to load from CDN');\n }\n }\n\n async initialize(containerId: string): Promise<void> {\n await this.loadSDK();\n\n const conf: Record<string, any> = {\n lang: this.config.lang || 'en',\n };\n\n if (this.config.applicantEmail) conf.email = this.config.applicantEmail;\n if (this.config.applicantPhone) conf.phone = this.config.applicantPhone;\n if (this.config.theme) conf.theme = this.config.theme;\n\n // WebSDK 2.0: reference a Dashboard customization by name\n if (this.config.customizationName) {\n conf.customizationName = this.config.customizationName;\n }\n\n // WebSDK 1.0 fallback: inject CSS via uiConf when no customizationName\n // is provided. If the level is 2.0 these are silently ignored.\n if (!this.config.customizationName) {\n const uiConf: Record<string, any> = {};\n if (this.config.customCss) uiConf.customCss = this.config.customCss;\n if (this.config.customCssStr) uiConf.customCssStr = this.config.customCssStr;\n if (!uiConf.customCssStr) uiConf.customCssStr = buildThemeCssStr();\n conf.uiConf = uiConf;\n }\n\n const builder = window.snsWebSdk\n .init(\n this.config.accessToken,\n () => this.config.onTokenRefresh(),\n )\n .withConf(conf)\n .withOptions({\n addViewportTag: false,\n adaptIframeHeight: this.config.adaptIframeHeight !== false,\n })\n .on('idCheck.onStepCompleted', (payload: any) => {\n console.log('[Sumsub] Step completed:', payload);\n })\n .on('idCheck.applicantStatus', (payload: any) => {\n console.log('[Sumsub] Applicant status:', payload);\n if (\n payload?.reviewStatus === 'completed' ||\n payload?.reviewResult?.reviewAnswer === 'GREEN'\n ) {\n this.completeCallback?.(payload);\n }\n })\n .on('idCheck.onError', (error: any) => {\n console.error('[Sumsub] Error:', error);\n this.errorCallback?.(error);\n })\n .onMessage((type: string, payload: any) => {\n console.log('[Sumsub] Message:', type, payload);\n if (type === 'idCheck.onApplicantSubmitted') {\n this.completeCallback?.(payload);\n }\n });\n\n this.sdk = builder.build();\n this.sdk.launch(`#${containerId}`);\n }\n\n destroy(): void {\n if (this.sdk) {\n try { this.sdk.destroy(); } catch { /* ignore */ }\n this.sdk = null;\n }\n }\n\n onComplete(callback: (payload: any) => void): void {\n this.completeCallback = callback;\n }\n\n onError(callback: (error: any) => void): void {\n this.errorCallback = callback;\n }\n}\n","import { loadScript } from '../load-script';\nimport { OnfidoConfig } from '../../types';\n\ndeclare global {\n interface Window {\n Onfido?: any;\n }\n}\n\n/**\n * Onfido provider integration\n */\nexport class OnfidoProvider {\n private sdk: any = null;\n private config: OnfidoConfig;\n\n constructor(config: OnfidoConfig) {\n this.config = config;\n }\n\n /**\n * Load Onfido SDK\n */\n async loadSDK(): Promise<void> {\n await loadScript(\n 'https://sdk.onfido.com/v12.0.0/onfido.min.js',\n 'onfido-sdk'\n );\n }\n\n /**\n * Initialize Onfido SDK\n */\n async initialize(containerId: string): Promise<void> {\n if (!window.Onfido) {\n await this.loadSDK();\n }\n\n if (!window.Onfido) {\n throw new Error('Onfido SDK failed to load');\n }\n\n this.sdk = window.Onfido.init({\n token: this.config.token,\n containerId: containerId,\n steps: this.config.steps || [\n {\n type: 'welcome',\n options: {\n title: 'Identity Verification',\n },\n },\n {\n type: 'document',\n options: {\n documentTypes: {\n passport: true,\n driving_licence: true,\n national_identity_card: true,\n },\n },\n },\n {\n type: 'face',\n options: {\n requestedVariant: 'standard',\n },\n },\n {\n type: 'complete',\n },\n ],\n onComplete: () => {\n if (this.config.onComplete) {\n this.config.onComplete();\n }\n },\n onError: (error: any) => {\n if (this.config.onError) {\n this.config.onError(error);\n }\n },\n });\n }\n\n /**\n * Destroy Onfido SDK\n */\n destroy(): void {\n if (this.sdk) {\n this.sdk.tearDown();\n this.sdk = null;\n }\n }\n}\n","import { SardinAIConfig } from '../../types';\n\ndeclare global {\n interface Window {\n _Sardine?: {\n createContext: (config: any) => any;\n };\n }\n}\n\n/**\n * SardinAI Risk SDK provider integration\n * Implements Sardine's JavaScript SDK for device risk detection\n */\nexport class SardinAIProvider {\n private sardineContext: any = null;\n private config: SardinAIConfig;\n private sessionKey: string;\n\n constructor(config: SardinAIConfig) {\n this.config = config;\n this.sessionKey = config.sessionKey || this.generateSessionKey();\n }\n\n /**\n * Generate a UUID for session key\n */\n private generateSessionKey(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Get Sardine host based on environment and region\n */\n private getSardineHost(): string {\n const { environment, region } = this.config;\n const isSandbox = environment === 'sandbox';\n \n if (isSandbox) {\n return 'api.sandbox.sardine.ai';\n }\n \n switch (region) {\n case 'eu':\n return 'api.eu.sardine.ai';\n case 'ca':\n return 'api.ca.sardine.ai';\n case 'au':\n return 'api.au.sardine.ai';\n default:\n return 'api.sardine.ai';\n }\n }\n\n /**\n * Load SardinAI Risk SDK script\n */\n async loadSDK(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already loaded\n if (window._Sardine) {\n resolve();\n return;\n }\n\n const sardineHost = this.getSardineHost();\n const loader = document.createElement('script');\n loader.type = 'text/javascript';\n loader.async = true;\n loader.src = `https://${sardineHost}/assets/loader.min.js`;\n \n loader.onload = () => {\n console.log('[SardinAI] SDK loaded successfully');\n resolve();\n };\n \n loader.onerror = () => {\n reject(new Error('Failed to load SardinAI SDK'));\n };\n\n const firstScript = document.getElementsByTagName('script')[0];\n if (firstScript && firstScript.parentNode) {\n firstScript.parentNode.insertBefore(loader, firstScript);\n } else {\n document.head.appendChild(loader);\n }\n });\n }\n\n /**\n * Initialize SardinAI Risk SDK\n */\n async initialize(): Promise<void> {\n try {\n await this.loadSDK();\n\n if (!window._Sardine) {\n throw new Error('SardinAI SDK not available after loading');\n }\n\n const sardineHost = this.getSardineHost();\n const { clientId, environment, flow, enableBiometrics, enablePortScanning } = this.config;\n\n this.sardineContext = window._Sardine.createContext({\n clientId,\n sessionKey: this.sessionKey,\n userIdHash: undefined, // Will be set later via updateConfig\n flow: flow || window.location.pathname,\n environment: environment || 'production',\n parentElement: document.body,\n enableBiometrics: enableBiometrics !== false, // Default true\n enablePortScanning: enablePortScanning === true, // Default false\n region: this.config.region,\n \n // Callback for device response (deprecated but kept for compatibility)\n onDeviceResponse: (data: any) => {\n console.log(`[SardinAI] Device ID: ${data.deviceId}`);\n },\n \n // New callback for session updates\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Session update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Session updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No session update');\n break;\n default:\n console.warn('[SardinAI] Unknown event:', event);\n }\n }\n });\n\n // Add noscript fallback image\n this.addNoScriptFallback(sardineHost);\n\n console.log('[SardinAI] SDK initialized with sessionKey:', this.sessionKey);\n } catch (error) {\n console.error('[SardinAI] Initialization failed:', error);\n throw error;\n }\n }\n\n /**\n * Add noscript fallback for cases where JS is disabled\n */\n private addNoScriptFallback(sardineHost: string): void {\n const noscript = document.createElement('noscript');\n const img = document.createElement('img');\n const { clientId, flow } = this.config;\n \n img.src = `https://${sardineHost}/v1/a.png?clientId=${clientId}&sessionKey=${this.sessionKey}&flow=${flow || 'kyc'}&ns=1`;\n img.style.display = 'none';\n \n noscript.appendChild(img);\n document.body.appendChild(noscript);\n }\n\n /**\n * Update configuration (e.g., set userIdHash after login)\n */\n updateConfig(options: { flow?: string; userIdHash?: string | null; sessionKey?: string }): void {\n if (!this.sardineContext) {\n console.warn('[SardinAI] Cannot update config - SDK not initialized');\n return;\n }\n\n if (options.sessionKey) {\n this.sessionKey = options.sessionKey;\n }\n\n this.sardineContext.updateConfig({\n ...options,\n onConfigUpdate: (event: string, data: any, error: any) => {\n switch (event) {\n case 'SESSION_UPDATE_FAILED':\n console.error('[SardinAI] Config update failed:', error);\n break;\n case 'SESSION_UPDATED':\n console.log('[SardinAI] Config updated:', data);\n break;\n case 'SESSION_NO_UPDATE':\n console.log('[SardinAI] No config update needed');\n break;\n }\n }\n });\n }\n\n /**\n * Get current session key\n */\n getSessionKey(): string {\n return this.sessionKey;\n }\n\n /**\n * Destroy SardinAI SDK instance\n */\n destroy(): void {\n if (this.sardineContext) {\n // SardinAI SDK cleanup if needed\n this.sardineContext = null;\n }\n }\n}\n","import { IdentityVerificationProvider } from '../types';\nimport { SumsubProvider } from './providers/sumsub';\nimport { OnfidoProvider } from './providers/onfido';\nimport { SardinAIProvider } from './providers/sardin-ai';\n\n/**\n * Identity provider manager\n * Factory for creating and managing identity verification providers\n */\nexport class IdentityProviderManager {\n /**\n * Create a provider instance\n */\n static createProvider(\n provider: IdentityVerificationProvider,\n config: any\n ): SumsubProvider | OnfidoProvider | SardinAIProvider {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n return new SumsubProvider(config);\n\n case IdentityVerificationProvider.Onfido:\n return new OnfidoProvider(config);\n\n case IdentityVerificationProvider.SardinAI:\n return new SardinAIProvider(config);\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n\n /**\n * Get provider configuration from API token object\n */\n static parseProviderConfig(\n provider: IdentityVerificationProvider,\n tokenObject: Record<string, any>,\n contextConfig?: any\n ): any {\n switch (provider) {\n case IdentityVerificationProvider.Sumsub:\n const sumsubCtx = contextConfig?.identityProviders?.sumsub || {};\n return {\n accessToken: tokenObject.accessToken || tokenObject.token,\n applicantEmail: tokenObject.email,\n applicantPhone: tokenObject.phone,\n externalUserId: tokenObject.externalUserId,\n lang: sumsubCtx.lang || tokenObject.lang || 'en',\n theme: sumsubCtx.theme,\n customizationName: sumsubCtx.customizationName,\n customCss: sumsubCtx.customCss,\n adaptIframeHeight: sumsubCtx.adaptIframeHeight,\n };\n\n case IdentityVerificationProvider.Onfido:\n return {\n token: tokenObject.token || tokenObject.sdkToken,\n };\n\n case IdentityVerificationProvider.SardinAI:\n // Prioritize context config over backend response\n const sardinConfig = contextConfig?.identityProviders?.sardinai || {};\n return {\n clientId: sardinConfig.clientId || tokenObject.clientId,\n sessionKey: sardinConfig.sessionKey || tokenObject.sessionKey,\n environment: sardinConfig.environment || tokenObject.environment || 'production',\n flow: sardinConfig.flow || tokenObject.flow,\n region: sardinConfig.region,\n enableBiometrics: sardinConfig.enableBiometrics,\n enablePortScanning: sardinConfig.enablePortScanning,\n };\n\n default:\n throw new Error(`Unsupported identity provider: ${provider}`);\n }\n }\n}\n","import { ThemeConfig } from '../types/theme';\nimport { defaultTheme } from './presets';\n\n/**\n * Theme Manager\n * Handles theme application and CSS variable management.\n * All CSS variables are scoped to .metakyc-sdk via injected <style> tags\n * to prevent host-app interference.\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = defaultTheme;\n private customStyleElement: HTMLStyleElement | null = null;\n private themeStyleElement: HTMLStyleElement | null = null;\n\n constructor() {}\n\n /**\n * Apply theme configuration\n */\n applyTheme(theme: Partial<ThemeConfig>): void {\n this.currentTheme = this.mergeWithDefault(theme);\n this.injectThemeCSS();\n\n if (this.currentTheme.customCSS) {\n this.injectCustomCSS(this.currentTheme.customCSS);\n }\n\n console.log('[ThemeManager] Theme applied:', this.currentTheme.name || 'Custom');\n }\n\n /**\n * Build and inject a single <style> tag that sets all CSS variables on\n * .metakyc-sdk AND re-asserts critical input/portal rules.\n * Scoping to .metakyc-sdk means host-app variables can never interfere.\n */\n private injectThemeCSS(): void {\n if (this.themeStyleElement) {\n this.themeStyleElement.remove();\n }\n\n const colors = this.currentTheme.colors;\n const typo = this.currentTheme.typography;\n const space = this.currentTheme.spacing;\n\n const varMap: Record<string, string | undefined> = {\n 'primary': colors.primary,\n 'primary-hover': colors.primaryHover,\n 'primary-light': colors.primaryLight,\n 'primary-dark': colors.primaryDark,\n 'secondary': colors.secondary,\n 'secondary-hover': colors.secondaryHover,\n 'success': colors.success,\n 'warning': colors.warning,\n 'danger': colors.danger,\n 'info': colors.info,\n 'background': colors.background,\n 'surface': colors.surface,\n 'border': colors.border,\n 'text-primary': colors.textPrimary,\n 'text-secondary': colors.textSecondary,\n 'text-muted': colors.textMuted,\n 'input-bg': colors.inputBg || colors.background,\n 'input-text': colors.inputText || colors.textPrimary,\n 'input-border': colors.inputBorder || colors.border,\n 'input-border-focus': colors.inputBorderFocus || colors.primary,\n 'input-placeholder': colors.inputPlaceholder || colors.textMuted,\n };\n\n if (typo?.fontFamily) varMap['font-family'] = typo.fontFamily;\n if (typo?.headingFont) varMap['heading-font'] = typo.headingFont;\n if (typo?.fontSize) {\n Object.entries(typo.fontSize).forEach(([k, v]) => { varMap[`font-size-${k}`] = v; });\n }\n if (typo?.fontWeight) {\n Object.entries(typo.fontWeight).forEach(([k, v]) => { varMap[`font-weight-${k}`] = String(v); });\n }\n if (space) {\n Object.entries(space).forEach(([k, v]) => { varMap[this.kebabCase(k)] = v; });\n }\n\n const varLines = Object.entries(varMap)\n .filter(([, v]) => !!v)\n .map(([k, v]) => ` --metakyc-${k}: ${v} !important;`)\n .join('\\n');\n\n const css = `\n/* ── metakyc-theme-vars: scoped CSS variables ──────────────────────────────── */\n.metakyc-sdk,\n.metakyc-searchable-select-dropdown,\n.metakyc-multiselect-dropdown {\n${varLines}\n}\n\n/* ── metakyc-input-overrides: hardened input styling ───────────────────────── */\n.metakyc-sdk input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"color\"]):not([type=\"range\"]),\n.metakyc-sdk select,\n.metakyc-sdk textarea,\n.metakyc-sdk .metakyc-searchable-select-trigger,\n.metakyc-sdk .metakyc-multiselect-trigger {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"],\n.metakyc-sdk input[type=\"radio\"] {\n appearance: none !important;\n -webkit-appearance: none !important;\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n border: 1.5px solid var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n accent-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk input[type=\"checkbox\"]:checked,\n.metakyc-sdk input[type=\"radio\"]:checked {\n background-color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n}\n.metakyc-sdk .metakyc-help-btn {\n color: var(--metakyc-primary, #2563eb) !important;\n border-color: var(--metakyc-primary, #2563eb) !important;\n background: transparent !important;\n position: relative !important;\n z-index: 2 !important;\n}\n\n/* ── Portal dropdowns (rendered at document.body, outside .metakyc-sdk) ────── */\n.metakyc-searchable-select-dropdown,\n.metakyc-multiselect-dropdown {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n}\n.metakyc-searchable-select-dropdown input,\n.metakyc-multiselect-dropdown input {\n background-color: var(--metakyc-input-bg, var(--metakyc-background, #ffffff)) !important;\n color: var(--metakyc-input-text, var(--metakyc-text-primary, #111827)) !important;\n border-color: var(--metakyc-input-border, var(--metakyc-border, #d1d5db)) !important;\n}\n`;\n\n this.themeStyleElement = document.createElement('style');\n this.themeStyleElement.id = 'metakyc-theme-vars';\n this.themeStyleElement.textContent = css;\n\n if (this.customStyleElement?.parentNode) {\n document.head.insertBefore(this.themeStyleElement, this.customStyleElement);\n } else {\n document.head.appendChild(this.themeStyleElement);\n }\n }\n\n /**\n * Inject custom CSS into document\n */\n private injectCustomCSS(css: string): void {\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n }\n this.customStyleElement = document.createElement('style');\n this.customStyleElement.id = 'metakyc-custom-css';\n this.customStyleElement.textContent = css;\n document.head.appendChild(this.customStyleElement);\n }\n\n /**\n * Merge partial theme with default theme\n */\n private mergeWithDefault(theme: Partial<ThemeConfig>): ThemeConfig {\n return {\n name: theme.name || defaultTheme.name,\n title: theme.title || defaultTheme.title,\n logo: { ...defaultTheme.logo, ...theme.logo },\n colors: { ...defaultTheme.colors, ...theme.colors },\n typography: theme.typography ? \n { ...defaultTheme.typography, ...theme.typography } : \n defaultTheme.typography,\n spacing: theme.spacing ? \n { ...defaultTheme.spacing, ...theme.spacing } : \n defaultTheme.spacing,\n customCSS: theme.customCSS,\n darkMode: theme.darkMode ? {\n colors: { \n ...defaultTheme.darkMode?.colors, \n ...theme.darkMode.colors \n }\n } : defaultTheme.darkMode,\n applicantFormVisibleFields: theme.applicantFormVisibleFields,\n applicantFormRequiredFields: theme.applicantFormRequiredFields,\n allowedLanguages: theme.allowedLanguages,\n applicantFormPages: theme.applicantFormPages,\n reviewPageFields: theme.reviewPageFields,\n reviewPageDisabled: theme.reviewPageDisabled,\n fieldLabelMode: theme.fieldLabelMode,\n companyFormVisibleFields: theme.companyFormVisibleFields,\n companyFormRequiredFields: theme.companyFormRequiredFields,\n companyFormPages: theme.companyFormPages,\n companyReviewPageFields: theme.companyReviewPageFields,\n };\n }\n\n /**\n * Get current theme configuration\n */\n getCurrentTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * Reset to default theme\n */\n resetTheme(): void {\n this.applyTheme(defaultTheme);\n }\n\n /**\n * Remove all custom styles\n */\n cleanup(): void {\n if (this.themeStyleElement) {\n this.themeStyleElement.remove();\n this.themeStyleElement = null;\n }\n if (this.customStyleElement) {\n this.customStyleElement.remove();\n this.customStyleElement = null;\n }\n }\n\n /**\n * Convert camelCase to kebab-case\n */\n private kebabCase(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}\n","import type { TranslationDictionary } from '../types';\n\nexport const en: TranslationDictionary = {\n common: {\n next: 'Next',\n previous: 'Previous',\n back: 'Back',\n submit: 'Submit',\n cancel: 'Cancel',\n skip: 'Skip',\n skipAndSubmit: 'Skip & Submit',\n loading: 'Loading...',\n error: 'Error',\n errorPrefix: 'Error:',\n continue: 'Continue',\n close: 'Close',\n help: 'Help',\n search: 'Search...',\n select: 'Select...',\n noResults: 'No results',\n clearAll: 'Clear all',\n loadingForm: 'Loading form…',\n required: 'required',\n pageXofY: 'Page {{current}} of {{total}}',\n stepXofY: 'Step {{current}} of {{total}}',\n },\n\n fields: {\n firstName: 'First Name',\n lastName: 'Last Name',\n email: 'Email',\n phoneNumber: 'Phone Number',\n dateOfBirth: 'Date of Birth',\n salutation: 'Salutation',\n title: 'Title',\n mobileCountryCode: 'Mobile Country Code',\n street: 'Street',\n streetNumber: 'Street Number',\n zip: 'ZIP / Postal Code',\n city: 'City',\n country: 'Country',\n nationality: 'Nationality',\n otherNationalities: 'Other Nationalities',\n countryOfBirth: 'Country of Birth',\n placeOfBirth: 'Place of Birth',\n taxCountry: 'Tax Country',\n taxNumber: 'Tax Number',\n defaultLanguage: 'Default Language',\n educationLevel: 'Education Level',\n occupation: 'Occupation',\n companyName: 'Company Name',\n companyEmail: 'Email',\n companyPhone: 'Phone',\n registrationNumber: 'Registration Number',\n countryOfResidence: 'Country of Residence',\n legalAddress: 'Legal Address',\n incorporationDate: 'Incorporation Date',\n controlScheme: 'Control Scheme',\n taxId: 'Tax ID',\n registrationLocation: 'Registration Location',\n website: 'Website',\n postalAddress: 'Postal Address',\n state: 'State / Province',\n postalCode: 'Postal Code',\n addressCountry: 'Country',\n lei: 'LEI',\n name: 'Name',\n notProvided: 'Not provided',\n addressInformation: 'Address Information',\n },\n\n gender: {\n male: 'Male',\n female: 'Female',\n other: 'Other',\n },\n\n placeholders: {\n selectSalutation: 'Select salutation...',\n selectLanguage: 'Select language...',\n selectOtherNationalities: 'Select other nationalities...',\n selectCountry: 'Select country…',\n selectNationality: 'Select nationality…',\n selectCountryCode: 'Select country code…',\n selectOption: 'Select an option…',\n enterAnswer: 'Enter your answer…',\n phonePlaceholder: '+1',\n },\n\n createApplicant: {\n title: 'Create Applicant',\n createApplicant: 'Create Applicant',\n externalRefIdRequired: 'External Reference ID is required. Please pass it via config.applicantForm.externalRefId.',\n failedToCreate: 'Failed to create applicant',\n },\n\n createCompany: {\n title: 'Company Registration',\n registerCompany: 'Register Company',\n failedToCreate: 'Failed to create company applicant',\n },\n\n workflow: {\n loadingWorkflow: 'Loading workflow...',\n errorOccurred: 'An error occurred',\n workflowTransition: 'Workflow Transition',\n workflowUpdatedMessage: 'Your application workflow has been updated based on your progress.',\n previousWorkflow: 'Previous Workflow',\n newWorkflow: 'New Workflow',\n continueNewWorkflow: 'Continue with New Workflow',\n loadingIdentityVerification: 'Loading identity verification...',\n loadingCurrentStep: 'Loading current step...',\n processingStep: 'Processing step:',\n actionType: 'Action type:',\n },\n\n stepNames: {\n overview: 'Overview',\n questionnaire: 'Questionnaire',\n documents: 'Documents',\n identity: 'Identity',\n riskAssessment: 'Risk Assessment',\n investorCategorization: 'Investor Categorization',\n appropriatenessTest: 'Appropriateness Test',\n additionalData: 'Additional Data',\n review: 'Review',\n },\n\n validation: {\n required: '{{field}} is required',\n fieldRequired: '{{field}} is required.',\n invalidFormat: 'Invalid format',\n minValue: 'Minimum value is {{min}}',\n maxValue: 'Maximum value is {{max}}',\n minLength: 'Minimum length is {{min}} characters',\n maxLength: 'Maximum length is {{max}} characters',\n fileTooLarge: 'File exceeds the maximum size of {{size}}',\n invalidFileType: 'Invalid file type',\n },\n\n questionnaire: {\n errorLoading: 'Error loading questionnaire:',\n },\n\n riskScoring: {\n title: 'Risk Assessment',\n subtitle: 'Please answer the following questions for risk evaluation',\n loadingCriteria: 'Loading risk scoring criteria…',\n noCriteria: 'No criteria required. Moving to next step…',\n errorLoading: 'Error loading criteria:',\n range: 'Range: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maximum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Upload Documents',\n loading: 'Loading document requirements...',\n errorLoading: 'Error loading document requirements',\n failedToSubmit: 'Failed to submit documents. Please try again.',\n uploading: 'Uploading...',\n clickToUpload: 'Click to upload',\n orDragDrop: 'or drag and drop',\n maxSize: 'Max {{size}}',\n },\n\n overview: {\n title: 'Overview',\n loadingOverview: 'Loading overview data...',\n errorLoading: 'Error loading overview:',\n },\n\n investorCategorization: {\n whichStatement: 'Which statement best describes you?',\n retailInvestorInfo: 'All Tokenise clients are treated as Retail Investors unless they meet specific criteria to be classified as Professional or Elective Professional Investors. In order to provide you with the appropriate level of service, please indicate which of the following descriptions applies to you.',\n chooseOne: 'Choose one',\n individualInvestor: 'Individual investor',\n individualInvestorDesc: '(Recommended) Most of our clients choose this option. You will benefit from the highest level of regulatory protection.',\n sophisticatedInvestor: 'Sophisticated investor',\n sophisticatedInvestorDesc: 'In the last 2 years, I have done one or more of the following: made significant investments in unlisted companies, been a director of a company with a turnover of at least $1 million, or worked in private equity or corporate finance.',\n highNetworthInvestor: 'High networth investor',\n highNetworthInvestorDesc: 'I earn more than (USD/EUR) $150,000 per year, or I have net assets of more than $250,000 (excluding primary residence).',\n pleaseSelect: 'Please select an investor type',\n failedToSubmit: 'Failed to submit investor categorization',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Failed to load appropriateness test',\n failedToSubmit: 'Failed to submit test. Please try again.',\n answerAllQuestions: 'Please answer all questions. {{remaining}} remaining.',\n testPassed: 'Test Passed',\n testFailed: 'Test Failed',\n passedMessage: 'Congratulations! You have passed the test.',\n failedMessage: 'You did not pass the test.',\n loadingTest: 'Loading test...',\n noTestData: 'No test data available',\n waitBeforeRetrying: 'Please wait before retrying',\n waitTimerMessage: 'You can attempt the test again once the timer expires',\n attemptsRemaining: 'You have {{count}} attempt(s) remaining',\n noAttemptsRemaining: 'No attempts remaining. Please contact support for assistance.',\n retakeTest: 'Retake Test',\n ok: 'OK',\n startTest: 'Start Test',\n questionXofY: 'Question {{current}} of {{total}}',\n answered: 'answered',\n attemptsLeft: 'attempt(s) left',\n timesUp: \"Time's up! Your answers are being submitted.\",\n submitting: 'Submitting...',\n submitTest: 'Submit Test',\n questions: 'Questions',\n timeLimit: 'Time Limit',\n passRequirement: 'Pass Requirement',\n attemptsLeftLabel: 'Attempts Left',\n correct: '{{count}} correct',\n previousAttempt: 'Previous attempt:',\n allAttemptsUsed: 'You have used all your attempts. Please contact support for assistance.',\n },\n\n identity: {\n title: 'Identity Verification',\n subtitle: 'Please complete the identity verification process',\n reviewYourInformation: 'Review Your Information',\n reviewSubtitle: 'Please review and confirm your information before starting identity verification',\n confirmAndStart: 'Confirm and Start Verification',\n invalidUrl: 'Invalid verification URL. Please restart.',\n sessionExpired: 'Your verification session has expired. Please restart.',\n linkExpired: 'Your verification link has expired. Please restart.',\n sessionExpiredRestart: 'Session expired. Please restart.',\n sessionExpiredOrInvalid: 'Session expired or invalid. Please restart verification.',\n sessionIssueTitle: 'Verification Session Issue',\n sessionExpiredTitle: 'Session Expired',\n verificationError: 'Verification Error',\n sessionExpiredMessage: 'Your verification session has expired and needs to be restarted.',\n whatToDoNext: 'What to do next:',\n clickRestart: 'Click \"Restart Verification\" below to generate a new session',\n completeWithoutDelays: 'Complete the verification process without delays',\n ifIssuesPersist: 'If issues persist, contact support',\n restartVerification: 'Restart Verification',\n restarting: 'Restarting…',\n restart: 'Restart',\n failedToRestart: 'Failed to restart verification',\n failedToInitialize: 'Failed to initialize: {{message}}',\n configurationError: 'Configuration error: {{message}}',\n setupError: 'Setup error: {{message}}',\n importantExpiredMessage: 'Important: If you see an \"expired\" or \"invalid link\" message, please click \"Restart\" to generate a new verification session.',\n deviceRiskAssessment: 'Device Risk Assessment',\n analyzingDevice: 'Analyzing device security and behavioral patterns...',\n pleaseWaitDevice: 'Please wait while we verify your device security',\n automaticProcess: 'This process is automatic and will complete in a few seconds',\n loadingIdentity: 'Loading identity verification...',\n },\n\n status: {\n verificationApproved: 'Verification Approved',\n verificationApprovedMsg: 'Your identity verification has been successfully approved.',\n verificationRejected: 'Verification Rejected',\n verificationRejectedMsg: 'Unfortunately, your identity verification was not approved.',\n verificationPending: 'Verification Pending',\n verificationPendingMsg: 'Your identity verification is currently being processed.',\n applicationApproved: 'Application Approved',\n applicationApprovedMsg: 'Your application has been approved.',\n applicationRejected: 'Application Rejected',\n applicationRejectedMsg: 'Your application has been rejected.',\n underReview: 'Under Review',\n underReviewMsg: 'Your application is currently under manual review.',\n processComplete: 'Process Complete',\n processCompleteMsg: 'Your verification process has been completed successfully.',\n processFailed: 'Process Failed',\n processFailedMsg: 'The verification process could not be completed.',\n adminReviewRequired: 'Admin Review Required',\n adminReviewRequiredMsg: 'Your application requires administrator review.',\n processing: 'Processing',\n processingMsg: 'Your application is being reviewed.',\n whatsNext: \"What's Next?\",\n identityVerified: 'Your identity has been verified',\n canProceed: 'You can now proceed with your application',\n allFeaturesAccessible: 'All features are now accessible',\n whatCanYouDo: 'What Can You Do?',\n contactSupportTeam: 'Contact our support team for assistance',\n reviewSubmittedInfo: 'Review the information you submitted',\n resubmitIfNeeded: 'Resubmit your application if needed',\n whatHappensNext: 'What Happens Next?',\n teamReviewing: 'Our team is reviewing your application',\n notifiedByEmail: \"You'll be notified by email when the review is complete\",\n noActionRequired: 'No action is required from you at this time',\n kycStatus: 'KYC Status:',\n reviewStatus: 'Review Status:',\n notAvailable: 'Not Available',\n contactSupport: 'Contact Support',\n tryAgain: 'Try Again',\n checkBackLater: 'Please check back later or wait for our email notification',\n },\n\n logo: {\n companyLogo: 'Company Logo',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const de: TranslationDictionary = {\n common: {\n next: 'Weiter',\n previous: 'Zurück',\n back: 'Zurück',\n submit: 'Absenden',\n cancel: 'Abbrechen',\n skip: 'Überspringen',\n skipAndSubmit: 'Überspringen & Absenden',\n loading: 'Wird geladen...',\n error: 'Fehler',\n errorPrefix: 'Fehler:',\n continue: 'Fortfahren',\n close: 'Schließen',\n help: 'Hilfe',\n search: 'Suchen...',\n select: 'Auswählen...',\n noResults: 'Keine Ergebnisse',\n clearAll: 'Alle löschen',\n loadingForm: 'Formular wird geladen…',\n required: 'erforderlich',\n pageXofY: 'Seite {{current}} von {{total}}',\n stepXofY: 'Schritt {{current}} von {{total}}',\n },\n\n fields: {\n firstName: 'Vorname',\n lastName: 'Nachname',\n email: 'E-Mail',\n phoneNumber: 'Telefonnummer',\n dateOfBirth: 'Geburtsdatum',\n salutation: 'Anrede',\n title: 'Titel',\n mobileCountryCode: 'Landesvorwahl',\n street: 'Straße',\n streetNumber: 'Hausnummer',\n zip: 'PLZ',\n city: 'Stadt',\n country: 'Land',\n nationality: 'Staatsangehörigkeit',\n otherNationalities: 'Weitere Staatsangehörigkeiten',\n countryOfBirth: 'Geburtsland',\n placeOfBirth: 'Geburtsort',\n taxCountry: 'Steuerland',\n taxNumber: 'Steuernummer',\n defaultLanguage: 'Standardsprache',\n educationLevel: 'Bildungsgrad',\n occupation: 'Beruf',\n companyName: 'Firmenname',\n companyEmail: 'E-Mail',\n companyPhone: 'Telefon',\n registrationNumber: 'Registrierungsnummer',\n countryOfResidence: 'Wohnsitzland',\n legalAddress: 'Rechtliche Adresse',\n incorporationDate: 'Gründungsdatum',\n controlScheme: 'Kontrollstruktur',\n taxId: 'Steuer-ID',\n registrationLocation: 'Registrierungsort',\n website: 'Webseite',\n postalAddress: 'Postanschrift',\n state: 'Bundesland / Provinz',\n postalCode: 'Postleitzahl',\n addressCountry: 'Land',\n lei: 'LEI',\n name: 'Name',\n notProvided: 'Nicht angegeben',\n addressInformation: 'Adressinformationen',\n },\n\n gender: {\n male: 'Männlich',\n female: 'Weiblich',\n other: 'Divers',\n },\n\n placeholders: {\n selectSalutation: 'Anrede auswählen...',\n selectLanguage: 'Sprache auswählen...',\n selectOtherNationalities: 'Weitere Staatsangehörigkeiten auswählen...',\n selectCountry: 'Land auswählen…',\n selectNationality: 'Staatsangehörigkeit auswählen…',\n selectCountryCode: 'Landesvorwahl auswählen…',\n selectOption: 'Option auswählen…',\n enterAnswer: 'Antwort eingeben…',\n phonePlaceholder: '+49',\n },\n\n createApplicant: {\n title: 'Antragsteller erstellen',\n createApplicant: 'Antragsteller erstellen',\n externalRefIdRequired: 'Externe Referenz-ID ist erforderlich. Bitte über config.applicantForm.externalRefId übergeben.',\n failedToCreate: 'Antragsteller konnte nicht erstellt werden',\n },\n\n createCompany: {\n title: 'Unternehmensregistrierung',\n registerCompany: 'Unternehmen registrieren',\n failedToCreate: 'Unternehmensantragsteller konnte nicht erstellt werden',\n },\n\n workflow: {\n loadingWorkflow: 'Workflow wird geladen...',\n errorOccurred: 'Ein Fehler ist aufgetreten',\n workflowTransition: 'Workflow-Übergang',\n workflowUpdatedMessage: 'Ihr Antragsworkflow wurde basierend auf Ihrem Fortschritt aktualisiert.',\n previousWorkflow: 'Vorheriger Workflow',\n newWorkflow: 'Neuer Workflow',\n continueNewWorkflow: 'Mit neuem Workflow fortfahren',\n loadingIdentityVerification: 'Identitätsprüfung wird geladen...',\n loadingCurrentStep: 'Aktueller Schritt wird geladen...',\n processingStep: 'Schritt wird verarbeitet:',\n actionType: 'Aktionstyp:',\n },\n\n stepNames: {\n overview: 'Übersicht',\n questionnaire: 'Fragebogen',\n documents: 'Dokumente',\n identity: 'Identität',\n riskAssessment: 'Risikobewertung',\n investorCategorization: 'Anlegerkategorisierung',\n appropriatenessTest: 'Angemessenheitstest',\n additionalData: 'Zusätzliche Daten',\n review: 'Überprüfung',\n },\n\n validation: {\n required: '{{field}} ist erforderlich',\n fieldRequired: '{{field}} ist erforderlich.',\n invalidFormat: 'Ungültiges Format',\n minValue: 'Mindestwert ist {{min}}',\n maxValue: 'Höchstwert ist {{max}}',\n minLength: 'Mindestlänge ist {{min}} Zeichen',\n maxLength: 'Höchstlänge ist {{max}} Zeichen',\n fileTooLarge: 'Datei überschreitet die maximale Größe von {{size}}',\n invalidFileType: 'Ungültiger Dateityp',\n },\n\n questionnaire: {\n errorLoading: 'Fehler beim Laden des Fragebogens:',\n },\n\n riskScoring: {\n title: 'Risikobewertung',\n subtitle: 'Bitte beantworten Sie die folgenden Fragen zur Risikobewertung',\n loadingCriteria: 'Risikobewertungskriterien werden geladen…',\n noCriteria: 'Keine Kriterien erforderlich. Weiter zum nächsten Schritt…',\n errorLoading: 'Fehler beim Laden der Kriterien:',\n range: 'Bereich: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maximum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Dokumente hochladen',\n loading: 'Dokumentenanforderungen werden geladen...',\n errorLoading: 'Fehler beim Laden der Dokumentenanforderungen',\n failedToSubmit: 'Dokumente konnten nicht eingereicht werden. Bitte versuchen Sie es erneut.',\n uploading: 'Wird hochgeladen...',\n clickToUpload: 'Zum Hochladen klicken',\n orDragDrop: 'oder per Drag & Drop',\n maxSize: 'Max. {{size}}',\n },\n\n overview: {\n title: 'Übersicht',\n loadingOverview: 'Übersichtsdaten werden geladen...',\n errorLoading: 'Fehler beim Laden der Übersicht:',\n },\n\n investorCategorization: {\n whichStatement: 'Welche Aussage beschreibt Sie am besten?',\n retailInvestorInfo: 'Alle Tokenise-Kunden werden als Privatanleger behandelt, es sei denn, sie erfüllen bestimmte Kriterien für die Einstufung als professionelle oder wahlprofessionelle Anleger. Um Ihnen den passenden Servicelevel zu bieten, geben Sie bitte an, welche der folgenden Beschreibungen auf Sie zutrifft.',\n chooseOne: 'Wählen Sie eine Option',\n individualInvestor: 'Privatanleger',\n individualInvestorDesc: '(Empfohlen) Die meisten unserer Kunden wählen diese Option. Sie profitieren vom höchsten Maß an regulatorischem Schutz.',\n sophisticatedInvestor: 'Erfahrener Anleger',\n sophisticatedInvestorDesc: 'In den letzten 2 Jahren habe ich eine oder mehrere der folgenden Aktivitäten durchgeführt: bedeutende Investitionen in nicht börsennotierte Unternehmen getätigt, als Geschäftsführer eines Unternehmens mit einem Umsatz von mindestens 1 Million US-Dollar gearbeitet, oder im Bereich Private Equity oder Corporate Finance tätig gewesen.',\n highNetworthInvestor: 'Vermögender Anleger',\n highNetworthInvestorDesc: 'Ich verdiene mehr als (USD/EUR) 150.000 $ pro Jahr, oder ich verfüge über ein Nettovermögen von mehr als 250.000 $ (ohne Hauptwohnsitz).',\n pleaseSelect: 'Bitte wählen Sie einen Anlegertyp',\n failedToSubmit: 'Anlegerkategorisierung konnte nicht eingereicht werden',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Angemessenheitstest konnte nicht geladen werden',\n failedToSubmit: 'Test konnte nicht eingereicht werden. Bitte versuchen Sie es erneut.',\n answerAllQuestions: 'Bitte beantworten Sie alle Fragen. {{remaining}} verbleibend.',\n testPassed: 'Test bestanden',\n testFailed: 'Test nicht bestanden',\n passedMessage: 'Herzlichen Glückwunsch! Sie haben den Test bestanden.',\n failedMessage: 'Sie haben den Test nicht bestanden.',\n loadingTest: 'Test wird geladen...',\n noTestData: 'Keine Testdaten verfügbar',\n waitBeforeRetrying: 'Bitte warten Sie, bevor Sie es erneut versuchen',\n waitTimerMessage: 'Sie können den Test erneut versuchen, sobald der Timer abgelaufen ist',\n attemptsRemaining: 'Sie haben noch {{count}} Versuch(e)',\n noAttemptsRemaining: 'Keine Versuche mehr übrig. Bitte kontaktieren Sie den Support.',\n retakeTest: 'Test wiederholen',\n ok: 'OK',\n startTest: 'Test starten',\n questionXofY: 'Frage {{current}} von {{total}}',\n answered: 'beantwortet',\n attemptsLeft: 'Versuch(e) übrig',\n timesUp: 'Die Zeit ist abgelaufen! Ihre Antworten werden eingereicht.',\n submitting: 'Wird eingereicht...',\n submitTest: 'Test einreichen',\n questions: 'Fragen',\n timeLimit: 'Zeitlimit',\n passRequirement: 'Bestehensanforderung',\n attemptsLeftLabel: 'Verbleibende Versuche',\n correct: '{{count}} richtig',\n previousAttempt: 'Vorheriger Versuch:',\n allAttemptsUsed: 'Sie haben alle Versuche aufgebraucht. Bitte kontaktieren Sie den Support.',\n },\n\n identity: {\n title: 'Identitätsprüfung',\n subtitle: 'Bitte führen Sie den Identitätsprüfungsprozess durch',\n reviewYourInformation: 'Ihre Informationen überprüfen',\n reviewSubtitle: 'Bitte überprüfen und bestätigen Sie Ihre Informationen, bevor Sie die Identitätsprüfung starten',\n confirmAndStart: 'Bestätigen und Prüfung starten',\n invalidUrl: 'Ungültige Verifizierungs-URL. Bitte starten Sie neu.',\n sessionExpired: 'Ihre Verifizierungssitzung ist abgelaufen. Bitte starten Sie neu.',\n linkExpired: 'Ihr Verifizierungslink ist abgelaufen. Bitte starten Sie neu.',\n sessionExpiredRestart: 'Sitzung abgelaufen. Bitte starten Sie neu.',\n sessionExpiredOrInvalid: 'Sitzung abgelaufen oder ungültig. Bitte starten Sie die Verifizierung neu.',\n sessionIssueTitle: 'Problem mit der Verifizierungssitzung',\n sessionExpiredTitle: 'Sitzung abgelaufen',\n verificationError: 'Verifizierungsfehler',\n sessionExpiredMessage: 'Ihre Verifizierungssitzung ist abgelaufen und muss neu gestartet werden.',\n whatToDoNext: 'Nächste Schritte:',\n clickRestart: 'Klicken Sie unten auf „Verifizierung neu starten\", um eine neue Sitzung zu erzeugen',\n completeWithoutDelays: 'Schließen Sie den Verifizierungsprozess ohne Verzögerungen ab',\n ifIssuesPersist: 'Bei anhaltenden Problemen kontaktieren Sie den Support',\n restartVerification: 'Verifizierung neu starten',\n restarting: 'Wird neu gestartet…',\n restart: 'Neu starten',\n failedToRestart: 'Verifizierung konnte nicht neu gestartet werden',\n failedToInitialize: 'Initialisierung fehlgeschlagen: {{message}}',\n configurationError: 'Konfigurationsfehler: {{message}}',\n setupError: 'Einrichtungsfehler: {{message}}',\n importantExpiredMessage: 'Wichtig: Wenn Sie eine Meldung „abgelaufen\" oder „ungültiger Link\" sehen, klicken Sie bitte auf „Neu starten\", um eine neue Verifizierungssitzung zu erzeugen.',\n deviceRiskAssessment: 'Geräte-Risikobewertung',\n analyzingDevice: 'Gerätesicherheit und Verhaltensmuster werden analysiert...',\n pleaseWaitDevice: 'Bitte warten Sie, während wir Ihre Gerätesicherheit überprüfen',\n automaticProcess: 'Dieser Vorgang erfolgt automatisch und wird in wenigen Sekunden abgeschlossen',\n loadingIdentity: 'Identitätsprüfung wird geladen...',\n },\n\n status: {\n verificationApproved: 'Verifizierung genehmigt',\n verificationApprovedMsg: 'Ihre Identitätsprüfung wurde erfolgreich genehmigt.',\n verificationRejected: 'Verifizierung abgelehnt',\n verificationRejectedMsg: 'Leider wurde Ihre Identitätsprüfung nicht genehmigt.',\n verificationPending: 'Verifizierung ausstehend',\n verificationPendingMsg: 'Ihre Identitätsprüfung wird derzeit bearbeitet.',\n applicationApproved: 'Antrag genehmigt',\n applicationApprovedMsg: 'Ihr Antrag wurde genehmigt.',\n applicationRejected: 'Antrag abgelehnt',\n applicationRejectedMsg: 'Ihr Antrag wurde abgelehnt.',\n underReview: 'In Prüfung',\n underReviewMsg: 'Ihr Antrag wird derzeit manuell geprüft.',\n processComplete: 'Vorgang abgeschlossen',\n processCompleteMsg: 'Ihr Verifizierungsprozess wurde erfolgreich abgeschlossen.',\n processFailed: 'Vorgang fehlgeschlagen',\n processFailedMsg: 'Der Verifizierungsprozess konnte nicht abgeschlossen werden.',\n adminReviewRequired: 'Administratorprüfung erforderlich',\n adminReviewRequiredMsg: 'Ihr Antrag erfordert eine Überprüfung durch einen Administrator.',\n processing: 'Wird verarbeitet',\n processingMsg: 'Ihr Antrag wird geprüft.',\n whatsNext: 'Wie geht es weiter?',\n identityVerified: 'Ihre Identität wurde verifiziert',\n canProceed: 'Sie können jetzt mit Ihrem Antrag fortfahren',\n allFeaturesAccessible: 'Alle Funktionen sind jetzt verfügbar',\n whatCanYouDo: 'Was können Sie tun?',\n contactSupportTeam: 'Kontaktieren Sie unser Support-Team für Unterstützung',\n reviewSubmittedInfo: 'Überprüfen Sie die von Ihnen eingereichten Informationen',\n resubmitIfNeeded: 'Reichen Sie Ihren Antrag bei Bedarf erneut ein',\n whatHappensNext: 'Was passiert als Nächstes?',\n teamReviewing: 'Unser Team prüft Ihren Antrag',\n notifiedByEmail: 'Sie werden per E-Mail benachrichtigt, wenn die Prüfung abgeschlossen ist',\n noActionRequired: 'Von Ihrer Seite ist derzeit keine Aktion erforderlich',\n kycStatus: 'KYC-Status:',\n reviewStatus: 'Prüfungsstatus:',\n notAvailable: 'Nicht verfügbar',\n contactSupport: 'Support kontaktieren',\n tryAgain: 'Erneut versuchen',\n checkBackLater: 'Bitte schauen Sie später nochmal vorbei oder warten Sie auf unsere E-Mail-Benachrichtigung',\n },\n\n logo: {\n companyLogo: 'Firmenlogo',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const fr: TranslationDictionary = {\n common: {\n next: 'Suivant',\n previous: 'Précédent',\n back: 'Retour',\n submit: 'Soumettre',\n cancel: 'Annuler',\n skip: 'Passer',\n skipAndSubmit: 'Passer & Soumettre',\n loading: 'Chargement...',\n error: 'Erreur',\n errorPrefix: 'Erreur :',\n continue: 'Continuer',\n close: 'Fermer',\n help: 'Aide',\n search: 'Rechercher...',\n select: 'Sélectionner...',\n noResults: 'Aucun résultat',\n clearAll: 'Tout effacer',\n loadingForm: 'Chargement du formulaire…',\n required: 'obligatoire',\n pageXofY: 'Page {{current}} sur {{total}}',\n stepXofY: 'Étape {{current}} sur {{total}}',\n },\n\n fields: {\n firstName: 'Prénom',\n lastName: 'Nom',\n email: 'E-mail',\n phoneNumber: 'Numéro de téléphone',\n dateOfBirth: 'Date de naissance',\n salutation: 'Civilité',\n title: 'Titre',\n mobileCountryCode: 'Indicatif pays',\n street: 'Rue',\n streetNumber: 'Numéro de rue',\n zip: 'Code postal',\n city: 'Ville',\n country: 'Pays',\n nationality: 'Nationalité',\n otherNationalities: 'Autres nationalités',\n countryOfBirth: 'Pays de naissance',\n placeOfBirth: 'Lieu de naissance',\n taxCountry: 'Pays d\\'imposition',\n taxNumber: 'Numéro fiscal',\n defaultLanguage: 'Langue par défaut',\n educationLevel: 'Niveau d\\'éducation',\n occupation: 'Profession',\n companyName: 'Nom de l\\'entreprise',\n companyEmail: 'E-mail',\n companyPhone: 'Téléphone',\n registrationNumber: 'Numéro d\\'immatriculation',\n countryOfResidence: 'Pays de résidence',\n legalAddress: 'Adresse légale',\n incorporationDate: 'Date de constitution',\n controlScheme: 'Schéma de contrôle',\n taxId: 'Identifiant fiscal',\n registrationLocation: 'Lieu d\\'immatriculation',\n website: 'Site web',\n postalAddress: 'Adresse postale',\n state: 'État / Province',\n postalCode: 'Code postal',\n addressCountry: 'Pays',\n lei: 'LEI',\n name: 'Nom',\n notProvided: 'Non fourni',\n addressInformation: 'Informations d\\'adresse',\n },\n\n gender: {\n male: 'Homme',\n female: 'Femme',\n other: 'Autre',\n },\n\n placeholders: {\n selectSalutation: 'Sélectionner la civilité...',\n selectLanguage: 'Sélectionner la langue...',\n selectOtherNationalities: 'Sélectionner les autres nationalités...',\n selectCountry: 'Sélectionner le pays…',\n selectNationality: 'Sélectionner la nationalité…',\n selectCountryCode: 'Sélectionner l\\'indicatif pays…',\n selectOption: 'Sélectionner une option…',\n enterAnswer: 'Entrez votre réponse…',\n phonePlaceholder: '+33',\n },\n\n createApplicant: {\n title: 'Créer un demandeur',\n createApplicant: 'Créer un demandeur',\n externalRefIdRequired: 'L\\'identifiant de référence externe est requis. Veuillez le transmettre via config.applicantForm.externalRefId.',\n failedToCreate: 'Échec de la création du demandeur',\n },\n\n createCompany: {\n title: 'Enregistrement de l\\'entreprise',\n registerCompany: 'Enregistrer l\\'entreprise',\n failedToCreate: 'Échec de la création du demandeur entreprise',\n },\n\n workflow: {\n loadingWorkflow: 'Chargement du workflow...',\n errorOccurred: 'Une erreur est survenue',\n workflowTransition: 'Transition de workflow',\n workflowUpdatedMessage: 'Le workflow de votre demande a été mis à jour en fonction de votre progression.',\n previousWorkflow: 'Workflow précédent',\n newWorkflow: 'Nouveau workflow',\n continueNewWorkflow: 'Continuer avec le nouveau workflow',\n loadingIdentityVerification: 'Chargement de la vérification d\\'identité...',\n loadingCurrentStep: 'Chargement de l\\'étape en cours...',\n processingStep: 'Traitement de l\\'étape :',\n actionType: 'Type d\\'action :',\n },\n\n stepNames: {\n overview: 'Aperçu',\n questionnaire: 'Questionnaire',\n documents: 'Documents',\n identity: 'Identité',\n riskAssessment: 'Évaluation des risques',\n investorCategorization: 'Catégorisation de l\\'investisseur',\n appropriatenessTest: 'Test d\\'adéquation',\n additionalData: 'Données supplémentaires',\n review: 'Vérification',\n },\n\n validation: {\n required: '{{field}} est obligatoire',\n fieldRequired: '{{field}} est obligatoire.',\n invalidFormat: 'Format invalide',\n minValue: 'La valeur minimale est {{min}}',\n maxValue: 'La valeur maximale est {{max}}',\n minLength: 'La longueur minimale est de {{min}} caractères',\n maxLength: 'La longueur maximale est de {{max}} caractères',\n fileTooLarge: 'Le fichier dépasse la taille maximale de {{size}}',\n invalidFileType: 'Type de fichier invalide',\n },\n\n questionnaire: {\n errorLoading: 'Erreur lors du chargement du questionnaire :',\n },\n\n riskScoring: {\n title: 'Évaluation des risques',\n subtitle: 'Veuillez répondre aux questions suivantes pour l\\'évaluation des risques',\n loadingCriteria: 'Chargement des critères de notation des risques…',\n noCriteria: 'Aucun critère requis. Passage à l\\'étape suivante…',\n errorLoading: 'Erreur lors du chargement des critères :',\n range: 'Plage : {{min}} – {{max}}',\n minimum: 'Minimum : {{min}}',\n maximum: 'Maximum : {{max}}',\n },\n\n uploadDocument: {\n title: 'Télécharger les documents',\n loading: 'Chargement des exigences documentaires...',\n errorLoading: 'Erreur lors du chargement des exigences documentaires',\n failedToSubmit: 'Échec de la soumission des documents. Veuillez réessayer.',\n uploading: 'Téléchargement en cours...',\n clickToUpload: 'Cliquer pour télécharger',\n orDragDrop: 'ou glisser-déposer',\n maxSize: 'Max {{size}}',\n },\n\n overview: {\n title: 'Aperçu',\n loadingOverview: 'Chargement des données d\\'aperçu...',\n errorLoading: 'Erreur lors du chargement de l\\'aperçu :',\n },\n\n investorCategorization: {\n whichStatement: 'Quelle déclaration vous décrit le mieux ?',\n retailInvestorInfo: 'Tous les clients de Tokenise sont traités comme des investisseurs particuliers, sauf s\\'ils remplissent des critères spécifiques pour être classés comme investisseurs professionnels ou professionnels électifs. Afin de vous fournir le niveau de service approprié, veuillez indiquer laquelle des descriptions suivantes s\\'applique à vous.',\n chooseOne: 'Choisissez une option',\n individualInvestor: 'Investisseur particulier',\n individualInvestorDesc: '(Recommandé) La plupart de nos clients choisissent cette option. Vous bénéficierez du plus haut niveau de protection réglementaire.',\n sophisticatedInvestor: 'Investisseur averti',\n sophisticatedInvestorDesc: 'Au cours des 2 dernières années, j\\'ai effectué une ou plusieurs des actions suivantes : réalisé des investissements significatifs dans des sociétés non cotées, été directeur d\\'une entreprise avec un chiffre d\\'affaires d\\'au moins 1 million de dollars, ou travaillé dans le capital-investissement ou la finance d\\'entreprise.',\n highNetworthInvestor: 'Investisseur à haute valeur nette',\n highNetworthInvestorDesc: 'Je gagne plus de (USD/EUR) 150 000 $ par an, ou j\\'ai un patrimoine net supérieur à 250 000 $ (hors résidence principale).',\n pleaseSelect: 'Veuillez sélectionner un type d\\'investisseur',\n failedToSubmit: 'Échec de la soumission de la catégorisation de l\\'investisseur',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Échec du chargement du test d\\'adéquation',\n failedToSubmit: 'Échec de la soumission du test. Veuillez réessayer.',\n answerAllQuestions: 'Veuillez répondre à toutes les questions. {{remaining}} restante(s).',\n testPassed: 'Test réussi',\n testFailed: 'Test échoué',\n passedMessage: 'Félicitations ! Vous avez réussi le test.',\n failedMessage: 'Vous n\\'avez pas réussi le test.',\n loadingTest: 'Chargement du test...',\n noTestData: 'Aucune donnée de test disponible',\n waitBeforeRetrying: 'Veuillez patienter avant de réessayer',\n waitTimerMessage: 'Vous pourrez retenter le test une fois le minuteur expiré',\n attemptsRemaining: 'Il vous reste {{count}} tentative(s)',\n noAttemptsRemaining: 'Plus de tentatives disponibles. Veuillez contacter le support.',\n retakeTest: 'Repasser le test',\n ok: 'OK',\n startTest: 'Commencer le test',\n questionXofY: 'Question {{current}} sur {{total}}',\n answered: 'répondu',\n attemptsLeft: 'tentative(s) restante(s)',\n timesUp: 'Le temps est écoulé ! Vos réponses sont en cours de soumission.',\n submitting: 'Soumission en cours...',\n submitTest: 'Soumettre le test',\n questions: 'Questions',\n timeLimit: 'Limite de temps',\n passRequirement: 'Condition de réussite',\n attemptsLeftLabel: 'Tentatives restantes',\n correct: '{{count}} correcte(s)',\n previousAttempt: 'Tentative précédente :',\n allAttemptsUsed: 'Vous avez utilisé toutes vos tentatives. Veuillez contacter le support.',\n },\n\n identity: {\n title: 'Vérification d\\'identité',\n subtitle: 'Veuillez compléter le processus de vérification d\\'identité',\n reviewYourInformation: 'Vérifiez vos informations',\n reviewSubtitle: 'Veuillez vérifier et confirmer vos informations avant de commencer la vérification d\\'identité',\n confirmAndStart: 'Confirmer et commencer la vérification',\n invalidUrl: 'URL de vérification invalide. Veuillez redémarrer.',\n sessionExpired: 'Votre session de vérification a expiré. Veuillez redémarrer.',\n linkExpired: 'Votre lien de vérification a expiré. Veuillez redémarrer.',\n sessionExpiredRestart: 'Session expirée. Veuillez redémarrer.',\n sessionExpiredOrInvalid: 'Session expirée ou invalide. Veuillez redémarrer la vérification.',\n sessionIssueTitle: 'Problème de session de vérification',\n sessionExpiredTitle: 'Session expirée',\n verificationError: 'Erreur de vérification',\n sessionExpiredMessage: 'Votre session de vérification a expiré et doit être redémarrée.',\n whatToDoNext: 'Que faire ensuite :',\n clickRestart: 'Cliquez sur « Redémarrer la vérification » ci-dessous pour générer une nouvelle session',\n completeWithoutDelays: 'Complétez le processus de vérification sans tarder',\n ifIssuesPersist: 'Si les problèmes persistent, contactez le support',\n restartVerification: 'Redémarrer la vérification',\n restarting: 'Redémarrage…',\n restart: 'Redémarrer',\n failedToRestart: 'Échec du redémarrage de la vérification',\n failedToInitialize: 'Échec de l\\'initialisation : {{message}}',\n configurationError: 'Erreur de configuration : {{message}}',\n setupError: 'Erreur de configuration : {{message}}',\n importantExpiredMessage: 'Important : Si vous voyez un message « expiré » ou « lien invalide », veuillez cliquer sur « Redémarrer » pour générer une nouvelle session de vérification.',\n deviceRiskAssessment: 'Évaluation des risques de l\\'appareil',\n analyzingDevice: 'Analyse de la sécurité de l\\'appareil et des modèles comportementaux...',\n pleaseWaitDevice: 'Veuillez patienter pendant que nous vérifions la sécurité de votre appareil',\n automaticProcess: 'Ce processus est automatique et se terminera en quelques secondes',\n loadingIdentity: 'Chargement de la vérification d\\'identité...',\n },\n\n status: {\n verificationApproved: 'Vérification approuvée',\n verificationApprovedMsg: 'Votre vérification d\\'identité a été approuvée avec succès.',\n verificationRejected: 'Vérification refusée',\n verificationRejectedMsg: 'Malheureusement, votre vérification d\\'identité n\\'a pas été approuvée.',\n verificationPending: 'Vérification en attente',\n verificationPendingMsg: 'Votre vérification d\\'identité est en cours de traitement.',\n applicationApproved: 'Demande approuvée',\n applicationApprovedMsg: 'Votre demande a été approuvée.',\n applicationRejected: 'Demande refusée',\n applicationRejectedMsg: 'Votre demande a été refusée.',\n underReview: 'En cours d\\'examen',\n underReviewMsg: 'Votre demande est actuellement en cours d\\'examen manuel.',\n processComplete: 'Processus terminé',\n processCompleteMsg: 'Votre processus de vérification a été complété avec succès.',\n processFailed: 'Processus échoué',\n processFailedMsg: 'Le processus de vérification n\\'a pas pu être complété.',\n adminReviewRequired: 'Examen administrateur requis',\n adminReviewRequiredMsg: 'Votre demande nécessite un examen par un administrateur.',\n processing: 'En cours de traitement',\n processingMsg: 'Votre demande est en cours d\\'examen.',\n whatsNext: 'Et maintenant ?',\n identityVerified: 'Votre identité a été vérifiée',\n canProceed: 'Vous pouvez maintenant poursuivre votre demande',\n allFeaturesAccessible: 'Toutes les fonctionnalités sont désormais accessibles',\n whatCanYouDo: 'Que pouvez-vous faire ?',\n contactSupportTeam: 'Contactez notre équipe de support pour obtenir de l\\'aide',\n reviewSubmittedInfo: 'Consultez les informations que vous avez soumises',\n resubmitIfNeeded: 'Soumettez à nouveau votre demande si nécessaire',\n whatHappensNext: 'Que se passe-t-il ensuite ?',\n teamReviewing: 'Notre équipe examine votre demande',\n notifiedByEmail: 'Vous serez notifié par e-mail lorsque l\\'examen sera terminé',\n noActionRequired: 'Aucune action n\\'est requise de votre part pour le moment',\n kycStatus: 'Statut KYC :',\n reviewStatus: 'Statut de l\\'examen :',\n notAvailable: 'Non disponible',\n contactSupport: 'Contacter le support',\n tryAgain: 'Réessayer',\n checkBackLater: 'Veuillez revenir plus tard ou attendre notre notification par e-mail',\n },\n\n logo: {\n companyLogo: 'Logo de l\\'entreprise',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const es: TranslationDictionary = {\n common: {\n next: 'Siguiente',\n previous: 'Anterior',\n back: 'Volver',\n submit: 'Enviar',\n cancel: 'Cancelar',\n skip: 'Omitir',\n skipAndSubmit: 'Omitir y Enviar',\n loading: 'Cargando...',\n error: 'Error',\n errorPrefix: 'Error:',\n continue: 'Continuar',\n close: 'Cerrar',\n help: 'Ayuda',\n search: 'Buscar...',\n select: 'Seleccionar...',\n noResults: 'Sin resultados',\n clearAll: 'Borrar todo',\n loadingForm: 'Cargando formulario…',\n required: 'obligatorio',\n pageXofY: 'Página {{current}} de {{total}}',\n stepXofY: 'Paso {{current}} de {{total}}',\n },\n\n fields: {\n firstName: 'Nombre',\n lastName: 'Apellido',\n email: 'Correo electrónico',\n phoneNumber: 'Número de teléfono',\n dateOfBirth: 'Fecha de nacimiento',\n salutation: 'Tratamiento',\n title: 'Título',\n mobileCountryCode: 'Código de país móvil',\n street: 'Calle',\n streetNumber: 'Número',\n zip: 'Código postal',\n city: 'Ciudad',\n country: 'País',\n nationality: 'Nacionalidad',\n otherNationalities: 'Otras nacionalidades',\n countryOfBirth: 'País de nacimiento',\n placeOfBirth: 'Lugar de nacimiento',\n taxCountry: 'País fiscal',\n taxNumber: 'Número fiscal',\n defaultLanguage: 'Idioma predeterminado',\n educationLevel: 'Nivel de educación',\n occupation: 'Ocupación',\n companyName: 'Nombre de la empresa',\n companyEmail: 'Correo electrónico',\n companyPhone: 'Teléfono',\n registrationNumber: 'Número de registro',\n countryOfResidence: 'País de residencia',\n legalAddress: 'Dirección legal',\n incorporationDate: 'Fecha de constitución',\n controlScheme: 'Esquema de control',\n taxId: 'Identificación fiscal',\n registrationLocation: 'Lugar de registro',\n website: 'Sitio web',\n postalAddress: 'Dirección postal',\n state: 'Estado / Provincia',\n postalCode: 'Código postal',\n addressCountry: 'País',\n lei: 'LEI',\n name: 'Nombre',\n notProvided: 'No proporcionado',\n addressInformation: 'Información de dirección',\n },\n\n gender: {\n male: 'Masculino',\n female: 'Femenino',\n other: 'Otro',\n },\n\n placeholders: {\n selectSalutation: 'Seleccionar tratamiento...',\n selectLanguage: 'Seleccionar idioma...',\n selectOtherNationalities: 'Seleccionar otras nacionalidades...',\n selectCountry: 'Seleccionar país…',\n selectNationality: 'Seleccionar nacionalidad…',\n selectCountryCode: 'Seleccionar código de país…',\n selectOption: 'Seleccionar una opción…',\n enterAnswer: 'Introduzca su respuesta…',\n phonePlaceholder: '+34',\n },\n\n createApplicant: {\n title: 'Crear solicitante',\n createApplicant: 'Crear solicitante',\n externalRefIdRequired: 'Se requiere el ID de referencia externa. Por favor, páselo mediante config.applicantForm.externalRefId.',\n failedToCreate: 'No se pudo crear el solicitante',\n },\n\n createCompany: {\n title: 'Registro de empresa',\n registerCompany: 'Registrar empresa',\n failedToCreate: 'No se pudo crear el solicitante empresa',\n },\n\n workflow: {\n loadingWorkflow: 'Cargando flujo de trabajo...',\n errorOccurred: 'Se produjo un error',\n workflowTransition: 'Transición de flujo de trabajo',\n workflowUpdatedMessage: 'El flujo de trabajo de su solicitud se ha actualizado en función de su progreso.',\n previousWorkflow: 'Flujo de trabajo anterior',\n newWorkflow: 'Nuevo flujo de trabajo',\n continueNewWorkflow: 'Continuar con el nuevo flujo de trabajo',\n loadingIdentityVerification: 'Cargando verificación de identidad...',\n loadingCurrentStep: 'Cargando paso actual...',\n processingStep: 'Procesando paso:',\n actionType: 'Tipo de acción:',\n },\n\n stepNames: {\n overview: 'Resumen',\n questionnaire: 'Cuestionario',\n documents: 'Documentos',\n identity: 'Identidad',\n riskAssessment: 'Evaluación de riesgos',\n investorCategorization: 'Categorización de inversores',\n appropriatenessTest: 'Test de idoneidad',\n additionalData: 'Datos adicionales',\n review: 'Revisión',\n },\n\n validation: {\n required: '{{field}} es obligatorio',\n fieldRequired: '{{field}} es obligatorio.',\n invalidFormat: 'Formato inválido',\n minValue: 'El valor mínimo es {{min}}',\n maxValue: 'El valor máximo es {{max}}',\n minLength: 'La longitud mínima es de {{min}} caracteres',\n maxLength: 'La longitud máxima es de {{max}} caracteres',\n fileTooLarge: 'El archivo supera el tamaño máximo de {{size}}',\n invalidFileType: 'Tipo de archivo inválido',\n },\n\n questionnaire: {\n errorLoading: 'Error al cargar el cuestionario:',\n },\n\n riskScoring: {\n title: 'Evaluación de riesgos',\n subtitle: 'Por favor, responda las siguientes preguntas para la evaluación de riesgos',\n loadingCriteria: 'Cargando criterios de evaluación de riesgos…',\n noCriteria: 'No se requieren criterios. Pasando al siguiente paso…',\n errorLoading: 'Error al cargar los criterios:',\n range: 'Rango: {{min}} – {{max}}',\n minimum: 'Mínimo: {{min}}',\n maximum: 'Máximo: {{max}}',\n },\n\n uploadDocument: {\n title: 'Subir documentos',\n loading: 'Cargando requisitos de documentos...',\n errorLoading: 'Error al cargar los requisitos de documentos',\n failedToSubmit: 'No se pudieron enviar los documentos. Por favor, inténtelo de nuevo.',\n uploading: 'Subiendo...',\n clickToUpload: 'Haga clic para subir',\n orDragDrop: 'o arrastre y suelte',\n maxSize: 'Máx. {{size}}',\n },\n\n overview: {\n title: 'Resumen',\n loadingOverview: 'Cargando datos del resumen...',\n errorLoading: 'Error al cargar el resumen:',\n },\n\n investorCategorization: {\n whichStatement: '¿Qué afirmación le describe mejor?',\n retailInvestorInfo: 'Todos los clientes de Tokenise son tratados como inversores minoristas a menos que cumplan criterios específicos para ser clasificados como inversores profesionales o profesionales electivos. Para proporcionarle el nivel de servicio adecuado, indique cuál de las siguientes descripciones se aplica a usted.',\n chooseOne: 'Elija una opción',\n individualInvestor: 'Inversor particular',\n individualInvestorDesc: '(Recomendado) La mayoría de nuestros clientes eligen esta opción. Se beneficiará del mayor nivel de protección regulatoria.',\n sophisticatedInvestor: 'Inversor sofisticado',\n sophisticatedInvestorDesc: 'En los últimos 2 años, he realizado una o más de las siguientes actividades: inversiones significativas en empresas no cotizadas, he sido director de una empresa con una facturación de al menos 1 millón de dólares, o he trabajado en capital privado o finanzas corporativas.',\n highNetworthInvestor: 'Inversor de alto patrimonio',\n highNetworthInvestorDesc: 'Gano más de (USD/EUR) 150.000 $ al año, o tengo un patrimonio neto superior a 250.000 $ (excluyendo la residencia principal).',\n pleaseSelect: 'Por favor, seleccione un tipo de inversor',\n failedToSubmit: 'No se pudo enviar la categorización del inversor',\n },\n\n appropriatenessTest: {\n failedToLoad: 'No se pudo cargar el test de idoneidad',\n failedToSubmit: 'No se pudo enviar el test. Por favor, inténtelo de nuevo.',\n answerAllQuestions: 'Por favor, responda todas las preguntas. {{remaining}} restante(s).',\n testPassed: 'Test aprobado',\n testFailed: 'Test no aprobado',\n passedMessage: '¡Felicidades! Ha aprobado el test.',\n failedMessage: 'No ha aprobado el test.',\n loadingTest: 'Cargando test...',\n noTestData: 'No hay datos de test disponibles',\n waitBeforeRetrying: 'Por favor, espere antes de reintentar',\n waitTimerMessage: 'Podrá intentar el test de nuevo una vez que expire el temporizador',\n attemptsRemaining: 'Le quedan {{count}} intento(s)',\n noAttemptsRemaining: 'No quedan intentos. Por favor, contacte con soporte.',\n retakeTest: 'Repetir test',\n ok: 'OK',\n startTest: 'Iniciar test',\n questionXofY: 'Pregunta {{current}} de {{total}}',\n answered: 'respondida',\n attemptsLeft: 'intento(s) restante(s)',\n timesUp: '¡Se acabó el tiempo! Sus respuestas están siendo enviadas.',\n submitting: 'Enviando...',\n submitTest: 'Enviar test',\n questions: 'Preguntas',\n timeLimit: 'Límite de tiempo',\n passRequirement: 'Requisito de aprobación',\n attemptsLeftLabel: 'Intentos restantes',\n correct: '{{count}} correcta(s)',\n previousAttempt: 'Intento anterior:',\n allAttemptsUsed: 'Ha utilizado todos sus intentos. Por favor, contacte con soporte.',\n },\n\n identity: {\n title: 'Verificación de identidad',\n subtitle: 'Por favor, complete el proceso de verificación de identidad',\n reviewYourInformation: 'Revise su información',\n reviewSubtitle: 'Por favor, revise y confirme su información antes de iniciar la verificación de identidad',\n confirmAndStart: 'Confirmar e iniciar verificación',\n invalidUrl: 'URL de verificación inválida. Por favor, reinicie.',\n sessionExpired: 'Su sesión de verificación ha expirado. Por favor, reinicie.',\n linkExpired: 'Su enlace de verificación ha expirado. Por favor, reinicie.',\n sessionExpiredRestart: 'Sesión expirada. Por favor, reinicie.',\n sessionExpiredOrInvalid: 'Sesión expirada o inválida. Por favor, reinicie la verificación.',\n sessionIssueTitle: 'Problema con la sesión de verificación',\n sessionExpiredTitle: 'Sesión expirada',\n verificationError: 'Error de verificación',\n sessionExpiredMessage: 'Su sesión de verificación ha expirado y necesita ser reiniciada.',\n whatToDoNext: 'Próximos pasos:',\n clickRestart: 'Haga clic en \"Reiniciar verificación\" a continuación para generar una nueva sesión',\n completeWithoutDelays: 'Complete el proceso de verificación sin demoras',\n ifIssuesPersist: 'Si los problemas persisten, contacte con soporte',\n restartVerification: 'Reiniciar verificación',\n restarting: 'Reiniciando…',\n restart: 'Reiniciar',\n failedToRestart: 'No se pudo reiniciar la verificación',\n failedToInitialize: 'Error de inicialización: {{message}}',\n configurationError: 'Error de configuración: {{message}}',\n setupError: 'Error de configuración: {{message}}',\n importantExpiredMessage: 'Importante: Si ve un mensaje de \"expirado\" o \"enlace inválido\", haga clic en \"Reiniciar\" para generar una nueva sesión de verificación.',\n deviceRiskAssessment: 'Evaluación de riesgos del dispositivo',\n analyzingDevice: 'Analizando la seguridad del dispositivo y patrones de comportamiento...',\n pleaseWaitDevice: 'Por favor, espere mientras verificamos la seguridad de su dispositivo',\n automaticProcess: 'Este proceso es automático y se completará en unos segundos',\n loadingIdentity: 'Cargando verificación de identidad...',\n },\n\n status: {\n verificationApproved: 'Verificación aprobada',\n verificationApprovedMsg: 'Su verificación de identidad ha sido aprobada exitosamente.',\n verificationRejected: 'Verificación rechazada',\n verificationRejectedMsg: 'Lamentablemente, su verificación de identidad no fue aprobada.',\n verificationPending: 'Verificación pendiente',\n verificationPendingMsg: 'Su verificación de identidad está siendo procesada actualmente.',\n applicationApproved: 'Solicitud aprobada',\n applicationApprovedMsg: 'Su solicitud ha sido aprobada.',\n applicationRejected: 'Solicitud rechazada',\n applicationRejectedMsg: 'Su solicitud ha sido rechazada.',\n underReview: 'En revisión',\n underReviewMsg: 'Su solicitud está siendo revisada manualmente.',\n processComplete: 'Proceso completado',\n processCompleteMsg: 'Su proceso de verificación se ha completado exitosamente.',\n processFailed: 'Proceso fallido',\n processFailedMsg: 'El proceso de verificación no pudo completarse.',\n adminReviewRequired: 'Revisión de administrador requerida',\n adminReviewRequiredMsg: 'Su solicitud requiere revisión por un administrador.',\n processing: 'Procesando',\n processingMsg: 'Su solicitud está siendo revisada.',\n whatsNext: '¿Qué sigue?',\n identityVerified: 'Su identidad ha sido verificada',\n canProceed: 'Ahora puede continuar con su solicitud',\n allFeaturesAccessible: 'Todas las funciones están ahora disponibles',\n whatCanYouDo: '¿Qué puede hacer?',\n contactSupportTeam: 'Contacte con nuestro equipo de soporte para obtener ayuda',\n reviewSubmittedInfo: 'Revise la información que envió',\n resubmitIfNeeded: 'Vuelva a enviar su solicitud si es necesario',\n whatHappensNext: '¿Qué sucede después?',\n teamReviewing: 'Nuestro equipo está revisando su solicitud',\n notifiedByEmail: 'Se le notificará por correo electrónico cuando la revisión esté completa',\n noActionRequired: 'No se requiere ninguna acción de su parte en este momento',\n kycStatus: 'Estado KYC:',\n reviewStatus: 'Estado de la revisión:',\n notAvailable: 'No disponible',\n contactSupport: 'Contactar soporte',\n tryAgain: 'Intentar de nuevo',\n checkBackLater: 'Por favor, vuelva más tarde o espere nuestra notificación por correo electrónico',\n },\n\n logo: {\n companyLogo: 'Logo de la empresa',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const it: TranslationDictionary = {\n common: {\n next: 'Avanti',\n previous: 'Precedente',\n back: 'Indietro',\n submit: 'Invia',\n cancel: 'Annulla',\n skip: 'Salta',\n skipAndSubmit: 'Salta e Invia',\n loading: 'Caricamento...',\n error: 'Errore',\n errorPrefix: 'Errore:',\n continue: 'Continua',\n close: 'Chiudi',\n help: 'Aiuto',\n search: 'Cerca...',\n select: 'Seleziona...',\n noResults: 'Nessun risultato',\n clearAll: 'Cancella tutto',\n loadingForm: 'Caricamento modulo…',\n required: 'obbligatorio',\n pageXofY: 'Pagina {{current}} di {{total}}',\n stepXofY: 'Passaggio {{current}} di {{total}}',\n },\n\n fields: {\n firstName: 'Nome',\n lastName: 'Cognome',\n email: 'E-mail',\n phoneNumber: 'Numero di telefono',\n dateOfBirth: 'Data di nascita',\n salutation: 'Titolo di cortesia',\n title: 'Titolo',\n mobileCountryCode: 'Prefisso internazionale',\n street: 'Via',\n streetNumber: 'Numero civico',\n zip: 'CAP',\n city: 'Città',\n country: 'Paese',\n nationality: 'Nazionalità',\n otherNationalities: 'Altre nazionalità',\n countryOfBirth: 'Paese di nascita',\n placeOfBirth: 'Luogo di nascita',\n taxCountry: 'Paese fiscale',\n taxNumber: 'Numero fiscale',\n defaultLanguage: 'Lingua predefinita',\n educationLevel: 'Livello di istruzione',\n occupation: 'Occupazione',\n companyName: 'Nome azienda',\n companyEmail: 'E-mail',\n companyPhone: 'Telefono',\n registrationNumber: 'Numero di registrazione',\n countryOfResidence: 'Paese di residenza',\n legalAddress: 'Indirizzo legale',\n incorporationDate: 'Data di costituzione',\n controlScheme: 'Schema di controllo',\n taxId: 'Codice fiscale',\n registrationLocation: 'Luogo di registrazione',\n website: 'Sito web',\n postalAddress: 'Indirizzo postale',\n state: 'Stato / Provincia',\n postalCode: 'Codice postale',\n addressCountry: 'Paese',\n lei: 'LEI',\n name: 'Nome',\n notProvided: 'Non fornito',\n addressInformation: 'Informazioni sull\\'indirizzo',\n },\n\n gender: {\n male: 'Maschio',\n female: 'Femmina',\n other: 'Altro',\n },\n\n placeholders: {\n selectSalutation: 'Seleziona titolo di cortesia...',\n selectLanguage: 'Seleziona lingua...',\n selectOtherNationalities: 'Seleziona altre nazionalità...',\n selectCountry: 'Seleziona paese…',\n selectNationality: 'Seleziona nazionalità…',\n selectCountryCode: 'Seleziona prefisso internazionale…',\n selectOption: 'Seleziona un\\'opzione…',\n enterAnswer: 'Inserisci la tua risposta…',\n phonePlaceholder: '+39',\n },\n\n createApplicant: {\n title: 'Crea richiedente',\n createApplicant: 'Crea richiedente',\n externalRefIdRequired: 'L\\'ID di riferimento esterno è obbligatorio. Passarlo tramite config.applicantForm.externalRefId.',\n failedToCreate: 'Impossibile creare il richiedente',\n },\n\n createCompany: {\n title: 'Registrazione azienda',\n registerCompany: 'Registra azienda',\n failedToCreate: 'Impossibile creare il richiedente aziendale',\n },\n\n workflow: {\n loadingWorkflow: 'Caricamento flusso di lavoro...',\n errorOccurred: 'Si è verificato un errore',\n workflowTransition: 'Transizione del flusso di lavoro',\n workflowUpdatedMessage: 'Il flusso di lavoro della tua domanda è stato aggiornato in base ai tuoi progressi.',\n previousWorkflow: 'Flusso di lavoro precedente',\n newWorkflow: 'Nuovo flusso di lavoro',\n continueNewWorkflow: 'Continua con il nuovo flusso di lavoro',\n loadingIdentityVerification: 'Caricamento verifica dell\\'identità...',\n loadingCurrentStep: 'Caricamento passaggio corrente...',\n processingStep: 'Elaborazione passaggio:',\n actionType: 'Tipo di azione:',\n },\n\n stepNames: {\n overview: 'Panoramica',\n questionnaire: 'Questionario',\n documents: 'Documenti',\n identity: 'Identità',\n riskAssessment: 'Valutazione del rischio',\n investorCategorization: 'Categorizzazione dell\\'investitore',\n appropriatenessTest: 'Test di adeguatezza',\n additionalData: 'Dati aggiuntivi',\n review: 'Revisione',\n },\n\n validation: {\n required: '{{field}} è obbligatorio',\n fieldRequired: '{{field}} è obbligatorio.',\n invalidFormat: 'Formato non valido',\n minValue: 'Il valore minimo è {{min}}',\n maxValue: 'Il valore massimo è {{max}}',\n minLength: 'La lunghezza minima è di {{min}} caratteri',\n maxLength: 'La lunghezza massima è di {{max}} caratteri',\n fileTooLarge: 'Il file supera la dimensione massima di {{size}}',\n invalidFileType: 'Tipo di file non valido',\n },\n\n questionnaire: {\n errorLoading: 'Errore nel caricamento del questionario:',\n },\n\n riskScoring: {\n title: 'Valutazione del rischio',\n subtitle: 'Rispondi alle seguenti domande per la valutazione del rischio',\n loadingCriteria: 'Caricamento dei criteri di valutazione del rischio…',\n noCriteria: 'Nessun criterio richiesto. Passaggio al prossimo step…',\n errorLoading: 'Errore nel caricamento dei criteri:',\n range: 'Intervallo: {{min}} – {{max}}',\n minimum: 'Minimo: {{min}}',\n maximum: 'Massimo: {{max}}',\n },\n\n uploadDocument: {\n title: 'Carica documenti',\n loading: 'Caricamento requisiti documentali...',\n errorLoading: 'Errore nel caricamento dei requisiti documentali',\n failedToSubmit: 'Invio dei documenti non riuscito. Riprova.',\n uploading: 'Caricamento in corso...',\n clickToUpload: 'Clicca per caricare',\n orDragDrop: 'o trascina e rilascia',\n maxSize: 'Max {{size}}',\n },\n\n overview: {\n title: 'Panoramica',\n loadingOverview: 'Caricamento dati panoramica...',\n errorLoading: 'Errore nel caricamento della panoramica:',\n },\n\n investorCategorization: {\n whichStatement: 'Quale affermazione ti descrive meglio?',\n retailInvestorInfo: 'Tutti i clienti di Tokenise sono trattati come investitori al dettaglio, a meno che non soddisfino criteri specifici per essere classificati come investitori professionali o professionali elettivi. Per fornirti il livello di servizio appropriato, indica quale delle seguenti descrizioni si applica a te.',\n chooseOne: 'Scegli un\\'opzione',\n individualInvestor: 'Investitore individuale',\n individualInvestorDesc: '(Consigliato) La maggior parte dei nostri clienti sceglie questa opzione. Beneficerai del massimo livello di protezione normativa.',\n sophisticatedInvestor: 'Investitore sofisticato',\n sophisticatedInvestorDesc: 'Negli ultimi 2 anni, ho svolto una o più delle seguenti attività: investimenti significativi in società non quotate, sono stato direttore di un\\'azienda con un fatturato di almeno 1 milione di dollari, o ho lavorato nel private equity o nella finanza aziendale.',\n highNetworthInvestor: 'Investitore ad alto patrimonio',\n highNetworthInvestorDesc: 'Guadagno più di (USD/EUR) 150.000 $ all\\'anno, oppure ho un patrimonio netto superiore a 250.000 $ (esclusa la residenza principale).',\n pleaseSelect: 'Seleziona un tipo di investitore',\n failedToSubmit: 'Invio della categorizzazione dell\\'investitore non riuscito',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Impossibile caricare il test di adeguatezza',\n failedToSubmit: 'Invio del test non riuscito. Riprova.',\n answerAllQuestions: 'Rispondi a tutte le domande. {{remaining}} rimanente/i.',\n testPassed: 'Test superato',\n testFailed: 'Test non superato',\n passedMessage: 'Congratulazioni! Hai superato il test.',\n failedMessage: 'Non hai superato il test.',\n loadingTest: 'Caricamento test...',\n noTestData: 'Nessun dato del test disponibile',\n waitBeforeRetrying: 'Attendi prima di riprovare',\n waitTimerMessage: 'Potrai riprovare il test una volta scaduto il timer',\n attemptsRemaining: 'Hai ancora {{count}} tentativo/i',\n noAttemptsRemaining: 'Nessun tentativo rimasto. Contatta il supporto per assistenza.',\n retakeTest: 'Ripeti test',\n ok: 'OK',\n startTest: 'Inizia test',\n questionXofY: 'Domanda {{current}} di {{total}}',\n answered: 'risposta',\n attemptsLeft: 'tentativo/i rimasto/i',\n timesUp: 'Tempo scaduto! Le tue risposte vengono inviate.',\n submitting: 'Invio in corso...',\n submitTest: 'Invia test',\n questions: 'Domande',\n timeLimit: 'Limite di tempo',\n passRequirement: 'Requisito di superamento',\n attemptsLeftLabel: 'Tentativi rimasti',\n correct: '{{count}} corretta/e',\n previousAttempt: 'Tentativo precedente:',\n allAttemptsUsed: 'Hai esaurito tutti i tentativi. Contatta il supporto per assistenza.',\n },\n\n identity: {\n title: 'Verifica dell\\'identità',\n subtitle: 'Completa il processo di verifica dell\\'identità',\n reviewYourInformation: 'Rivedi le tue informazioni',\n reviewSubtitle: 'Rivedi e conferma le tue informazioni prima di avviare la verifica dell\\'identità',\n confirmAndStart: 'Conferma e avvia la verifica',\n invalidUrl: 'URL di verifica non valido. Riavvia il processo.',\n sessionExpired: 'La sessione di verifica è scaduta. Riavvia il processo.',\n linkExpired: 'Il link di verifica è scaduto. Riavvia il processo.',\n sessionExpiredRestart: 'Sessione scaduta. Riavvia il processo.',\n sessionExpiredOrInvalid: 'Sessione scaduta o non valida. Riavvia la verifica.',\n sessionIssueTitle: 'Problema con la sessione di verifica',\n sessionExpiredTitle: 'Sessione scaduta',\n verificationError: 'Errore di verifica',\n sessionExpiredMessage: 'La sessione di verifica è scaduta e deve essere riavviata.',\n whatToDoNext: 'Cosa fare:',\n clickRestart: 'Clicca su \"Riavvia verifica\" qui sotto per generare una nuova sessione',\n completeWithoutDelays: 'Completa il processo di verifica senza ritardi',\n ifIssuesPersist: 'Se i problemi persistono, contatta il supporto',\n restartVerification: 'Riavvia verifica',\n restarting: 'Riavvio…',\n restart: 'Riavvia',\n failedToRestart: 'Impossibile riavviare la verifica',\n failedToInitialize: 'Inizializzazione non riuscita: {{message}}',\n configurationError: 'Errore di configurazione: {{message}}',\n setupError: 'Errore di configurazione: {{message}}',\n importantExpiredMessage: 'Importante: Se vedi un messaggio \"scaduto\" o \"link non valido\", clicca su \"Riavvia\" per generare una nuova sessione di verifica.',\n deviceRiskAssessment: 'Valutazione del rischio del dispositivo',\n analyzingDevice: 'Analisi della sicurezza del dispositivo e dei modelli comportamentali...',\n pleaseWaitDevice: 'Attendi mentre verifichiamo la sicurezza del tuo dispositivo',\n automaticProcess: 'Questo processo è automatico e si completerà in pochi secondi',\n loadingIdentity: 'Caricamento verifica dell\\'identità...',\n },\n\n status: {\n verificationApproved: 'Verifica approvata',\n verificationApprovedMsg: 'La tua verifica dell\\'identità è stata approvata con successo.',\n verificationRejected: 'Verifica rifiutata',\n verificationRejectedMsg: 'Purtroppo, la tua verifica dell\\'identità non è stata approvata.',\n verificationPending: 'Verifica in attesa',\n verificationPendingMsg: 'La tua verifica dell\\'identità è attualmente in fase di elaborazione.',\n applicationApproved: 'Domanda approvata',\n applicationApprovedMsg: 'La tua domanda è stata approvata.',\n applicationRejected: 'Domanda rifiutata',\n applicationRejectedMsg: 'La tua domanda è stata rifiutata.',\n underReview: 'In revisione',\n underReviewMsg: 'La tua domanda è attualmente in fase di revisione manuale.',\n processComplete: 'Processo completato',\n processCompleteMsg: 'Il tuo processo di verifica è stato completato con successo.',\n processFailed: 'Processo non riuscito',\n processFailedMsg: 'Il processo di verifica non è stato completato.',\n adminReviewRequired: 'Revisione dell\\'amministratore richiesta',\n adminReviewRequiredMsg: 'La tua domanda richiede la revisione di un amministratore.',\n processing: 'In elaborazione',\n processingMsg: 'La tua domanda è in fase di revisione.',\n whatsNext: 'Cosa succede ora?',\n identityVerified: 'La tua identità è stata verificata',\n canProceed: 'Ora puoi procedere con la tua domanda',\n allFeaturesAccessible: 'Tutte le funzionalità sono ora accessibili',\n whatCanYouDo: 'Cosa puoi fare?',\n contactSupportTeam: 'Contatta il nostro team di supporto per assistenza',\n reviewSubmittedInfo: 'Rivedi le informazioni che hai inviato',\n resubmitIfNeeded: 'Invia nuovamente la tua domanda se necessario',\n whatHappensNext: 'Cosa succede dopo?',\n teamReviewing: 'Il nostro team sta esaminando la tua domanda',\n notifiedByEmail: 'Riceverai una notifica via e-mail al termine della revisione',\n noActionRequired: 'Al momento non è richiesta alcuna azione da parte tua',\n kycStatus: 'Stato KYC:',\n reviewStatus: 'Stato della revisione:',\n notAvailable: 'Non disponibile',\n contactSupport: 'Contatta il supporto',\n tryAgain: 'Riprova',\n checkBackLater: 'Ricontrolla più tardi o attendi la nostra notifica via e-mail',\n },\n\n logo: {\n companyLogo: 'Logo aziendale',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const pt: TranslationDictionary = {\n common: {\n next: 'Próximo',\n previous: 'Anterior',\n back: 'Voltar',\n submit: 'Enviar',\n cancel: 'Cancelar',\n skip: 'Pular',\n skipAndSubmit: 'Pular e Enviar',\n loading: 'Carregando...',\n error: 'Erro',\n errorPrefix: 'Erro:',\n continue: 'Continuar',\n close: 'Fechar',\n help: 'Ajuda',\n search: 'Pesquisar...',\n select: 'Selecionar...',\n noResults: 'Sem resultados',\n clearAll: 'Limpar tudo',\n loadingForm: 'Carregando formulário…',\n required: 'obrigatório',\n pageXofY: 'Página {{current}} de {{total}}',\n stepXofY: 'Etapa {{current}} de {{total}}',\n },\n\n fields: {\n firstName: 'Nome',\n lastName: 'Sobrenome',\n email: 'E-mail',\n phoneNumber: 'Número de Telefone',\n dateOfBirth: 'Data de Nascimento',\n salutation: 'Saudação',\n title: 'Título',\n mobileCountryCode: 'Código do País (Celular)',\n street: 'Rua',\n streetNumber: 'Número',\n zip: 'CEP / Código Postal',\n city: 'Cidade',\n country: 'País',\n nationality: 'Nacionalidade',\n otherNationalities: 'Outras Nacionalidades',\n countryOfBirth: 'País de Nascimento',\n placeOfBirth: 'Local de Nascimento',\n taxCountry: 'País Fiscal',\n taxNumber: 'Número Fiscal',\n defaultLanguage: 'Idioma Padrão',\n educationLevel: 'Nível de Escolaridade',\n occupation: 'Profissão',\n companyName: 'Nome da Empresa',\n companyEmail: 'E-mail',\n companyPhone: 'Telefone',\n registrationNumber: 'Número de Registro',\n countryOfResidence: 'País de Residência',\n legalAddress: 'Endereço Legal',\n incorporationDate: 'Data de Constituição',\n controlScheme: 'Esquema de Controle',\n taxId: 'Identificação Fiscal',\n registrationLocation: 'Local de Registro',\n website: 'Website',\n postalAddress: 'Endereço Postal',\n state: 'Estado / Província',\n postalCode: 'Código Postal',\n addressCountry: 'País',\n lei: 'LEI',\n name: 'Nome',\n notProvided: 'Não informado',\n addressInformation: 'Informações de Endereço',\n },\n\n gender: {\n male: 'Masculino',\n female: 'Feminino',\n other: 'Outro',\n },\n\n placeholders: {\n selectSalutation: 'Selecione a saudação...',\n selectLanguage: 'Selecione o idioma...',\n selectOtherNationalities: 'Selecione outras nacionalidades...',\n selectCountry: 'Selecione o país…',\n selectNationality: 'Selecione a nacionalidade…',\n selectCountryCode: 'Selecione o código do país…',\n selectOption: 'Selecione uma opção…',\n enterAnswer: 'Digite sua resposta…',\n phonePlaceholder: '+55',\n },\n\n createApplicant: {\n title: 'Criar Candidato',\n createApplicant: 'Criar Candidato',\n externalRefIdRequired: 'O ID de Referência Externa é obrigatório. Por favor, passe-o via config.applicantForm.externalRefId.',\n failedToCreate: 'Falha ao criar candidato',\n },\n\n createCompany: {\n title: 'Registro de Empresa',\n registerCompany: 'Registrar Empresa',\n failedToCreate: 'Falha ao criar candidato empresa',\n },\n\n workflow: {\n loadingWorkflow: 'Carregando fluxo de trabalho...',\n errorOccurred: 'Ocorreu um erro',\n workflowTransition: 'Transição de Fluxo de Trabalho',\n workflowUpdatedMessage: 'O fluxo de trabalho da sua candidatura foi atualizado com base no seu progresso.',\n previousWorkflow: 'Fluxo de Trabalho Anterior',\n newWorkflow: 'Novo Fluxo de Trabalho',\n continueNewWorkflow: 'Continuar com o Novo Fluxo de Trabalho',\n loadingIdentityVerification: 'Carregando verificação de identidade...',\n loadingCurrentStep: 'Carregando etapa atual...',\n processingStep: 'Processando etapa:',\n actionType: 'Tipo de ação:',\n },\n\n stepNames: {\n overview: 'Visão Geral',\n questionnaire: 'Questionário',\n documents: 'Documentos',\n identity: 'Identidade',\n riskAssessment: 'Avaliação de Risco',\n investorCategorization: 'Categorização de Investidor',\n appropriatenessTest: 'Teste de Adequação',\n additionalData: 'Dados Adicionais',\n review: 'Revisão',\n },\n\n validation: {\n required: '{{field}} é obrigatório',\n fieldRequired: '{{field}} é obrigatório.',\n invalidFormat: 'Formato inválido',\n minValue: 'O valor mínimo é {{min}}',\n maxValue: 'O valor máximo é {{max}}',\n minLength: 'O comprimento mínimo é {{min}} caracteres',\n maxLength: 'O comprimento máximo é {{max}} caracteres',\n fileTooLarge: 'O arquivo excede o tamanho máximo de {{size}}',\n invalidFileType: 'Tipo de arquivo inválido',\n },\n\n questionnaire: {\n errorLoading: 'Erro ao carregar questionário:',\n },\n\n riskScoring: {\n title: 'Avaliação de Risco',\n subtitle: 'Por favor, responda às seguintes perguntas para avaliação de risco',\n loadingCriteria: 'Carregando critérios de pontuação de risco…',\n noCriteria: 'Nenhum critério necessário. Avançando para a próxima etapa…',\n errorLoading: 'Erro ao carregar critérios:',\n range: 'Intervalo: {{min}} – {{max}}',\n minimum: 'Mínimo: {{min}}',\n maximum: 'Máximo: {{max}}',\n },\n\n uploadDocument: {\n title: 'Enviar Documentos',\n loading: 'Carregando requisitos de documentos...',\n errorLoading: 'Erro ao carregar requisitos de documentos',\n failedToSubmit: 'Falha ao enviar documentos. Por favor, tente novamente.',\n uploading: 'Enviando...',\n clickToUpload: 'Clique para enviar',\n orDragDrop: 'ou arraste e solte',\n maxSize: 'Máx {{size}}',\n },\n\n overview: {\n title: 'Visão Geral',\n loadingOverview: 'Carregando dados da visão geral...',\n errorLoading: 'Erro ao carregar visão geral:',\n },\n\n investorCategorization: {\n whichStatement: 'Qual afirmação melhor descreve você?',\n retailInvestorInfo: 'Todos os clientes da Tokenise são tratados como Investidores de Varejo, a menos que atendam a critérios específicos para serem classificados como Investidores Profissionais ou Profissionais Eletivos. Para fornecer o nível adequado de serviço, indique qual das seguintes descrições se aplica a você.',\n chooseOne: 'Escolha uma opção',\n individualInvestor: 'Investidor individual',\n individualInvestorDesc: '(Recomendado) A maioria dos nossos clientes escolhe esta opção. Você se beneficiará do mais alto nível de proteção regulatória.',\n sophisticatedInvestor: 'Investidor sofisticado',\n sophisticatedInvestorDesc: 'Nos últimos 2 anos, fiz uma ou mais das seguintes ações: realizei investimentos significativos em empresas não listadas, fui diretor de uma empresa com faturamento de pelo menos $1 milhão, ou trabalhei em private equity ou finanças corporativas.',\n highNetworthInvestor: 'Investidor de alto patrimônio',\n highNetworthInvestorDesc: 'Ganho mais de (USD/EUR) $150.000 por ano, ou possuo ativos líquidos superiores a $250.000 (excluindo residência principal).',\n pleaseSelect: 'Por favor, selecione um tipo de investidor',\n failedToSubmit: 'Falha ao enviar categorização de investidor',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Falha ao carregar teste de adequação',\n failedToSubmit: 'Falha ao enviar teste. Por favor, tente novamente.',\n answerAllQuestions: 'Por favor, responda todas as perguntas. {{remaining}} restantes.',\n testPassed: 'Teste Aprovado',\n testFailed: 'Teste Reprovado',\n passedMessage: 'Parabéns! Você foi aprovado no teste.',\n failedMessage: 'Você não foi aprovado no teste.',\n loadingTest: 'Carregando teste...',\n noTestData: 'Nenhum dado de teste disponível',\n waitBeforeRetrying: 'Aguarde antes de tentar novamente',\n waitTimerMessage: 'Você pode tentar o teste novamente quando o temporizador expirar',\n attemptsRemaining: 'Você tem {{count}} tentativa(s) restante(s)',\n noAttemptsRemaining: 'Nenhuma tentativa restante. Entre em contato com o suporte para assistência.',\n retakeTest: 'Refazer Teste',\n ok: 'OK',\n startTest: 'Iniciar Teste',\n questionXofY: 'Pergunta {{current}} de {{total}}',\n answered: 'respondida',\n attemptsLeft: 'tentativa(s) restante(s)',\n timesUp: 'O tempo acabou! Suas respostas estão sendo enviadas.',\n submitting: 'Enviando...',\n submitTest: 'Enviar Teste',\n questions: 'Perguntas',\n timeLimit: 'Limite de Tempo',\n passRequirement: 'Requisito de Aprovação',\n attemptsLeftLabel: 'Tentativas Restantes',\n correct: '{{count}} correta(s)',\n previousAttempt: 'Tentativa anterior:',\n allAttemptsUsed: 'Você usou todas as suas tentativas. Entre em contato com o suporte para assistência.',\n },\n\n identity: {\n title: 'Verificação de Identidade',\n subtitle: 'Por favor, conclua o processo de verificação de identidade',\n reviewYourInformation: 'Revise Suas Informações',\n reviewSubtitle: 'Por favor, revise e confirme suas informações antes de iniciar a verificação de identidade',\n confirmAndStart: 'Confirmar e Iniciar Verificação',\n invalidUrl: 'URL de verificação inválida. Por favor, reinicie.',\n sessionExpired: 'Sua sessão de verificação expirou. Por favor, reinicie.',\n linkExpired: 'Seu link de verificação expirou. Por favor, reinicie.',\n sessionExpiredRestart: 'Sessão expirada. Por favor, reinicie.',\n sessionExpiredOrInvalid: 'Sessão expirada ou inválida. Por favor, reinicie a verificação.',\n sessionIssueTitle: 'Problema na Sessão de Verificação',\n sessionExpiredTitle: 'Sessão Expirada',\n verificationError: 'Erro de Verificação',\n sessionExpiredMessage: 'Sua sessão de verificação expirou e precisa ser reiniciada.',\n whatToDoNext: 'O que fazer a seguir:',\n clickRestart: 'Clique em \"Reiniciar Verificação\" abaixo para gerar uma nova sessão',\n completeWithoutDelays: 'Conclua o processo de verificação sem atrasos',\n ifIssuesPersist: 'Se os problemas persistirem, entre em contato com o suporte',\n restartVerification: 'Reiniciar Verificação',\n restarting: 'Reiniciando…',\n restart: 'Reiniciar',\n failedToRestart: 'Falha ao reiniciar verificação',\n failedToInitialize: 'Falha ao inicializar: {{message}}',\n configurationError: 'Erro de configuração: {{message}}',\n setupError: 'Erro de configuração: {{message}}',\n importantExpiredMessage: 'Importante: Se você vir uma mensagem de \"expirado\" ou \"link inválido\", clique em \"Reiniciar\" para gerar uma nova sessão de verificação.',\n deviceRiskAssessment: 'Avaliação de Risco do Dispositivo',\n analyzingDevice: 'Analisando segurança do dispositivo e padrões comportamentais...',\n pleaseWaitDevice: 'Aguarde enquanto verificamos a segurança do seu dispositivo',\n automaticProcess: 'Este processo é automático e será concluído em alguns segundos',\n loadingIdentity: 'Carregando verificação de identidade...',\n },\n\n status: {\n verificationApproved: 'Verificação Aprovada',\n verificationApprovedMsg: 'Sua verificação de identidade foi aprovada com sucesso.',\n verificationRejected: 'Verificação Rejeitada',\n verificationRejectedMsg: 'Infelizmente, sua verificação de identidade não foi aprovada.',\n verificationPending: 'Verificação Pendente',\n verificationPendingMsg: 'Sua verificação de identidade está sendo processada.',\n applicationApproved: 'Candidatura Aprovada',\n applicationApprovedMsg: 'Sua candidatura foi aprovada.',\n applicationRejected: 'Candidatura Rejeitada',\n applicationRejectedMsg: 'Sua candidatura foi rejeitada.',\n underReview: 'Em Análise',\n underReviewMsg: 'Sua candidatura está em análise manual.',\n processComplete: 'Processo Concluído',\n processCompleteMsg: 'Seu processo de verificação foi concluído com sucesso.',\n processFailed: 'Processo Falhou',\n processFailedMsg: 'O processo de verificação não pôde ser concluído.',\n adminReviewRequired: 'Revisão do Administrador Necessária',\n adminReviewRequiredMsg: 'Sua candidatura requer revisão do administrador.',\n processing: 'Processando',\n processingMsg: 'Sua candidatura está sendo analisada.',\n whatsNext: 'Próximos Passos',\n identityVerified: 'Sua identidade foi verificada',\n canProceed: 'Agora você pode prosseguir com sua candidatura',\n allFeaturesAccessible: 'Todos os recursos estão acessíveis agora',\n whatCanYouDo: 'O Que Você Pode Fazer?',\n contactSupportTeam: 'Entre em contato com nossa equipe de suporte para assistência',\n reviewSubmittedInfo: 'Revise as informações que você enviou',\n resubmitIfNeeded: 'Reenvie sua candidatura se necessário',\n whatHappensNext: 'O Que Acontece a Seguir?',\n teamReviewing: 'Nossa equipe está analisando sua candidatura',\n notifiedByEmail: 'Você será notificado por e-mail quando a análise estiver concluída',\n noActionRequired: 'Nenhuma ação é necessária da sua parte neste momento',\n kycStatus: 'Status KYC:',\n reviewStatus: 'Status da Análise:',\n notAvailable: 'Não Disponível',\n contactSupport: 'Contatar Suporte',\n tryAgain: 'Tentar Novamente',\n checkBackLater: 'Verifique novamente mais tarde ou aguarde nossa notificação por e-mail',\n },\n\n logo: {\n companyLogo: 'Logo da Empresa',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const nl: TranslationDictionary = {\n common: {\n next: 'Volgende',\n previous: 'Vorige',\n back: 'Terug',\n submit: 'Verzenden',\n cancel: 'Annuleren',\n skip: 'Overslaan',\n skipAndSubmit: 'Overslaan en Verzenden',\n loading: 'Laden...',\n error: 'Fout',\n errorPrefix: 'Fout:',\n continue: 'Doorgaan',\n close: 'Sluiten',\n help: 'Help',\n search: 'Zoeken...',\n select: 'Selecteren...',\n noResults: 'Geen resultaten',\n clearAll: 'Alles wissen',\n loadingForm: 'Formulier laden…',\n required: 'verplicht',\n pageXofY: 'Pagina {{current}} van {{total}}',\n stepXofY: 'Stap {{current}} van {{total}}',\n },\n\n fields: {\n firstName: 'Voornaam',\n lastName: 'Achternaam',\n email: 'E-mail',\n phoneNumber: 'Telefoonnummer',\n dateOfBirth: 'Geboortedatum',\n salutation: 'Aanhef',\n title: 'Titel',\n mobileCountryCode: 'Mobiel Landcode',\n street: 'Straat',\n streetNumber: 'Huisnummer',\n zip: 'Postcode',\n city: 'Stad',\n country: 'Land',\n nationality: 'Nationaliteit',\n otherNationalities: 'Andere Nationaliteiten',\n countryOfBirth: 'Geboorteland',\n placeOfBirth: 'Geboorteplaats',\n taxCountry: 'Belastingland',\n taxNumber: 'Belastingnummer',\n defaultLanguage: 'Standaardtaal',\n educationLevel: 'Opleidingsniveau',\n occupation: 'Beroep',\n companyName: 'Bedrijfsnaam',\n companyEmail: 'E-mail',\n companyPhone: 'Telefoon',\n registrationNumber: 'Registratienummer',\n countryOfResidence: 'Land van Verblijf',\n legalAddress: 'Juridisch Adres',\n incorporationDate: 'Oprichtingsdatum',\n controlScheme: 'Controleschema',\n taxId: 'Belasting-ID',\n registrationLocation: 'Registratielocatie',\n website: 'Website',\n postalAddress: 'Postadres',\n state: 'Staat / Provincie',\n postalCode: 'Postcode',\n addressCountry: 'Land',\n lei: 'LEI',\n name: 'Naam',\n notProvided: 'Niet opgegeven',\n addressInformation: 'Adresgegevens',\n },\n\n gender: {\n male: 'Man',\n female: 'Vrouw',\n other: 'Anders',\n },\n\n placeholders: {\n selectSalutation: 'Selecteer aanhef...',\n selectLanguage: 'Selecteer taal...',\n selectOtherNationalities: 'Selecteer andere nationaliteiten...',\n selectCountry: 'Selecteer land…',\n selectNationality: 'Selecteer nationaliteit…',\n selectCountryCode: 'Selecteer landcode…',\n selectOption: 'Selecteer een optie…',\n enterAnswer: 'Voer uw antwoord in…',\n phonePlaceholder: '+31',\n },\n\n createApplicant: {\n title: 'Aanvrager Aanmaken',\n createApplicant: 'Aanvrager Aanmaken',\n externalRefIdRequired: 'Extern Referentie-ID is verplicht. Geef het door via config.applicantForm.externalRefId.',\n failedToCreate: 'Aanvrager aanmaken mislukt',\n },\n\n createCompany: {\n title: 'Bedrijfsregistratie',\n registerCompany: 'Bedrijf Registreren',\n failedToCreate: 'Bedrijfsaanvrager aanmaken mislukt',\n },\n\n workflow: {\n loadingWorkflow: 'Workflow laden...',\n errorOccurred: 'Er is een fout opgetreden',\n workflowTransition: 'Workflow Overgang',\n workflowUpdatedMessage: 'Uw aanvraagworkflow is bijgewerkt op basis van uw voortgang.',\n previousWorkflow: 'Vorige Workflow',\n newWorkflow: 'Nieuwe Workflow',\n continueNewWorkflow: 'Doorgaan met Nieuwe Workflow',\n loadingIdentityVerification: 'Identiteitsverificatie laden...',\n loadingCurrentStep: 'Huidige stap laden...',\n processingStep: 'Stap verwerken:',\n actionType: 'Actietype:',\n },\n\n stepNames: {\n overview: 'Overzicht',\n questionnaire: 'Vragenlijst',\n documents: 'Documenten',\n identity: 'Identiteit',\n riskAssessment: 'Risicobeoordeling',\n investorCategorization: 'Beleggerscategorisering',\n appropriatenessTest: 'Geschiktheidstoets',\n additionalData: 'Aanvullende Gegevens',\n review: 'Beoordeling',\n },\n\n validation: {\n required: '{{field}} is verplicht',\n fieldRequired: '{{field}} is verplicht.',\n invalidFormat: 'Ongeldig formaat',\n minValue: 'Minimumwaarde is {{min}}',\n maxValue: 'Maximumwaarde is {{max}}',\n minLength: 'Minimale lengte is {{min}} tekens',\n maxLength: 'Maximale lengte is {{max}} tekens',\n fileTooLarge: 'Bestand overschrijdt de maximale grootte van {{size}}',\n invalidFileType: 'Ongeldig bestandstype',\n },\n\n questionnaire: {\n errorLoading: 'Fout bij het laden van vragenlijst:',\n },\n\n riskScoring: {\n title: 'Risicobeoordeling',\n subtitle: 'Beantwoord de volgende vragen voor risico-evaluatie',\n loadingCriteria: 'Risicobeoordelingscriteria laden…',\n noCriteria: 'Geen criteria vereist. Doorgaan naar volgende stap…',\n errorLoading: 'Fout bij het laden van criteria:',\n range: 'Bereik: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maximum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Documenten Uploaden',\n loading: 'Documentvereisten laden...',\n errorLoading: 'Fout bij het laden van documentvereisten',\n failedToSubmit: 'Documenten verzenden mislukt. Probeer het opnieuw.',\n uploading: 'Uploaden...',\n clickToUpload: 'Klik om te uploaden',\n orDragDrop: 'of sleep en laat los',\n maxSize: 'Max {{size}}',\n },\n\n overview: {\n title: 'Overzicht',\n loadingOverview: 'Overzichtsgegevens laden...',\n errorLoading: 'Fout bij het laden van overzicht:',\n },\n\n investorCategorization: {\n whichStatement: 'Welke verklaring beschrijft u het beste?',\n retailInvestorInfo: 'Alle klanten van Tokenise worden behandeld als Particuliere Beleggers, tenzij zij aan specifieke criteria voldoen om te worden geclassificeerd als Professionele of Electief Professionele Beleggers. Om u het juiste serviceniveau te bieden, geef aan welke van de volgende beschrijvingen op u van toepassing is.',\n chooseOne: 'Kies er één',\n individualInvestor: 'Individuele belegger',\n individualInvestorDesc: '(Aanbevolen) De meeste van onze klanten kiezen deze optie. U profiteert van het hoogste niveau van regelgevende bescherming.',\n sophisticatedInvestor: 'Ervaren belegger',\n sophisticatedInvestorDesc: 'In de afgelopen 2 jaar heb ik een of meer van de volgende dingen gedaan: aanzienlijke investeringen gedaan in niet-beursgenoteerde bedrijven, directeur geweest van een bedrijf met een omzet van minstens $1 miljoen, of gewerkt in private equity of corporate finance.',\n highNetworthInvestor: 'Vermogende belegger',\n highNetworthInvestorDesc: 'Ik verdien meer dan (USD/EUR) $150.000 per jaar, of ik heb een nettovermogen van meer dan $250.000 (exclusief hoofdverblijf).',\n pleaseSelect: 'Selecteer een beleggerstype',\n failedToSubmit: 'Beleggerscategorisering verzenden mislukt',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Geschiktheidstoets laden mislukt',\n failedToSubmit: 'Toets verzenden mislukt. Probeer het opnieuw.',\n answerAllQuestions: 'Beantwoord alle vragen. {{remaining}} resterend.',\n testPassed: 'Toets Geslaagd',\n testFailed: 'Toets Niet Geslaagd',\n passedMessage: 'Gefeliciteerd! U bent geslaagd voor de toets.',\n failedMessage: 'U bent niet geslaagd voor de toets.',\n loadingTest: 'Toets laden...',\n noTestData: 'Geen toetsgegevens beschikbaar',\n waitBeforeRetrying: 'Wacht voordat u het opnieuw probeert',\n waitTimerMessage: 'U kunt de toets opnieuw proberen zodra de timer verloopt',\n attemptsRemaining: 'U heeft nog {{count}} poging(en) over',\n noAttemptsRemaining: 'Geen pogingen meer over. Neem contact op met ondersteuning voor hulp.',\n retakeTest: 'Toets Opnieuw Doen',\n ok: 'OK',\n startTest: 'Toets Starten',\n questionXofY: 'Vraag {{current}} van {{total}}',\n answered: 'beantwoord',\n attemptsLeft: 'poging(en) over',\n timesUp: 'De tijd is om! Uw antwoorden worden verzonden.',\n submitting: 'Verzenden...',\n submitTest: 'Toets Verzenden',\n questions: 'Vragen',\n timeLimit: 'Tijdslimiet',\n passRequirement: 'Slaagvereiste',\n attemptsLeftLabel: 'Resterende Pogingen',\n correct: '{{count}} correct',\n previousAttempt: 'Vorige poging:',\n allAttemptsUsed: 'U heeft al uw pogingen gebruikt. Neem contact op met ondersteuning voor hulp.',\n },\n\n identity: {\n title: 'Identiteitsverificatie',\n subtitle: 'Voltooi het identiteitsverificatieproces',\n reviewYourInformation: 'Controleer Uw Gegevens',\n reviewSubtitle: 'Controleer en bevestig uw gegevens voordat u de identiteitsverificatie start',\n confirmAndStart: 'Bevestigen en Verificatie Starten',\n invalidUrl: 'Ongeldige verificatie-URL. Start opnieuw.',\n sessionExpired: 'Uw verificatiesessie is verlopen. Start opnieuw.',\n linkExpired: 'Uw verificatielink is verlopen. Start opnieuw.',\n sessionExpiredRestart: 'Sessie verlopen. Start opnieuw.',\n sessionExpiredOrInvalid: 'Sessie verlopen of ongeldig. Start de verificatie opnieuw.',\n sessionIssueTitle: 'Probleem met Verificatiesessie',\n sessionExpiredTitle: 'Sessie Verlopen',\n verificationError: 'Verificatiefout',\n sessionExpiredMessage: 'Uw verificatiesessie is verlopen en moet opnieuw worden gestart.',\n whatToDoNext: 'Wat te doen:',\n clickRestart: 'Klik op \"Verificatie Opnieuw Starten\" hieronder om een nieuwe sessie te genereren',\n completeWithoutDelays: 'Voltooi het verificatieproces zonder vertragingen',\n ifIssuesPersist: 'Als problemen aanhouden, neem contact op met ondersteuning',\n restartVerification: 'Verificatie Opnieuw Starten',\n restarting: 'Opnieuw starten…',\n restart: 'Opnieuw starten',\n failedToRestart: 'Verificatie opnieuw starten mislukt',\n failedToInitialize: 'Initialisatie mislukt: {{message}}',\n configurationError: 'Configuratiefout: {{message}}',\n setupError: 'Installatiefout: {{message}}',\n importantExpiredMessage: 'Belangrijk: Als u een \"verlopen\" of \"ongeldige link\" melding ziet, klik dan op \"Opnieuw starten\" om een nieuwe verificatiesessie te genereren.',\n deviceRiskAssessment: 'Apparaat Risicobeoordeling',\n analyzingDevice: 'Apparaatbeveiliging en gedragspatronen analyseren...',\n pleaseWaitDevice: 'Even geduld terwijl we de beveiliging van uw apparaat verifiëren',\n automaticProcess: 'Dit proces is automatisch en wordt binnen enkele seconden voltooid',\n loadingIdentity: 'Identiteitsverificatie laden...',\n },\n\n status: {\n verificationApproved: 'Verificatie Goedgekeurd',\n verificationApprovedMsg: 'Uw identiteitsverificatie is succesvol goedgekeurd.',\n verificationRejected: 'Verificatie Afgewezen',\n verificationRejectedMsg: 'Helaas is uw identiteitsverificatie niet goedgekeurd.',\n verificationPending: 'Verificatie In Behandeling',\n verificationPendingMsg: 'Uw identiteitsverificatie wordt momenteel verwerkt.',\n applicationApproved: 'Aanvraag Goedgekeurd',\n applicationApprovedMsg: 'Uw aanvraag is goedgekeurd.',\n applicationRejected: 'Aanvraag Afgewezen',\n applicationRejectedMsg: 'Uw aanvraag is afgewezen.',\n underReview: 'In Beoordeling',\n underReviewMsg: 'Uw aanvraag wordt momenteel handmatig beoordeeld.',\n processComplete: 'Proces Voltooid',\n processCompleteMsg: 'Uw verificatieproces is succesvol voltooid.',\n processFailed: 'Proces Mislukt',\n processFailedMsg: 'Het verificatieproces kon niet worden voltooid.',\n adminReviewRequired: 'Beheerdersbeoordeling Vereist',\n adminReviewRequiredMsg: 'Uw aanvraag vereist beoordeling door een beheerder.',\n processing: 'Verwerken',\n processingMsg: 'Uw aanvraag wordt beoordeeld.',\n whatsNext: 'Wat Nu?',\n identityVerified: 'Uw identiteit is geverifieerd',\n canProceed: 'U kunt nu doorgaan met uw aanvraag',\n allFeaturesAccessible: 'Alle functies zijn nu toegankelijk',\n whatCanYouDo: 'Wat Kunt U Doen?',\n contactSupportTeam: 'Neem contact op met ons ondersteuningsteam voor hulp',\n reviewSubmittedInfo: 'Bekijk de informatie die u heeft ingediend',\n resubmitIfNeeded: 'Dien uw aanvraag opnieuw in indien nodig',\n whatHappensNext: 'Wat Gebeurt Er Nu?',\n teamReviewing: 'Ons team beoordeelt uw aanvraag',\n notifiedByEmail: 'U wordt per e-mail op de hoogte gesteld wanneer de beoordeling is afgerond',\n noActionRequired: 'Er is op dit moment geen actie van u vereist',\n kycStatus: 'KYC Status:',\n reviewStatus: 'Beoordelingsstatus:',\n notAvailable: 'Niet Beschikbaar',\n contactSupport: 'Contact Ondersteuning',\n tryAgain: 'Opnieuw Proberen',\n checkBackLater: 'Kom later terug of wacht op onze e-mailnotificatie',\n },\n\n logo: {\n companyLogo: 'Bedrijfslogo',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const pl: TranslationDictionary = {\n common: {\n next: 'Dalej',\n previous: 'Wstecz',\n back: 'Powrót',\n submit: 'Wyślij',\n cancel: 'Anuluj',\n skip: 'Pomiń',\n skipAndSubmit: 'Pomiń i Wyślij',\n loading: 'Ładowanie...',\n error: 'Błąd',\n errorPrefix: 'Błąd:',\n continue: 'Kontynuuj',\n close: 'Zamknij',\n help: 'Pomoc',\n search: 'Szukaj...',\n select: 'Wybierz...',\n noResults: 'Brak wyników',\n clearAll: 'Wyczyść wszystko',\n loadingForm: 'Ładowanie formularza…',\n required: 'wymagane',\n pageXofY: 'Strona {{current}} z {{total}}',\n stepXofY: 'Krok {{current}} z {{total}}',\n },\n\n fields: {\n firstName: 'Imię',\n lastName: 'Nazwisko',\n email: 'E-mail',\n phoneNumber: 'Numer Telefonu',\n dateOfBirth: 'Data Urodzenia',\n salutation: 'Zwrot Grzecznościowy',\n title: 'Tytuł',\n mobileCountryCode: 'Kod Kraju (Komórkowy)',\n street: 'Ulica',\n streetNumber: 'Numer Domu',\n zip: 'Kod Pocztowy',\n city: 'Miasto',\n country: 'Kraj',\n nationality: 'Narodowość',\n otherNationalities: 'Inne Narodowości',\n countryOfBirth: 'Kraj Urodzenia',\n placeOfBirth: 'Miejsce Urodzenia',\n taxCountry: 'Kraj Podatkowy',\n taxNumber: 'Numer Podatkowy',\n defaultLanguage: 'Język Domyślny',\n educationLevel: 'Poziom Wykształcenia',\n occupation: 'Zawód',\n companyName: 'Nazwa Firmy',\n companyEmail: 'E-mail',\n companyPhone: 'Telefon',\n registrationNumber: 'Numer Rejestracyjny',\n countryOfResidence: 'Kraj Zamieszkania',\n legalAddress: 'Adres Prawny',\n incorporationDate: 'Data Rejestracji',\n controlScheme: 'Schemat Kontroli',\n taxId: 'Numer Identyfikacji Podatkowej',\n registrationLocation: 'Miejsce Rejestracji',\n website: 'Strona Internetowa',\n postalAddress: 'Adres Korespondencyjny',\n state: 'Województwo / Prowincja',\n postalCode: 'Kod Pocztowy',\n addressCountry: 'Kraj',\n lei: 'LEI',\n name: 'Nazwa',\n notProvided: 'Nie podano',\n addressInformation: 'Informacje Adresowe',\n },\n\n gender: {\n male: 'Mężczyzna',\n female: 'Kobieta',\n other: 'Inna',\n },\n\n placeholders: {\n selectSalutation: 'Wybierz zwrot grzecznościowy...',\n selectLanguage: 'Wybierz język...',\n selectOtherNationalities: 'Wybierz inne narodowości...',\n selectCountry: 'Wybierz kraj…',\n selectNationality: 'Wybierz narodowość…',\n selectCountryCode: 'Wybierz kod kraju…',\n selectOption: 'Wybierz opcję…',\n enterAnswer: 'Wpisz swoją odpowiedź…',\n phonePlaceholder: '+48',\n },\n\n createApplicant: {\n title: 'Utwórz Wnioskodawcę',\n createApplicant: 'Utwórz Wnioskodawcę',\n externalRefIdRequired: 'Zewnętrzny identyfikator referencyjny jest wymagany. Przekaż go przez config.applicantForm.externalRefId.',\n failedToCreate: 'Nie udało się utworzyć wnioskodawcy',\n },\n\n createCompany: {\n title: 'Rejestracja Firmy',\n registerCompany: 'Zarejestruj Firmę',\n failedToCreate: 'Nie udało się utworzyć wnioskodawcy firmowego',\n },\n\n workflow: {\n loadingWorkflow: 'Ładowanie procesu...',\n errorOccurred: 'Wystąpił błąd',\n workflowTransition: 'Zmiana Procesu',\n workflowUpdatedMessage: 'Proces Twojego wniosku został zaktualizowany na podstawie Twojego postępu.',\n previousWorkflow: 'Poprzedni Proces',\n newWorkflow: 'Nowy Proces',\n continueNewWorkflow: 'Kontynuuj z Nowym Procesem',\n loadingIdentityVerification: 'Ładowanie weryfikacji tożsamości...',\n loadingCurrentStep: 'Ładowanie bieżącego kroku...',\n processingStep: 'Przetwarzanie kroku:',\n actionType: 'Typ akcji:',\n },\n\n stepNames: {\n overview: 'Przegląd',\n questionnaire: 'Kwestionariusz',\n documents: 'Dokumenty',\n identity: 'Tożsamość',\n riskAssessment: 'Ocena Ryzyka',\n investorCategorization: 'Kategoryzacja Inwestora',\n appropriatenessTest: 'Test Adekwatności',\n additionalData: 'Dodatkowe Dane',\n review: 'Recenzja',\n },\n\n validation: {\n required: '{{field}} jest wymagane',\n fieldRequired: '{{field}} jest wymagane.',\n invalidFormat: 'Nieprawidłowy format',\n minValue: 'Minimalna wartość to {{min}}',\n maxValue: 'Maksymalna wartość to {{max}}',\n minLength: 'Minimalna długość to {{min}} znaków',\n maxLength: 'Maksymalna długość to {{max}} znaków',\n fileTooLarge: 'Plik przekracza maksymalny rozmiar {{size}}',\n invalidFileType: 'Nieprawidłowy typ pliku',\n },\n\n questionnaire: {\n errorLoading: 'Błąd ładowania kwestionariusza:',\n },\n\n riskScoring: {\n title: 'Ocena Ryzyka',\n subtitle: 'Proszę odpowiedzieć na poniższe pytania w celu oceny ryzyka',\n loadingCriteria: 'Ładowanie kryteriów oceny ryzyka…',\n noCriteria: 'Brak wymaganych kryteriów. Przechodzenie do następnego kroku…',\n errorLoading: 'Błąd ładowania kryteriów:',\n range: 'Zakres: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maksimum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Prześlij Dokumenty',\n loading: 'Ładowanie wymagań dotyczących dokumentów...',\n errorLoading: 'Błąd ładowania wymagań dotyczących dokumentów',\n failedToSubmit: 'Nie udało się przesłać dokumentów. Spróbuj ponownie.',\n uploading: 'Przesyłanie...',\n clickToUpload: 'Kliknij, aby przesłać',\n orDragDrop: 'lub przeciągnij i upuść',\n maxSize: 'Maks. {{size}}',\n },\n\n overview: {\n title: 'Przegląd',\n loadingOverview: 'Ładowanie danych przeglądu...',\n errorLoading: 'Błąd ładowania przeglądu:',\n },\n\n investorCategorization: {\n whichStatement: 'Które stwierdzenie najlepiej Cię opisuje?',\n retailInvestorInfo: 'Wszyscy klienci Tokenise są traktowani jako Inwestorzy Detaliczni, chyba że spełniają określone kryteria, aby zostać sklasyfikowani jako Inwestorzy Profesjonalni lub Elektywni Profesjonalni. Aby zapewnić Ci odpowiedni poziom usług, wskaż, które z poniższych opisów Cię dotyczą.',\n chooseOne: 'Wybierz jedną opcję',\n individualInvestor: 'Inwestor indywidualny',\n individualInvestorDesc: '(Zalecane) Większość naszych klientów wybiera tę opcję. Będziesz korzystać z najwyższego poziomu ochrony regulacyjnej.',\n sophisticatedInvestor: 'Inwestor zaawansowany',\n sophisticatedInvestorDesc: 'W ciągu ostatnich 2 lat wykonałem jedną lub więcej z następujących czynności: dokonałem znaczących inwestycji w spółki nienotowane, byłem dyrektorem spółki o obrotach co najmniej 1 milion dolarów lub pracowałem w private equity lub finansach korporacyjnych.',\n highNetworthInvestor: 'Inwestor o wysokim majątku',\n highNetworthInvestorDesc: 'Zarabiam więcej niż (USD/EUR) 150 000 $ rocznie lub posiadam aktywa netto o wartości powyżej 250 000 $ (z wyłączeniem głównego miejsca zamieszkania).',\n pleaseSelect: 'Proszę wybrać typ inwestora',\n failedToSubmit: 'Nie udało się przesłać kategoryzacji inwestora',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Nie udało się załadować testu adekwatności',\n failedToSubmit: 'Nie udało się przesłać testu. Spróbuj ponownie.',\n answerAllQuestions: 'Proszę odpowiedzieć na wszystkie pytania. Pozostało {{remaining}}.',\n testPassed: 'Test Zaliczony',\n testFailed: 'Test Niezaliczony',\n passedMessage: 'Gratulacje! Zdałeś test.',\n failedMessage: 'Nie zdałeś testu.',\n loadingTest: 'Ładowanie testu...',\n noTestData: 'Brak dostępnych danych testowych',\n waitBeforeRetrying: 'Poczekaj przed ponowną próbą',\n waitTimerMessage: 'Możesz ponownie przystąpić do testu po upływie czasu',\n attemptsRemaining: 'Pozostało {{count}} prób(a/y)',\n noAttemptsRemaining: 'Brak pozostałych prób. Skontaktuj się z pomocą techniczną.',\n retakeTest: 'Powtórz Test',\n ok: 'OK',\n startTest: 'Rozpocznij Test',\n questionXofY: 'Pytanie {{current}} z {{total}}',\n answered: 'odpowiedziane',\n attemptsLeft: 'pozostałych prób',\n timesUp: 'Czas minął! Twoje odpowiedzi są przesyłane.',\n submitting: 'Przesyłanie...',\n submitTest: 'Wyślij Test',\n questions: 'Pytania',\n timeLimit: 'Limit Czasu',\n passRequirement: 'Wymaganie Zaliczenia',\n attemptsLeftLabel: 'Pozostałe Próby',\n correct: '{{count}} poprawnych',\n previousAttempt: 'Poprzednia próba:',\n allAttemptsUsed: 'Wykorzystałeś wszystkie próby. Skontaktuj się z pomocą techniczną.',\n },\n\n identity: {\n title: 'Weryfikacja Tożsamości',\n subtitle: 'Proszę ukończyć proces weryfikacji tożsamości',\n reviewYourInformation: 'Przejrzyj Swoje Dane',\n reviewSubtitle: 'Przejrzyj i potwierdź swoje dane przed rozpoczęciem weryfikacji tożsamości',\n confirmAndStart: 'Potwierdź i Rozpocznij Weryfikację',\n invalidUrl: 'Nieprawidłowy adres URL weryfikacji. Proszę rozpocząć ponownie.',\n sessionExpired: 'Twoja sesja weryfikacji wygasła. Proszę rozpocząć ponownie.',\n linkExpired: 'Twój link weryfikacyjny wygasł. Proszę rozpocząć ponownie.',\n sessionExpiredRestart: 'Sesja wygasła. Proszę rozpocząć ponownie.',\n sessionExpiredOrInvalid: 'Sesja wygasła lub jest nieprawidłowa. Proszę ponownie rozpocząć weryfikację.',\n sessionIssueTitle: 'Problem z Sesją Weryfikacji',\n sessionExpiredTitle: 'Sesja Wygasła',\n verificationError: 'Błąd Weryfikacji',\n sessionExpiredMessage: 'Twoja sesja weryfikacji wygasła i wymaga ponownego uruchomienia.',\n whatToDoNext: 'Co zrobić dalej:',\n clickRestart: 'Kliknij \"Uruchom Ponownie Weryfikację\" poniżej, aby wygenerować nową sesję',\n completeWithoutDelays: 'Ukończ proces weryfikacji bez opóźnień',\n ifIssuesPersist: 'Jeśli problemy się powtarzają, skontaktuj się z pomocą techniczną',\n restartVerification: 'Uruchom Ponownie Weryfikację',\n restarting: 'Ponowne uruchamianie…',\n restart: 'Uruchom ponownie',\n failedToRestart: 'Nie udało się ponownie uruchomić weryfikacji',\n failedToInitialize: 'Nie udało się zainicjalizować: {{message}}',\n configurationError: 'Błąd konfiguracji: {{message}}',\n setupError: 'Błąd konfiguracji: {{message}}',\n importantExpiredMessage: 'Ważne: Jeśli widzisz komunikat \"wygasło\" lub \"nieprawidłowy link\", kliknij \"Uruchom ponownie\", aby wygenerować nową sesję weryfikacji.',\n deviceRiskAssessment: 'Ocena Ryzyka Urządzenia',\n analyzingDevice: 'Analizowanie bezpieczeństwa urządzenia i wzorców behawioralnych...',\n pleaseWaitDevice: 'Proszę czekać, weryfikujemy bezpieczeństwo Twojego urządzenia',\n automaticProcess: 'Ten proces jest automatyczny i zakończy się w ciągu kilku sekund',\n loadingIdentity: 'Ładowanie weryfikacji tożsamości...',\n },\n\n status: {\n verificationApproved: 'Weryfikacja Zatwierdzona',\n verificationApprovedMsg: 'Twoja weryfikacja tożsamości została pomyślnie zatwierdzona.',\n verificationRejected: 'Weryfikacja Odrzucona',\n verificationRejectedMsg: 'Niestety Twoja weryfikacja tożsamości nie została zatwierdzona.',\n verificationPending: 'Weryfikacja w Toku',\n verificationPendingMsg: 'Twoja weryfikacja tożsamości jest obecnie przetwarzana.',\n applicationApproved: 'Wniosek Zatwierdzony',\n applicationApprovedMsg: 'Twój wniosek został zatwierdzony.',\n applicationRejected: 'Wniosek Odrzucony',\n applicationRejectedMsg: 'Twój wniosek został odrzucony.',\n underReview: 'W Trakcie Przeglądu',\n underReviewMsg: 'Twój wniosek jest obecnie weryfikowany ręcznie.',\n processComplete: 'Proces Zakończony',\n processCompleteMsg: 'Twój proces weryfikacji został pomyślnie zakończony.',\n processFailed: 'Proces Nieudany',\n processFailedMsg: 'Proces weryfikacji nie mógł zostać ukończony.',\n adminReviewRequired: 'Wymagany Przegląd Administratora',\n adminReviewRequiredMsg: 'Twój wniosek wymaga przeglądu przez administratora.',\n processing: 'Przetwarzanie',\n processingMsg: 'Twój wniosek jest weryfikowany.',\n whatsNext: 'Co Dalej?',\n identityVerified: 'Twoja tożsamość została zweryfikowana',\n canProceed: 'Możesz teraz kontynuować swój wniosek',\n allFeaturesAccessible: 'Wszystkie funkcje są teraz dostępne',\n whatCanYouDo: 'Co Możesz Zrobić?',\n contactSupportTeam: 'Skontaktuj się z naszym zespołem wsparcia w celu uzyskania pomocy',\n reviewSubmittedInfo: 'Przejrzyj przesłane informacje',\n resubmitIfNeeded: 'Prześlij ponownie swój wniosek, jeśli to konieczne',\n whatHappensNext: 'Co Stanie Się Dalej?',\n teamReviewing: 'Nasz zespół weryfikuje Twój wniosek',\n notifiedByEmail: 'Zostaniesz powiadomiony e-mailem po zakończeniu weryfikacji',\n noActionRequired: 'W tej chwili nie jest wymagane żadne działanie z Twojej strony',\n kycStatus: 'Status KYC:',\n reviewStatus: 'Status Przeglądu:',\n notAvailable: 'Niedostępne',\n contactSupport: 'Kontakt z Pomocą',\n tryAgain: 'Spróbuj Ponownie',\n checkBackLater: 'Sprawdź ponownie później lub poczekaj na powiadomienie e-mailowe',\n },\n\n logo: {\n companyLogo: 'Logo Firmy',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const ru: TranslationDictionary = {\n common: {\n next: 'Далее',\n previous: 'Назад',\n back: 'Назад',\n submit: 'Отправить',\n cancel: 'Отмена',\n skip: 'Пропустить',\n skipAndSubmit: 'Пропустить и Отправить',\n loading: 'Загрузка...',\n error: 'Ошибка',\n errorPrefix: 'Ошибка:',\n continue: 'Продолжить',\n close: 'Закрыть',\n help: 'Помощь',\n search: 'Поиск...',\n select: 'Выбрать...',\n noResults: 'Нет результатов',\n clearAll: 'Очистить всё',\n loadingForm: 'Загрузка формы…',\n required: 'обязательно',\n pageXofY: 'Страница {{current}} из {{total}}',\n stepXofY: 'Шаг {{current}} из {{total}}',\n },\n\n fields: {\n firstName: 'Имя',\n lastName: 'Фамилия',\n email: 'Электронная почта',\n phoneNumber: 'Номер телефона',\n dateOfBirth: 'Дата рождения',\n salutation: 'Обращение',\n title: 'Титул',\n mobileCountryCode: 'Код страны (мобильный)',\n street: 'Улица',\n streetNumber: 'Номер дома',\n zip: 'Почтовый индекс',\n city: 'Город',\n country: 'Страна',\n nationality: 'Гражданство',\n otherNationalities: 'Другие гражданства',\n countryOfBirth: 'Страна рождения',\n placeOfBirth: 'Место рождения',\n taxCountry: 'Страна налогообложения',\n taxNumber: 'Налоговый номер',\n defaultLanguage: 'Язык по умолчанию',\n educationLevel: 'Уровень образования',\n occupation: 'Род занятий',\n companyName: 'Название компании',\n companyEmail: 'Электронная почта',\n companyPhone: 'Телефон',\n registrationNumber: 'Регистрационный номер',\n countryOfResidence: 'Страна проживания',\n legalAddress: 'Юридический адрес',\n incorporationDate: 'Дата регистрации',\n controlScheme: 'Схема контроля',\n taxId: 'ИНН',\n registrationLocation: 'Место регистрации',\n website: 'Веб-сайт',\n postalAddress: 'Почтовый адрес',\n state: 'Область / Регион',\n postalCode: 'Почтовый индекс',\n addressCountry: 'Страна',\n lei: 'LEI',\n name: 'Название',\n notProvided: 'Не указано',\n addressInformation: 'Адресные данные',\n },\n\n gender: {\n male: 'Мужской',\n female: 'Женский',\n other: 'Другой',\n },\n\n placeholders: {\n selectSalutation: 'Выберите обращение...',\n selectLanguage: 'Выберите язык...',\n selectOtherNationalities: 'Выберите другие гражданства...',\n selectCountry: 'Выберите страну…',\n selectNationality: 'Выберите гражданство…',\n selectCountryCode: 'Выберите код страны…',\n selectOption: 'Выберите вариант…',\n enterAnswer: 'Введите ваш ответ…',\n phonePlaceholder: '+7',\n },\n\n createApplicant: {\n title: 'Создать Заявителя',\n createApplicant: 'Создать Заявителя',\n externalRefIdRequired: 'Внешний идентификатор обязателен. Передайте его через config.applicantForm.externalRefId.',\n failedToCreate: 'Не удалось создать заявителя',\n },\n\n createCompany: {\n title: 'Регистрация Компании',\n registerCompany: 'Зарегистрировать Компанию',\n failedToCreate: 'Не удалось создать заявителя-компанию',\n },\n\n workflow: {\n loadingWorkflow: 'Загрузка рабочего процесса...',\n errorOccurred: 'Произошла ошибка',\n workflowTransition: 'Переход Рабочего Процесса',\n workflowUpdatedMessage: 'Рабочий процесс вашей заявки был обновлён на основе вашего прогресса.',\n previousWorkflow: 'Предыдущий Рабочий Процесс',\n newWorkflow: 'Новый Рабочий Процесс',\n continueNewWorkflow: 'Продолжить с Новым Рабочим Процессом',\n loadingIdentityVerification: 'Загрузка верификации личности...',\n loadingCurrentStep: 'Загрузка текущего шага...',\n processingStep: 'Обработка шага:',\n actionType: 'Тип действия:',\n },\n\n stepNames: {\n overview: 'Обзор',\n questionnaire: 'Анкета',\n documents: 'Документы',\n identity: 'Личность',\n riskAssessment: 'Оценка Рисков',\n investorCategorization: 'Категоризация Инвестора',\n appropriatenessTest: 'Тест на Соответствие',\n additionalData: 'Дополнительные Данные',\n review: 'Проверка',\n },\n\n validation: {\n required: '{{field}} обязательно для заполнения',\n fieldRequired: '{{field}} обязательно для заполнения.',\n invalidFormat: 'Неверный формат',\n minValue: 'Минимальное значение — {{min}}',\n maxValue: 'Максимальное значение — {{max}}',\n minLength: 'Минимальная длина — {{min}} символов',\n maxLength: 'Максимальная длина — {{max}} символов',\n fileTooLarge: 'Файл превышает максимальный размер {{size}}',\n invalidFileType: 'Неверный тип файла',\n },\n\n questionnaire: {\n errorLoading: 'Ошибка загрузки анкеты:',\n },\n\n riskScoring: {\n title: 'Оценка Рисков',\n subtitle: 'Пожалуйста, ответьте на следующие вопросы для оценки рисков',\n loadingCriteria: 'Загрузка критериев оценки рисков…',\n noCriteria: 'Критерии не требуются. Переход к следующему шагу…',\n errorLoading: 'Ошибка загрузки критериев:',\n range: 'Диапазон: {{min}} – {{max}}',\n minimum: 'Минимум: {{min}}',\n maximum: 'Максимум: {{max}}',\n },\n\n uploadDocument: {\n title: 'Загрузка Документов',\n loading: 'Загрузка требований к документам...',\n errorLoading: 'Ошибка загрузки требований к документам',\n failedToSubmit: 'Не удалось отправить документы. Пожалуйста, попробуйте снова.',\n uploading: 'Загрузка...',\n clickToUpload: 'Нажмите для загрузки',\n orDragDrop: 'или перетащите файл',\n maxSize: 'Макс. {{size}}',\n },\n\n overview: {\n title: 'Обзор',\n loadingOverview: 'Загрузка данных обзора...',\n errorLoading: 'Ошибка загрузки обзора:',\n },\n\n investorCategorization: {\n whichStatement: 'Какое утверждение лучше всего вас описывает?',\n retailInvestorInfo: 'Все клиенты Tokenise рассматриваются как Розничные Инвесторы, если они не соответствуют определённым критериям для классификации в качестве Профессиональных или Элективных Профессиональных Инвесторов. Чтобы обеспечить вам соответствующий уровень обслуживания, укажите, какое из следующих описаний вам подходит.',\n chooseOne: 'Выберите один вариант',\n individualInvestor: 'Индивидуальный инвестор',\n individualInvestorDesc: '(Рекомендуется) Большинство наших клиентов выбирают этот вариант. Вы получите наивысший уровень нормативной защиты.',\n sophisticatedInvestor: 'Квалифицированный инвестор',\n sophisticatedInvestorDesc: 'За последние 2 года я совершил одно или несколько из следующих действий: осуществлял значительные инвестиции в некотируемые компании, был директором компании с оборотом не менее $1 млн или работал в сфере прямых инвестиций или корпоративных финансов.',\n highNetworthInvestor: 'Состоятельный инвестор',\n highNetworthInvestorDesc: 'Мой доход превышает (USD/EUR) $150 000 в год, или я владею чистыми активами на сумму более $250 000 (без учёта основного жилья).',\n pleaseSelect: 'Пожалуйста, выберите тип инвестора',\n failedToSubmit: 'Не удалось отправить категоризацию инвестора',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Не удалось загрузить тест на соответствие',\n failedToSubmit: 'Не удалось отправить тест. Пожалуйста, попробуйте снова.',\n answerAllQuestions: 'Пожалуйста, ответьте на все вопросы. Осталось {{remaining}}.',\n testPassed: 'Тест Пройден',\n testFailed: 'Тест Не Пройден',\n passedMessage: 'Поздравляем! Вы прошли тест.',\n failedMessage: 'Вы не прошли тест.',\n loadingTest: 'Загрузка теста...',\n noTestData: 'Данные теста недоступны',\n waitBeforeRetrying: 'Подождите перед повторной попыткой',\n waitTimerMessage: 'Вы сможете пройти тест снова после истечения таймера',\n attemptsRemaining: 'У вас осталось {{count}} попыток(а/и)',\n noAttemptsRemaining: 'Попытки исчерпаны. Обратитесь в службу поддержки за помощью.',\n retakeTest: 'Пройти Тест Заново',\n ok: 'ОК',\n startTest: 'Начать Тест',\n questionXofY: 'Вопрос {{current}} из {{total}}',\n answered: 'отвечено',\n attemptsLeft: 'попыток осталось',\n timesUp: 'Время вышло! Ваши ответы отправляются.',\n submitting: 'Отправка...',\n submitTest: 'Отправить Тест',\n questions: 'Вопросы',\n timeLimit: 'Ограничение по Времени',\n passRequirement: 'Требование для Прохождения',\n attemptsLeftLabel: 'Оставшиеся Попытки',\n correct: '{{count}} правильных',\n previousAttempt: 'Предыдущая попытка:',\n allAttemptsUsed: 'Вы использовали все попытки. Обратитесь в службу поддержки за помощью.',\n },\n\n identity: {\n title: 'Верификация Личности',\n subtitle: 'Пожалуйста, завершите процесс верификации личности',\n reviewYourInformation: 'Проверьте Ваши Данные',\n reviewSubtitle: 'Пожалуйста, проверьте и подтвердите ваши данные перед началом верификации личности',\n confirmAndStart: 'Подтвердить и Начать Верификацию',\n invalidUrl: 'Недействительный URL верификации. Пожалуйста, начните заново.',\n sessionExpired: 'Ваша сессия верификации истекла. Пожалуйста, начните заново.',\n linkExpired: 'Ваша ссылка для верификации истекла. Пожалуйста, начните заново.',\n sessionExpiredRestart: 'Сессия истекла. Пожалуйста, начните заново.',\n sessionExpiredOrInvalid: 'Сессия истекла или недействительна. Пожалуйста, перезапустите верификацию.',\n sessionIssueTitle: 'Проблема с Сессией Верификации',\n sessionExpiredTitle: 'Сессия Истекла',\n verificationError: 'Ошибка Верификации',\n sessionExpiredMessage: 'Ваша сессия верификации истекла и требует перезапуска.',\n whatToDoNext: 'Что делать дальше:',\n clickRestart: 'Нажмите \"Перезапустить Верификацию\" ниже, чтобы создать новую сессию',\n completeWithoutDelays: 'Завершите процесс верификации без задержек',\n ifIssuesPersist: 'Если проблемы сохраняются, обратитесь в службу поддержки',\n restartVerification: 'Перезапустить Верификацию',\n restarting: 'Перезапуск…',\n restart: 'Перезапустить',\n failedToRestart: 'Не удалось перезапустить верификацию',\n failedToInitialize: 'Не удалось инициализировать: {{message}}',\n configurationError: 'Ошибка конфигурации: {{message}}',\n setupError: 'Ошибка настройки: {{message}}',\n importantExpiredMessage: 'Важно: Если вы видите сообщение «истекло» или «недействительная ссылка», нажмите «Перезапустить», чтобы создать новую сессию верификации.',\n deviceRiskAssessment: 'Оценка Рисков Устройства',\n analyzingDevice: 'Анализ безопасности устройства и поведенческих паттернов...',\n pleaseWaitDevice: 'Пожалуйста, подождите, пока мы проверяем безопасность вашего устройства',\n automaticProcess: 'Этот процесс автоматический и завершится через несколько секунд',\n loadingIdentity: 'Загрузка верификации личности...',\n },\n\n status: {\n verificationApproved: 'Верификация Одобрена',\n verificationApprovedMsg: 'Ваша верификация личности успешно одобрена.',\n verificationRejected: 'Верификация Отклонена',\n verificationRejectedMsg: 'К сожалению, ваша верификация личности не была одобрена.',\n verificationPending: 'Верификация на Рассмотрении',\n verificationPendingMsg: 'Ваша верификация личности в настоящее время обрабатывается.',\n applicationApproved: 'Заявка Одобрена',\n applicationApprovedMsg: 'Ваша заявка была одобрена.',\n applicationRejected: 'Заявка Отклонена',\n applicationRejectedMsg: 'Ваша заявка была отклонена.',\n underReview: 'На Рассмотрении',\n underReviewMsg: 'Ваша заявка в настоящее время проходит ручную проверку.',\n processComplete: 'Процесс Завершён',\n processCompleteMsg: 'Ваш процесс верификации успешно завершён.',\n processFailed: 'Процесс Не Удался',\n processFailedMsg: 'Процесс верификации не удалось завершить.',\n adminReviewRequired: 'Требуется Проверка Администратором',\n adminReviewRequiredMsg: 'Ваша заявка требует проверки администратором.',\n processing: 'Обработка',\n processingMsg: 'Ваша заявка рассматривается.',\n whatsNext: 'Что Дальше?',\n identityVerified: 'Ваша личность подтверждена',\n canProceed: 'Теперь вы можете продолжить работу с заявкой',\n allFeaturesAccessible: 'Все функции теперь доступны',\n whatCanYouDo: 'Что Вы Можете Сделать?',\n contactSupportTeam: 'Свяжитесь с нашей службой поддержки для получения помощи',\n reviewSubmittedInfo: 'Проверьте отправленную вами информацию',\n resubmitIfNeeded: 'Повторно отправьте заявку при необходимости',\n whatHappensNext: 'Что Произойдёт Дальше?',\n teamReviewing: 'Наша команда рассматривает вашу заявку',\n notifiedByEmail: 'Вы будете уведомлены по электронной почте, когда проверка будет завершена',\n noActionRequired: 'В настоящее время от вас не требуется никаких действий',\n kycStatus: 'Статус KYC:',\n reviewStatus: 'Статус Проверки:',\n notAvailable: 'Недоступно',\n contactSupport: 'Связаться с Поддержкой',\n tryAgain: 'Попробовать Снова',\n checkBackLater: 'Проверьте позже или дождитесь нашего уведомления по электронной почте',\n },\n\n logo: {\n companyLogo: 'Логотип Компании',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const zh: TranslationDictionary = {\n common: {\n next: '下一步',\n previous: '上一步',\n back: '返回',\n submit: '提交',\n cancel: '取消',\n skip: '跳过',\n skipAndSubmit: '跳过并提交',\n loading: '加载中...',\n error: '错误',\n errorPrefix: '错误:',\n continue: '继续',\n close: '关闭',\n help: '帮助',\n search: '搜索...',\n select: '选择...',\n noResults: '无结果',\n clearAll: '清除全部',\n loadingForm: '正在加载表单…',\n required: '必填',\n pageXofY: '第 {{current}} 页,共 {{total}} 页',\n stepXofY: '第 {{current}} 步,共 {{total}} 步',\n },\n\n fields: {\n firstName: '名',\n lastName: '姓',\n email: '电子邮箱',\n phoneNumber: '电话号码',\n dateOfBirth: '出生日期',\n salutation: '称呼',\n title: '头衔',\n mobileCountryCode: '手机国家代码',\n street: '街道',\n streetNumber: '门牌号',\n zip: '邮政编码',\n city: '城市',\n country: '国家',\n nationality: '国籍',\n otherNationalities: '其他国籍',\n countryOfBirth: '出生国家',\n placeOfBirth: '出生地点',\n taxCountry: '税务国家',\n taxNumber: '税号',\n defaultLanguage: '默认语言',\n educationLevel: '教育水平',\n occupation: '职业',\n companyName: '公司名称',\n companyEmail: '电子邮箱',\n companyPhone: '电话',\n registrationNumber: '注册号',\n countryOfResidence: '居住国家',\n legalAddress: '法定地址',\n incorporationDate: '成立日期',\n controlScheme: '控制方案',\n taxId: '税务编号',\n registrationLocation: '注册地点',\n website: '网站',\n postalAddress: '通讯地址',\n state: '州/省',\n postalCode: '邮政编码',\n addressCountry: '国家',\n lei: 'LEI',\n name: '姓名',\n notProvided: '未提供',\n addressInformation: '地址信息',\n },\n\n gender: {\n male: '男',\n female: '女',\n other: '其他',\n },\n\n placeholders: {\n selectSalutation: '选择称呼...',\n selectLanguage: '选择语言...',\n selectOtherNationalities: '选择其他国籍...',\n selectCountry: '选择国家…',\n selectNationality: '选择国籍…',\n selectCountryCode: '选择国家代码…',\n selectOption: '选择一个选项…',\n enterAnswer: '输入您的答案…',\n phonePlaceholder: '+1',\n },\n\n createApplicant: {\n title: '创建申请人',\n createApplicant: '创建申请人',\n externalRefIdRequired: '外部参考 ID 是必需的。请通过 config.applicantForm.externalRefId 传入。',\n failedToCreate: '创建申请人失败',\n },\n\n createCompany: {\n title: '公司注册',\n registerCompany: '注册公司',\n failedToCreate: '创建公司申请人失败',\n },\n\n workflow: {\n loadingWorkflow: '正在加载工作流...',\n errorOccurred: '发生错误',\n workflowTransition: '工作流转换',\n workflowUpdatedMessage: '您的申请工作流已根据您的进度进行了更新。',\n previousWorkflow: '之前的工作流',\n newWorkflow: '新工作流',\n continueNewWorkflow: '继续新工作流',\n loadingIdentityVerification: '正在加载身份验证...',\n loadingCurrentStep: '正在加载当前步骤...',\n processingStep: '正在处理步骤:',\n actionType: '操作类型:',\n },\n\n stepNames: {\n overview: '概览',\n questionnaire: '问卷',\n documents: '文件',\n identity: '身份',\n riskAssessment: '风险评估',\n investorCategorization: '投资者分类',\n appropriatenessTest: '适当性测试',\n additionalData: '附加数据',\n review: '审核',\n },\n\n validation: {\n required: '{{field}} 是必填项',\n fieldRequired: '{{field}} 是必填项。',\n invalidFormat: '格式无效',\n minValue: '最小值为 {{min}}',\n maxValue: '最大值为 {{max}}',\n minLength: '最小长度为 {{min}} 个字符',\n maxLength: '最大长度为 {{max}} 个字符',\n fileTooLarge: '文件超过最大大小 {{size}}',\n invalidFileType: '文件类型无效',\n },\n\n questionnaire: {\n errorLoading: '加载问卷时出错:',\n },\n\n riskScoring: {\n title: '风险评估',\n subtitle: '请回答以下问题以进行风险评估',\n loadingCriteria: '正在加载风险评分标准…',\n noCriteria: '无需标准。正在跳转到下一步…',\n errorLoading: '加载标准时出错:',\n range: '范围:{{min}} – {{max}}',\n minimum: '最小值:{{min}}',\n maximum: '最大值:{{max}}',\n },\n\n uploadDocument: {\n title: '上传文件',\n loading: '正在加载文件要求...',\n errorLoading: '加载文件要求时出错',\n failedToSubmit: '提交文件失败,请重试。',\n uploading: '上传中...',\n clickToUpload: '点击上传',\n orDragDrop: '或拖放文件',\n maxSize: '最大 {{size}}',\n },\n\n overview: {\n title: '概览',\n loadingOverview: '正在加载概览数据...',\n errorLoading: '加载概览时出错:',\n },\n\n investorCategorization: {\n whichStatement: '哪项描述最符合您的情况?',\n retailInvestorInfo: '所有 Tokenise 客户均被视为零售投资者,除非他们符合被归类为专业投资者或自选专业投资者的特定标准。为了为您提供适当级别的服务,请说明以下哪项描述适用于您。',\n chooseOne: '选择一项',\n individualInvestor: '个人投资者',\n individualInvestorDesc: '(推荐)大多数客户选择此选项。您将获得最高级别的监管保护。',\n sophisticatedInvestor: '专业投资者',\n sophisticatedInvestorDesc: '在过去两年中,我完成了以下一项或多项操作:对非上市公司进行了大量投资、担任过营业额至少为100万美元的公司董事,或在私募股权或企业融资领域工作。',\n highNetworthInvestor: '高净值投资者',\n highNetworthInvestorDesc: '我的年收入超过(美元/欧元)150,000 美元,或我的净资产超过 250,000 美元(不含主要住宅)。',\n pleaseSelect: '请选择投资者类型',\n failedToSubmit: '提交投资者分类失败',\n },\n\n appropriatenessTest: {\n failedToLoad: '加载适当性测试失败',\n failedToSubmit: '提交测试失败,请重试。',\n answerAllQuestions: '请回答所有问题。还剩 {{remaining}} 题。',\n testPassed: '测试通过',\n testFailed: '测试未通过',\n passedMessage: '恭喜!您已通过测试。',\n failedMessage: '您未通过测试。',\n loadingTest: '正在加载测试...',\n noTestData: '没有可用的测试数据',\n waitBeforeRetrying: '请等待后再重试',\n waitTimerMessage: '计时器到期后您可以再次尝试测试',\n attemptsRemaining: '您还有 {{count}} 次尝试机会',\n noAttemptsRemaining: '没有剩余尝试机会。请联系客服获取帮助。',\n retakeTest: '重新测试',\n ok: '确定',\n startTest: '开始测试',\n questionXofY: '第 {{current}} 题,共 {{total}} 题',\n answered: '已回答',\n attemptsLeft: '剩余尝试次数',\n timesUp: '时间到!您的答案正在提交。',\n submitting: '提交中...',\n submitTest: '提交测试',\n questions: '题目',\n timeLimit: '时间限制',\n passRequirement: '通过要求',\n attemptsLeftLabel: '剩余尝试次数',\n correct: '{{count}} 题正确',\n previousAttempt: '上次尝试:',\n allAttemptsUsed: '您已用完所有尝试机会。请联系客服获取帮助。',\n },\n\n identity: {\n title: '身份验证',\n subtitle: '请完成身份验证流程',\n reviewYourInformation: '检查您的信息',\n reviewSubtitle: '请在开始身份验证前检查并确认您的信息',\n confirmAndStart: '确认并开始验证',\n invalidUrl: '验证链接无效。请重新开始。',\n sessionExpired: '您的验证会话已过期。请重新开始。',\n linkExpired: '您的验证链接已过期。请重新开始。',\n sessionExpiredRestart: '会话已过期。请重新开始。',\n sessionExpiredOrInvalid: '会话已过期或无效。请重新开始验证。',\n sessionIssueTitle: '验证会话问题',\n sessionExpiredTitle: '会话已过期',\n verificationError: '验证错误',\n sessionExpiredMessage: '您的验证会话已过期,需要重新启动。',\n whatToDoNext: '接下来怎么做:',\n clickRestart: '点击下方的\"重新验证\"以生成新会话',\n completeWithoutDelays: '请尽快完成验证流程',\n ifIssuesPersist: '如果问题持续存在,请联系客服',\n restartVerification: '重新验证',\n restarting: '正在重新启动…',\n restart: '重新开始',\n failedToRestart: '重新启动验证失败',\n failedToInitialize: '初始化失败:{{message}}',\n configurationError: '配置错误:{{message}}',\n setupError: '设置错误:{{message}}',\n importantExpiredMessage: '重要提示:如果您看到\"已过期\"或\"无效链接\"的消息,请点击\"重新开始\"以生成新的验证会话。',\n deviceRiskAssessment: '设备风险评估',\n analyzingDevice: '正在分析设备安全性和行为模式...',\n pleaseWaitDevice: '请稍候,我们正在验证您的设备安全性',\n automaticProcess: '此过程是自动的,将在几秒钟内完成',\n loadingIdentity: '正在加载身份验证...',\n },\n\n status: {\n verificationApproved: '验证已通过',\n verificationApprovedMsg: '您的身份验证已成功通过。',\n verificationRejected: '验证被拒绝',\n verificationRejectedMsg: '很遗憾,您的身份验证未通过。',\n verificationPending: '验证待处理',\n verificationPendingMsg: '您的身份验证正在处理中。',\n applicationApproved: '申请已通过',\n applicationApprovedMsg: '您的申请已获得批准。',\n applicationRejected: '申请被拒绝',\n applicationRejectedMsg: '您的申请已被拒绝。',\n underReview: '审核中',\n underReviewMsg: '您的申请正在接受人工审核。',\n processComplete: '流程已完成',\n processCompleteMsg: '您的验证流程已成功完成。',\n processFailed: '流程失败',\n processFailedMsg: '验证流程无法完成。',\n adminReviewRequired: '需要管理员审核',\n adminReviewRequiredMsg: '您的申请需要管理员审核。',\n processing: '处理中',\n processingMsg: '您的申请正在审核中。',\n whatsNext: '接下来呢?',\n identityVerified: '您的身份已验证',\n canProceed: '您现在可以继续您的申请',\n allFeaturesAccessible: '所有功能现已开放',\n whatCanYouDo: '您可以做什么?',\n contactSupportTeam: '联系我们的客服团队获取帮助',\n reviewSubmittedInfo: '查看您提交的信息',\n resubmitIfNeeded: '如有需要,重新提交您的申请',\n whatHappensNext: '接下来会发生什么?',\n teamReviewing: '我们的团队正在审核您的申请',\n notifiedByEmail: '审核完成后,我们将通过电子邮件通知您',\n noActionRequired: '目前您无需采取任何操作',\n kycStatus: 'KYC 状态:',\n reviewStatus: '审核状态:',\n notAvailable: '不可用',\n contactSupport: '联系客服',\n tryAgain: '重试',\n checkBackLater: '请稍后再查看或等待我们的电子邮件通知',\n },\n\n logo: {\n companyLogo: '公司标志',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const ja: TranslationDictionary = {\n common: {\n next: '次へ',\n previous: '前へ',\n back: '戻る',\n submit: '送信',\n cancel: 'キャンセル',\n skip: 'スキップ',\n skipAndSubmit: 'スキップして送信',\n loading: '読み込み中...',\n error: 'エラー',\n errorPrefix: 'エラー:',\n continue: '続行',\n close: '閉じる',\n help: 'ヘルプ',\n search: '検索...',\n select: '選択...',\n noResults: '結果なし',\n clearAll: 'すべてクリア',\n loadingForm: 'フォームを読み込み中…',\n required: '必須',\n pageXofY: '{{total}} ページ中 {{current}} ページ',\n stepXofY: '{{total}} ステップ中 {{current}} ステップ',\n },\n\n fields: {\n firstName: '名',\n lastName: '姓',\n email: 'メールアドレス',\n phoneNumber: '電話番号',\n dateOfBirth: '生年月日',\n salutation: '敬称',\n title: '肩書',\n mobileCountryCode: '携帯電話国番号',\n street: '通り',\n streetNumber: '番地',\n zip: '郵便番号',\n city: '市区町村',\n country: '国',\n nationality: '国籍',\n otherNationalities: 'その他の国籍',\n countryOfBirth: '出生国',\n placeOfBirth: '出生地',\n taxCountry: '納税国',\n taxNumber: '納税者番号',\n defaultLanguage: 'デフォルト言語',\n educationLevel: '学歴',\n occupation: '職業',\n companyName: '会社名',\n companyEmail: 'メールアドレス',\n companyPhone: '電話',\n registrationNumber: '登録番号',\n countryOfResidence: '居住国',\n legalAddress: '法定住所',\n incorporationDate: '設立日',\n controlScheme: '管理体制',\n taxId: '税務番号',\n registrationLocation: '登録地',\n website: 'ウェブサイト',\n postalAddress: '郵送先住所',\n state: '都道府県',\n postalCode: '郵便番号',\n addressCountry: '国',\n lei: 'LEI',\n name: '氏名',\n notProvided: '未入力',\n addressInformation: '住所情報',\n },\n\n gender: {\n male: '男性',\n female: '女性',\n other: 'その他',\n },\n\n placeholders: {\n selectSalutation: '敬称を選択...',\n selectLanguage: '言語を選択...',\n selectOtherNationalities: 'その他の国籍を選択...',\n selectCountry: '国を選択…',\n selectNationality: '国籍を選択…',\n selectCountryCode: '国番号を選択…',\n selectOption: 'オプションを選択…',\n enterAnswer: '回答を入力…',\n phonePlaceholder: '+1',\n },\n\n createApplicant: {\n title: '申請者を作成',\n createApplicant: '申請者を作成',\n externalRefIdRequired: '外部参照IDが必要です。config.applicantForm.externalRefId から入力してください。',\n failedToCreate: '申請者の作成に失敗しました',\n },\n\n createCompany: {\n title: '会社登録',\n registerCompany: '会社を登録',\n failedToCreate: '会社申請者の作成に失敗しました',\n },\n\n workflow: {\n loadingWorkflow: 'ワークフローを読み込み中...',\n errorOccurred: 'エラーが発生しました',\n workflowTransition: 'ワークフローの移行',\n workflowUpdatedMessage: '進捗状況に基づいて申請ワークフローが更新されました。',\n previousWorkflow: '以前のワークフロー',\n newWorkflow: '新しいワークフロー',\n continueNewWorkflow: '新しいワークフローで続行',\n loadingIdentityVerification: '本人確認を読み込み中...',\n loadingCurrentStep: '現在のステップを読み込み中...',\n processingStep: 'ステップ処理中:',\n actionType: 'アクションタイプ:',\n },\n\n stepNames: {\n overview: '概要',\n questionnaire: 'アンケート',\n documents: '書類',\n identity: '本人確認',\n riskAssessment: 'リスク評価',\n investorCategorization: '投資家分類',\n appropriatenessTest: '適合性テスト',\n additionalData: '追加データ',\n review: '審査',\n },\n\n validation: {\n required: '{{field}} は必須です',\n fieldRequired: '{{field}} は必須です。',\n invalidFormat: '形式が無効です',\n minValue: '最小値は {{min}} です',\n maxValue: '最大値は {{max}} です',\n minLength: '最小文字数は {{min}} 文字です',\n maxLength: '最大文字数は {{max}} 文字です',\n fileTooLarge: 'ファイルが最大サイズ {{size}} を超えています',\n invalidFileType: 'ファイル形式が無効です',\n },\n\n questionnaire: {\n errorLoading: 'アンケートの読み込みエラー:',\n },\n\n riskScoring: {\n title: 'リスク評価',\n subtitle: 'リスク評価のために以下の質問にお答えください',\n loadingCriteria: 'リスクスコアリング基準を読み込み中…',\n noCriteria: '基準は不要です。次のステップに進みます…',\n errorLoading: '基準の読み込みエラー:',\n range: '範囲:{{min}} – {{max}}',\n minimum: '最小値:{{min}}',\n maximum: '最大値:{{max}}',\n },\n\n uploadDocument: {\n title: '書類のアップロード',\n loading: '書類要件を読み込み中...',\n errorLoading: '書類要件の読み込みエラー',\n failedToSubmit: '書類の送信に失敗しました。もう一度お試しください。',\n uploading: 'アップロード中...',\n clickToUpload: 'クリックしてアップロード',\n orDragDrop: 'またはドラッグ&ドロップ',\n maxSize: '最大 {{size}}',\n },\n\n overview: {\n title: '概要',\n loadingOverview: '概要データを読み込み中...',\n errorLoading: '概要の読み込みエラー:',\n },\n\n investorCategorization: {\n whichStatement: 'あなたに最も当てはまる記述はどれですか?',\n retailInvestorInfo: 'すべての Tokenise クライアントは、専門投資家または選択的専門投資家として分類される特定の基準を満たさない限り、リテール投資家として扱われます。適切なレベルのサービスを提供するために、以下の説明のうちどれが該当するかをお知らせください。',\n chooseOne: '一つ選択',\n individualInvestor: '個人投資家',\n individualInvestorDesc: '(推奨)ほとんどのクライアントがこのオプションを選択しています。最高レベルの規制保護を受けることができます。',\n sophisticatedInvestor: '洗練された投資家',\n sophisticatedInvestorDesc: '過去2年間に、以下の一つ以上を行いました:非上場企業への大規模投資、売上高100万ドル以上の企業の取締役就任、またはプライベートエクイティまたはコーポレートファイナンスでの勤務。',\n highNetworthInvestor: '高額資産投資家',\n highNetworthInvestorDesc: '年収が(米ドル/ユーロ)150,000ドルを超える、または純資産が250,000ドルを超えています(主たる住居を除く)。',\n pleaseSelect: '投資家タイプを選択してください',\n failedToSubmit: '投資家分類の送信に失敗しました',\n },\n\n appropriatenessTest: {\n failedToLoad: '適合性テストの読み込みに失敗しました',\n failedToSubmit: 'テストの送信に失敗しました。もう一度お試しください。',\n answerAllQuestions: 'すべての質問にお答えください。残り {{remaining}} 問。',\n testPassed: 'テスト合格',\n testFailed: 'テスト不合格',\n passedMessage: 'おめでとうございます!テストに合格しました。',\n failedMessage: 'テストに合格できませんでした。',\n loadingTest: 'テストを読み込み中...',\n noTestData: 'テストデータがありません',\n waitBeforeRetrying: '再試行する前にお待ちください',\n waitTimerMessage: 'タイマーが終了すると再度テストを受けることができます',\n attemptsRemaining: '残り {{count}} 回の試行が可能です',\n noAttemptsRemaining: '残りの試行回数がありません。サポートにお問い合わせください。',\n retakeTest: '再テスト',\n ok: 'OK',\n startTest: 'テスト開始',\n questionXofY: '{{total}} 問中 {{current}} 問',\n answered: '回答済み',\n attemptsLeft: '残り試行回数',\n timesUp: '時間切れです!回答を送信しています。',\n submitting: '送信中...',\n submitTest: 'テストを送信',\n questions: '質問',\n timeLimit: '制限時間',\n passRequirement: '合格要件',\n attemptsLeftLabel: '残り試行回数',\n correct: '{{count}} 問正解',\n previousAttempt: '前回の試行:',\n allAttemptsUsed: 'すべての試行回数を使い切りました。サポートにお問い合わせください。',\n },\n\n identity: {\n title: '本人確認',\n subtitle: '本人確認プロセスを完了してください',\n reviewYourInformation: '情報の確認',\n reviewSubtitle: '本人確認を開始する前に、情報を確認してください',\n confirmAndStart: '確認して認証を開始',\n invalidUrl: '認証URLが無効です。やり直してください。',\n sessionExpired: '認証セッションの有効期限が切れました。やり直してください。',\n linkExpired: '認証リンクの有効期限が切れました。やり直してください。',\n sessionExpiredRestart: 'セッションの有効期限が切れました。やり直してください。',\n sessionExpiredOrInvalid: 'セッションの有効期限が切れたか無効です。認証をやり直してください。',\n sessionIssueTitle: '認証セッションの問題',\n sessionExpiredTitle: 'セッション期限切れ',\n verificationError: '認証エラー',\n sessionExpiredMessage: '認証セッションの有効期限が切れたため、再開する必要があります。',\n whatToDoNext: '次にすべきこと:',\n clickRestart: '下の「認証を再開」をクリックして新しいセッションを生成してください',\n completeWithoutDelays: '認証プロセスを遅延なく完了してください',\n ifIssuesPersist: '問題が続く場合はサポートにお問い合わせください',\n restartVerification: '認証を再開',\n restarting: '再開中…',\n restart: '再開',\n failedToRestart: '認証の再開に失敗しました',\n failedToInitialize: '初期化に失敗しました:{{message}}',\n configurationError: '設定エラー:{{message}}',\n setupError: 'セットアップエラー:{{message}}',\n importantExpiredMessage: '重要:「期限切れ」または「無効なリンク」のメッセージが表示された場合は、「再開」をクリックして新しい認証セッションを生成してください。',\n deviceRiskAssessment: 'デバイスリスク評価',\n analyzingDevice: 'デバイスのセキュリティと行動パターンを分析中...',\n pleaseWaitDevice: 'デバイスのセキュリティを確認しています。お待ちください',\n automaticProcess: 'このプロセスは自動で、数秒で完了します',\n loadingIdentity: '本人確認を読み込み中...',\n },\n\n status: {\n verificationApproved: '認証承認済み',\n verificationApprovedMsg: '本人確認が正常に承認されました。',\n verificationRejected: '認証却下',\n verificationRejectedMsg: '残念ながら、本人確認は承認されませんでした。',\n verificationPending: '認証保留中',\n verificationPendingMsg: '本人確認は現在処理中です。',\n applicationApproved: '申請承認済み',\n applicationApprovedMsg: '申請が承認されました。',\n applicationRejected: '申請却下',\n applicationRejectedMsg: '申請が却下されました。',\n underReview: '審査中',\n underReviewMsg: '申請は現在手動審査中です。',\n processComplete: 'プロセス完了',\n processCompleteMsg: '認証プロセスが正常に完了しました。',\n processFailed: 'プロセス失敗',\n processFailedMsg: '認証プロセスを完了できませんでした。',\n adminReviewRequired: '管理者の審査が必要',\n adminReviewRequiredMsg: '申請には管理者の審査が必要です。',\n processing: '処理中',\n processingMsg: '申請を審査中です。',\n whatsNext: '次のステップは?',\n identityVerified: '本人確認が完了しました',\n canProceed: '申請を続行できます',\n allFeaturesAccessible: 'すべての機能が利用可能になりました',\n whatCanYouDo: '何ができますか?',\n contactSupportTeam: 'サポートチームにお問い合わせください',\n reviewSubmittedInfo: '送信した情報を確認する',\n resubmitIfNeeded: '必要に応じて申請を再送信する',\n whatHappensNext: '次に何が起こりますか?',\n teamReviewing: '当社のチームが申請を審査しています',\n notifiedByEmail: '審査完了時にメールでお知らせします',\n noActionRequired: '現時点でお客様のご対応は不要です',\n kycStatus: 'KYC ステータス:',\n reviewStatus: '審査ステータス:',\n notAvailable: '利用不可',\n contactSupport: 'サポートに連絡',\n tryAgain: 'もう一度試す',\n checkBackLater: '後で再度ご確認いただくか、メール通知をお待ちください',\n },\n\n logo: {\n companyLogo: '会社ロゴ',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const ar: TranslationDictionary = {\n common: {\n next: 'التالي',\n previous: 'السابق',\n back: 'رجوع',\n submit: 'إرسال',\n cancel: 'إلغاء',\n skip: 'تخطي',\n skipAndSubmit: 'تخطي وإرسال',\n loading: 'جارٍ التحميل...',\n error: 'خطأ',\n errorPrefix: 'خطأ:',\n continue: 'متابعة',\n close: 'إغلاق',\n help: 'مساعدة',\n search: 'بحث...',\n select: 'اختر...',\n noResults: 'لا توجد نتائج',\n clearAll: 'مسح الكل',\n loadingForm: 'جارٍ تحميل النموذج…',\n required: 'مطلوب',\n pageXofY: 'الصفحة {{current}} من {{total}}',\n stepXofY: 'الخطوة {{current}} من {{total}}',\n },\n\n fields: {\n firstName: 'الاسم الأول',\n lastName: 'اسم العائلة',\n email: 'البريد الإلكتروني',\n phoneNumber: 'رقم الهاتف',\n dateOfBirth: 'تاريخ الميلاد',\n salutation: 'التحية',\n title: 'اللقب',\n mobileCountryCode: 'رمز البلد للهاتف المحمول',\n street: 'الشارع',\n streetNumber: 'رقم الشارع',\n zip: 'الرمز البريدي',\n city: 'المدينة',\n country: 'البلد',\n nationality: 'الجنسية',\n otherNationalities: 'جنسيات أخرى',\n countryOfBirth: 'بلد الميلاد',\n placeOfBirth: 'مكان الميلاد',\n taxCountry: 'بلد الضريبة',\n taxNumber: 'الرقم الضريبي',\n defaultLanguage: 'اللغة الافتراضية',\n educationLevel: 'المستوى التعليمي',\n occupation: 'المهنة',\n companyName: 'اسم الشركة',\n companyEmail: 'البريد الإلكتروني',\n companyPhone: 'الهاتف',\n registrationNumber: 'رقم التسجيل',\n countryOfResidence: 'بلد الإقامة',\n legalAddress: 'العنوان القانوني',\n incorporationDate: 'تاريخ التأسيس',\n controlScheme: 'نظام السيطرة',\n taxId: 'المعرّف الضريبي',\n registrationLocation: 'مكان التسجيل',\n website: 'الموقع الإلكتروني',\n postalAddress: 'العنوان البريدي',\n state: 'الولاية / المقاطعة',\n postalCode: 'الرمز البريدي',\n addressCountry: 'البلد',\n lei: 'LEI',\n name: 'الاسم',\n notProvided: 'غير مُقدَّم',\n addressInformation: 'معلومات العنوان',\n },\n\n gender: {\n male: 'ذكر',\n female: 'أنثى',\n other: 'أخرى',\n },\n\n placeholders: {\n selectSalutation: 'اختر التحية...',\n selectLanguage: 'اختر اللغة...',\n selectOtherNationalities: 'اختر جنسيات أخرى...',\n selectCountry: 'اختر البلد…',\n selectNationality: 'اختر الجنسية…',\n selectCountryCode: 'اختر رمز البلد…',\n selectOption: 'اختر خياراً…',\n enterAnswer: 'أدخل إجابتك…',\n phonePlaceholder: '+1',\n },\n\n createApplicant: {\n title: 'إنشاء مقدّم طلب',\n createApplicant: 'إنشاء مقدّم طلب',\n externalRefIdRequired: 'معرّف المرجع الخارجي مطلوب. يرجى تمريره عبر config.applicantForm.externalRefId.',\n failedToCreate: 'فشل في إنشاء مقدّم الطلب',\n },\n\n createCompany: {\n title: 'تسجيل الشركة',\n registerCompany: 'تسجيل الشركة',\n failedToCreate: 'فشل في إنشاء مقدّم طلب الشركة',\n },\n\n workflow: {\n loadingWorkflow: 'جارٍ تحميل سير العمل...',\n errorOccurred: 'حدث خطأ',\n workflowTransition: 'انتقال سير العمل',\n workflowUpdatedMessage: 'تم تحديث سير عمل طلبك بناءً على تقدمك.',\n previousWorkflow: 'سير العمل السابق',\n newWorkflow: 'سير العمل الجديد',\n continueNewWorkflow: 'المتابعة مع سير العمل الجديد',\n loadingIdentityVerification: 'جارٍ تحميل التحقق من الهوية...',\n loadingCurrentStep: 'جارٍ تحميل الخطوة الحالية...',\n processingStep: 'جارٍ معالجة الخطوة:',\n actionType: 'نوع الإجراء:',\n },\n\n stepNames: {\n overview: 'نظرة عامة',\n questionnaire: 'الاستبيان',\n documents: 'المستندات',\n identity: 'الهوية',\n riskAssessment: 'تقييم المخاطر',\n investorCategorization: 'تصنيف المستثمر',\n appropriatenessTest: 'اختبار الملاءمة',\n additionalData: 'بيانات إضافية',\n review: 'المراجعة',\n },\n\n validation: {\n required: '{{field}} مطلوب',\n fieldRequired: '{{field}} مطلوب.',\n invalidFormat: 'صيغة غير صالحة',\n minValue: 'الحد الأدنى للقيمة هو {{min}}',\n maxValue: 'الحد الأقصى للقيمة هو {{max}}',\n minLength: 'الحد الأدنى للطول هو {{min}} حرفاً',\n maxLength: 'الحد الأقصى للطول هو {{max}} حرفاً',\n fileTooLarge: 'الملف يتجاوز الحجم الأقصى {{size}}',\n invalidFileType: 'نوع الملف غير صالح',\n },\n\n questionnaire: {\n errorLoading: 'خطأ في تحميل الاستبيان:',\n },\n\n riskScoring: {\n title: 'تقييم المخاطر',\n subtitle: 'يرجى الإجابة على الأسئلة التالية لتقييم المخاطر',\n loadingCriteria: 'جارٍ تحميل معايير تقييم المخاطر…',\n noCriteria: 'لا توجد معايير مطلوبة. جارٍ الانتقال إلى الخطوة التالية…',\n errorLoading: 'خطأ في تحميل المعايير:',\n range: 'النطاق: {{min}} – {{max}}',\n minimum: 'الحد الأدنى: {{min}}',\n maximum: 'الحد الأقصى: {{max}}',\n },\n\n uploadDocument: {\n title: 'رفع المستندات',\n loading: 'جارٍ تحميل متطلبات المستندات...',\n errorLoading: 'خطأ في تحميل متطلبات المستندات',\n failedToSubmit: 'فشل في إرسال المستندات. يرجى المحاولة مرة أخرى.',\n uploading: 'جارٍ الرفع...',\n clickToUpload: 'انقر للرفع',\n orDragDrop: 'أو اسحب وأفلت',\n maxSize: 'الحد الأقصى {{size}}',\n },\n\n overview: {\n title: 'نظرة عامة',\n loadingOverview: 'جارٍ تحميل بيانات النظرة العامة...',\n errorLoading: 'خطأ في تحميل النظرة العامة:',\n },\n\n investorCategorization: {\n whichStatement: 'أي عبارة تصفك بشكل أفضل؟',\n retailInvestorInfo: 'يتم التعامل مع جميع عملاء Tokenise كمستثمرين أفراد ما لم يستوفوا معايير محددة لتصنيفهم كمستثمرين محترفين أو محترفين اختياريين. من أجل تقديم المستوى المناسب من الخدمة لك، يرجى تحديد أي من الأوصاف التالية ينطبق عليك.',\n chooseOne: 'اختر واحداً',\n individualInvestor: 'مستثمر فردي',\n individualInvestorDesc: '(موصى به) يختار معظم عملائنا هذا الخيار. ستستفيد من أعلى مستوى من الحماية التنظيمية.',\n sophisticatedInvestor: 'مستثمر متمرس',\n sophisticatedInvestorDesc: 'في العامين الماضيين، قمت بواحدة أو أكثر مما يلي: استثمارات كبيرة في شركات غير مدرجة، أو كنت مديراً لشركة بإيرادات لا تقل عن مليون دولار، أو عملت في الاستثمار الخاص أو تمويل الشركات.',\n highNetworthInvestor: 'مستثمر ذو ملاءة مالية عالية',\n highNetworthInvestorDesc: 'دخلي يتجاوز (دولار أمريكي/يورو) 150,000 دولار سنوياً، أو صافي أصولي يتجاوز 250,000 دولار (باستثناء المسكن الرئيسي).',\n pleaseSelect: 'يرجى اختيار نوع المستثمر',\n failedToSubmit: 'فشل في إرسال تصنيف المستثمر',\n },\n\n appropriatenessTest: {\n failedToLoad: 'فشل في تحميل اختبار الملاءمة',\n failedToSubmit: 'فشل في إرسال الاختبار. يرجى المحاولة مرة أخرى.',\n answerAllQuestions: 'يرجى الإجابة على جميع الأسئلة. متبقي {{remaining}}.',\n testPassed: 'نجح الاختبار',\n testFailed: 'فشل الاختبار',\n passedMessage: 'تهانينا! لقد اجتزت الاختبار.',\n failedMessage: 'لم تجتز الاختبار.',\n loadingTest: 'جارٍ تحميل الاختبار...',\n noTestData: 'لا تتوفر بيانات اختبار',\n waitBeforeRetrying: 'يرجى الانتظار قبل إعادة المحاولة',\n waitTimerMessage: 'يمكنك محاولة الاختبار مرة أخرى بعد انتهاء المؤقت',\n attemptsRemaining: 'لديك {{count}} محاولة(محاولات) متبقية',\n noAttemptsRemaining: 'لا توجد محاولات متبقية. يرجى الاتصال بالدعم للمساعدة.',\n retakeTest: 'إعادة الاختبار',\n ok: 'حسناً',\n startTest: 'بدء الاختبار',\n questionXofY: 'السؤال {{current}} من {{total}}',\n answered: 'تمت الإجابة',\n attemptsLeft: 'محاولة(محاولات) متبقية',\n timesUp: 'انتهى الوقت! جارٍ إرسال إجاباتك.',\n submitting: 'جارٍ الإرسال...',\n submitTest: 'إرسال الاختبار',\n questions: 'الأسئلة',\n timeLimit: 'الحد الزمني',\n passRequirement: 'شرط النجاح',\n attemptsLeftLabel: 'المحاولات المتبقية',\n correct: '{{count}} صحيحة',\n previousAttempt: 'المحاولة السابقة:',\n allAttemptsUsed: 'لقد استنفدت جميع محاولاتك. يرجى الاتصال بالدعم للمساعدة.',\n },\n\n identity: {\n title: 'التحقق من الهوية',\n subtitle: 'يرجى إكمال عملية التحقق من الهوية',\n reviewYourInformation: 'مراجعة معلوماتك',\n reviewSubtitle: 'يرجى مراجعة وتأكيد معلوماتك قبل بدء التحقق من الهوية',\n confirmAndStart: 'تأكيد وبدء التحقق',\n invalidUrl: 'رابط التحقق غير صالح. يرجى إعادة المحاولة.',\n sessionExpired: 'انتهت صلاحية جلسة التحقق الخاصة بك. يرجى إعادة المحاولة.',\n linkExpired: 'انتهت صلاحية رابط التحقق الخاص بك. يرجى إعادة المحاولة.',\n sessionExpiredRestart: 'انتهت صلاحية الجلسة. يرجى إعادة المحاولة.',\n sessionExpiredOrInvalid: 'انتهت صلاحية الجلسة أو أنها غير صالحة. يرجى إعادة بدء التحقق.',\n sessionIssueTitle: 'مشكلة في جلسة التحقق',\n sessionExpiredTitle: 'انتهت صلاحية الجلسة',\n verificationError: 'خطأ في التحقق',\n sessionExpiredMessage: 'انتهت صلاحية جلسة التحقق الخاصة بك وتحتاج إلى إعادة تشغيل.',\n whatToDoNext: 'ماذا تفعل بعد ذلك:',\n clickRestart: 'انقر على \"إعادة بدء التحقق\" أدناه لإنشاء جلسة جديدة',\n completeWithoutDelays: 'أكمل عملية التحقق بدون تأخير',\n ifIssuesPersist: 'إذا استمرت المشكلة، اتصل بالدعم',\n restartVerification: 'إعادة بدء التحقق',\n restarting: 'جارٍ إعادة التشغيل…',\n restart: 'إعادة البدء',\n failedToRestart: 'فشل في إعادة بدء التحقق',\n failedToInitialize: 'فشل في التهيئة: {{message}}',\n configurationError: 'خطأ في الإعداد: {{message}}',\n setupError: 'خطأ في التثبيت: {{message}}',\n importantExpiredMessage: 'مهم: إذا رأيت رسالة \"منتهية الصلاحية\" أو \"رابط غير صالح\"، يرجى النقر على \"إعادة البدء\" لإنشاء جلسة تحقق جديدة.',\n deviceRiskAssessment: 'تقييم مخاطر الجهاز',\n analyzingDevice: 'جارٍ تحليل أمان الجهاز وأنماط السلوك...',\n pleaseWaitDevice: 'يرجى الانتظار أثناء التحقق من أمان جهازك',\n automaticProcess: 'هذه العملية تلقائية وستكتمل في ثوانٍ قليلة',\n loadingIdentity: 'جارٍ تحميل التحقق من الهوية...',\n },\n\n status: {\n verificationApproved: 'تمت الموافقة على التحقق',\n verificationApprovedMsg: 'تمت الموافقة على التحقق من هويتك بنجاح.',\n verificationRejected: 'تم رفض التحقق',\n verificationRejectedMsg: 'للأسف، لم تتم الموافقة على التحقق من هويتك.',\n verificationPending: 'التحقق قيد الانتظار',\n verificationPendingMsg: 'التحقق من هويتك قيد المعالجة حالياً.',\n applicationApproved: 'تمت الموافقة على الطلب',\n applicationApprovedMsg: 'تمت الموافقة على طلبك.',\n applicationRejected: 'تم رفض الطلب',\n applicationRejectedMsg: 'تم رفض طلبك.',\n underReview: 'قيد المراجعة',\n underReviewMsg: 'طلبك قيد المراجعة اليدوية حالياً.',\n processComplete: 'اكتملت العملية',\n processCompleteMsg: 'تمت عملية التحقق بنجاح.',\n processFailed: 'فشلت العملية',\n processFailedMsg: 'تعذر إكمال عملية التحقق.',\n adminReviewRequired: 'مطلوب مراجعة المسؤول',\n adminReviewRequiredMsg: 'يتطلب طلبك مراجعة من المسؤول.',\n processing: 'قيد المعالجة',\n processingMsg: 'جارٍ مراجعة طلبك.',\n whatsNext: 'ما التالي؟',\n identityVerified: 'تم التحقق من هويتك',\n canProceed: 'يمكنك الآن متابعة طلبك',\n allFeaturesAccessible: 'جميع الميزات متاحة الآن',\n whatCanYouDo: 'ماذا يمكنك أن تفعل؟',\n contactSupportTeam: 'تواصل مع فريق الدعم للمساعدة',\n reviewSubmittedInfo: 'راجع المعلومات التي قدمتها',\n resubmitIfNeeded: 'أعد تقديم طلبك إذا لزم الأمر',\n whatHappensNext: 'ماذا يحدث بعد ذلك؟',\n teamReviewing: 'فريقنا يراجع طلبك',\n notifiedByEmail: 'سيتم إعلامك عبر البريد الإلكتروني عند اكتمال المراجعة',\n noActionRequired: 'لا يلزم اتخاذ أي إجراء من جانبك في هذا الوقت',\n kycStatus: 'حالة KYC:',\n reviewStatus: 'حالة المراجعة:',\n notAvailable: 'غير متوفر',\n contactSupport: 'اتصل بالدعم',\n tryAgain: 'حاول مرة أخرى',\n checkBackLater: 'يرجى التحقق لاحقاً أو انتظار إشعارنا عبر البريد الإلكتروني',\n },\n\n logo: {\n companyLogo: 'شعار الشركة',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const tr: TranslationDictionary = {\n common: {\n next: 'İleri',\n previous: 'Geri',\n back: 'Geri',\n submit: 'Gönder',\n cancel: 'İptal',\n skip: 'Atla',\n skipAndSubmit: 'Atla ve Gönder',\n loading: 'Yükleniyor...',\n error: 'Hata',\n errorPrefix: 'Hata:',\n continue: 'Devam',\n close: 'Kapat',\n help: 'Yardım',\n search: 'Ara...',\n select: 'Seç...',\n noResults: 'Sonuç bulunamadı',\n clearAll: 'Tümünü temizle',\n loadingForm: 'Form yükleniyor…',\n required: 'zorunlu',\n pageXofY: 'Sayfa {{current}} / {{total}}',\n stepXofY: 'Adım {{current}} / {{total}}',\n },\n\n fields: {\n firstName: 'Ad',\n lastName: 'Soyad',\n email: 'E-posta',\n phoneNumber: 'Telefon Numarası',\n dateOfBirth: 'Doğum Tarihi',\n salutation: 'Hitap',\n title: 'Unvan',\n mobileCountryCode: 'Mobil Ülke Kodu',\n street: 'Sokak',\n streetNumber: 'Sokak Numarası',\n zip: 'Posta Kodu',\n city: 'Şehir',\n country: 'Ülke',\n nationality: 'Uyruk',\n otherNationalities: 'Diğer Uyruklar',\n countryOfBirth: 'Doğum Ülkesi',\n placeOfBirth: 'Doğum Yeri',\n taxCountry: 'Vergi Ülkesi',\n taxNumber: 'Vergi Numarası',\n defaultLanguage: 'Varsayılan Dil',\n educationLevel: 'Eğitim Düzeyi',\n occupation: 'Meslek',\n companyName: 'Şirket Adı',\n companyEmail: 'E-posta',\n companyPhone: 'Telefon',\n registrationNumber: 'Sicil Numarası',\n countryOfResidence: 'İkamet Ülkesi',\n legalAddress: 'Yasal Adres',\n incorporationDate: 'Kuruluş Tarihi',\n controlScheme: 'Kontrol Yapısı',\n taxId: 'Vergi Kimlik No',\n registrationLocation: 'Kayıt Yeri',\n website: 'Web Sitesi',\n postalAddress: 'Posta Adresi',\n state: 'Eyalet / İl',\n postalCode: 'Posta Kodu',\n addressCountry: 'Ülke',\n lei: 'LEI',\n name: 'İsim',\n notProvided: 'Belirtilmedi',\n addressInformation: 'Adres Bilgileri',\n },\n\n gender: {\n male: 'Erkek',\n female: 'Kadın',\n other: 'Diğer',\n },\n\n placeholders: {\n selectSalutation: 'Hitap seçin...',\n selectLanguage: 'Dil seçin...',\n selectOtherNationalities: 'Diğer uyrukları seçin...',\n selectCountry: 'Ülke seçin…',\n selectNationality: 'Uyruk seçin…',\n selectCountryCode: 'Ülke kodu seçin…',\n selectOption: 'Bir seçenek seçin…',\n enterAnswer: 'Cevabınızı girin…',\n phonePlaceholder: '+1',\n },\n\n createApplicant: {\n title: 'Başvuru Sahibi Oluştur',\n createApplicant: 'Başvuru Sahibi Oluştur',\n externalRefIdRequired: 'Harici Referans Kimliği gereklidir. Lütfen config.applicantForm.externalRefId üzerinden iletin.',\n failedToCreate: 'Başvuru sahibi oluşturulamadı',\n },\n\n createCompany: {\n title: 'Şirket Kaydı',\n registerCompany: 'Şirketi Kaydet',\n failedToCreate: 'Şirket başvuru sahibi oluşturulamadı',\n },\n\n workflow: {\n loadingWorkflow: 'İş akışı yükleniyor...',\n errorOccurred: 'Bir hata oluştu',\n workflowTransition: 'İş Akışı Geçişi',\n workflowUpdatedMessage: 'Başvuru iş akışınız ilerlemenize göre güncellendi.',\n previousWorkflow: 'Önceki İş Akışı',\n newWorkflow: 'Yeni İş Akışı',\n continueNewWorkflow: 'Yeni İş Akışı ile Devam Et',\n loadingIdentityVerification: 'Kimlik doğrulama yükleniyor...',\n loadingCurrentStep: 'Mevcut adım yükleniyor...',\n processingStep: 'Adım işleniyor:',\n actionType: 'İşlem türü:',\n },\n\n stepNames: {\n overview: 'Genel Bakış',\n questionnaire: 'Anket',\n documents: 'Belgeler',\n identity: 'Kimlik',\n riskAssessment: 'Risk Değerlendirmesi',\n investorCategorization: 'Yatırımcı Sınıflandırması',\n appropriatenessTest: 'Uygunluk Testi',\n additionalData: 'Ek Veriler',\n review: 'İnceleme',\n },\n\n validation: {\n required: '{{field}} zorunludur',\n fieldRequired: '{{field}} zorunludur.',\n invalidFormat: 'Geçersiz format',\n minValue: 'Minimum değer {{min}}',\n maxValue: 'Maksimum değer {{max}}',\n minLength: 'Minimum uzunluk {{min}} karakter',\n maxLength: 'Maksimum uzunluk {{max}} karakter',\n fileTooLarge: 'Dosya maksimum boyutu aşıyor: {{size}}',\n invalidFileType: 'Geçersiz dosya türü',\n },\n\n questionnaire: {\n errorLoading: 'Anket yüklenirken hata oluştu:',\n },\n\n riskScoring: {\n title: 'Risk Değerlendirmesi',\n subtitle: 'Lütfen risk değerlendirmesi için aşağıdaki soruları cevaplayın',\n loadingCriteria: 'Risk puanlama kriterleri yükleniyor…',\n noCriteria: 'Kriter gerekli değil. Sonraki adıma geçiliyor…',\n errorLoading: 'Kriterler yüklenirken hata oluştu:',\n range: 'Aralık: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maksimum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Belge Yükleme',\n loading: 'Belge gereksinimleri yükleniyor...',\n errorLoading: 'Belge gereksinimleri yüklenirken hata oluştu',\n failedToSubmit: 'Belgeler gönderilemedi. Lütfen tekrar deneyin.',\n uploading: 'Yükleniyor...',\n clickToUpload: 'Yüklemek için tıklayın',\n orDragDrop: 'veya sürükleyip bırakın',\n maxSize: 'Maksimum {{size}}',\n },\n\n overview: {\n title: 'Genel Bakış',\n loadingOverview: 'Genel bakış verileri yükleniyor...',\n errorLoading: 'Genel bakış yüklenirken hata oluştu:',\n },\n\n investorCategorization: {\n whichStatement: 'Sizi en iyi hangi ifade tanımlar?',\n retailInvestorInfo: 'Tüm Tokenise müşterileri, Profesyonel veya İsteğe Bağlı Profesyonel Yatırımcı olarak sınıflandırılmak için belirli kriterleri karşılamadıkça Bireysel Yatırımcı olarak değerlendirilir. Size uygun düzeyde hizmet sunabilmek için lütfen aşağıdaki açıklamalardan hangisinin sizin için geçerli olduğunu belirtin.',\n chooseOne: 'Birini seçin',\n individualInvestor: 'Bireysel yatırımcı',\n individualInvestorDesc: '(Önerilen) Müşterilerimizin çoğu bu seçeneği tercih eder. En yüksek düzeyde düzenleyici korumadan yararlanırsınız.',\n sophisticatedInvestor: 'Deneyimli yatırımcı',\n sophisticatedInvestorDesc: 'Son 2 yılda şunlardan birini veya birkaçını yaptım: borsaya kote olmayan şirketlere önemli yatırımlar, cirosu en az 1 milyon dolar olan bir şirkette yöneticilik veya özel sermaye ya da kurumsal finansman alanında çalışma.',\n highNetworthInvestor: 'Yüksek net değere sahip yatırımcı',\n highNetworthInvestorDesc: 'Yıllık gelirim (USD/EUR) 150.000 doların üzerinde veya net varlıklarım 250.000 doların üzerinde (birincil konut hariç).',\n pleaseSelect: 'Lütfen bir yatırımcı türü seçin',\n failedToSubmit: 'Yatırımcı sınıflandırması gönderilemedi',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Uygunluk testi yüklenemedi',\n failedToSubmit: 'Test gönderilemedi. Lütfen tekrar deneyin.',\n answerAllQuestions: 'Lütfen tüm soruları cevaplayın. {{remaining}} kaldı.',\n testPassed: 'Test Başarılı',\n testFailed: 'Test Başarısız',\n passedMessage: 'Tebrikler! Testi geçtiniz.',\n failedMessage: 'Testi geçemediniz.',\n loadingTest: 'Test yükleniyor...',\n noTestData: 'Test verisi mevcut değil',\n waitBeforeRetrying: 'Tekrar denemeden önce lütfen bekleyin',\n waitTimerMessage: 'Süre dolduğunda testi tekrar deneyebilirsiniz',\n attemptsRemaining: '{{count}} deneme hakkınız kaldı',\n noAttemptsRemaining: 'Deneme hakkınız kalmadı. Lütfen yardım için destek ekibiyle iletişime geçin.',\n retakeTest: 'Testi Tekrarla',\n ok: 'Tamam',\n startTest: 'Teste Başla',\n questionXofY: 'Soru {{current}} / {{total}}',\n answered: 'cevaplanmış',\n attemptsLeft: 'deneme hakkı kaldı',\n timesUp: 'Süre doldu! Cevaplarınız gönderiliyor.',\n submitting: 'Gönderiliyor...',\n submitTest: 'Testi Gönder',\n questions: 'Sorular',\n timeLimit: 'Süre Sınırı',\n passRequirement: 'Geçme Koşulu',\n attemptsLeftLabel: 'Kalan Deneme Hakkı',\n correct: '{{count}} doğru',\n previousAttempt: 'Önceki deneme:',\n allAttemptsUsed: 'Tüm deneme haklarınızı kullandınız. Lütfen yardım için destek ekibiyle iletişime geçin.',\n },\n\n identity: {\n title: 'Kimlik Doğrulama',\n subtitle: 'Lütfen kimlik doğrulama sürecini tamamlayın',\n reviewYourInformation: 'Bilgilerinizi İnceleyin',\n reviewSubtitle: 'Kimlik doğrulamaya başlamadan önce lütfen bilgilerinizi inceleyin ve onaylayın',\n confirmAndStart: 'Onayla ve Doğrulamayı Başlat',\n invalidUrl: 'Geçersiz doğrulama URL\\'si. Lütfen yeniden başlayın.',\n sessionExpired: 'Doğrulama oturumunuzun süresi doldu. Lütfen yeniden başlayın.',\n linkExpired: 'Doğrulama bağlantınızın süresi doldu. Lütfen yeniden başlayın.',\n sessionExpiredRestart: 'Oturum süresi doldu. Lütfen yeniden başlayın.',\n sessionExpiredOrInvalid: 'Oturum süresi doldu veya geçersiz. Lütfen doğrulamayı yeniden başlatın.',\n sessionIssueTitle: 'Doğrulama Oturumu Sorunu',\n sessionExpiredTitle: 'Oturum Süresi Doldu',\n verificationError: 'Doğrulama Hatası',\n sessionExpiredMessage: 'Doğrulama oturumunuzun süresi doldu ve yeniden başlatılması gerekiyor.',\n whatToDoNext: 'Bundan sonra ne yapmalısınız:',\n clickRestart: 'Yeni bir oturum oluşturmak için aşağıdaki \"Doğrulamayı Yeniden Başlat\" düğmesine tıklayın',\n completeWithoutDelays: 'Doğrulama sürecini gecikmeden tamamlayın',\n ifIssuesPersist: 'Sorunlar devam ederse destek ekibiyle iletişime geçin',\n restartVerification: 'Doğrulamayı Yeniden Başlat',\n restarting: 'Yeniden başlatılıyor…',\n restart: 'Yeniden Başlat',\n failedToRestart: 'Doğrulama yeniden başlatılamadı',\n failedToInitialize: 'Başlatma başarısız: {{message}}',\n configurationError: 'Yapılandırma hatası: {{message}}',\n setupError: 'Kurulum hatası: {{message}}',\n importantExpiredMessage: 'Önemli: \"Süresi dolmuş\" veya \"geçersiz bağlantı\" mesajı görürseniz, lütfen yeni bir doğrulama oturumu oluşturmak için \"Yeniden Başlat\"a tıklayın.',\n deviceRiskAssessment: 'Cihaz Risk Değerlendirmesi',\n analyzingDevice: 'Cihaz güvenliği ve davranış kalıpları analiz ediliyor...',\n pleaseWaitDevice: 'Cihaz güvenliğiniz doğrulanırken lütfen bekleyin',\n automaticProcess: 'Bu işlem otomatiktir ve birkaç saniye içinde tamamlanacaktır',\n loadingIdentity: 'Kimlik doğrulama yükleniyor...',\n },\n\n status: {\n verificationApproved: 'Doğrulama Onaylandı',\n verificationApprovedMsg: 'Kimlik doğrulamanız başarıyla onaylandı.',\n verificationRejected: 'Doğrulama Reddedildi',\n verificationRejectedMsg: 'Maalesef kimlik doğrulamanız onaylanmadı.',\n verificationPending: 'Doğrulama Beklemede',\n verificationPendingMsg: 'Kimlik doğrulamanız şu anda işleniyor.',\n applicationApproved: 'Başvuru Onaylandı',\n applicationApprovedMsg: 'Başvurunuz onaylandı.',\n applicationRejected: 'Başvuru Reddedildi',\n applicationRejectedMsg: 'Başvurunuz reddedildi.',\n underReview: 'İnceleme Altında',\n underReviewMsg: 'Başvurunuz şu anda manuel inceleme altındadır.',\n processComplete: 'Süreç Tamamlandı',\n processCompleteMsg: 'Doğrulama süreciniz başarıyla tamamlandı.',\n processFailed: 'Süreç Başarısız',\n processFailedMsg: 'Doğrulama süreci tamamlanamadı.',\n adminReviewRequired: 'Yönetici İncelemesi Gerekli',\n adminReviewRequiredMsg: 'Başvurunuz yönetici incelemesi gerektiriyor.',\n processing: 'İşleniyor',\n processingMsg: 'Başvurunuz inceleniyor.',\n whatsNext: 'Sırada Ne Var?',\n identityVerified: 'Kimliğiniz doğrulandı',\n canProceed: 'Artık başvurunuza devam edebilirsiniz',\n allFeaturesAccessible: 'Tüm özellikler artık erişilebilir',\n whatCanYouDo: 'Ne Yapabilirsiniz?',\n contactSupportTeam: 'Yardım için destek ekibimizle iletişime geçin',\n reviewSubmittedInfo: 'Gönderdiğiniz bilgileri inceleyin',\n resubmitIfNeeded: 'Gerekirse başvurunuzu yeniden gönderin',\n whatHappensNext: 'Bundan Sonra Ne Olacak?',\n teamReviewing: 'Ekibimiz başvurunuzu inceliyor',\n notifiedByEmail: 'İnceleme tamamlandığında e-posta ile bilgilendirileceksiniz',\n noActionRequired: 'Şu anda sizden herhangi bir işlem gerekmemektedir',\n kycStatus: 'KYC Durumu:',\n reviewStatus: 'İnceleme Durumu:',\n notAvailable: 'Mevcut Değil',\n contactSupport: 'Destek ile İletişime Geçin',\n tryAgain: 'Tekrar Deneyin',\n checkBackLater: 'Lütfen daha sonra tekrar kontrol edin veya e-posta bildirimini bekleyin',\n },\n\n logo: {\n companyLogo: 'Şirket Logosu',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const sv: TranslationDictionary = {\n common: {\n next: 'Nästa',\n previous: 'Föregående',\n back: 'Tillbaka',\n submit: 'Skicka',\n cancel: 'Avbryt',\n skip: 'Hoppa över',\n skipAndSubmit: 'Hoppa över & Skicka',\n loading: 'Laddar...',\n error: 'Fel',\n errorPrefix: 'Fel:',\n continue: 'Fortsätt',\n close: 'Stäng',\n help: 'Hjälp',\n search: 'Sök...',\n select: 'Välj...',\n noResults: 'Inga resultat',\n clearAll: 'Rensa allt',\n loadingForm: 'Laddar formulär…',\n required: 'obligatoriskt',\n pageXofY: 'Sida {{current}} av {{total}}',\n stepXofY: 'Steg {{current}} av {{total}}',\n },\n\n fields: {\n firstName: 'Förnamn',\n lastName: 'Efternamn',\n email: 'E-post',\n phoneNumber: 'Telefonnummer',\n dateOfBirth: 'Födelsedatum',\n salutation: 'Tilltal',\n title: 'Titel',\n mobileCountryCode: 'Landskod för mobil',\n street: 'Gata',\n streetNumber: 'Gatunummer',\n zip: 'Postnummer',\n city: 'Stad',\n country: 'Land',\n nationality: 'Nationalitet',\n otherNationalities: 'Andra nationaliteter',\n countryOfBirth: 'Födelseland',\n placeOfBirth: 'Födelseort',\n taxCountry: 'Skatteland',\n taxNumber: 'Skattenummer',\n defaultLanguage: 'Standardspråk',\n educationLevel: 'Utbildningsnivå',\n occupation: 'Yrke',\n companyName: 'Företagsnamn',\n companyEmail: 'E-post',\n companyPhone: 'Telefon',\n registrationNumber: 'Registreringsnummer',\n countryOfResidence: 'Bosättningsland',\n legalAddress: 'Juridisk adress',\n incorporationDate: 'Registreringsdatum',\n controlScheme: 'Kontrollstruktur',\n taxId: 'Skatte-ID',\n registrationLocation: 'Registreringsort',\n website: 'Webbplats',\n postalAddress: 'Postadress',\n state: 'Delstat / Region',\n postalCode: 'Postnummer',\n addressCountry: 'Land',\n lei: 'LEI',\n name: 'Namn',\n notProvided: 'Ej angivet',\n addressInformation: 'Adressinformation',\n },\n\n gender: {\n male: 'Man',\n female: 'Kvinna',\n other: 'Annat',\n },\n\n placeholders: {\n selectSalutation: 'Välj tilltal...',\n selectLanguage: 'Välj språk...',\n selectOtherNationalities: 'Välj andra nationaliteter...',\n selectCountry: 'Välj land…',\n selectNationality: 'Välj nationalitet…',\n selectCountryCode: 'Välj landskod…',\n selectOption: 'Välj ett alternativ…',\n enterAnswer: 'Ange ditt svar…',\n phonePlaceholder: '+46',\n },\n\n createApplicant: {\n title: 'Skapa sökande',\n createApplicant: 'Skapa sökande',\n externalRefIdRequired: 'Externt referens-ID krävs. Vänligen ange det via config.applicantForm.externalRefId.',\n failedToCreate: 'Det gick inte att skapa sökande',\n },\n\n createCompany: {\n title: 'Företagsregistrering',\n registerCompany: 'Registrera företag',\n failedToCreate: 'Det gick inte att skapa företagssökande',\n },\n\n workflow: {\n loadingWorkflow: 'Laddar arbetsflöde...',\n errorOccurred: 'Ett fel uppstod',\n workflowTransition: 'Arbetsflödesövergång',\n workflowUpdatedMessage: 'Ditt ansökningsarbetsflöde har uppdaterats baserat på dina framsteg.',\n previousWorkflow: 'Tidigare arbetsflöde',\n newWorkflow: 'Nytt arbetsflöde',\n continueNewWorkflow: 'Fortsätt med nytt arbetsflöde',\n loadingIdentityVerification: 'Laddar identitetsverifiering...',\n loadingCurrentStep: 'Laddar aktuellt steg...',\n processingStep: 'Bearbetar steg:',\n actionType: 'Åtgärdstyp:',\n },\n\n stepNames: {\n overview: 'Översikt',\n questionnaire: 'Frågeformulär',\n documents: 'Dokument',\n identity: 'Identitet',\n riskAssessment: 'Riskbedömning',\n investorCategorization: 'Investerarkategorisering',\n appropriatenessTest: 'Lämplighetstest',\n additionalData: 'Ytterligare data',\n review: 'Granskning',\n },\n\n validation: {\n required: '{{field}} är obligatoriskt',\n fieldRequired: '{{field}} är obligatoriskt.',\n invalidFormat: 'Ogiltigt format',\n minValue: 'Minimivärde är {{min}}',\n maxValue: 'Maxvärde är {{max}}',\n minLength: 'Minsta längd är {{min}} tecken',\n maxLength: 'Högsta längd är {{max}} tecken',\n fileTooLarge: 'Filen överskrider maxstorleken på {{size}}',\n invalidFileType: 'Ogiltig filtyp',\n },\n\n questionnaire: {\n errorLoading: 'Fel vid laddning av frågeformulär:',\n },\n\n riskScoring: {\n title: 'Riskbedömning',\n subtitle: 'Vänligen besvara följande frågor för riskutvärdering',\n loadingCriteria: 'Laddar riskbedömningskriterier…',\n noCriteria: 'Inga kriterier krävs. Går vidare till nästa steg…',\n errorLoading: 'Fel vid laddning av kriterier:',\n range: 'Intervall: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maximum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Ladda upp dokument',\n loading: 'Laddar dokumentkrav...',\n errorLoading: 'Fel vid laddning av dokumentkrav',\n failedToSubmit: 'Det gick inte att skicka dokument. Försök igen.',\n uploading: 'Laddar upp...',\n clickToUpload: 'Klicka för att ladda upp',\n orDragDrop: 'eller dra och släpp',\n maxSize: 'Max {{size}}',\n },\n\n overview: {\n title: 'Översikt',\n loadingOverview: 'Laddar översiktsdata...',\n errorLoading: 'Fel vid laddning av översikt:',\n },\n\n investorCategorization: {\n whichStatement: 'Vilket påstående beskriver dig bäst?',\n retailInvestorInfo: 'Alla Tokenise-kunder behandlas som privata investerare om de inte uppfyller specifika kriterier för att klassificeras som professionella eller valfritt professionella investerare. För att kunna ge dig rätt servicenivå, vänligen ange vilken av följande beskrivningar som gäller dig.',\n chooseOne: 'Välj ett',\n individualInvestor: 'Individuell investerare',\n individualInvestorDesc: '(Rekommenderat) De flesta av våra kunder väljer detta alternativ. Du kommer att dra nytta av den högsta nivån av regulatoriskt skydd.',\n sophisticatedInvestor: 'Sofistikerad investerare',\n sophisticatedInvestorDesc: 'Under de senaste 2 åren har jag gjort ett eller flera av följande: gjort betydande investeringar i onoterade företag, varit styrelseledamot i ett företag med en omsättning på minst 1 miljon dollar, eller arbetat inom private equity eller corporate finance.',\n highNetworthInvestor: 'Investerare med hög nettoförmögenhet',\n highNetworthInvestorDesc: 'Jag tjänar mer än (USD/EUR) 150 000 dollar per år, eller jag har nettotillgångar på mer än 250 000 dollar (exklusive primärbostad).',\n pleaseSelect: 'Vänligen välj en investerartyp',\n failedToSubmit: 'Det gick inte att skicka investerarkategorisering',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Det gick inte att ladda lämplighetstest',\n failedToSubmit: 'Det gick inte att skicka testet. Försök igen.',\n answerAllQuestions: 'Vänligen besvara alla frågor. {{remaining}} återstår.',\n testPassed: 'Test godkänt',\n testFailed: 'Test underkänt',\n passedMessage: 'Grattis! Du har klarat testet.',\n failedMessage: 'Du klarade inte testet.',\n loadingTest: 'Laddar test...',\n noTestData: 'Ingen testdata tillgänglig',\n waitBeforeRetrying: 'Vänligen vänta innan du försöker igen',\n waitTimerMessage: 'Du kan göra testet igen när tidsgränsen har löpt ut',\n attemptsRemaining: 'Du har {{count}} försök kvar',\n noAttemptsRemaining: 'Inga försök kvar. Kontakta support för hjälp.',\n retakeTest: 'Gör om testet',\n ok: 'OK',\n startTest: 'Starta test',\n questionXofY: 'Fråga {{current}} av {{total}}',\n answered: 'besvarad',\n attemptsLeft: 'försök kvar',\n timesUp: 'Tiden är slut! Dina svar skickas in.',\n submitting: 'Skickar...',\n submitTest: 'Skicka test',\n questions: 'Frågor',\n timeLimit: 'Tidsgräns',\n passRequirement: 'Godkändkrav',\n attemptsLeftLabel: 'Försök kvar',\n correct: '{{count}} korrekta',\n previousAttempt: 'Tidigare försök:',\n allAttemptsUsed: 'Du har använt alla dina försök. Kontakta support för hjälp.',\n },\n\n identity: {\n title: 'Identitetsverifiering',\n subtitle: 'Vänligen slutför identitetsverifieringsprocessen',\n reviewYourInformation: 'Granska din information',\n reviewSubtitle: 'Vänligen granska och bekräfta din information innan du startar identitetsverifiering',\n confirmAndStart: 'Bekräfta och starta verifiering',\n invalidUrl: 'Ogiltig verifierings-URL. Vänligen starta om.',\n sessionExpired: 'Din verifieringssession har löpt ut. Vänligen starta om.',\n linkExpired: 'Din verifieringslänk har löpt ut. Vänligen starta om.',\n sessionExpiredRestart: 'Sessionen har löpt ut. Vänligen starta om.',\n sessionExpiredOrInvalid: 'Sessionen har löpt ut eller är ogiltig. Vänligen starta om verifieringen.',\n sessionIssueTitle: 'Problem med verifieringssession',\n sessionExpiredTitle: 'Sessionen har löpt ut',\n verificationError: 'Verifieringsfel',\n sessionExpiredMessage: 'Din verifieringssession har löpt ut och behöver startas om.',\n whatToDoNext: 'Vad du ska göra härnäst:',\n clickRestart: 'Klicka på \"Starta om verifiering\" nedan för att generera en ny session',\n completeWithoutDelays: 'Slutför verifieringsprocessen utan fördröjningar',\n ifIssuesPersist: 'Om problemen kvarstår, kontakta support',\n restartVerification: 'Starta om verifiering',\n restarting: 'Startar om…',\n restart: 'Starta om',\n failedToRestart: 'Det gick inte att starta om verifieringen',\n failedToInitialize: 'Det gick inte att initiera: {{message}}',\n configurationError: 'Konfigurationsfel: {{message}}',\n setupError: 'Installationsfel: {{message}}',\n importantExpiredMessage: 'Viktigt: Om du ser meddelandet \"utgången\" eller \"ogiltig länk\", klicka på \"Starta om\" för att generera en ny verifieringssession.',\n deviceRiskAssessment: 'Enhetsriskbedömning',\n analyzingDevice: 'Analyserar enhetssäkerhet och beteendemönster...',\n pleaseWaitDevice: 'Vänligen vänta medan vi verifierar din enhetssäkerhet',\n automaticProcess: 'Denna process är automatisk och slutförs inom några sekunder',\n loadingIdentity: 'Laddar identitetsverifiering...',\n },\n\n status: {\n verificationApproved: 'Verifiering godkänd',\n verificationApprovedMsg: 'Din identitetsverifiering har godkänts.',\n verificationRejected: 'Verifiering avvisad',\n verificationRejectedMsg: 'Tyvärr godkändes inte din identitetsverifiering.',\n verificationPending: 'Verifiering väntar',\n verificationPendingMsg: 'Din identitetsverifiering behandlas för närvarande.',\n applicationApproved: 'Ansökan godkänd',\n applicationApprovedMsg: 'Din ansökan har godkänts.',\n applicationRejected: 'Ansökan avvisad',\n applicationRejectedMsg: 'Din ansökan har avvisats.',\n underReview: 'Under granskning',\n underReviewMsg: 'Din ansökan granskas för närvarande manuellt.',\n processComplete: 'Process slutförd',\n processCompleteMsg: 'Din verifieringsprocess har slutförts framgångsrikt.',\n processFailed: 'Processen misslyckades',\n processFailedMsg: 'Verifieringsprocessen kunde inte slutföras.',\n adminReviewRequired: 'Administratörsgranskning krävs',\n adminReviewRequiredMsg: 'Din ansökan kräver granskning av en administratör.',\n processing: 'Bearbetar',\n processingMsg: 'Din ansökan granskas.',\n whatsNext: 'Vad händer nu?',\n identityVerified: 'Din identitet har verifierats',\n canProceed: 'Du kan nu fortsätta med din ansökan',\n allFeaturesAccessible: 'Alla funktioner är nu tillgängliga',\n whatCanYouDo: 'Vad kan du göra?',\n contactSupportTeam: 'Kontakta vårt supportteam för hjälp',\n reviewSubmittedInfo: 'Granska informationen du har skickat',\n resubmitIfNeeded: 'Skicka in din ansökan igen vid behov',\n whatHappensNext: 'Vad händer härnäst?',\n teamReviewing: 'Vårt team granskar din ansökan',\n notifiedByEmail: 'Du kommer att meddelas via e-post när granskningen är klar',\n noActionRequired: 'Ingen åtgärd krävs från dig just nu',\n kycStatus: 'KYC-status:',\n reviewStatus: 'Granskningsstatus:',\n notAvailable: 'Ej tillgänglig',\n contactSupport: 'Kontakta support',\n tryAgain: 'Försök igen',\n checkBackLater: 'Vänligen kontrollera igen senare eller vänta på vårt e-postmeddelande',\n },\n\n logo: {\n companyLogo: 'Företagslogotyp',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const da: TranslationDictionary = {\n common: {\n next: 'Næste',\n previous: 'Forrige',\n back: 'Tilbage',\n submit: 'Indsend',\n cancel: 'Annuller',\n skip: 'Spring over',\n skipAndSubmit: 'Spring over & Indsend',\n loading: 'Indlæser...',\n error: 'Fejl',\n errorPrefix: 'Fejl:',\n continue: 'Fortsæt',\n close: 'Luk',\n help: 'Hjælp',\n search: 'Søg...',\n select: 'Vælg...',\n noResults: 'Ingen resultater',\n clearAll: 'Ryd alt',\n loadingForm: 'Indlæser formular…',\n required: 'påkrævet',\n pageXofY: 'Side {{current}} af {{total}}',\n stepXofY: 'Trin {{current}} af {{total}}',\n },\n\n fields: {\n firstName: 'Fornavn',\n lastName: 'Efternavn',\n email: 'E-mail',\n phoneNumber: 'Telefonnummer',\n dateOfBirth: 'Fødselsdato',\n salutation: 'Tiltaleform',\n title: 'Titel',\n mobileCountryCode: 'Mobil landekode',\n street: 'Gade',\n streetNumber: 'Gadenummer',\n zip: 'Postnummer',\n city: 'By',\n country: 'Land',\n nationality: 'Nationalitet',\n otherNationalities: 'Andre nationaliteter',\n countryOfBirth: 'Fødeland',\n placeOfBirth: 'Fødested',\n taxCountry: 'Skatteland',\n taxNumber: 'Skattenummer',\n defaultLanguage: 'Standardsprog',\n educationLevel: 'Uddannelsesniveau',\n occupation: 'Beskæftigelse',\n companyName: 'Virksomhedsnavn',\n companyEmail: 'E-mail',\n companyPhone: 'Telefon',\n registrationNumber: 'Registreringsnummer',\n countryOfResidence: 'Bopælsland',\n legalAddress: 'Juridisk adresse',\n incorporationDate: 'Stiftelsesdato',\n controlScheme: 'Kontrolstruktur',\n taxId: 'Skatte-ID',\n registrationLocation: 'Registreringssted',\n website: 'Hjemmeside',\n postalAddress: 'Postadresse',\n state: 'Stat / Region',\n postalCode: 'Postnummer',\n addressCountry: 'Land',\n lei: 'LEI',\n name: 'Navn',\n notProvided: 'Ikke angivet',\n addressInformation: 'Adresseoplysninger',\n },\n\n gender: {\n male: 'Mand',\n female: 'Kvinde',\n other: 'Andet',\n },\n\n placeholders: {\n selectSalutation: 'Vælg tiltaleform...',\n selectLanguage: 'Vælg sprog...',\n selectOtherNationalities: 'Vælg andre nationaliteter...',\n selectCountry: 'Vælg land…',\n selectNationality: 'Vælg nationalitet…',\n selectCountryCode: 'Vælg landekode…',\n selectOption: 'Vælg en mulighed…',\n enterAnswer: 'Indtast dit svar…',\n phonePlaceholder: '+45',\n },\n\n createApplicant: {\n title: 'Opret ansøger',\n createApplicant: 'Opret ansøger',\n externalRefIdRequired: 'Eksternt reference-ID er påkrævet. Angiv det via config.applicantForm.externalRefId.',\n failedToCreate: 'Kunne ikke oprette ansøger',\n },\n\n createCompany: {\n title: 'Virksomhedsregistrering',\n registerCompany: 'Registrer virksomhed',\n failedToCreate: 'Kunne ikke oprette virksomhedsansøger',\n },\n\n workflow: {\n loadingWorkflow: 'Indlæser arbejdsgang...',\n errorOccurred: 'Der opstod en fejl',\n workflowTransition: 'Arbejdsgangsovergang',\n workflowUpdatedMessage: 'Din ansøgningsarbejdsgang er blevet opdateret baseret på dine fremskridt.',\n previousWorkflow: 'Tidligere arbejdsgang',\n newWorkflow: 'Ny arbejdsgang',\n continueNewWorkflow: 'Fortsæt med ny arbejdsgang',\n loadingIdentityVerification: 'Indlæser identitetsbekræftelse...',\n loadingCurrentStep: 'Indlæser nuværende trin...',\n processingStep: 'Behandler trin:',\n actionType: 'Handlingstype:',\n },\n\n stepNames: {\n overview: 'Oversigt',\n questionnaire: 'Spørgeskema',\n documents: 'Dokumenter',\n identity: 'Identitet',\n riskAssessment: 'Risikovurdering',\n investorCategorization: 'Investorkategorisering',\n appropriatenessTest: 'Egnethedstest',\n additionalData: 'Yderligere data',\n review: 'Gennemgang',\n },\n\n validation: {\n required: '{{field}} er påkrævet',\n fieldRequired: '{{field}} er påkrævet.',\n invalidFormat: 'Ugyldigt format',\n minValue: 'Minimumsværdi er {{min}}',\n maxValue: 'Maksimumsværdi er {{max}}',\n minLength: 'Minimumlængde er {{min}} tegn',\n maxLength: 'Maksimallængde er {{max}} tegn',\n fileTooLarge: 'Filen overstiger den maksimale størrelse på {{size}}',\n invalidFileType: 'Ugyldig filtype',\n },\n\n questionnaire: {\n errorLoading: 'Fejl ved indlæsning af spørgeskema:',\n },\n\n riskScoring: {\n title: 'Risikovurdering',\n subtitle: 'Besvar venligst følgende spørgsmål til risikovurdering',\n loadingCriteria: 'Indlæser risikovurderingskriterier…',\n noCriteria: 'Ingen kriterier påkrævet. Går videre til næste trin…',\n errorLoading: 'Fejl ved indlæsning af kriterier:',\n range: 'Interval: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maksimum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Upload dokumenter',\n loading: 'Indlæser dokumentkrav...',\n errorLoading: 'Fejl ved indlæsning af dokumentkrav',\n failedToSubmit: 'Kunne ikke indsende dokumenter. Prøv venligst igen.',\n uploading: 'Uploader...',\n clickToUpload: 'Klik for at uploade',\n orDragDrop: 'eller træk og slip',\n maxSize: 'Maks {{size}}',\n },\n\n overview: {\n title: 'Oversigt',\n loadingOverview: 'Indlæser oversigtsdata...',\n errorLoading: 'Fejl ved indlæsning af oversigt:',\n },\n\n investorCategorization: {\n whichStatement: 'Hvilken erklæring beskriver dig bedst?',\n retailInvestorInfo: 'Alle Tokenise-kunder behandles som detailinvestorer, medmindre de opfylder specifikke kriterier for at blive klassificeret som professionelle eller valgfrit professionelle investorer. For at kunne give dig det rette serviceniveau, bedes du angive, hvilken af følgende beskrivelser der gælder for dig.',\n chooseOne: 'Vælg én',\n individualInvestor: 'Individuel investor',\n individualInvestorDesc: '(Anbefalet) De fleste af vores kunder vælger denne mulighed. Du vil drage fordel af det højeste niveau af regulatorisk beskyttelse.',\n sophisticatedInvestor: 'Sofistikeret investor',\n sophisticatedInvestorDesc: 'I de sidste 2 år har jeg gjort en eller flere af følgende: foretaget betydelige investeringer i unoterede virksomheder, været direktør i en virksomhed med en omsætning på mindst 1 million dollars, eller arbejdet inden for private equity eller corporate finance.',\n highNetworthInvestor: 'Investor med høj nettoformue',\n highNetworthInvestorDesc: 'Jeg tjener mere end (USD/EUR) $150.000 om året, eller jeg har nettoaktiver for mere end $250.000 (eksklusive primær bolig).',\n pleaseSelect: 'Vælg venligst en investortype',\n failedToSubmit: 'Kunne ikke indsende investorkategorisering',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Kunne ikke indlæse egnethedstest',\n failedToSubmit: 'Kunne ikke indsende testen. Prøv venligst igen.',\n answerAllQuestions: 'Besvar venligst alle spørgsmål. {{remaining}} resterende.',\n testPassed: 'Test bestået',\n testFailed: 'Test ikke bestået',\n passedMessage: 'Tillykke! Du har bestået testen.',\n failedMessage: 'Du bestod ikke testen.',\n loadingTest: 'Indlæser test...',\n noTestData: 'Ingen testdata tilgængelig',\n waitBeforeRetrying: 'Vent venligst, før du prøver igen',\n waitTimerMessage: 'Du kan forsøge testen igen, når timeren udløber',\n attemptsRemaining: 'Du har {{count}} forsøg tilbage',\n noAttemptsRemaining: 'Ingen forsøg tilbage. Kontakt venligst support for hjælp.',\n retakeTest: 'Tag testen igen',\n ok: 'OK',\n startTest: 'Start test',\n questionXofY: 'Spørgsmål {{current}} af {{total}}',\n answered: 'besvaret',\n attemptsLeft: 'forsøg tilbage',\n timesUp: 'Tiden er udløbet! Dine svar indsendes.',\n submitting: 'Indsender...',\n submitTest: 'Indsend test',\n questions: 'Spørgsmål',\n timeLimit: 'Tidsbegrænsning',\n passRequirement: 'Beståelseskrav',\n attemptsLeftLabel: 'Forsøg tilbage',\n correct: '{{count}} korrekte',\n previousAttempt: 'Tidligere forsøg:',\n allAttemptsUsed: 'Du har brugt alle dine forsøg. Kontakt venligst support for hjælp.',\n },\n\n identity: {\n title: 'Identitetsbekræftelse',\n subtitle: 'Gennemfør venligst identitetsbekræftelsesprocessen',\n reviewYourInformation: 'Gennemgå dine oplysninger',\n reviewSubtitle: 'Gennemgå og bekræft venligst dine oplysninger, før du starter identitetsbekræftelse',\n confirmAndStart: 'Bekræft og start bekræftelse',\n invalidUrl: 'Ugyldig bekræftelses-URL. Start venligst forfra.',\n sessionExpired: 'Din bekræftelsessession er udløbet. Start venligst forfra.',\n linkExpired: 'Dit bekræftelseslink er udløbet. Start venligst forfra.',\n sessionExpiredRestart: 'Session udløbet. Start venligst forfra.',\n sessionExpiredOrInvalid: 'Session udløbet eller ugyldig. Start venligst bekræftelsen forfra.',\n sessionIssueTitle: 'Problem med bekræftelsessession',\n sessionExpiredTitle: 'Session udløbet',\n verificationError: 'Bekræftelsesfejl',\n sessionExpiredMessage: 'Din bekræftelsessession er udløbet og skal genstartes.',\n whatToDoNext: 'Hvad du skal gøre nu:',\n clickRestart: 'Klik på \"Genstart bekræftelse\" nedenfor for at generere en ny session',\n completeWithoutDelays: 'Gennemfør bekræftelsesprocessen uden forsinkelser',\n ifIssuesPersist: 'Hvis problemerne fortsætter, kontakt support',\n restartVerification: 'Genstart bekræftelse',\n restarting: 'Genstarter…',\n restart: 'Genstart',\n failedToRestart: 'Kunne ikke genstarte bekræftelsen',\n failedToInitialize: 'Kunne ikke initialisere: {{message}}',\n configurationError: 'Konfigurationsfejl: {{message}}',\n setupError: 'Opsætningsfejl: {{message}}',\n importantExpiredMessage: 'Vigtigt: Hvis du ser en besked om \"udløbet\" eller \"ugyldigt link\", klik på \"Genstart\" for at generere en ny bekræftelsessession.',\n deviceRiskAssessment: 'Enheds risikovurdering',\n analyzingDevice: 'Analyserer enhedssikkerhed og adfærdsmønstre...',\n pleaseWaitDevice: 'Vent venligst, mens vi bekræfter din enhedssikkerhed',\n automaticProcess: 'Denne proces er automatisk og vil være færdig om få sekunder',\n loadingIdentity: 'Indlæser identitetsbekræftelse...',\n },\n\n status: {\n verificationApproved: 'Bekræftelse godkendt',\n verificationApprovedMsg: 'Din identitetsbekræftelse er blevet godkendt.',\n verificationRejected: 'Bekræftelse afvist',\n verificationRejectedMsg: 'Desværre blev din identitetsbekræftelse ikke godkendt.',\n verificationPending: 'Bekræftelse afventer',\n verificationPendingMsg: 'Din identitetsbekræftelse behandles i øjeblikket.',\n applicationApproved: 'Ansøgning godkendt',\n applicationApprovedMsg: 'Din ansøgning er blevet godkendt.',\n applicationRejected: 'Ansøgning afvist',\n applicationRejectedMsg: 'Din ansøgning er blevet afvist.',\n underReview: 'Under gennemgang',\n underReviewMsg: 'Din ansøgning gennemgås i øjeblikket manuelt.',\n processComplete: 'Proces fuldført',\n processCompleteMsg: 'Din bekræftelsesproces er blevet fuldført.',\n processFailed: 'Processen mislykkedes',\n processFailedMsg: 'Bekræftelsesprocessen kunne ikke fuldføres.',\n adminReviewRequired: 'Administratorgennemgang påkrævet',\n adminReviewRequiredMsg: 'Din ansøgning kræver gennemgang af en administrator.',\n processing: 'Behandler',\n processingMsg: 'Din ansøgning bliver gennemgået.',\n whatsNext: 'Hvad sker der nu?',\n identityVerified: 'Din identitet er blevet bekræftet',\n canProceed: 'Du kan nu fortsætte med din ansøgning',\n allFeaturesAccessible: 'Alle funktioner er nu tilgængelige',\n whatCanYouDo: 'Hvad kan du gøre?',\n contactSupportTeam: 'Kontakt vores supportteam for hjælp',\n reviewSubmittedInfo: 'Gennemgå de oplysninger, du har indsendt',\n resubmitIfNeeded: 'Genindsend din ansøgning, hvis det er nødvendigt',\n whatHappensNext: 'Hvad sker der nu?',\n teamReviewing: 'Vores team gennemgår din ansøgning',\n notifiedByEmail: 'Du vil blive underrettet via e-mail, når gennemgangen er fuldført',\n noActionRequired: 'Ingen handling er påkrævet fra dig på nuværende tidspunkt',\n kycStatus: 'KYC-status:',\n reviewStatus: 'Gennemgangsstatus:',\n notAvailable: 'Ikke tilgængelig',\n contactSupport: 'Kontakt support',\n tryAgain: 'Prøv igen',\n checkBackLater: 'Tjek venligst igen senere, eller vent på vores e-mailnotifikation',\n },\n\n logo: {\n companyLogo: 'Virksomhedslogo',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const fi: TranslationDictionary = {\n common: {\n next: 'Seuraava',\n previous: 'Edellinen',\n back: 'Takaisin',\n submit: 'Lähetä',\n cancel: 'Peruuta',\n skip: 'Ohita',\n skipAndSubmit: 'Ohita ja lähetä',\n loading: 'Ladataan...',\n error: 'Virhe',\n errorPrefix: 'Virhe:',\n continue: 'Jatka',\n close: 'Sulje',\n help: 'Ohje',\n search: 'Hae...',\n select: 'Valitse...',\n noResults: 'Ei tuloksia',\n clearAll: 'Tyhjennä kaikki',\n loadingForm: 'Ladataan lomaketta…',\n required: 'pakollinen',\n pageXofY: 'Sivu {{current}} / {{total}}',\n stepXofY: 'Vaihe {{current}} / {{total}}',\n },\n\n fields: {\n firstName: 'Etunimi',\n lastName: 'Sukunimi',\n email: 'Sähköposti',\n phoneNumber: 'Puhelinnumero',\n dateOfBirth: 'Syntymäaika',\n salutation: 'Puhuttelumuoto',\n title: 'Titteli',\n mobileCountryCode: 'Mobiilimaakoodi',\n street: 'Katu',\n streetNumber: 'Kadun numero',\n zip: 'Postinumero',\n city: 'Kaupunki',\n country: 'Maa',\n nationality: 'Kansalaisuus',\n otherNationalities: 'Muut kansalaisuudet',\n countryOfBirth: 'Syntymämaa',\n placeOfBirth: 'Syntymäpaikka',\n taxCountry: 'Veromaa',\n taxNumber: 'Veronumero',\n defaultLanguage: 'Oletuskieli',\n educationLevel: 'Koulutustaso',\n occupation: 'Ammatti',\n companyName: 'Yrityksen nimi',\n companyEmail: 'Sähköposti',\n companyPhone: 'Puhelin',\n registrationNumber: 'Rekisterinumero',\n countryOfResidence: 'Asuinmaa',\n legalAddress: 'Virallinen osoite',\n incorporationDate: 'Perustamispäivä',\n controlScheme: 'Hallintorakenne',\n taxId: 'Verotunniste',\n registrationLocation: 'Rekisteröintipaikka',\n website: 'Verkkosivusto',\n postalAddress: 'Postiosoite',\n state: 'Osavaltio / Maakunta',\n postalCode: 'Postinumero',\n addressCountry: 'Maa',\n lei: 'LEI',\n name: 'Nimi',\n notProvided: 'Ei annettu',\n addressInformation: 'Osoitetiedot',\n },\n\n gender: {\n male: 'Mies',\n female: 'Nainen',\n other: 'Muu',\n },\n\n placeholders: {\n selectSalutation: 'Valitse puhuttelumuoto...',\n selectLanguage: 'Valitse kieli...',\n selectOtherNationalities: 'Valitse muut kansalaisuudet...',\n selectCountry: 'Valitse maa…',\n selectNationality: 'Valitse kansalaisuus…',\n selectCountryCode: 'Valitse maakoodi…',\n selectOption: 'Valitse vaihtoehto…',\n enterAnswer: 'Kirjoita vastauksesi…',\n phonePlaceholder: '+358',\n },\n\n createApplicant: {\n title: 'Luo hakija',\n createApplicant: 'Luo hakija',\n externalRefIdRequired: 'Ulkoinen viitetunnus on pakollinen. Anna se config.applicantForm.externalRefId-kentässä.',\n failedToCreate: 'Hakijan luominen epäonnistui',\n },\n\n createCompany: {\n title: 'Yrityksen rekisteröinti',\n registerCompany: 'Rekisteröi yritys',\n failedToCreate: 'Yrityshakijan luominen epäonnistui',\n },\n\n workflow: {\n loadingWorkflow: 'Ladataan työnkulkua...',\n errorOccurred: 'Tapahtui virhe',\n workflowTransition: 'Työnkulun siirtymä',\n workflowUpdatedMessage: 'Hakemuksesi työnkulkua on päivitetty edistymisesi perusteella.',\n previousWorkflow: 'Edellinen työnkulku',\n newWorkflow: 'Uusi työnkulku',\n continueNewWorkflow: 'Jatka uudella työnkululla',\n loadingIdentityVerification: 'Ladataan henkilöllisyyden todentamista...',\n loadingCurrentStep: 'Ladataan nykyistä vaihetta...',\n processingStep: 'Käsitellään vaihetta:',\n actionType: 'Toimintotyyppi:',\n },\n\n stepNames: {\n overview: 'Yleiskatsaus',\n questionnaire: 'Kyselylomake',\n documents: 'Asiakirjat',\n identity: 'Henkilöllisyys',\n riskAssessment: 'Riskiarviointi',\n investorCategorization: 'Sijoittajaluokittelu',\n appropriatenessTest: 'Soveltuvuustesti',\n additionalData: 'Lisätiedot',\n review: 'Tarkistus',\n },\n\n validation: {\n required: '{{field}} on pakollinen',\n fieldRequired: '{{field}} on pakollinen.',\n invalidFormat: 'Virheellinen muoto',\n minValue: 'Minimiarvo on {{min}}',\n maxValue: 'Maksimiarvo on {{max}}',\n minLength: 'Vähimmäispituus on {{min}} merkkiä',\n maxLength: 'Enimmäispituus on {{max}} merkkiä',\n fileTooLarge: 'Tiedosto ylittää enimmäiskoon {{size}}',\n invalidFileType: 'Virheellinen tiedostotyyppi',\n },\n\n questionnaire: {\n errorLoading: 'Virhe kyselylomakkeen lataamisessa:',\n },\n\n riskScoring: {\n title: 'Riskiarviointi',\n subtitle: 'Vastaa seuraaviin kysymyksiin riskiarviointia varten',\n loadingCriteria: 'Ladataan riskiarviointikriteerejä…',\n noCriteria: 'Kriteerejä ei vaadita. Siirrytään seuraavaan vaiheeseen…',\n errorLoading: 'Virhe kriteerien lataamisessa:',\n range: 'Väli: {{min}} – {{max}}',\n minimum: 'Minimi: {{min}}',\n maximum: 'Maksimi: {{max}}',\n },\n\n uploadDocument: {\n title: 'Lataa asiakirjat',\n loading: 'Ladataan asiakirjavaatimuksia...',\n errorLoading: 'Virhe asiakirjavaatimusten lataamisessa',\n failedToSubmit: 'Asiakirjojen lähettäminen epäonnistui. Yritä uudelleen.',\n uploading: 'Ladataan...',\n clickToUpload: 'Napsauta ladataksesi',\n orDragDrop: 'tai vedä ja pudota',\n maxSize: 'Enintään {{size}}',\n },\n\n overview: {\n title: 'Yleiskatsaus',\n loadingOverview: 'Ladataan yleiskatsaustietoja...',\n errorLoading: 'Virhe yleiskatsauksen lataamisessa:',\n },\n\n investorCategorization: {\n whichStatement: 'Mikä väittämä kuvaa sinua parhaiten?',\n retailInvestorInfo: 'Kaikkia Tokenise-asiakkaita kohdellaan yksityissijoittajina, elleivät he täytä tiettyjä kriteerejä luokiteltavaksi ammattimaisiksi tai valinnaisesti ammattimaisiksi sijoittajiksi. Jotta voimme tarjota sinulle oikean palvelutason, ilmoita, mikä seuraavista kuvauksista koskee sinua.',\n chooseOne: 'Valitse yksi',\n individualInvestor: 'Yksityissijoittaja',\n individualInvestorDesc: '(Suositeltu) Useimmat asiakkaamme valitsevat tämän vaihtoehdon. Saat korkeimman tason sääntelysuojaa.',\n sophisticatedInvestor: 'Kokenut sijoittaja',\n sophisticatedInvestorDesc: 'Viimeisten 2 vuoden aikana olen tehnyt yhden tai useamman seuraavista: merkittäviä sijoituksia listaamattomiin yrityksiin, toiminut johtajana yrityksessä, jonka liikevaihto on vähintään 1 miljoona dollaria, tai työskennellyt pääomasijoitus- tai yritysrahoitusalalla.',\n highNetworthInvestor: 'Varakas sijoittaja',\n highNetworthInvestorDesc: 'Ansaitsen yli (USD/EUR) 150 000 dollaria vuodessa tai nettovarallisuuteni on yli 250 000 dollaria (pois lukien ensisijainen asunto).',\n pleaseSelect: 'Valitse sijoittajatyyppi',\n failedToSubmit: 'Sijoittajaluokittelun lähettäminen epäonnistui',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Soveltuvuustestin lataaminen epäonnistui',\n failedToSubmit: 'Testin lähettäminen epäonnistui. Yritä uudelleen.',\n answerAllQuestions: 'Vastaa kaikkiin kysymyksiin. {{remaining}} jäljellä.',\n testPassed: 'Testi läpäisty',\n testFailed: 'Testi hylätty',\n passedMessage: 'Onnittelut! Olet läpäissyt testin.',\n failedMessage: 'Et läpäissyt testiä.',\n loadingTest: 'Ladataan testiä...',\n noTestData: 'Testitietoja ei ole saatavilla',\n waitBeforeRetrying: 'Odota ennen uutta yritystä',\n waitTimerMessage: 'Voit yrittää testiä uudelleen ajastimen umpeuduttua',\n attemptsRemaining: 'Sinulla on {{count}} yritystä jäljellä',\n noAttemptsRemaining: 'Ei yrityksiä jäljellä. Ota yhteyttä tukeen saadaksesi apua.',\n retakeTest: 'Tee testi uudelleen',\n ok: 'OK',\n startTest: 'Aloita testi',\n questionXofY: 'Kysymys {{current}} / {{total}}',\n answered: 'vastattu',\n attemptsLeft: 'yritystä jäljellä',\n timesUp: 'Aika loppui! Vastauksesi lähetetään.',\n submitting: 'Lähetetään...',\n submitTest: 'Lähetä testi',\n questions: 'Kysymykset',\n timeLimit: 'Aikaraja',\n passRequirement: 'Läpäisyvaatimus',\n attemptsLeftLabel: 'Yrityksiä jäljellä',\n correct: '{{count}} oikein',\n previousAttempt: 'Edellinen yritys:',\n allAttemptsUsed: 'Olet käyttänyt kaikki yrityksesi. Ota yhteyttä tukeen saadaksesi apua.',\n },\n\n identity: {\n title: 'Henkilöllisyyden todentaminen',\n subtitle: 'Suorita henkilöllisyyden todentamisprosessi loppuun',\n reviewYourInformation: 'Tarkista tietosi',\n reviewSubtitle: 'Tarkista ja vahvista tietosi ennen henkilöllisyyden todentamisen aloittamista',\n confirmAndStart: 'Vahvista ja aloita todentaminen',\n invalidUrl: 'Virheellinen todentamis-URL. Aloita uudelleen.',\n sessionExpired: 'Todentamisistuntosi on vanhentunut. Aloita uudelleen.',\n linkExpired: 'Todentamislinkkisi on vanhentunut. Aloita uudelleen.',\n sessionExpiredRestart: 'Istunto vanhentunut. Aloita uudelleen.',\n sessionExpiredOrInvalid: 'Istunto vanhentunut tai virheellinen. Aloita todentaminen uudelleen.',\n sessionIssueTitle: 'Todentamisistunnon ongelma',\n sessionExpiredTitle: 'Istunto vanhentunut',\n verificationError: 'Todentamisvirhe',\n sessionExpiredMessage: 'Todentamisistuntosi on vanhentunut ja se täytyy aloittaa uudelleen.',\n whatToDoNext: 'Mitä tehdä seuraavaksi:',\n clickRestart: 'Napsauta \"Aloita todentaminen uudelleen\" luodaksesi uuden istunnon',\n completeWithoutDelays: 'Suorita todentamisprosessi viivytyksettä',\n ifIssuesPersist: 'Jos ongelmat jatkuvat, ota yhteyttä tukeen',\n restartVerification: 'Aloita todentaminen uudelleen',\n restarting: 'Käynnistetään uudelleen…',\n restart: 'Käynnistä uudelleen',\n failedToRestart: 'Todentamisen uudelleenkäynnistys epäonnistui',\n failedToInitialize: 'Alustus epäonnistui: {{message}}',\n configurationError: 'Määritysvirhe: {{message}}',\n setupError: 'Asennusvirhe: {{message}}',\n importantExpiredMessage: 'Tärkeää: Jos näet viestin \"vanhentunut\" tai \"virheellinen linkki\", napsauta \"Käynnistä uudelleen\" luodaksesi uuden todentamisistunnon.',\n deviceRiskAssessment: 'Laitteen riskiarviointi',\n analyzingDevice: 'Analysoidaan laitteen turvallisuutta ja käyttäytymismalleja...',\n pleaseWaitDevice: 'Odota, kun tarkistamme laitteesi turvallisuuden',\n automaticProcess: 'Tämä prosessi on automaattinen ja valmistuu muutamassa sekunnissa',\n loadingIdentity: 'Ladataan henkilöllisyyden todentamista...',\n },\n\n status: {\n verificationApproved: 'Todentaminen hyväksytty',\n verificationApprovedMsg: 'Henkilöllisyytesi todentaminen on hyväksytty.',\n verificationRejected: 'Todentaminen hylätty',\n verificationRejectedMsg: 'Valitettavasti henkilöllisyytesi todentamista ei hyväksytty.',\n verificationPending: 'Todentaminen odottaa',\n verificationPendingMsg: 'Henkilöllisyytesi todentamista käsitellään parhaillaan.',\n applicationApproved: 'Hakemus hyväksytty',\n applicationApprovedMsg: 'Hakemuksesi on hyväksytty.',\n applicationRejected: 'Hakemus hylätty',\n applicationRejectedMsg: 'Hakemuksesi on hylätty.',\n underReview: 'Tarkistettavana',\n underReviewMsg: 'Hakemustasi tarkistetaan parhaillaan manuaalisesti.',\n processComplete: 'Prosessi valmis',\n processCompleteMsg: 'Todentamisprosessisi on suoritettu onnistuneesti.',\n processFailed: 'Prosessi epäonnistui',\n processFailedMsg: 'Todentamisprosessia ei voitu suorittaa loppuun.',\n adminReviewRequired: 'Ylläpitäjän tarkistus vaaditaan',\n adminReviewRequiredMsg: 'Hakemuksesi vaatii ylläpitäjän tarkistuksen.',\n processing: 'Käsitellään',\n processingMsg: 'Hakemustasi tarkistetaan.',\n whatsNext: 'Mitä seuraavaksi?',\n identityVerified: 'Henkilöllisyytesi on todennettu',\n canProceed: 'Voit nyt jatkaa hakemustasi',\n allFeaturesAccessible: 'Kaikki ominaisuudet ovat nyt käytettävissä',\n whatCanYouDo: 'Mitä voit tehdä?',\n contactSupportTeam: 'Ota yhteyttä tukitiimiimme saadaksesi apua',\n reviewSubmittedInfo: 'Tarkista lähettämäsi tiedot',\n resubmitIfNeeded: 'Lähetä hakemuksesi uudelleen tarvittaessa',\n whatHappensNext: 'Mitä tapahtuu seuraavaksi?',\n teamReviewing: 'Tiimimme tarkistaa hakemustasi',\n notifiedByEmail: 'Saat sähköposti-ilmoituksen, kun tarkistus on valmis',\n noActionRequired: 'Sinulta ei vaadita toimenpiteitä tällä hetkellä',\n kycStatus: 'KYC-tila:',\n reviewStatus: 'Tarkistuksen tila:',\n notAvailable: 'Ei saatavilla',\n contactSupport: 'Ota yhteyttä tukeen',\n tryAgain: 'Yritä uudelleen',\n checkBackLater: 'Tarkista myöhemmin uudelleen tai odota sähköposti-ilmoitustamme',\n },\n\n logo: {\n companyLogo: 'Yrityksen logo',\n },\n};\n","import type { TranslationDictionary } from '../types';\n\nexport const no: TranslationDictionary = {\n common: {\n next: 'Neste',\n previous: 'Forrige',\n back: 'Tilbake',\n submit: 'Send inn',\n cancel: 'Avbryt',\n skip: 'Hopp over',\n skipAndSubmit: 'Hopp over og send inn',\n loading: 'Laster...',\n error: 'Feil',\n errorPrefix: 'Feil:',\n continue: 'Fortsett',\n close: 'Lukk',\n help: 'Hjelp',\n search: 'Søk...',\n select: 'Velg...',\n noResults: 'Ingen resultater',\n clearAll: 'Tøm alt',\n loadingForm: 'Laster skjema…',\n required: 'påkrevd',\n pageXofY: 'Side {{current}} av {{total}}',\n stepXofY: 'Steg {{current}} av {{total}}',\n },\n\n fields: {\n firstName: 'Fornavn',\n lastName: 'Etternavn',\n email: 'E-post',\n phoneNumber: 'Telefonnummer',\n dateOfBirth: 'Fødselsdato',\n salutation: 'Tiltaleform',\n title: 'Tittel',\n mobileCountryCode: 'Mobil landskode',\n street: 'Gate',\n streetNumber: 'Gatenummer',\n zip: 'Postnummer',\n city: 'By',\n country: 'Land',\n nationality: 'Nasjonalitet',\n otherNationalities: 'Andre nasjonaliteter',\n countryOfBirth: 'Fødeland',\n placeOfBirth: 'Fødested',\n taxCountry: 'Skatteland',\n taxNumber: 'Skattenummer',\n defaultLanguage: 'Standardspråk',\n educationLevel: 'Utdanningsnivå',\n occupation: 'Yrke',\n companyName: 'Firmanavn',\n companyEmail: 'E-post',\n companyPhone: 'Telefon',\n registrationNumber: 'Registreringsnummer',\n countryOfResidence: 'Bostedsland',\n legalAddress: 'Juridisk adresse',\n incorporationDate: 'Stiftelsesdato',\n controlScheme: 'Kontrollstruktur',\n taxId: 'Skatte-ID',\n registrationLocation: 'Registreringssted',\n website: 'Nettsted',\n postalAddress: 'Postadresse',\n state: 'Delstat / Fylke',\n postalCode: 'Postnummer',\n addressCountry: 'Land',\n lei: 'LEI',\n name: 'Navn',\n notProvided: 'Ikke oppgitt',\n addressInformation: 'Adresseinformasjon',\n },\n\n gender: {\n male: 'Mann',\n female: 'Kvinne',\n other: 'Annet',\n },\n\n placeholders: {\n selectSalutation: 'Velg tiltaleform...',\n selectLanguage: 'Velg språk...',\n selectOtherNationalities: 'Velg andre nasjonaliteter...',\n selectCountry: 'Velg land…',\n selectNationality: 'Velg nasjonalitet…',\n selectCountryCode: 'Velg landskode…',\n selectOption: 'Velg et alternativ…',\n enterAnswer: 'Skriv inn svaret ditt…',\n phonePlaceholder: '+47',\n },\n\n createApplicant: {\n title: 'Opprett søker',\n createApplicant: 'Opprett søker',\n externalRefIdRequired: 'Ekstern referanse-ID er påkrevd. Oppgi den via config.applicantForm.externalRefId.',\n failedToCreate: 'Kunne ikke opprette søker',\n },\n\n createCompany: {\n title: 'Firmaregistrering',\n registerCompany: 'Registrer firma',\n failedToCreate: 'Kunne ikke opprette firmasøker',\n },\n\n workflow: {\n loadingWorkflow: 'Laster arbeidsflyt...',\n errorOccurred: 'Det oppstod en feil',\n workflowTransition: 'Arbeidsflytovergang',\n workflowUpdatedMessage: 'Søknadsflyten din er oppdatert basert på fremdriften din.',\n previousWorkflow: 'Tidligere arbeidsflyt',\n newWorkflow: 'Ny arbeidsflyt',\n continueNewWorkflow: 'Fortsett med ny arbeidsflyt',\n loadingIdentityVerification: 'Laster identitetsverifisering...',\n loadingCurrentStep: 'Laster gjeldende steg...',\n processingStep: 'Behandler steg:',\n actionType: 'Handlingstype:',\n },\n\n stepNames: {\n overview: 'Oversikt',\n questionnaire: 'Spørreskjema',\n documents: 'Dokumenter',\n identity: 'Identitet',\n riskAssessment: 'Risikovurdering',\n investorCategorization: 'Investorkategorisering',\n appropriatenessTest: 'Egnethetstest',\n additionalData: 'Tilleggsdata',\n review: 'Gjennomgang',\n },\n\n validation: {\n required: '{{field}} er påkrevd',\n fieldRequired: '{{field}} er påkrevd.',\n invalidFormat: 'Ugyldig format',\n minValue: 'Minimumsverdi er {{min}}',\n maxValue: 'Maksimumsverdi er {{max}}',\n minLength: 'Minimumslengde er {{min}} tegn',\n maxLength: 'Maksimumslengde er {{max}} tegn',\n fileTooLarge: 'Filen overskrider maksimal størrelse på {{size}}',\n invalidFileType: 'Ugyldig filtype',\n },\n\n questionnaire: {\n errorLoading: 'Feil ved lasting av spørreskjema:',\n },\n\n riskScoring: {\n title: 'Risikovurdering',\n subtitle: 'Vennligst besvar følgende spørsmål for risikovurdering',\n loadingCriteria: 'Laster risikovurderingskriterier…',\n noCriteria: 'Ingen kriterier påkrevd. Går videre til neste steg…',\n errorLoading: 'Feil ved lasting av kriterier:',\n range: 'Intervall: {{min}} – {{max}}',\n minimum: 'Minimum: {{min}}',\n maximum: 'Maksimum: {{max}}',\n },\n\n uploadDocument: {\n title: 'Last opp dokumenter',\n loading: 'Laster dokumentkrav...',\n errorLoading: 'Feil ved lasting av dokumentkrav',\n failedToSubmit: 'Kunne ikke sende inn dokumenter. Vennligst prøv igjen.',\n uploading: 'Laster opp...',\n clickToUpload: 'Klikk for å laste opp',\n orDragDrop: 'eller dra og slipp',\n maxSize: 'Maks {{size}}',\n },\n\n overview: {\n title: 'Oversikt',\n loadingOverview: 'Laster oversiktsdata...',\n errorLoading: 'Feil ved lasting av oversikt:',\n },\n\n investorCategorization: {\n whichStatement: 'Hvilken påstand beskriver deg best?',\n retailInvestorInfo: 'Alle Tokenise-kunder behandles som private investorer med mindre de oppfyller spesifikke kriterier for å bli klassifisert som profesjonelle eller valgfritt profesjonelle investorer. For å kunne gi deg riktig servicenivå, vennligst oppgi hvilken av følgende beskrivelser som gjelder for deg.',\n chooseOne: 'Velg én',\n individualInvestor: 'Individuell investor',\n individualInvestorDesc: '(Anbefalt) De fleste av våre kunder velger dette alternativet. Du vil dra nytte av det høyeste nivået av regulatorisk beskyttelse.',\n sophisticatedInvestor: 'Sofistikert investor',\n sophisticatedInvestorDesc: 'I løpet av de siste 2 årene har jeg gjort ett eller flere av følgende: gjort betydelige investeringer i unoterte selskaper, vært styremedlem i et selskap med en omsetning på minst 1 million dollar, eller jobbet innen private equity eller corporate finance.',\n highNetworthInvestor: 'Investor med høy nettoformue',\n highNetworthInvestorDesc: 'Jeg tjener mer enn (USD/EUR) $150 000 per år, eller jeg har netto eiendeler på mer enn $250 000 (unntatt primærbolig).',\n pleaseSelect: 'Vennligst velg en investortype',\n failedToSubmit: 'Kunne ikke sende inn investorkategorisering',\n },\n\n appropriatenessTest: {\n failedToLoad: 'Kunne ikke laste egnethetstest',\n failedToSubmit: 'Kunne ikke sende inn testen. Vennligst prøv igjen.',\n answerAllQuestions: 'Vennligst svar på alle spørsmål. {{remaining}} gjenstår.',\n testPassed: 'Test bestått',\n testFailed: 'Test ikke bestått',\n passedMessage: 'Gratulerer! Du har bestått testen.',\n failedMessage: 'Du bestod ikke testen.',\n loadingTest: 'Laster test...',\n noTestData: 'Ingen testdata tilgjengelig',\n waitBeforeRetrying: 'Vennligst vent før du prøver igjen',\n waitTimerMessage: 'Du kan forsøke testen igjen når tidtakeren utløper',\n attemptsRemaining: 'Du har {{count}} forsøk igjen',\n noAttemptsRemaining: 'Ingen forsøk igjen. Vennligst kontakt support for hjelp.',\n retakeTest: 'Ta testen på nytt',\n ok: 'OK',\n startTest: 'Start test',\n questionXofY: 'Spørsmål {{current}} av {{total}}',\n answered: 'besvart',\n attemptsLeft: 'forsøk igjen',\n timesUp: 'Tiden er ute! Svarene dine sendes inn.',\n submitting: 'Sender inn...',\n submitTest: 'Send inn test',\n questions: 'Spørsmål',\n timeLimit: 'Tidsbegrensning',\n passRequirement: 'Beståelseskrav',\n attemptsLeftLabel: 'Forsøk igjen',\n correct: '{{count}} riktige',\n previousAttempt: 'Forrige forsøk:',\n allAttemptsUsed: 'Du har brukt alle forsøkene dine. Vennligst kontakt support for hjelp.',\n },\n\n identity: {\n title: 'Identitetsverifisering',\n subtitle: 'Vennligst fullfør identitetsverifiseringsprosessen',\n reviewYourInformation: 'Gjennomgå informasjonen din',\n reviewSubtitle: 'Vennligst gjennomgå og bekreft informasjonen din før du starter identitetsverifisering',\n confirmAndStart: 'Bekreft og start verifisering',\n invalidUrl: 'Ugyldig verifiserings-URL. Vennligst start på nytt.',\n sessionExpired: 'Verifiseringsøkten din har utløpt. Vennligst start på nytt.',\n linkExpired: 'Verifiseringslenken din har utløpt. Vennligst start på nytt.',\n sessionExpiredRestart: 'Økten har utløpt. Vennligst start på nytt.',\n sessionExpiredOrInvalid: 'Økten har utløpt eller er ugyldig. Vennligst start verifiseringen på nytt.',\n sessionIssueTitle: 'Problem med verifiseringsøkt',\n sessionExpiredTitle: 'Økten har utløpt',\n verificationError: 'Verifiseringsfeil',\n sessionExpiredMessage: 'Verifiseringsøkten din har utløpt og må startes på nytt.',\n whatToDoNext: 'Hva du skal gjøre nå:',\n clickRestart: 'Klikk på \"Start verifisering på nytt\" nedenfor for å generere en ny økt',\n completeWithoutDelays: 'Fullfør verifiseringsprosessen uten forsinkelser',\n ifIssuesPersist: 'Hvis problemene vedvarer, kontakt support',\n restartVerification: 'Start verifisering på nytt',\n restarting: 'Starter på nytt…',\n restart: 'Start på nytt',\n failedToRestart: 'Kunne ikke starte verifiseringen på nytt',\n failedToInitialize: 'Kunne ikke initialisere: {{message}}',\n configurationError: 'Konfigurasjonsfeil: {{message}}',\n setupError: 'Oppsettsfeil: {{message}}',\n importantExpiredMessage: 'Viktig: Hvis du ser en melding om \"utløpt\" eller \"ugyldig lenke\", klikk på \"Start på nytt\" for å generere en ny verifiseringsøkt.',\n deviceRiskAssessment: 'Risikovurdering av enhet',\n analyzingDevice: 'Analyserer enhetssikkerhet og atferdsmønstre...',\n pleaseWaitDevice: 'Vennligst vent mens vi verifiserer enhetssikkerheten din',\n automaticProcess: 'Denne prosessen er automatisk og fullføres i løpet av noen sekunder',\n loadingIdentity: 'Laster identitetsverifisering...',\n },\n\n status: {\n verificationApproved: 'Verifisering godkjent',\n verificationApprovedMsg: 'Identitetsverifiseringen din er godkjent.',\n verificationRejected: 'Verifisering avvist',\n verificationRejectedMsg: 'Dessverre ble identitetsverifiseringen din ikke godkjent.',\n verificationPending: 'Verifisering venter',\n verificationPendingMsg: 'Identitetsverifiseringen din behandles for øyeblikket.',\n applicationApproved: 'Søknad godkjent',\n applicationApprovedMsg: 'Søknaden din er godkjent.',\n applicationRejected: 'Søknad avvist',\n applicationRejectedMsg: 'Søknaden din er avvist.',\n underReview: 'Under gjennomgang',\n underReviewMsg: 'Søknaden din gjennomgås for øyeblikket manuelt.',\n processComplete: 'Prosess fullført',\n processCompleteMsg: 'Verifiseringsprosessen din er fullført.',\n processFailed: 'Prosessen mislyktes',\n processFailedMsg: 'Verifiseringsprosessen kunne ikke fullføres.',\n adminReviewRequired: 'Administratorgjennomgang påkrevd',\n adminReviewRequiredMsg: 'Søknaden din krever gjennomgang av en administrator.',\n processing: 'Behandler',\n processingMsg: 'Søknaden din blir gjennomgått.',\n whatsNext: 'Hva skjer nå?',\n identityVerified: 'Identiteten din er verifisert',\n canProceed: 'Du kan nå fortsette med søknaden din',\n allFeaturesAccessible: 'Alle funksjoner er nå tilgjengelige',\n whatCanYouDo: 'Hva kan du gjøre?',\n contactSupportTeam: 'Kontakt supportteamet vårt for hjelp',\n reviewSubmittedInfo: 'Gjennomgå informasjonen du har sendt inn',\n resubmitIfNeeded: 'Send inn søknaden din på nytt ved behov',\n whatHappensNext: 'Hva skjer videre?',\n teamReviewing: 'Teamet vårt gjennomgår søknaden din',\n notifiedByEmail: 'Du vil bli varslet via e-post når gjennomgangen er fullført',\n noActionRequired: 'Ingen handling er påkrevd fra deg på dette tidspunktet',\n kycStatus: 'KYC-status:',\n reviewStatus: 'Gjennomgangsstatus:',\n notAvailable: 'Ikke tilgjengelig',\n contactSupport: 'Kontakt support',\n tryAgain: 'Prøv igjen',\n checkBackLater: 'Vennligst sjekk tilbake senere eller vent på e-postvarselet vårt',\n },\n\n logo: {\n companyLogo: 'Firmalogo',\n },\n};\n","import type { TranslationDictionary, PartialTranslationDictionary } from './types';\nimport { en } from './locales/en';\nimport { de } from './locales/de';\nimport { fr } from './locales/fr';\nimport { es } from './locales/es';\nimport { it } from './locales/it';\nimport { pt } from './locales/pt';\nimport { nl } from './locales/nl';\nimport { pl } from './locales/pl';\nimport { ru } from './locales/ru';\nimport { zh } from './locales/zh';\nimport { ja } from './locales/ja';\nimport { ar } from './locales/ar';\nimport { tr } from './locales/tr';\nimport { sv } from './locales/sv';\nimport { da } from './locales/da';\nimport { fi } from './locales/fi';\nimport { no as nb } from './locales/no';\n\nexport type { TranslationDictionary, PartialTranslationDictionary };\n\nexport const bundledLocales: Record<string, TranslationDictionary> = {\n en, de, fr, es, it, pt, nl, pl, ru, zh, ja, ar, tr, sv, da, fi, no: nb,\n};\n\n/**\n * Resolve a dot-notation key like \"common.next\" from a dictionary object.\n * Returns undefined if any segment is missing.\n */\nfunction resolvePath(obj: Record<string, any>, path: string): string | undefined {\n const parts = path.split('.');\n let cur: any = obj;\n for (const p of parts) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = cur[p];\n }\n return typeof cur === 'string' ? cur : undefined;\n}\n\n/**\n * Replace `{{key}}` placeholders with values from params.\n */\nfunction interpolate(\n template: string,\n params?: Record<string, string | number>,\n): string {\n if (!params) return template;\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const val = params[key];\n return val != null ? String(val) : `{{${key}}}`;\n });\n}\n\n/**\n * Deep-merge a partial dictionary on top of a base dictionary.\n * Only string leaf values from `override` replace those in `base`.\n */\nexport function deepMerge(\n base: TranslationDictionary,\n override: PartialTranslationDictionary,\n): TranslationDictionary {\n const result: any = { ...base };\n for (const key of Object.keys(override) as Array<keyof TranslationDictionary>) {\n const overrideVal = override[key];\n if (overrideVal && typeof overrideVal === 'object') {\n result[key] = { ...result[key], ...overrideVal };\n }\n }\n return result as TranslationDictionary;\n}\n\n/**\n * Get the bundled dictionary for a locale, falling back to English.\n */\nexport function getBundledDictionary(locale: string): TranslationDictionary {\n const normalized = locale.toLowerCase().split(/[-_]/)[0];\n return bundledLocales[normalized] || bundledLocales.en;\n}\n\n/**\n * Create a `t()` function bound to a specific dictionary with English fallback.\n */\nexport function createTFunction(\n dict: TranslationDictionary,\n): (key: string, params?: Record<string, string | number>) => string {\n const fallback = bundledLocales.en;\n return (key: string, params?: Record<string, string | number>): string => {\n const value = resolvePath(dict as any, key)\n ?? resolvePath(fallback as any, key)\n ?? key;\n return interpolate(value, params);\n };\n}\n","import React, { createContext, useContext, useMemo, useState, useEffect } from 'react';\nimport type { TranslationDictionary, PartialTranslationDictionary } from './types';\nimport { getBundledDictionary, deepMerge, createTFunction } from './index';\n\nexport type TFunction = (key: string, params?: Record<string, string | number>) => string;\n\ninterface TranslationContextValue {\n t: TFunction;\n locale: string;\n dictionary: TranslationDictionary;\n}\n\nconst TranslationContext = createContext<TranslationContextValue | null>(null);\n\nconst CACHE_PREFIX = 'metakyc-translations-';\n\ninterface TranslationProviderProps {\n locale: string;\n fetchTranslations?: (locale: string) => Promise<PartialTranslationDictionary>;\n children: React.ReactNode;\n}\n\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({\n locale,\n fetchTranslations,\n children,\n}) => {\n const normalizedLocale = locale.toLowerCase().split(/[-_]/)[0];\n\n // Build the initial dictionary synchronously: cached override → bundled fallback\n const initialDict = useMemo(() => {\n const bundled = getBundledDictionary(normalizedLocale);\n if (typeof window === 'undefined') return bundled;\n try {\n const cached = localStorage.getItem(CACHE_PREFIX + normalizedLocale);\n if (cached) return deepMerge(bundled, JSON.parse(cached));\n } catch { /* ignore */ }\n return bundled;\n }, [normalizedLocale]);\n\n const [dictionary, setDictionary] = useState<TranslationDictionary>(initialDict);\n\n // Fetch remote overrides asynchronously\n useEffect(() => {\n if (!fetchTranslations) return;\n let cancelled = false;\n\n fetchTranslations(normalizedLocale)\n .then((remote) => {\n if (cancelled || !remote || Object.keys(remote).length === 0) return;\n const bundled = getBundledDictionary(normalizedLocale);\n const merged = deepMerge(bundled, remote);\n setDictionary(merged);\n try { localStorage.setItem(CACHE_PREFIX + normalizedLocale, JSON.stringify(remote)); } catch { /* ignore */ }\n })\n .catch((err) => {\n console.warn('[MetaKYC i18n] Failed to fetch remote translations:', err);\n });\n\n return () => { cancelled = true; };\n }, [normalizedLocale, fetchTranslations]);\n\n const value = useMemo<TranslationContextValue>(() => ({\n t: createTFunction(dictionary),\n locale: normalizedLocale,\n dictionary,\n }), [dictionary, normalizedLocale]);\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n );\n};\n\nexport function useTranslation(): TranslationContextValue {\n const ctx = useContext(TranslationContext);\n if (!ctx) {\n const fallback = getBundledDictionary('en');\n return { t: createTFunction(fallback), locale: 'en', dictionary: fallback };\n }\n return ctx;\n}\n","import { createContext } from 'react';\nimport { HttpClient } from '../client/http-client';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { MetaKYCClientConfig } from '../client/config';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\n\n/**\n * MetaKYC context value\n */\nexport interface MetaKYCContextValue {\n config: MetaKYCClientConfig;\n httpClient: HttpClient;\n applicantService: ApplicantService;\n questionnaireService: QuestionnaireService;\n uploadDocumentService: UploadDocumentService;\n appropriatenessTestService: AppropriatenessTestService;\n overviewService: OverviewService;\n riskScoringService: RiskScoringService;\n identityService: IdentityService;\n baseInformationService: BaseInformationService;\n investorCategorizationService: InvestorCategorizationService;\n themeService: ThemeService;\n themeManager: ThemeManager;\n currentTheme: ThemeConfig | null;\n createOrchestrator: () => WorkflowOrchestrator;\n}\n\n/**\n * MetaKYC context\n */\nexport const MetaKYCContext = createContext<MetaKYCContextValue | null>(null);\n","export const SDK_VERSION = '1.0.26';\n","import cssText from './globals.css?inline';\n\nconst STYLE_ID = 'metakyc-sdk-styles';\nlet injected = false;\n\nexport function injectCriticalCSS(): void {\n if (injected) return;\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) { injected = true; return; }\n\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = cssText;\n document.head.appendChild(style);\n injected = true;\n}\n","import React, { useMemo, useEffect, useState, useCallback } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\nimport { HttpClient } from '../client/http-client';\nimport { MetaKYCClientConfig } from '../client/config';\nimport {\n ApplicantService,\n QuestionnaireService,\n UploadDocumentService,\n AppropriatenessTestService,\n OverviewService,\n RiskScoringService,\n IdentityService,\n BaseInformationService,\n InvestorCategorizationService,\n ThemeService,\n TranslationService,\n} from '../services';\nimport { WorkflowOrchestrator } from '../state';\nimport { ThemeManager } from '../theme/theme-manager';\nimport { ThemeConfig } from '../types/theme';\nimport { defaultTheme } from '../theme/presets';\nimport { SDK_VERSION } from '../version';\nimport { injectCriticalCSS } from '../styles/critical-css';\nimport { TranslationProvider } from '../i18n/TranslationContext';\n\nconst THEME_CACHE_KEY = 'metakyc-theme-cache';\n\n/**\n * Props for MetaKYCProvider\n */\nexport interface MetaKYCProviderProps {\n config: MetaKYCClientConfig;\n children: React.ReactNode;\n}\n\n/**\n * MetaKYC Provider Component\n * Provides MetaKYC client and services to all child components\n */\nexport const MetaKYCProvider: React.FC<MetaKYCProviderProps> = ({ config, children }) => {\n injectCriticalCSS();\n\n const [currentTheme, setCurrentTheme] = useState<ThemeConfig | null>(null);\n const isLoadingThemeRef = React.useRef(false);\n const hasLoadedThemeRef = React.useRef(false);\n \n // Initialize services once - don't recreate on theme changes\n const services = useMemo(() => {\n const httpClient = new HttpClient(config);\n\n const applicantService = new ApplicantService(httpClient);\n const questionnaireService = new QuestionnaireService(httpClient);\n const uploadDocumentService = new UploadDocumentService(httpClient);\n const appropriatenessTestService = new AppropriatenessTestService(httpClient);\n const overviewService = new OverviewService(httpClient);\n const riskScoringService = new RiskScoringService(httpClient);\n const identityService = new IdentityService(httpClient);\n const baseInformationService = new BaseInformationService(httpClient);\n const investorCategorizationService = new InvestorCategorizationService(httpClient);\n const themeService = new ThemeService(httpClient);\n const translationService = new TranslationService(httpClient);\n const themeManager = new ThemeManager();\n\n // Apply theme synchronously before first render to prevent flash.\n // Priority: static config theme → localStorage cache → default theme.\n if (typeof document !== 'undefined') {\n if (config.theme) {\n themeManager.applyTheme(config.theme);\n } else {\n try {\n const cached = localStorage.getItem(THEME_CACHE_KEY);\n themeManager.applyTheme(cached ? JSON.parse(cached) : defaultTheme);\n } catch {\n themeManager.applyTheme(defaultTheme);\n }\n }\n }\n\n return {\n httpClient,\n applicantService,\n questionnaireService,\n uploadDocumentService,\n appropriatenessTestService,\n overviewService,\n riskScoringService,\n identityService,\n baseInformationService,\n investorCategorizationService,\n themeService,\n translationService,\n themeManager,\n };\n }, [config]);\n\n // Create context value with current theme\n const value = useMemo<MetaKYCContextValue>(() => {\n return {\n config,\n ...services,\n currentTheme,\n createOrchestrator: () =>\n new WorkflowOrchestrator(\n services.applicantService,\n services.questionnaireService,\n services.uploadDocumentService,\n services.appropriatenessTestService,\n services.overviewService,\n services.riskScoringService,\n services.identityService,\n services.investorCategorizationService\n ),\n };\n }, [config, services, currentTheme]);\n\n // Load and apply theme on mount (only once)\n useEffect(() => {\n const loadTheme = async () => {\n // Prevent duplicate theme loading\n if (isLoadingThemeRef.current || hasLoadedThemeRef.current) {\n console.log('[MetaKYC] Theme already loading or loaded, skipping...');\n return;\n }\n \n isLoadingThemeRef.current = true;\n \n try {\n // If static theme provided in config, use it\n if (config.theme) {\n console.log('[MetaKYC] Applying static theme from config');\n services.themeManager.applyTheme(config.theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n return;\n }\n\n // Otherwise, fetch from backend (default behavior)\n console.log('[MetaKYC] Fetching theme from backend...');\n const theme = await services.themeService.getThemeConfiguration();\n services.themeManager.applyTheme(theme);\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n // Cache for next visit so the correct theme is applied instantly\n try { localStorage.setItem(THEME_CACHE_KEY, JSON.stringify(theme)); } catch { /* ignore */ }\n console.log('[MetaKYC] Theme loaded and applied', theme);\n } catch (error) {\n console.warn('[MetaKYC] Failed to load theme, using default:', error);\n // Set default theme\n setCurrentTheme(services.themeManager.getCurrentTheme());\n hasLoadedThemeRef.current = true;\n } finally {\n isLoadingThemeRef.current = false;\n }\n };\n\n loadTheme();\n\n // Cleanup on unmount\n return () => {\n services.themeManager.cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const fetchTranslations = useCallback(\n (locale: string) => services.translationService.getTranslations(locale),\n [services.translationService],\n );\n\n return (\n <MetaKYCContext.Provider value={value}>\n <TranslationProvider\n locale={config.locale || 'en'}\n fetchTranslations={fetchTranslations}\n >\n {config.showVersion && (\n <div\n style={{\n fontSize: '0.625rem',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n opacity: 0.5,\n textAlign: 'right',\n padding: '2px 8px',\n userSelect: 'none',\n pointerEvents: 'none',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}\n >\n SDK v{SDK_VERSION}\n </div>\n )}\n {children}\n </TranslationProvider>\n </MetaKYCContext.Provider>\n );\n};\n","import { useContext } from 'react';\nimport { MetaKYCContext, MetaKYCContextValue } from './MetaKYCContext';\n\n/**\n * Hook to access MetaKYC context\n * @throws Error if used outside MetaKYCProvider\n */\nexport function useMetaKYC(): MetaKYCContextValue {\n const context = useContext(MetaKYCContext);\n\n if (!context) {\n throw new Error('useMetaKYC must be used within a MetaKYCProvider');\n }\n\n return context;\n}\n","/**\n * Convert file to base64 string\n */\nexport async function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const result = reader.result as string;\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = (error) => reject(error);\n });\n}\n\n/**\n * Validate file size\n */\nexport function validateFileSize(file: File, maxSizeBytes: number): boolean {\n return file.size <= maxSizeBytes;\n}\n\n/**\n * Validate file type\n */\nexport function validateFileType(file: File, allowedTypes: string): boolean {\n const mimeTypes = allowedTypes.split(',').map((type) => type.trim());\n return mimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n // Wildcard type (e.g., image/*)\n const prefix = type.slice(0, -2);\n return file.type.startsWith(prefix);\n }\n return file.type === type;\n });\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Get accept attribute string for file input\n */\nexport function getAcceptString(allowedTypes: string): string {\n return allowedTypes;\n}\n","/**\n * Simple class name utility\n * Combines class names and filters out falsy values\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Local storage utilities for persisting workflow state\n */\n\nconst STORAGE_KEYS = {\n APPLICANT_ID: 'metakyc_applicant_id',\n WORKFLOW_STATE: 'metakyc_workflow_state',\n} as const;\n\n/**\n * Save applicant ID to local storage\n */\nexport function saveApplicantId(applicantId: number): void {\n try {\n localStorage.setItem(STORAGE_KEYS.APPLICANT_ID, applicantId.toString());\n } catch (error) {\n console.warn('Failed to save applicant ID to storage:', error);\n }\n}\n\n/**\n * Get applicant ID from local storage\n */\nexport function getApplicantId(): number | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.APPLICANT_ID);\n return stored ? parseInt(stored, 10) : null;\n } catch (error) {\n console.warn('Failed to retrieve applicant ID from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear applicant ID from local storage\n */\nexport function clearApplicantId(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.APPLICANT_ID);\n } catch (error) {\n console.warn('Failed to clear applicant ID from storage:', error);\n }\n}\n\n/**\n * Persisted workflow state interface\n */\nexport interface PersistedWorkflowState {\n applicantId: number;\n currentStepOrder?: number;\n status: number;\n lastUpdated: string;\n workflowKey?: string;\n nextWorkflowKey?: string;\n}\n\n/**\n * Save workflow state to local storage\n */\nexport function saveWorkflowState(state: PersistedWorkflowState): void {\n try {\n localStorage.setItem(STORAGE_KEYS.WORKFLOW_STATE, JSON.stringify(state));\n } catch (error) {\n console.warn('Failed to save workflow state to storage:', error);\n }\n}\n\n/**\n * Get workflow state from local storage\n */\nexport function getWorkflowState(): PersistedWorkflowState | null {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.WORKFLOW_STATE);\n return stored ? JSON.parse(stored) : null;\n } catch (error) {\n console.warn('Failed to retrieve workflow state from storage:', error);\n return null;\n }\n}\n\n/**\n * Clear workflow state from local storage\n */\nexport function clearWorkflowState(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.WORKFLOW_STATE);\n } catch (error) {\n console.warn('Failed to clear workflow state from storage:', error);\n }\n}\n\n/**\n * Clear all MetaKYC data from local storage\n */\nexport function clearAllStorage(): void {\n clearApplicantId();\n clearWorkflowState();\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport * as React from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ProgressApplicantResult,\n ApplicantProgressStatus,\n} from '../types';\nimport { WorkflowOrchestrator } from '../state';\nimport { saveApplicantId, getApplicantId, saveWorkflowState } from '../utils';\n\n/**\n * Hook to manage KYC workflow state and progression with automatic persistence\n */\nexport function useKycWorkflow(applicantId?: number) {\n const { createOrchestrator } = useMetaKYC();\n const [progress, setProgress] = useState<ProgressApplicantResult | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const orchestratorRef = useRef<WorkflowOrchestrator | null>(null);\n \n // Get persisted applicant ID if not provided\n const effectiveApplicantId = applicantId || getApplicantId();\n\n // Initialize orchestrator\n useEffect(() => {\n if (!orchestratorRef.current) {\n orchestratorRef.current = createOrchestrator();\n }\n }, [createOrchestrator]);\n\n // Save progress to localStorage whenever it changes\n useEffect(() => {\n if (progress && effectiveApplicantId) {\n saveApplicantId(effectiveApplicantId);\n saveWorkflowState({\n applicantId: effectiveApplicantId,\n currentStepOrder: progress.currentStep?.order,\n status: progress.status,\n lastUpdated: new Date().toISOString(),\n workflowKey: progress.workFlowKey,\n nextWorkflowKey: progress.nextWorkflowKey,\n });\n }\n }, [progress, effectiveApplicantId]);\n\n // Track if we're currently loading to prevent duplicate requests\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef(false);\n\n // Load progress\n const loadProgress = useCallback(async () => {\n if (!effectiveApplicantId || !orchestratorRef.current) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.initialize(effectiveApplicantId);\n setProgress(result);\n hasLoadedRef.current = true;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [effectiveApplicantId]);\n\n // Load progress on mount or when applicantId changes\n useEffect(() => {\n if (effectiveApplicantId && !hasLoadedRef.current) {\n loadProgress();\n }\n }, [effectiveApplicantId, loadProgress]);\n\n // Refresh progress\n const refreshProgress = useCallback(async () => {\n if (!orchestratorRef.current) return;\n \n // Prevent duplicate refresh requests\n if (isLoadingRef.current) {\n console.log('[Workflow] Refresh already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, []);\n\n // Move to next step\n const moveToNext = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToNextStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Move to previous step\n const moveBack = useCallback(async () => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await orchestratorRef.current.moveToPreviousStep();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Submit current step data\n const submitCurrentStep = useCallback(async (data: any) => {\n if (!orchestratorRef.current) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n await orchestratorRef.current.submitCurrentStep(data);\n const result = await orchestratorRef.current.refreshProgress();\n setProgress(result);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Sort steps by order\n const sortedSteps = React.useMemo(() => {\n if (!progress?.stepInfoList) return [];\n return [...progress.stepInfoList].sort((a, b) => a.order - b.order);\n }, [progress?.stepInfoList]);\n\n // Check if workflow has changed\n const hasWorkflowChanged = React.useMemo(() => {\n if (!progress) return false;\n return progress.nextWorkflowKey && progress.nextWorkflowKey !== progress.workFlowKey;\n }, [progress]);\n\n return {\n progress,\n applicantId: effectiveApplicantId,\n currentStep: progress?.currentStep || null,\n steps: sortedSteps,\n status: progress?.status || ApplicantProgressStatus.None,\n workflowResult: progress?.workflowResult || null,\n workflowKey: progress?.workFlowKey,\n nextWorkflowKey: progress?.nextWorkflowKey,\n hasWorkflowChanged,\n isLoading,\n error,\n isComplete: progress?.status === ApplicantProgressStatus.Finished,\n isOnHold: progress?.status === ApplicantProgressStatus.OnHold,\n refreshProgress,\n moveToNext,\n moveBack,\n submitCurrentStep,\n orchestrator: orchestratorRef.current,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { QuestionnaireOutput, FillQuestionnarieInput, FillQuestionnairesResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage questionnaire data and submission\n */\nexport function useQuestionnaire(applicantId?: number) {\n const { questionnaireService, applicantService } = useMetaKYC();\n const [questionnaire, setQuestionnaire] = useState<QuestionnaireOutput | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load questionnaire + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Questionnaire] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [result, applicantData] = await Promise.all([\n questionnaireService.getQuestionnaire(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setQuestionnaire(result);\n\n // Build initial answers by matching question text to existing results\n if (applicantData?.questionnaireResults?.length && result) {\n const textToAnswers = new Map<string, string[]>();\n for (const qr of applicantData.questionnaireResults) {\n if (qr.question && qr.answers?.length) {\n textToAnswers.set(qr.question.trim().toLowerCase(), qr.answers);\n }\n }\n\n const answers: InitialAnswers = {};\n const allQuestions = result.questionGroups.flatMap(g => g.questions ?? []);\n for (const q of allQuestions) {\n const key = q.text.trim().toLowerCase();\n if (textToAnswers.has(key)) {\n answers[q.id] = textToAnswers.get(key)!;\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, questionnaireService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit questionnaire\n const submit = useCallback(\n async (input: FillQuestionnarieInput): Promise<FillQuestionnairesResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const result = await questionnaireService.fillQuestionnaire(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [questionnaireService]\n );\n\n return {\n questionnaire,\n initialAnswers,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { UploadDocumentOutputDto, FillUploadDocumentInput } from '../types';\n\n/**\n * Hook to manage upload document data and submission\n */\nexport function useUploadDocument(applicantId?: number) {\n const { uploadDocumentService } = useMetaKYC();\n const [uploadDocument, setUploadDocument] = useState<UploadDocumentOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load upload document requirements\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[UploadDocument] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await uploadDocumentService.getUploadDocument(applicantId);\n setUploadDocument(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, uploadDocumentService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit uploaded documents\n const submit = useCallback(\n async (input: FillUploadDocumentInput): Promise<void> => {\n setIsSubmitting(true);\n setUploadProgress(0);\n setError(null);\n\n try {\n await uploadDocumentService.fillUploadDocument(input);\n setUploadProgress(100);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [uploadDocumentService]\n );\n\n return {\n uploadDocument,\n isLoading,\n isSubmitting,\n uploadProgress,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n FillAppropriatenessTestResult,\n} from '../types';\n\n/**\n * Hook to manage appropriateness test data and submission\n */\nexport function useAppropriatenessTest(applicantId?: number) {\n const { appropriatenessTestService } = useMetaKYC();\n const [test, setTest] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<FillAppropriatenessTestResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load appropriateness test\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[AppropriatenessTest] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTest(data);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, appropriatenessTestService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit appropriateness test\n const submit = useCallback(\n async (input: FillAppropriatenessTestInput): Promise<FillAppropriatenessTestResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await appropriatenessTestService.fillAppropriatenessTest(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [appropriatenessTestService]\n );\n\n return {\n test,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { OverviewDataDto } from '../types';\n\n/**\n * Hook to manage overview data and submission\n */\nexport function useOverview(applicantId?: number) {\n const { overviewService } = useMetaKYC();\n const [overview, setOverview] = useState<OverviewDataDto | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load overview data\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[Overview] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await overviewService.getOverviewData(applicantId);\n setOverview(result);\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, overviewService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Pass overview (confirm and continue)\n const passOverview = useCallback(async () => {\n if (!applicantId) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n await overviewService.passOverview(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n }, [applicantId, overviewService]);\n\n return {\n overview,\n isLoading,\n isSubmitting,\n error,\n load,\n passOverview,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { ApplicantRegistrationRequestOutput, IdentityRequest } from '../types';\n\n/**\n * Hook to manage identity verification\n */\nexport function useIdentityVerification(applicantId?: number) {\n const { identityService } = useMetaKYC();\n const [identityData, setIdentityData] = useState<ApplicantRegistrationRequestOutput | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isRequestingRef = useRef(false);\n\n // Request identity verification (individual)\n const requestIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n \n // Prevent duplicate requests using ref\n if (isRequestingRef.current) {\n console.log('[Identity] Request already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl: redirectUrl || '',\n ttl: ttl || 7 * 24 * 3600, // Default: 7 days\n };\n console.log('Identity request input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Identity request result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n },\n [applicantId, identityService]\n );\n\n // Request company identity verification\n const requestCompanyIdentity = useCallback(\n async (redirectUrl?: string, ttl?: number) => {\n if (!applicantId) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: false,\n redirectUrl,\n ttl,\n };\n const result = await identityService.identityCompanyRequest(input);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantId, identityService]\n );\n\n // Restart identity verification\n const restartIdentity = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isRequestingRef.current) {\n console.log('[Identity] Restart already in progress, skipping...');\n return;\n }\n\n isRequestingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const input: IdentityRequest = {\n applicantId,\n restart: true,\n redirectUrl: '',\n ttl: 7 * 24 * 3600, // 7 days\n };\n console.log('Restarting identity with input:', input);\n const result = await identityService.identityRequest(input);\n console.log('Restart identity result:', result);\n setIdentityData(result);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isRequestingRef.current = false;\n }\n }, [applicantId, identityService]);\n\n return {\n identityData,\n provider: identityData?.provider || null,\n token: identityData?.publicProviderTokenObject || null,\n isLoading,\n error,\n requestIdentity,\n requestCompanyIdentity,\n restartIdentity,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport { RiskCriteriaDto, RiskCalculationInput, RiskScoringResult } from '../types';\n\ntype InitialAnswers = Record<number, string[]>;\n\n/**\n * Hook to manage risk scoring\n */\nexport function useRiskScoring(applicantId?: number) {\n const { riskScoringService, applicantService } = useMetaKYC();\n const [criteria, setCriteria] = useState<RiskCriteriaDto[] | null>(null);\n const [initialAnswers, setInitialAnswers] = useState<InitialAnswers>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<RiskScoringResult | null>(null);\n const isLoadingRef = useRef(false);\n const hasLoadedRef = useRef<number | null>(null);\n\n // Load risk criteria + existing answers\n const load = useCallback(async () => {\n if (!applicantId) return;\n \n // Prevent duplicate requests\n if (isLoadingRef.current) {\n console.log('[RiskScoring] Load already in progress, skipping...');\n return;\n }\n\n isLoadingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const [data, applicantData] = await Promise.all([\n riskScoringService.getRiskCriterias(applicantId),\n applicantService.getApplicantData(applicantId).catch(() => null),\n ]);\n setCriteria(data);\n\n // Build initial answers from the latest risk scoring result\n if (applicantData?.riskScoringResults?.length) {\n const latestResult = applicantData.riskScoringResults[0];\n const answers: InitialAnswers = {};\n for (const cr of latestResult.riskCriteriaResults ?? []) {\n if (cr.riskCriteriaId != null && cr.answer != null && cr.answer !== '') {\n // answer may be comma-separated for multi-value criteria — split, trim, and deduplicate\n const values = [...new Set(\n cr.answer.split(',').map((v: string) => v.trim()).filter((v: string) => v !== '')\n )];\n if (values.length > 0) {\n answers[cr.riskCriteriaId] = values;\n }\n }\n }\n setInitialAnswers(answers);\n }\n\n hasLoadedRef.current = applicantId;\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n isLoadingRef.current = false;\n }\n }, [applicantId, riskScoringService, applicantService]);\n\n // Load on mount or when applicantId changes\n useEffect(() => {\n if (applicantId && hasLoadedRef.current !== applicantId) {\n load();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Submit risk scoring\n const submit = useCallback(\n async (input: RiskCalculationInput): Promise<RiskScoringResult> => {\n setIsSubmitting(true);\n setError(null);\n\n try {\n const submitResult = await riskScoringService.submitRiskScoring(input);\n setResult(submitResult);\n return submitResult;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsSubmitting(false);\n }\n },\n [riskScoringService]\n );\n\n return {\n criteria,\n initialAnswers,\n result,\n isLoading,\n isSubmitting,\n error,\n load,\n submit,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useMetaKYC } from '../context';\nimport {\n ApplicantRegistrationRequestInput,\n CompanyApplicantRegistrationRequestInput,\n ProgressApplicantResult,\n ApplicantDataDto,\n} from '../types';\n\n/**\n * Hook to manage applicant operations\n */\nexport function useApplicant() {\n const { applicantService, config } = useMetaKYC();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isCreatingRef = useRef(false);\n const isLoadingDataRef = useRef(false);\n\n /**\n * Generate session key for SardinAI if configured\n */\n const generateSardinAISessionKey = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n // Create individual applicant\n const createApplicant = useCallback(\n async (input: ApplicantRegistrationRequestInput): Promise<ProgressApplicantResult> => {\n // Prevent duplicate requests\n if (isCreatingRef.current) {\n console.log('[Applicant] Create already in progress, skipping...');\n throw new Error('Creation already in progress');\n }\n\n isCreatingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n // Ensure applicantAdditionalDatas is always initialized (even if empty)\n if (!input.applicantAdditionalDatas) {\n input.applicantAdditionalDatas = [];\n }\n\n // If SardinAI is configured, add session key to additional data\n if (config.identityProviders?.sardinai) {\n const sessionKey = generateSardinAISessionKey();\n console.log('[SardinAI] Generated session key:', sessionKey);\n \n input.applicantAdditionalDatas.push({\n paramName: 'sessionKey',\n value: sessionKey,\n });\n }\n\n const result = await applicantService.createApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isCreatingRef.current = false;\n }\n },\n [applicantService, config]\n );\n\n // Create company applicant\n const createCompanyApplicant = useCallback(\n async (\n input: CompanyApplicantRegistrationRequestInput\n ): Promise<ProgressApplicantResult> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.createCompanyApplicant(input);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n // Get applicant data\n const getApplicantData = useCallback(\n async (applicantId: number): Promise<ApplicantDataDto> => {\n // Prevent duplicate requests\n if (isLoadingDataRef.current) {\n console.log('[Applicant] Data load already in progress, skipping...');\n throw new Error('Data load already in progress');\n }\n\n isLoadingDataRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await applicantService.getApplicantData(applicantId);\n return result;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n isLoadingDataRef.current = false;\n }\n },\n [applicantService]\n );\n\n // Stop progress\n const stopProgress = useCallback(\n async (applicantId: number): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await applicantService.stopProgress(applicantId);\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [applicantService]\n );\n\n return {\n isLoading,\n error,\n createApplicant,\n createCompanyApplicant,\n getApplicantData,\n stopProgress,\n };\n}\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n primary: {\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n color: '#ffffff',\n borderColor: 'transparent',\n },\n secondary: {\n backgroundColor: 'var(--metakyc-surface, #f3f4f6)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #e5e7eb)',\n },\n outline: {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n borderColor: 'var(--metakyc-primary, #2563eb)',\n },\n danger: {\n backgroundColor: 'var(--metakyc-danger, #ef4444)',\n color: '#ffffff',\n borderColor: 'transparent',\n },\n ghost: {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n borderColor: 'transparent',\n },\n};\n\n/**\n * Button component\n */\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant = 'primary',\n size = 'md',\n isLoading = false,\n disabled,\n className,\n style,\n ...props\n}) => {\n const baseStyles =\n 'inline-flex items-center justify-center rounded-lg font-medium transition-opacity border focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed';\n\n const sizeStyles = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n };\n\n const sizeInline: Record<string, React.CSSProperties> = {\n sm: { padding: '0.375rem 0.75rem', fontSize: '0.875rem' },\n md: { padding: '0.5rem 1rem', fontSize: '0.875rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1rem' },\n };\n\n return (\n <button\n className={cn(baseStyles, sizeStyles[size], className)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '0.5rem',\n fontWeight: 500,\n borderWidth: '1px',\n borderStyle: 'solid',\n cursor: disabled || isLoading ? 'not-allowed' : 'pointer',\n opacity: disabled || isLoading ? 0.5 : 1,\n lineHeight: '1.25rem',\n ...sizeInline[size],\n ...VARIANT_STYLES[variant],\n ...style,\n }}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * Input component — uses CSS variables so it follows the SDK theme.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ label, error, helperText, leftIcon, rightIcon, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n leftIcon ? 'pl-10' : '',\n rightIcon ? 'pr-10' : '',\n className\n )}\n style={{\n minHeight: '38px',\n backgroundColor: props.readOnly\n ? 'var(--metakyc-surface, #f3f4f6)'\n : 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n cursor: props.readOnly ? 'default' : undefined,\n ...style,\n }}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none\">\n {rightIcon}\n </div>\n )}\n </div>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * Card component\n */\nexport const Card: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('metakyc-card rounded-xl shadow-sm border', className)}\n style={{\n backgroundColor: 'var(--metakyc-surface, #ffffff)',\n borderColor: 'var(--metakyc-border, #e5e7eb)',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: '0.75rem',\n overflow: 'hidden',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card header component\n */\nexport const CardHeader: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4 border-b', className)}\n style={{\n padding: '1rem 1.5rem',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: 'var(--metakyc-border, #e5e7eb)',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card content component\n */\nexport const CardContent: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4', className)}\n style={{ padding: '1rem 1.5rem', ...style }}\n {...props}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Card footer component\n */\nexport const CardFooter: React.FC<CardProps> = ({ children, className, style, ...props }) => {\n return (\n <div\n className={cn('px-6 py-4 border-t', className)}\n style={{\n padding: '1rem 1.5rem',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: 'var(--metakyc-border, #e5e7eb)',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import React from 'react';\n\ninterface CheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nconst BOX_BASE: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 16,\n height: 16,\n minWidth: 16,\n minHeight: 16,\n maxWidth: 16,\n maxHeight: 16,\n borderRadius: 4,\n borderWidth: '1.5px',\n borderStyle: 'solid',\n cursor: 'pointer',\n flexShrink: 0,\n position: 'relative',\n transition: 'background-color 0.15s, border-color 0.15s',\n boxSizing: 'border-box',\n padding: 0,\n margin: 0,\n verticalAlign: 'middle',\n};\n\n/**\n * Fully inline-styled checkbox — immune to host-app CSS interference.\n * Uses a hidden native input for accessibility + a visual span with SVG checkmark.\n */\nexport const Checkbox: React.FC<CheckboxProps> = ({ checked, onChange, disabled, style }) => {\n const uncheckedBorder = 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))';\n const uncheckedBg = 'var(--metakyc-input-bg, var(--metakyc-background, #ffffff))';\n const checkedColor = 'var(--metakyc-primary, #2563eb)';\n\n return (\n <span\n role=\"checkbox\"\n aria-checked={checked}\n tabIndex={0}\n onClick={() => !disabled && onChange(!checked)}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n if (!disabled) onChange(!checked);\n }\n }}\n style={{\n ...BOX_BASE,\n backgroundColor: checked ? checkedColor : uncheckedBg,\n borderColor: checked ? checkedColor : uncheckedBorder,\n opacity: disabled ? 0.5 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n >\n {checked && (\n <svg\n width=\"10\"\n height=\"8\"\n viewBox=\"0 0 10 8\"\n fill=\"none\"\n style={{ display: 'block', flexShrink: 0 }}\n >\n <path\n d=\"M1 4L3.5 6.5L9 1\"\n stroke=\"#ffffff\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'success' | 'danger' | 'warning' | 'info';\n children: React.ReactNode;\n}\n\nconst VARIANT_STYLES: Record<string, React.CSSProperties> = {\n default: {\n backgroundColor: 'var(--metakyc-surface, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n },\n // Inherits input styling — matches inputs/selects visually\n info: {\n backgroundColor: 'var(--metakyc-input-bg, var(--metakyc-surface, #f9fafb))',\n color: 'var(--metakyc-input-text, var(--metakyc-text-secondary, #6b7280))',\n border: '1px solid var(--metakyc-input-border, var(--metakyc-border, #e5e7eb))',\n },\n success: {\n backgroundColor: 'var(--metakyc-input-bg, var(--metakyc-surface, #f9fafb))',\n color: 'var(--metakyc-input-text, var(--metakyc-text-secondary, #6b7280))',\n border: '1px solid var(--metakyc-input-border, var(--metakyc-border, #e5e7eb))',\n },\n danger: {\n backgroundColor: '#fee2e2',\n color: '#991b1b',\n },\n warning: {\n backgroundColor: '#fef3c7',\n color: '#92400e',\n },\n};\n\n/**\n * Badge component\n */\nexport const Badge: React.FC<BadgeProps> = ({ children, variant = 'default', className, style, ...props }) => {\n return (\n <span\n className={cn(\n 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium',\n className\n )}\n style={{ ...VARIANT_STYLES[variant], ...style }}\n {...props}\n >\n {children}\n </span>\n );\n};\n","import React from 'react';\nimport { cn } from '../../utils';\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className, ...props }) => {\n const sizeStyles = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className={cn('flex items-center justify-center', className)} {...props}>\n <svg\n className={cn('animate-spin text-primary-500', sizeStyles[size])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n );\n};\n","import React, { forwardRef } from 'react';\nimport { cn } from '../../utils';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n helperText?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * Select component — uses CSS variables so it follows the SDK theme.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ label, error, helperText, options, placeholder, className, style, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <select\n ref={ref}\n className={cn(\n 'block w-full rounded-lg border px-3 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\n 'disabled:opacity-60 disabled:cursor-not-allowed',\n error ? 'border-danger-500' : '',\n className\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n ...style,\n }}\n {...props}\n >\n {placeholder && (\n <option\n key=\"__placeholder__\"\n value=\"\"\n disabled\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >\n {placeholder}\n </option>\n )}\n {options.map((option, idx) => (\n <option\n key={option.value || `option-${idx}`}\n value={option.value}\n disabled={option.disabled}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: option.disabled\n ? 'var(--metakyc-text-muted, #9ca3af)'\n : 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))',\n }}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Checkbox } from './Checkbox';\nimport { useTranslation } from '../../i18n/TranslationContext';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nexport interface MultiSelectProps {\n label?: string;\n value: string[];\n onChange: (values: string[]) => void;\n options: MultiSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 280;\n\nexport const MultiSelect: React.FC<MultiSelectProps> = ({\n label,\n value,\n onChange,\n options,\n placeholder: placeholderProp,\n disabled: disabledProp = false,\n readOnly = false,\n required = false,\n}) => {\n const { t } = useTranslation();\n const placeholder = placeholderProp ?? t('common.select');\n const disabled = disabledProp || readOnly;\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff', borderColor: '#d1d5db', textPrimary: '#111827',\n textSecondary: '#6b7280', primaryColor: '#2563eb',\n primaryLight: '#eff6ff', hoverBg: '#f9fafb',\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const calcPos = useCallback((): DropdownPos | null => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return { top: openUp ? rect.top : rect.bottom + 4, left: rect.left, width: rect.width, openUp };\n }, []);\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const v = (name: string, fallback: string) => s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n borderColor: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n textPrimary: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primaryColor: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (!containerRef.current?.contains(target) && !dropdownRef.current?.contains(target)) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n useEffect(() => {\n if (!isOpen) return;\n const update = () => { const p = calcPos(); if (p) setPos(p); };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => { window.removeEventListener('scroll', update, true); window.removeEventListener('resize', update); };\n }, [isOpen, calcPos]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const toggleOption = (optionValue: string) => {\n if (disabled) return;\n onChange(value.includes(optionValue) ? value.filter(v => v !== optionValue) : [...value, optionValue]);\n };\n\n const removeValue = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) onChange(value.filter(v => v !== optionValue));\n };\n\n const getLabel = (val: string) => options.find(o => o.value === val)?.label || val;\n\n const { bg, borderColor, textPrimary, textSecondary, primaryColor, primaryLight, hoverBg } = portalColors;\n\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-multiselect-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${borderColor}` }}>\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder={t('common.search')}\n autoFocus\n onClick={e => e.stopPropagation()}\n className=\"metakyc-multiselect-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${borderColor}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n onFocus={e => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const focusBorder = s.getPropertyValue('--metakyc-input-border-focus').trim()\n || s.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = focusBorder;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = `0 0 0 2px ${focusBorder}33`;\n }}\n onBlur={e => {\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = borderColor;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Options */}\n <ul style={{ listStyle: 'none', margin: 0, padding: '4px 0', maxHeight: '192px', overflowY: 'auto' }}>\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>{t('common.noResults')}</li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = value.includes(option.value);\n return (\n <li\n key={option.value}\n onClick={() => toggleOption(option.value)}\n className=\"metakyc-multiselect-option\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '13px',\n cursor: 'pointer',\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primaryColor : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent'; }}\n >\n <Checkbox\n checked={isSelected}\n onChange={() => {}}\n />\n <span>{option.label}</span>\n </li>\n );\n })\n )}\n </ul>\n\n {/* Clear all */}\n {value.length > 0 && (\n <div style={{ padding: '6px 12px', borderTop: `1px solid ${borderColor}` }}>\n <button\n type=\"button\"\n onClick={() => { onChange([]); setSearch(''); }}\n style={{ fontSize: '12px', color: '#ef4444', background: 'none', border: 'none', cursor: 'pointer', padding: 0 }}\n >\n {t('common.clearAll')} ({value.length})\n </button>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"w-full metakyc-multiselect\" ref={containerRef}>\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n 'metakyc-multiselect-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors relative',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n borderColor: isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n {value.length === 0 ? (\n <span\n className=\"metakyc-multiselect-placeholder leading-6\"\n style={{ color: 'var(--metakyc-text-secondary, #9ca3af)' }}\n >\n {placeholder}\n </span>\n ) : (\n <div className=\"flex flex-wrap gap-1 pr-6\">\n {value.map(v => (\n <span\n key={v}\n className=\"metakyc-multiselect-chip inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium\"\n style={{\n backgroundColor: 'var(--metakyc-primary-light, #eff6ff)',\n color: 'var(--metakyc-primary, #2563eb)',\n }}\n >\n {getLabel(v)}\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(v, e)}\n className=\"metakyc-multiselect-chip-remove\"\n style={{\n background: 'transparent', border: 'none',\n padding: '0 0 0 2px', margin: 0,\n cursor: 'pointer', fontSize: '14px',\n lineHeight: 1, fontWeight: 'bold',\n display: 'inline-flex', alignItems: 'center',\n boxShadow: 'none', transform: 'none',\n minWidth: 0, width: 'auto', height: 'auto',\n letterSpacing: 'normal', textTransform: 'none',\n }}\n >\n ×\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n <span\n className=\"metakyc-multiselect-arrow absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none text-xs\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils';\nimport { useTranslation } from '../../i18n/TranslationContext';\n\nexport interface SearchableSelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SearchableSelectProps {\n label?: string;\n error?: string;\n helperText?: string;\n options: SearchableSelectOption[];\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n className?: string;\n}\n\ninterface DropdownPos {\n top: number;\n left: number;\n width: number;\n openUp: boolean;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 260; // px — search (44) + list (max-h-52 = 208) + padding\n\n/**\n * Single-value searchable dropdown — follows SDK CSS variable theming.\n * The dropdown panel is rendered via a React portal at document.body level\n * so it is never clipped by overflow:hidden parents or stacking contexts.\n */\nexport const SearchableSelect: React.FC<SearchableSelectProps> = ({\n label,\n error,\n helperText,\n options,\n placeholder: placeholderProp,\n value,\n onChange,\n disabled: disabledProp = false,\n readOnly = false,\n required = false,\n className,\n}) => {\n const { t } = useTranslation();\n const placeholder = placeholderProp ?? t('common.select');\n const disabled = disabledProp || readOnly;\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [pos, setPos] = useState<DropdownPos | null>(null);\n\n // Concrete color values snapped from CSS variables when the dropdown opens.\n // Reading from document.documentElement guarantees we get the ThemeManager's values\n // even though the portal renders outside .metakyc-sdk.\n const [portalColors, setPortalColors] = useState({\n bg: '#ffffff',\n border: '#d1d5db',\n text: '#111827',\n textSecondary: '#6b7280',\n primary: '#2563eb',\n primaryLight: '#eff6ff',\n hoverBg: '#f9fafb',\n });\n\n const snapPortalColors = useCallback(() => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const v = (name: string, fallback: string) =>\n s.getPropertyValue(name).trim() || fallback;\n const bg = v('--metakyc-input-bg', v('--metakyc-background', '#ffffff'));\n setPortalColors({\n bg,\n border: v('--metakyc-input-border', v('--metakyc-border', '#d1d5db')),\n text: v('--metakyc-input-text', v('--metakyc-text-primary', '#111827')),\n textSecondary: v('--metakyc-text-secondary', '#6b7280'),\n primary: v('--metakyc-primary', '#2563eb'),\n primaryLight: v('--metakyc-primary-light', '#eff6ff'),\n hoverBg: v('--metakyc-surface', bg),\n });\n }, []);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n // ── Position calculation ──────────────────────────────────────────────────\n const calcPos = useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const openUp = spaceBelow < DROPDOWN_MAX_HEIGHT && rect.top > DROPDOWN_MAX_HEIGHT;\n return {\n top: openUp ? rect.top : rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n openUp,\n };\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n snapPortalColors();\n const p = calcPos();\n if (p) setPos(p);\n setIsOpen(true);\n }, [disabled, calcPos, snapPortalColors]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n const handleToggle = () => (isOpen ? close() : open());\n\n // ── Close on outside click ────────────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !containerRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, close]);\n\n // ── Reposition on scroll / resize ────────────────────────────────────────\n useEffect(() => {\n if (!isOpen) return;\n const update = () => {\n const p = calcPos();\n if (p) setPos(p);\n };\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [isOpen, calcPos]);\n\n // ── Focus search on open ──────────────────────────────────────────────────\n useEffect(() => {\n if (isOpen && searchRef.current) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n const filteredOptions = options.filter(o =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n const selectedLabel = options.find(o => o.value === value)?.label;\n\n const handleSelect = (optValue: string, optDisabled?: boolean) => {\n if (disabled || optDisabled) return;\n onChange(optValue);\n close();\n };\n\n // Destructure snapped concrete values for the portal\n const { bg, border, text: textPrimary, textSecondary, primary, primaryLight, hoverBg } = portalColors;\n\n // ── Portal dropdown panel ─────────────────────────────────────────────────\n const dropdownPanel = isOpen && pos && (\n <div\n ref={dropdownRef}\n className=\"metakyc-searchable-select-dropdown\"\n style={{\n position: 'fixed',\n top: pos.openUp ? undefined : pos.top,\n bottom: pos.openUp ? window.innerHeight - pos.top + 4 : undefined,\n left: pos.left,\n width: pos.width,\n zIndex: 99999,\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n overflow: 'hidden',\n }}\n >\n {/* Search input */}\n <div style={{ padding: '8px', borderBottom: `1px solid ${border}` }}>\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder={t('common.search')}\n onClick={e => e.stopPropagation()}\n className=\"metakyc-searchable-select-search w-full\"\n style={{\n display: 'block',\n width: '100%',\n padding: '6px 8px',\n fontSize: '13px',\n borderRadius: '6px',\n border: `1px solid ${border}`,\n backgroundColor: bg,\n color: textPrimary,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n onFocus={e => {\n const s = getComputedStyle(document.querySelector('.metakyc-sdk') || document.documentElement);\n const focusBorder = s.getPropertyValue('--metakyc-input-border-focus').trim()\n || s.getPropertyValue('--metakyc-primary').trim() || '#2563eb';\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = focusBorder;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = `0 0 0 2px ${focusBorder}33`;\n }}\n onBlur={e => {\n e.currentTarget.style.backgroundColor = bg;\n e.currentTarget.style.color = textPrimary;\n e.currentTarget.style.borderColor = border;\n e.currentTarget.style.outline = 'none';\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Options list */}\n <ul\n style={{\n listStyle: 'none',\n margin: 0,\n padding: '4px 0',\n maxHeight: '208px',\n overflowY: 'auto',\n }}\n >\n {filteredOptions.length === 0 ? (\n <li style={{ padding: '8px 12px', fontSize: '13px', color: textSecondary }}>\n {t('common.noResults')}\n </li>\n ) : (\n filteredOptions.map(option => {\n const isSelected = option.value === value;\n return (\n <li\n key={option.value}\n className=\"metakyc-searchable-select-option\"\n onClick={() => handleSelect(option.value, option.disabled)}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n opacity: option.disabled ? 0.4 : 1,\n backgroundColor: isSelected ? primaryLight : 'transparent',\n color: isSelected ? primary : textPrimary,\n userSelect: 'none',\n }}\n onMouseEnter={e => {\n if (!isSelected && !option.disabled)\n (e.currentTarget as HTMLElement).style.backgroundColor = hoverBg;\n }}\n onMouseLeave={e => {\n if (!isSelected)\n (e.currentTarget as HTMLElement).style.backgroundColor = 'transparent';\n }}\n >\n {option.label}\n </li>\n );\n })\n )}\n </ul>\n </div>\n );\n\n return (\n <div\n className={cn('w-full metakyc-searchable-select', className)}\n ref={containerRef}\n >\n {label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {label}\n {required && (\n <span style={{ color: 'var(--metakyc-error, #ef4444)', marginLeft: '4px' }}>*</span>\n )}\n </label>\n )}\n\n {/* Trigger */}\n <div\n ref={triggerRef}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleToggle(); }\n if (e.key === 'Escape') close();\n }}\n className={cn(\n 'metakyc-searchable-select-trigger',\n 'w-full px-3 py-2 rounded-lg border text-sm transition-colors text-left',\n 'flex items-center justify-between gap-2',\n 'focus:outline-none',\n disabled ? 'opacity-60 cursor-not-allowed' : 'cursor-pointer',\n )}\n style={{\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: selectedLabel\n ? 'var(--metakyc-input-text, var(--metakyc-text-primary, #111827))'\n : 'var(--metakyc-input-placeholder, var(--metakyc-text-muted, #9ca3af))',\n borderColor: error\n ? 'var(--metakyc-danger, #ef4444)'\n : isOpen\n ? 'var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))'\n : 'var(--metakyc-input-border, var(--metakyc-border, #d1d5db))',\n minHeight: '38px',\n outline: isOpen ? '2px solid var(--metakyc-input-border-focus, var(--metakyc-primary, #2563eb))' : 'none',\n outlineOffset: '-1px',\n }}\n >\n <span className=\"truncate flex-1\">{selectedLabel || placeholder}</span>\n <span\n className=\"flex-shrink-0 text-xs pointer-events-none\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {isOpen ? '▲' : '▼'}\n </span>\n </div>\n\n {/* Portal dropdown */}\n {typeof document !== 'undefined' && dropdownPanel\n ? createPortal(dropdownPanel, document.body)\n : null}\n\n {error && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-error, #ef4444)' }}>\n {error}\n </p>\n )}\n {!error && helperText && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {helperText}\n </p>\n )}\n </div>\n );\n};\n\nSearchableSelect.displayName = 'SearchableSelect';\n","import React, { useRef, useState, useCallback } from 'react';\nimport { cn, formatFileSize } from '../../utils';\nimport { useTranslation } from '../../i18n/TranslationContext';\n\nexport interface FileUploadProps {\n label?: string;\n subtitle?: string;\n error?: string;\n accept?: string;\n multiple?: boolean;\n maxSize?: number;\n required?: boolean;\n onChange?: (files: File[]) => void;\n value?: File[];\n className?: string;\n}\n\nfunction getFileIcon(file: File) {\n const type = file.type;\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf') return 'pdf';\n return 'file';\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n label,\n subtitle,\n error,\n accept,\n multiple = false,\n maxSize,\n required,\n onChange,\n value = [],\n className,\n}) => {\n const { t } = useTranslation();\n const [isDragging, setIsDragging] = useState(false);\n const [sizeError, setSizeError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFiles = useCallback((files: FileList | null) => {\n if (!files) return;\n setSizeError(null);\n\n const fileArray = Array.from(files);\n\n if (maxSize) {\n const oversized = fileArray.filter((f) => f.size > maxSize);\n if (oversized.length > 0) {\n setSizeError(`File exceeds the maximum size of ${formatFileSize(maxSize)}`);\n return;\n }\n }\n\n onChange?.(multiple ? [...value, ...fileArray] : [fileArray[0]]);\n }, [maxSize, multiple, onChange, value]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n }, [handleFiles]);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const removeFile = (index: number) => {\n setSizeError(null);\n const newFiles = value.filter((_, i) => i !== index);\n onChange?.(newFiles);\n };\n\n const displayError = error || sizeError;\n const hasFiles = value.length > 0;\n\n return (\n <div className={cn('metakyc-file-upload', className)} style={{ width: '100%' }}>\n {label && (\n <div style={{ marginBottom: '8px' }}>\n <label\n style={{\n display: 'block',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--metakyc-text-primary, #111827)',\n }}\n >\n {label}\n {required && <span style={{ color: 'var(--metakyc-danger, #ef4444)', marginLeft: '2px' }}>*</span>}\n </label>\n {subtitle && (\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '2px' }}>\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n <div\n className=\"metakyc-file-dropzone\"\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n border: `2px dashed ${\n displayError\n ? 'var(--metakyc-danger, #ef4444)'\n : isDragging\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #d1d5db)'\n }`,\n borderRadius: '12px',\n padding: hasFiles ? '20px' : '32px 20px',\n textAlign: 'center',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: isDragging\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))'\n : 'var(--metakyc-background, #ffffff)',\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n style={{ display: 'none' }}\n accept={accept}\n multiple={multiple}\n onChange={(e) => { handleFiles(e.target.files); e.target.value = ''; }}\n />\n\n {/* Upload icon */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '12px' }}>\n <div\n style={{\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isDragging\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)'\n : 'var(--metakyc-surface, #f9fafb)',\n transition: 'background-color 0.2s ease',\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={isDragging ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-text-muted, #9ca3af)'}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transition: 'stroke 0.2s ease' }}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div>\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-secondary, #6b7280)', margin: 0 }}>\n <span style={{ fontWeight: 600, color: 'var(--metakyc-primary, #2563eb)' }}>{t('uploadDocument.clickToUpload')}</span>\n {' '}{t('uploadDocument.orDragDrop')}\n </p>\n {(accept || maxSize) && (\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '4px' }}>\n {accept && <span>{accept}</span>}\n {accept && maxSize && <span> · </span>}\n {maxSize && <span>{t('uploadDocument.maxSize', { size: formatFileSize(maxSize) })}</span>}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* File list */}\n {hasFiles && (\n <div style={{ marginTop: '12px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {value.map((file, index) => {\n const icon = getFileIcon(file);\n const isImage = icon === 'image';\n const previewUrl = isImage ? URL.createObjectURL(file) : null;\n\n return (\n <div\n key={`${file.name}-${index}`}\n className=\"metakyc-file-item\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '10px 12px',\n borderRadius: '10px',\n backgroundColor: 'var(--metakyc-surface, #f9fafb)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n transition: 'background-color 0.15s ease',\n }}\n >\n {/* Thumbnail / icon */}\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '8px',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n backgroundColor: isImage ? 'transparent' : 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 10%, transparent)',\n }}\n >\n {isImage && previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n style={{ width: '100%', height: '100%', objectFit: 'cover', borderRadius: '8px' }}\n />\n ) : icon === 'pdf' ? (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n ) : (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-primary, #2563eb)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n )}\n </div>\n\n {/* File info */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <p style={{\n fontSize: '13px',\n fontWeight: 500,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}>\n {file.name}\n </p>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', margin: 0, marginTop: '2px' }}>\n {formatFileSize(file.size)}\n </p>\n </div>\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeFile(index); }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'all 0.15s ease',\n padding: 0,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)';\n e.currentTarget.style.color = 'var(--metakyc-danger, #ef4444)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.color = 'var(--metakyc-text-muted, #9ca3af)';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n );\n })}\n </div>\n )}\n\n {displayError && (\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', marginTop: '6px' }}>\n {displayError}\n </p>\n )}\n </div>\n );\n};\n","import { forwardRef } from 'react';\nimport { cn } from '../../utils';\nimport { Input, InputProps } from './Input';\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'leftIcon'> {\n countryCode?: string;\n onCountryCodeChange?: (code: string) => void;\n}\n\n/**\n * Phone input component with country code\n */\nexport const PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ countryCode = '+1', onCountryCodeChange, className, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n {props.label && (\n <label\n className=\"block text-sm font-medium mb-1\"\n style={{ color: 'var(--metakyc-text-primary, #374151)' }}\n >\n {props.label}\n {props.required && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={countryCode}\n onChange={(e) => onCountryCodeChange?.(e.target.value)}\n className={cn(\n 'w-20 rounded-lg border px-3 py-2 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-offset-0'\n )}\n style={{\n minHeight: '38px',\n backgroundColor: 'var(--metakyc-input-bg, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n borderColor: 'var(--metakyc-border, #d1d5db)',\n }}\n placeholder=\"+1\"\n />\n <Input\n ref={ref}\n type=\"tel\"\n className={cn('flex-1', className)}\n {...props}\n label=\"\"\n />\n </div>\n\n {props.error && <p className=\"mt-1 text-sm text-danger-500\">{props.error}</p>}\n </div>\n );\n }\n);\n\nPhoneInput.displayName = 'PhoneInput';\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.574.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useQuestionnaire } from '../../hooks';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { FillQuestionnarieInput, QuestionDto, QuestionGroupDto } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface QuestionnaireStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedQuestion {\n question: QuestionDto;\n groupIndex: number;\n qIdx: number;\n}\n\ntype Answers = Record<number, string[]>; // questionId → values\ntype Errors = Record<number, string>; // questionId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateQuestion(question: QuestionDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (question.isRequired && isEmpty) {\n return question.errorMessage || 'This field is required';\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n if (first && question.regex) {\n try {\n if (!new RegExp(question.regex).test(first)) {\n return question.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n if (first !== '') {\n const num = Number(first);\n if (!isNaN(num) && first.trim() !== '') {\n if (question.min !== undefined && question.min !== null && num < question.min) {\n return `Minimum value is ${question.min}`;\n }\n if (question.max !== undefined && question.max !== null && num > question.max) {\n return `Maximum value is ${question.max}`;\n }\n } else {\n if (question.min !== undefined && question.min !== null && first.length < question.min) {\n return `Minimum length is ${question.min} characters`;\n }\n if (question.max !== undefined && question.max !== null && first.length > question.max) {\n return `Maximum length is ${question.max} characters`;\n }\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(groups: QuestionGroupDto[]): PagedQuestion[][] {\n const flat: PagedQuestion[] = groups.flatMap((g, gi) =>\n (g.questions ?? []).map((q, qi) => ({ question: q, groupIndex: gi, qIdx: qi }))\n );\n\n const map = new Map<number, PagedQuestion[]>();\n for (const pq of flat) {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (pq.question.pageNumber != null && pq.question.pageNumber > 0) ? pq.question.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(pq);\n }\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, qs]) => qs);\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const QuestionnaireStep: React.FC<QuestionnaireStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { questionnaire, initialAnswers, isLoading, isSubmitting, error, submit } = useQuestionnaire(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (questionnaire ? buildPages(questionnaire.questionGroups) : []),\n [questionnaire]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentQuestions = pages[currentPage] ?? [];\n\n const setAnswer = useCallback((questionId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [questionId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[questionId]; return e; });\n }, []);\n\n // Validate just the questions on the current page\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { question } of currentQuestions) {\n const err = validateQuestion(question, answers[question.id] ?? []);\n if (err) newErrors[question.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentQuestions, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !questionnaire) return;\n\n try {\n const questionResults = questionnaire.questionGroups.flatMap(g =>\n (g.questions ?? []).map(q => ({\n questionId: q.id,\n values: answers[q.id] ?? [],\n }))\n );\n\n const input: FillQuestionnarieInput = {\n applicantId,\n questionnarieId: questionnaire.id,\n questionResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Questionnaire submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">{t('questionnaire.errorLoading')} {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!questionnaire) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{questionnaire.displayName}</h2>\n {questionnaire.subtitle && (\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {questionnaire.subtitle}\n </p>\n )}\n\n {/* Page indicator — only shown when there are multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {t('common.pageXofY', { current: currentPage + 1, total: pages.length })}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Questions for current page */}\n <CardContent className=\"space-y-6\">\n {currentQuestions.map(({ question }) => (\n <QuestionField\n key={question.id}\n question={question}\n value={answers[question.id] ?? []}\n error={fieldErrors[question.id]}\n onChange={vals => setAnswer(question.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? t('common.previous') : t('common.back')}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n {t('common.continue')}\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n {t('common.next')}\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── QuestionField ──────────────────────────────────────────────────────────\n\ninterface QuestionFieldProps {\n question: QuestionDto;\n value: string[];\n error?: string;\n onChange: (values: string[]) => void;\n}\n\nconst QuestionField: React.FC<QuestionFieldProps> = ({ question, value, error, onChange }) => {\n const { t } = useTranslation();\n const hasDefaultAnswers = (question.defaultAnswers?.length ?? 0) > 0;\n\n const qType = !hasDefaultAnswers\n ? 'text'\n : question.showAsDropdown\n ? question.canMultipleAnswer ? 'multi-select' : 'single-select'\n : question.canMultipleAnswer ? 'checkbox' : 'radio';\n\n return (\n <div className=\"space-y-2\">\n {/* Question label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {question.text}\n {question.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Subtitle / description */}\n {question.subtitle && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {question.subtitle}\n </p>\n )}\n {question.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {question.description}\n </p>\n )}\n\n {/* Text input */}\n {qType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n placeholder={question.subtitle ? undefined : t('placeholders.enterAnswer')}\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Dropdown — single select */}\n {qType === 'single-select' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={(question.defaultAnswers ?? []).map(a => ({ value: a, label: a }))}\n placeholder={t('placeholders.selectOption')}\n error={error}\n required={question.isRequired}\n />\n )}\n\n {/* Radio buttons — single choice without dropdown */}\n {qType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes — multiple choice */}\n {(qType === 'checkbox' || qType === 'multi-select') && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(question.defaultAnswers ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={value.includes(answer)}\n onChange={v => {\n if (v) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v2 => v2 !== answer));\n }\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {answer}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Inline error for input types (radio/checkbox handle their own) */}\n {error && qType === 'text' && null /* already shown in Input */}\n </div>\n );\n};\n","import React, { useState, useMemo, useCallback } from 'react';\nimport { useUploadDocument } from '../../hooks';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, FileUpload, Spinner } from '../core';\nimport { FillUploadDocumentInput, UploadDocumentFileDto } from '../../types';\nimport { fileToBase64 } from '../../utils';\n\nexport interface UploadDocumentStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\nfunction buildPages(docFiles: UploadDocumentFileDto[]): UploadDocumentFileDto[][] {\n const map = new Map<number, UploadDocumentFileDto[]>();\n for (const df of docFiles) {\n const p = (df.pageNumber != null && df.pageNumber > 0) ? df.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push(df);\n }\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, files]) => files);\n}\n\nexport const UploadDocumentStep: React.FC<UploadDocumentStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { uploadDocument, isLoading, isSubmitting, error, submit } = useUploadDocument(applicantId);\n const [files, setFiles] = useState<Record<number, File[]>>({});\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<number, string>>({});\n\n const pages = useMemo(\n () => (uploadDocument ? buildPages(uploadDocument.uploadDocumentFiles) : []),\n [uploadDocument]\n );\n\n const currentDocs = pages[currentPage] ?? [];\n const isLastPage = currentPage === pages.length - 1;\n const totalPages = pages.length;\n\n const validateCurrentPage = useCallback((): boolean => {\n const errs: Record<number, string> = {};\n for (const df of currentDocs) {\n if (df.isRequired && (files[df.id] || []).length === 0) {\n errs[df.id] = `${df.displayName} is required`;\n }\n }\n setPageErrors(errs);\n return Object.keys(errs).length === 0;\n }, [currentDocs, files]);\n\n const handleNext = () => {\n if (validateCurrentPage()) {\n setCurrentPage((p) => p + 1);\n setPageErrors({});\n }\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage((p) => p - 1);\n setPageErrors({});\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validateCurrentPage() || !uploadDocument) return;\n setSubmitError(null);\n\n try {\n const uploadDocumentResults = await Promise.all(\n uploadDocument.uploadDocumentFiles.map(async (docFile) => {\n const fileList = files[docFile.id] || [];\n const valueList = await Promise.all(\n fileList.map(async (file) => ({\n fileName: file.name,\n fileData: await fileToBase64(file),\n }))\n );\n return {\n uploadDocumentFileId: docFile.id,\n valueList,\n };\n })\n );\n\n const input: FillUploadDocumentInput = {\n applicantId,\n uploadDocumentId: uploadDocument.id,\n uploadDocumentResults,\n };\n\n await submit(input);\n onComplete?.();\n } catch (err: any) {\n setSubmitError(err?.message || t('uploadDocument.failedToSubmit'));\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', padding: '48px 0', gap: '16px' }}>\n <Spinner className=\"my-8\" />\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('uploadDocument.loading')}</p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '32px 0',\n gap: '12px',\n textAlign: 'center',\n }}>\n <div style={{\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <p style={{ fontSize: '14px', color: 'var(--metakyc-danger, #ef4444)', fontWeight: 500 }}>\n {t('uploadDocument.errorLoading')}\n </p>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {error.message}\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (!uploadDocument) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 style={{\n fontSize: '18px',\n fontWeight: 700,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n }}>\n {uploadDocument.displayName || t('uploadDocument.title')}\n </h2>\n {uploadDocument.subtitle && (\n <p style={{\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n marginTop: '4px',\n }}>\n {uploadDocument.subtitle}\n </p>\n )}\n\n {/* Page indicator */}\n {totalPages > 1 && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: '12px',\n }}>\n <span style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {t('common.pageXofY', { current: currentPage + 1, total: totalPages })}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {pages.map((_, i) => (\n <div\n key={i}\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n borderRadius: '999px',\n transition: 'all 0.2s ease',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Description banner */}\n {uploadDocument.description && currentPage === 0 && (\n <div style={{\n margin: '0 24px',\n marginTop: '4px',\n display: 'flex',\n gap: '10px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))',\n border: '1px solid color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)',\n }}>\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"var(--metakyc-primary, #2563eb)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0, marginTop: '1px' }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-text-secondary, #374151)',\n margin: 0,\n lineHeight: 1.5,\n }}>\n {uploadDocument.description}\n </p>\n </div>\n )}\n\n {/* Document upload fields for current page */}\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '24px' }}>\n {currentDocs.map((docFile) => (\n <FileUpload\n key={docFile.id}\n label={docFile.displayName}\n subtitle={docFile.subtitle}\n accept={docFile.allowedTypes}\n multiple={docFile.multipleFile}\n maxSize={docFile.maxEachFileSizeByte}\n required={docFile.isRequired}\n error={pageErrors[docFile.id]}\n value={files[docFile.id] || []}\n onChange={(newFiles) => {\n setSubmitError(null);\n setPageErrors((prev) => { const e = { ...prev }; delete e[docFile.id]; return e; });\n setFiles((prev) => ({ ...prev, [docFile.id]: newFiles }));\n }}\n />\n ))}\n </div>\n </CardContent>\n\n {/* Error message */}\n {submitError && (\n <div style={{\n margin: '0 24px',\n padding: '10px 14px',\n borderRadius: '8px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>\n {submitError}\n </p>\n </div>\n )}\n\n {/* Footer navigation */}\n <CardFooter>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n >\n {currentPage > 0 ? t('common.previous') : t('common.back')}\n </Button>\n\n {isLastPage ? (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={handleSubmit}\n >\n {isSubmitting ? t('uploadDocument.uploading') : t('common.continue')}\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n >\n {t('common.next')}\n </Button>\n )}\n </div>\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { useOverview } from '../../hooks';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\n\nexport interface OverviewStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Overview step component\n */\nexport const OverviewStep: React.FC<OverviewStepProps> = ({ applicantId, onComplete, onBack }) => {\n const { t } = useTranslation();\n const { overview, isLoading, isSubmitting, error, passOverview } = useOverview(applicantId);\n\n const handleConfirm = async () => {\n await passOverview();\n onComplete?.();\n };\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">{t('overview.errorLoading')} {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!overview) return null;\n\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{overview.title || t('overview.title')}</h2>\n {overview.description && (\n <p className=\"mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{overview.description}</p>\n )}\n </CardHeader>\n\n <CardContent className=\"space-y-8\">\n {overview.steps && overview.steps.length > 0 ? (\n overview.steps\n .sort((a, b) => a.order - b.order)\n .map((step) => (\n <div key={step.order} className=\"metakyc-overview-step-item flex items-center space-x-3\">\n <div className=\"metakyc-step-icon flex-shrink-0\">\n <div\n className=\"w-8 h-8 rounded-full flex items-center justify-center font-medium text-sm\"\n style={{ backgroundColor: 'var(--metakyc-primary, #2563eb)', color: '#ffffff' }}\n >\n {step.order + 1}\n </div>\n </div>\n <div \n className=\"metakyc-step-content\"\n style={{\n flex: 1,\n border: 'none',\n height: 'auto',\n background: 'transparent',\n }}\n >\n <span className=\"metakyc-step-title text-sm font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {step.title}\n </span>\n {step.description && (\n <p className=\"metakyc-step-description text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-center py-8\">\n <p style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{t('overview.loadingOverview')}</p>\n </div>\n )}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n <Button onClick={handleConfirm} isLoading={isSubmitting}>\n {t('common.continue')}\n </Button>\n </CardFooter>\n </Card>\n );\n};\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { useRiskScoring } from '../../hooks';\nimport { useMetaKYC } from '../../context/useMetaKYC';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Select, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { RiskCalculationInput, RiskCriteriaDto, ValueDataType } from '../../types';\nimport { ChevronRight, ChevronLeft } from 'lucide-react';\n\nexport interface RiskScoringStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n// ── Money formatting helpers ───────────────────────────────────────────────\n\n/**\n * Converts a locale string (e.g. \"de\", \"de-AT\", \"EN\") to a BCP-47 tag.\n * Falls back to 'en' if the tag is invalid.\n */\nfunction resolveLocale(locale: string | undefined): string {\n const tag = (locale ?? 'en').toLowerCase().replace('_', '-');\n try {\n Intl.NumberFormat.supportedLocalesOf([tag]);\n return tag;\n } catch {\n return 'en';\n }\n}\n\n/**\n * Returns true when the criterion uses Money / Decimal data type AND has\n * pre-defined string options (radio / checkbox) that may contain numbers.\n */\nfunction isMoneyWithOptions(criterion: RiskCriteriaDto): boolean {\n return (\n criterion.valueDataType === ValueDataType.Money &&\n Array.isArray(criterion.defaultValues) &&\n criterion.defaultValues.length > 0\n );\n}\n\n/**\n * Formats every standalone integer/decimal number inside a label string\n * according to the given locale.\n * Examples (locale = \"de\"):\n * \"5000 - 10000\" → \"5.000 – 10.000\"\n * \"up to 5000\" → \"up to 5.000\"\n * \"> 30000\" → \"> 30.000\"\n *\n * The regex matches numbers that are NOT already formatted with separators so\n * we only touch plain digits (possibly with a decimal dot, e.g. \"1234.56\").\n */\nfunction formatMoneyLabel(raw: string, locale: string): string {\n const fmt = new Intl.NumberFormat(resolveLocale(locale), {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n // Match bare numbers: optional leading sign, digits, optional decimal part.\n return raw.replace(/([\\d]+(?:\\.\\d+)?)/g, (match) => {\n const num = parseFloat(match);\n return isNaN(num) ? match : fmt.format(num);\n });\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface PagedCriterion {\n criterion: RiskCriteriaDto;\n idx: number;\n}\n\ntype Answers = Record<number, string[]>; // criteriaId → values\ntype Errors = Record<number, string>; // criteriaId → error message\n\n// ── Validation ────────────────────────────────────────────────────────────\n\nfunction validateCriterion(criterion: RiskCriteriaDto, values: string[]): string | null {\n const isEmpty = !values || values.length === 0 || values.every(v => !v || !v.trim());\n\n if (criterion.isRequired && isEmpty) {\n return criterion.errorMessage || `${criterion.displayName} is required`;\n }\n\n if (!isEmpty) {\n const first = values[0] ?? '';\n\n // Regex validation (string types)\n if (first && criterion.regex) {\n try {\n if (!new RegExp(criterion.regex).test(first)) {\n return criterion.errorMessage || 'Invalid format';\n }\n } catch { /* ignore invalid regex */ }\n }\n\n // Numeric min/max for Integer/Money/DigitOnly types\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n if (isNumeric && first.trim() !== '') {\n const num = Number(first);\n if (!isNaN(num)) {\n if (criterion.min !== undefined && criterion.min !== null && num < criterion.min) {\n return `Minimum value is ${criterion.min}`;\n }\n if (criterion.max !== undefined && criterion.max !== null && num > criterion.max) {\n return `Maximum value is ${criterion.max}`;\n }\n }\n } else if (!isNumeric && first !== '') {\n // String length bounds for text types\n if (criterion.min !== undefined && criterion.min !== null && first.length < criterion.min) {\n return `Minimum length is ${criterion.min} characters`;\n }\n if (criterion.max !== undefined && criterion.max !== null && first.length > criterion.max) {\n return `Maximum length is ${criterion.max} characters`;\n }\n }\n }\n\n return null;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction buildPages(criteria: RiskCriteriaDto[]): PagedCriterion[][] {\n const map = new Map<number, PagedCriterion[]>();\n criteria.forEach((criterion, idx) => {\n // pageNumber <= 0 or undefined means \"first page\" (no specific pagination)\n const p = (criterion.pageNumber != null && criterion.pageNumber > 0) ? criterion.pageNumber : 1;\n if (!map.has(p)) map.set(p, []);\n map.get(p)!.push({ criterion, idx });\n });\n\n return Array.from(map.entries())\n .sort(([a], [b]) => a - b)\n .map(([, cs]) => cs);\n}\n\nfunction getInputType(criterion: RiskCriteriaDto): 'text' | 'radio' | 'checkbox' | 'country' {\n if (criterion.builtInType === 1) return 'country';\n if (!criterion.defaultValues || criterion.defaultValues.length === 0) return 'text';\n return criterion.multipleValue ? 'checkbox' : 'radio';\n}\n\n// ── Component ─────────────────────────────────────────────────────────────\n\nexport const RiskScoringStep: React.FC<RiskScoringStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { config } = useMetaKYC();\n const locale = config.locale ?? 'en';\n const { criteria, initialAnswers, isLoading, isSubmitting, error, submit } = useRiskScoring(applicantId);\n\n const [answers, setAnswers] = useState<Answers>({});\n const [fieldErrors, setFieldErrors] = useState<Errors>({});\n const [currentPage, setCurrentPage] = useState(0);\n const [autoSubmitted, setAutoSubmitted] = useState(false);\n\n // Seed answers with existing data when loaded (only if user hasn't entered anything yet)\n React.useEffect(() => {\n if (initialAnswers && Object.keys(initialAnswers).length > 0 && Object.keys(answers).length === 0) {\n setAnswers(initialAnswers);\n }\n }, [initialAnswers]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const pages = useMemo(\n () => (criteria && criteria.length > 0 ? buildPages(criteria) : []),\n [criteria]\n );\n\n const isLastPage = currentPage === pages.length - 1;\n const currentCriteria = pages[currentPage] ?? [];\n\n // Auto-submit when no criteria exist\n React.useEffect(() => {\n if (!isLoading && criteria && criteria.length === 0 && !autoSubmitted && !isSubmitting) {\n setAutoSubmitted(true);\n submit({ applicantId, criteriaValueInputs: [] })\n .then(() => onComplete?.())\n .catch(console.error);\n }\n }, [isLoading, criteria, autoSubmitted, isSubmitting, submit, applicantId, onComplete]);\n\n const setAnswer = useCallback((criteriaId: number, values: string[]) => {\n setAnswers(prev => ({ ...prev, [criteriaId]: values }));\n setFieldErrors(prev => { const e = { ...prev }; delete e[criteriaId]; return e; });\n }, []);\n\n const validatePage = useCallback((): boolean => {\n const newErrors: Errors = {};\n for (const { criterion } of currentCriteria) {\n const err = validateCriterion(criterion, answers[criterion.id] ?? []);\n if (err) newErrors[criterion.id] = err;\n }\n setFieldErrors(prev => ({ ...prev, ...newErrors }));\n return Object.keys(newErrors).length === 0;\n }, [currentCriteria, answers]);\n\n const handleNext = () => {\n if (validatePage()) setCurrentPage(p => p + 1);\n };\n\n const handleBack = () => {\n if (currentPage > 0) {\n setCurrentPage(p => p - 1);\n } else {\n onBack?.();\n }\n };\n\n const handleSubmit = async () => {\n if (!validatePage() || !criteria) return;\n\n try {\n const criteriaValueInputs = criteria\n .map(c => {\n const vals = (answers[c.id] ?? []).filter(v => v && v.trim());\n return vals.length > 0 ? { riskCriteriaId: c.id, values: vals } : null;\n })\n .filter((x): x is NonNullable<typeof x> => x !== null);\n\n const input: RiskCalculationInput = { applicantId, criteriaValueInputs };\n await submit(input);\n onComplete?.();\n } catch (e) {\n console.error('Risk scoring submit error:', e);\n }\n };\n\n // ── Loading / error states ──────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('riskScoring.loadingCriteria')}\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (!isLoading && criteria && criteria.length === 0) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-sm mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('riskScoring.noCriteria')}\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">{t('riskScoring.errorLoading')} {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n if (!criteria) return null;\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n return (\n <Card>\n {/* Header */}\n <CardHeader>\n <h2 className=\"text-lg font-bold\">{t('riskScoring.title')}</h2>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('riskScoring.subtitle')}\n </p>\n\n {/* Page indicator — only when multiple pages */}\n {pages.length > 1 && (\n <div className=\"flex items-center justify-between mt-3\">\n <span className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {t('common.pageXofY', { current: currentPage + 1, total: pages.length })}\n </span>\n <div className=\"flex items-center gap-1.5\">\n {pages.map((_, i) => (\n <div\n key={i}\n className=\"rounded-full transition-all duration-200\"\n style={{\n height: '6px',\n width: i === currentPage ? '20px' : '6px',\n backgroundColor: i <= currentPage\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n }}\n />\n ))}\n </div>\n </div>\n )}\n </CardHeader>\n\n {/* Criteria for current page */}\n <CardContent className=\"space-y-6\">\n {currentCriteria.map(({ criterion }) => (\n <CriterionField\n key={criterion.id}\n criterion={criterion}\n value={answers[criterion.id] ?? []}\n error={fieldErrors[criterion.id]}\n locale={locale}\n onChange={vals => setAnswer(criterion.id, vals)}\n />\n ))}\n </CardContent>\n\n {/* Footer navigation */}\n <CardFooter style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n <ChevronLeft size={14} />\n {currentPage > 0 ? t('common.previous') : t('common.back')}\n </Button>\n\n {isLastPage ? (\n <Button type=\"button\" isLoading={isSubmitting} onClick={handleSubmit}>\n {t('common.continue')}\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={handleNext}\n style={{ display: 'flex', alignItems: 'center', gap: '4px' }}\n >\n {t('common.next')}\n <ChevronRight size={14} />\n </Button>\n )}\n </CardFooter>\n\n {error && (\n <div className=\"mx-6 mb-4 p-3 bg-red-50 border border-red-200 rounded\">\n <p className=\"text-red-600 text-sm\">{(error as Error).message}</p>\n </div>\n )}\n </Card>\n );\n};\n\n// ── CriterionField ─────────────────────────────────────────────────────────\n\ninterface CriterionFieldProps {\n criterion: RiskCriteriaDto;\n value: string[];\n error?: string;\n locale: string;\n onChange: (values: string[]) => void;\n}\n\nconst CriterionField: React.FC<CriterionFieldProps> = ({ criterion, value, error, locale, onChange }) => {\n const { t } = useTranslation();\n const inputType = getInputType(criterion);\n\n const isNumeric =\n criterion.valueDataType === ValueDataType.Integer ||\n criterion.valueDataType === ValueDataType.Money ||\n criterion.valueDataType === ValueDataType.DigitOnly;\n\n // When this criterion has Money type + predefined options, show locale-formatted\n // labels but keep the original API string as the stored/submitted value.\n const moneyOptions = isMoneyWithOptions(criterion);\n const getLabel = (raw: string) =>\n moneyOptions ? formatMoneyLabel(raw, locale) : raw;\n\n return (\n <div className=\"space-y-2\">\n {/* Label */}\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {criterion.displayName}\n {criterion.isRequired && <span className=\"text-danger-500 ml-1\">*</span>}\n </label>\n\n {/* Description */}\n {criterion.description && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {criterion.description}\n </p>\n )}\n\n {/* min/max hint for numeric fields */}\n {isNumeric && (criterion.min !== undefined || criterion.max !== undefined) && (\n <p className=\"text-xs\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {criterion.min !== undefined && criterion.max !== undefined\n ? t('riskScoring.range', { min: criterion.min, max: criterion.max })\n : criterion.min !== undefined\n ? t('riskScoring.minimum', { min: criterion.min })\n : t('riskScoring.maximum', { max: criterion.max! })}\n </p>\n )}\n\n {/* Text / numeric input */}\n {inputType === 'text' && (\n <Input\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n type={isNumeric ? 'number' : 'text'}\n placeholder={t('placeholders.enterAnswer')}\n error={error}\n required={criterion.isRequired}\n min={criterion.min}\n max={criterion.max}\n onKeyDown={e => {\n if (criterion.valueDataType === ValueDataType.DigitOnly) {\n if (['e', 'E', '+', '-', '.'].includes(e.key)) e.preventDefault();\n }\n }}\n />\n )}\n\n {/* Radio buttons */}\n {inputType === 'radio' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={value[0] === answer}\n onChange={() => onChange([answer])}\n className=\"metakyc-option-input\"\n style={{\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Checkboxes */}\n {inputType === 'checkbox' && (\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(criterion.defaultValues ?? []).map(answer => (\n <label\n key={answer}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={value.includes(answer)}\n onChange={v => {\n if (v) {\n onChange([...value, answer]);\n } else {\n onChange(value.filter(v2 => v2 !== answer));\n }\n }}\n />\n <span className=\"metakyc-option-text\" style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', marginLeft: 0 }}>\n {getLabel(answer)}\n </span>\n </label>\n ))}\n {error && <p className=\"text-sm text-danger-500\">{error}</p>}\n </div>\n )}\n\n {/* Country dropdown */}\n {inputType === 'country' && (\n <Select\n value={value[0] ?? ''}\n onChange={e => onChange([e.target.value])}\n options={[\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'United Arab Emirates' },\n ]}\n placeholder={t('placeholders.selectCountry')}\n error={error}\n required={criterion.isRequired}\n />\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button } from '../core';\nimport { InvestorCategorizationType, InvestorCategorizationInput } from '../../types';\n\nexport interface InvestorCategorizationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Investor Categorization step component\n * Static UI for selecting investor type\n */\nexport const InvestorCategorizationStep: React.FC<InvestorCategorizationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { investorCategorizationService } = useMetaKYC();\n const [selectedType, setSelectedType] = useState<InvestorCategorizationType | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (selectedType === null) {\n setError(t('investorCategorization.pleaseSelect'));\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const input: InvestorCategorizationInput = {\n applicantId,\n investorType: selectedType,\n };\n\n console.log('Submitting investor categorization:', input);\n const result = await investorCategorizationService.setInvestorCategorization(input);\n console.log('Investor categorization result:', result);\n\n onComplete?.();\n } catch (err: any) {\n console.error('Error submitting investor categorization:', err);\n setError(err.message || t('investorCategorization.failedToSubmit'));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('investorCategorization.whichStatement')}\n </h2>\n <p className=\"mt-2\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('investorCategorization.retailInvestorInfo')}\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm font-medium mb-3\" style={{ color: 'var(--metakyc-text-secondary, #374151)' }}>\n {t('investorCategorization.chooseOne')}\n </p>\n\n {/* Individual Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.Individual\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.Individual\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Individual}\n checked={selectedType === InvestorCategorizationType.Individual}\n onChange={() => setSelectedType(InvestorCategorizationType.Individual)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('investorCategorization.individualInvestor')}\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('investorCategorization.individualInvestorDesc')}\n </div>\n </div>\n </div>\n </label>\n\n {/* Sophisticated Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.Sophisticated\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.Sophisticated\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.Sophisticated}\n checked={selectedType === InvestorCategorizationType.Sophisticated}\n onChange={() => setSelectedType(InvestorCategorizationType.Sophisticated)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('investorCategorization.sophisticatedInvestor')}\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('investorCategorization.sophisticatedInvestorDesc')}\n </div>\n </div>\n </div>\n </label>\n\n {/* High Networth Investor */}\n <label\n className=\"block p-4 border-2 rounded-lg cursor-pointer transition-all\"\n style={{\n borderColor: selectedType === InvestorCategorizationType.HighNetWorth\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-border, #e5e7eb)',\n backgroundColor: selectedType === InvestorCategorizationType.HighNetWorth\n ? 'var(--metakyc-primary-light, #dbeafe)'\n : 'transparent',\n }}\n >\n <div className=\"flex items-start\">\n <input\n type=\"radio\"\n name=\"investorType\"\n value={InvestorCategorizationType.HighNetWorth}\n checked={selectedType === InvestorCategorizationType.HighNetWorth}\n onChange={() => setSelectedType(InvestorCategorizationType.HighNetWorth)}\n className=\"mt-1\"\n />\n <div className=\"ml-3\">\n <div className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('investorCategorization.highNetworthInvestor')}\n </div>\n <div className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('investorCategorization.highNetworthInvestorDesc')}\n </div>\n </div>\n </div>\n </label>\n\n {/* Error Display */}\n {error && (\n <div className=\"p-4 rounded-lg\" style={{ backgroundColor: '#fee2e2', border: '1px solid #fca5a5' }}>\n <p className=\"text-sm\" style={{ color: '#991b1b' }}>\n <strong>Error:</strong> {error}\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n <Button \n type=\"submit\" \n isLoading={isSubmitting}\n disabled={selectedType === null}\n >\n {t('common.submit')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useMetaKYC } from '../../context';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Spinner } from '../core';\nimport {\n AppropriatenessTestOutputDto,\n FillAppropriatenessTestInput,\n AppropriatenessQuestionResult,\n AppropriatenessQuestionOutputDto,\n} from '../../types';\n\nexport interface AppropriatenessTestStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\nfunction parseTimeSpan(ts: string): number {\n const parts = ts.split(':').map(Number);\n if (parts.length === 3) return parts[0] * 3600 + parts[1] * 60 + parts[2];\n return 0;\n}\n\nfunction formatTime(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n}\n\nexport const AppropriatenessTestStep: React.FC<AppropriatenessTestStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { appropriatenessTestService } = useMetaKYC();\n\n const [testData, setTestData] = useState<AppropriatenessTestOutputDto | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [answers, setAnswers] = useState<Record<number, string>>({});\n const [timeRemaining, setTimeRemaining] = useState(0);\n const [isTestStarted, setIsTestStarted] = useState(false);\n const [isTestExpired, setIsTestExpired] = useState(false);\n const [waitTimeRemaining, setWaitTimeRemaining] = useState(0);\n const [currentQ, setCurrentQ] = useState(0);\n const [resultScreen, setResultScreen] = useState<{ success: boolean; message: string } | null>(null);\n\n // ── Load test ─────────────────────────────────────────────────────────\n\n useEffect(() => {\n (async () => {\n try {\n setIsLoading(true);\n setError(null);\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTestData(data);\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const w = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (w > 0) setWaitTimeRemaining(w);\n }\n } catch (err: any) {\n setError(err.message || t('appropriatenessTest.failedToLoad'));\n } finally {\n setIsLoading(false);\n }\n })();\n }, [applicantId, appropriatenessTestService]);\n\n // ── Timer ─────────────────────────────────────────────────────────────\n\n useEffect(() => {\n if (!isTestStarted || timeRemaining <= 0) return;\n const id = setInterval(() => {\n setTimeRemaining((p) => {\n if (p <= 1) { setIsTestExpired(true); return 0; }\n return p - 1;\n });\n }, 1000);\n return () => clearInterval(id);\n }, [isTestStarted, timeRemaining]);\n\n useEffect(() => {\n if (waitTimeRemaining <= 0) return;\n const id = setInterval(() => {\n setWaitTimeRemaining((p) => (p <= 1 ? 0 : p - 1));\n }, 1000);\n return () => clearInterval(id);\n }, [waitTimeRemaining]);\n\n // Auto-submit on expire\n useEffect(() => {\n if (isTestExpired && !isSubmitting) handleSubmit();\n }, [isTestExpired]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Handlers ──────────────────────────────────────────────────────────\n\n const handleStartTest = () => {\n if (!testData) return;\n setIsTestStarted(true);\n setTimeRemaining(testData.testDurationSec);\n setCurrentQ(0);\n setAnswers({});\n setError(null);\n };\n\n const handleAnswerChange = (qId: number, val: string) => {\n setAnswers((prev) => ({ ...prev, [qId]: val }));\n };\n\n const reloadTestData = useCallback(async () => {\n try {\n const data = await appropriatenessTestService.getAppropriatenessTest(applicantId);\n setTestData(data);\n if (data.waitTimeSpanForNextTry && data.waitTimeSpanForNextTry !== '00:00:00') {\n const w = parseTimeSpan(data.waitTimeSpanForNextTry);\n if (w > 0) setWaitTimeRemaining(w);\n }\n } catch { }\n }, [applicantId, appropriatenessTestService]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n if (!testData) return;\n\n if (!isTestExpired) {\n const unanswered = testData.appropriatenessQuestions.length - Object.keys(answers).length;\n if (unanswered > 0) {\n setError(t('appropriatenessTest.answerAllQuestions', { remaining: unanswered }));\n return;\n }\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const questionResults: AppropriatenessQuestionResult[] = testData.appropriatenessQuestions.map(\n (q) => ({ appropriatenessQuestionId: q.id, value: answers[q.id] || '' })\n );\n const input: FillAppropriatenessTestInput = {\n applicantId,\n appropriatenessTestId: testData.id,\n appropriatenessQuestionResults: questionResults,\n };\n\n try {\n const result = await appropriatenessTestService.fillAppropriatenessTest(input);\n if (result.isSuccess) {\n setResultScreen({ success: true, message: result.message || t('appropriatenessTest.passedMessage') });\n } else {\n setResultScreen({ success: false, message: result.message || t('appropriatenessTest.failedMessage') });\n setTimeout(() => reloadTestData(), 1000);\n }\n } catch (err: any) {\n if (err.code === 400 && err.message) {\n setResultScreen({ success: false, message: err.message });\n setTimeout(() => reloadTestData(), 1500);\n } else {\n throw err;\n }\n }\n } catch (err: any) {\n setError(err.message || t('appropriatenessTest.failedToSubmit'));\n resetTest();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const resetTest = () => {\n setIsTestStarted(false);\n setIsTestExpired(false);\n setAnswers({});\n setCurrentQ(0);\n };\n\n // ── Loading ───────────────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <Card>\n <CardContent>\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', padding: '48px 0', gap: '16px' }}>\n <Spinner className=\"my-8\" />\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('appropriatenessTest.loadingTest')}</p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n if (!testData) {\n return (\n <Card>\n <CardContent>\n <div style={{ textAlign: 'center', padding: '48px 0' }}>\n <p style={{ fontSize: '16px', fontWeight: 600, color: 'var(--metakyc-danger, #ef4444)' }}>{t('appropriatenessTest.noTestData')}</p>\n {error && <p style={{ fontSize: '14px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '8px' }}>{error}</p>}\n </div>\n </CardContent>\n </Card>\n );\n }\n\n const attemptsRemaining = testData.testAllowedMaxTry - testData.totalFailedTries;\n const totalQ = testData.appropriatenessQuestions.length;\n const answeredCount = Object.keys(answers).length;\n\n // ── Wait screen ───────────────────────────────────────────────────────\n\n if (waitTimeRemaining > 0) {\n return (\n <Card>\n <CardHeader>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n </CardHeader>\n <CardContent>\n <div style={{ textAlign: 'center', padding: '32px 0' }}>\n <div style={{\n width: '100px',\n height: '100px',\n borderRadius: '50%',\n margin: '0 auto 20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 8%, transparent)',\n }}>\n <span style={{\n fontSize: '28px',\n fontWeight: 700,\n color: 'var(--metakyc-primary, #2563eb)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {formatTime(waitTimeRemaining)}\n </span>\n </div>\n <p style={{ fontSize: '15px', fontWeight: 500, color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('appropriatenessTest.waitBeforeRetrying')}\n </p>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '4px' }}>\n {t('appropriatenessTest.waitTimerMessage')}\n </p>\n {error && (\n <div style={{\n marginTop: '20px',\n padding: '12px 16px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>{error}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // ── Result screen ─────────────────────────────────────────────────────\n\n if (resultScreen) {\n const handleRetake = () => {\n setResultScreen(null);\n resetTest();\n setError(null);\n };\n\n return (\n <Card>\n <CardContent>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n padding: '40px 16px',\n gap: '16px',\n }}>\n {/* Icon */}\n <div style={{\n width: '72px',\n height: '72px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: resultScreen.success\n ? 'color-mix(in srgb, var(--metakyc-success, #10b981) 12%, transparent)'\n : 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)',\n }}>\n {resultScreen.success ? (\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-success, #10b981)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n ) : (\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n )}\n </div>\n\n {/* Title */}\n <h2 style={{\n fontSize: '20px',\n fontWeight: 700,\n color: resultScreen.success\n ? 'var(--metakyc-success, #10b981)'\n : 'var(--metakyc-danger, #ef4444)',\n margin: 0,\n }}>\n {resultScreen.success ? t('appropriatenessTest.testPassed') : t('appropriatenessTest.testFailed')}\n </h2>\n\n {/* Message */}\n <p style={{\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n margin: 0,\n lineHeight: 1.6,\n maxWidth: '400px',\n whiteSpace: 'pre-line',\n }}>\n {resultScreen.message}\n </p>\n\n {/* Attempts info for failure */}\n {!resultScreen.success && attemptsRemaining > 0 && (\n <div style={{\n marginTop: '4px',\n padding: '10px 20px',\n borderRadius: '10px',\n backgroundColor: 'var(--metakyc-surface, #f9fafb)',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n margin: 0,\n }}>\n {t('appropriatenessTest.attemptsRemaining', { count: attemptsRemaining })}\n </p>\n </div>\n )}\n\n {!resultScreen.success && attemptsRemaining <= 0 && (\n <div style={{\n marginTop: '4px',\n padding: '10px 20px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{\n fontSize: '13px',\n color: 'var(--metakyc-danger, #ef4444)',\n margin: 0,\n }}>\n {t('appropriatenessTest.noAttemptsRemaining')}\n </p>\n </div>\n )}\n </div>\n </CardContent>\n <CardFooter>\n <div style={{ display: 'flex', justifyContent: 'center', width: '100%', gap: '12px' }}>\n {resultScreen.success ? (\n <Button type=\"button\" onClick={() => onComplete?.()}>\n {t('common.continue')}\n </Button>\n ) : (\n <>\n {attemptsRemaining > 0 && waitTimeRemaining <= 0 && (\n <Button type=\"button\" onClick={handleRetake}>\n {t('appropriatenessTest.retakeTest')}\n </Button>\n )}\n {attemptsRemaining > 0 && waitTimeRemaining > 0 && (\n <Button type=\"button\" onClick={handleRetake}>\n {t('appropriatenessTest.ok')}\n </Button>\n )}\n {attemptsRemaining <= 0 && onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n </>\n )}\n </div>\n </CardFooter>\n </Card>\n );\n }\n\n // ── Start screen ──────────────────────────────────────────────────────\n\n if (!isTestStarted) {\n return (\n <Card>\n <CardHeader>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n {testData.subtitle && (\n <p style={{ fontSize: '14px', color: 'var(--metakyc-text-secondary, #6b7280)', marginTop: '4px' }}>\n {testData.subtitle}\n </p>\n )}\n </CardHeader>\n <CardContent>\n {/* Description */}\n {testData.description && (\n <div style={{\n marginBottom: '20px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))',\n border: '1px solid color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)',\n display: 'flex',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-primary, #2563eb)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, marginTop: '1px' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" /><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-text-secondary, #374151)', margin: 0, lineHeight: 1.5 }}>\n {testData.description}\n </p>\n </div>\n )}\n\n {/* Stats grid */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px', marginBottom: '20px' }}>\n <StatCard icon=\"questions\" label={t('appropriatenessTest.questions')} value={String(testData.totalQuestionCount)} />\n <StatCard icon=\"time\" label={t('appropriatenessTest.timeLimit')} value={formatTime(testData.testDurationSec)} />\n <StatCard icon=\"target\" label={t('appropriatenessTest.passRequirement')} value={t('appropriatenessTest.correct', { count: testData.testCorrectAnswerPassLimit })} />\n <StatCard\n icon=\"retry\"\n label={t('appropriatenessTest.attemptsLeftLabel')}\n value={String(attemptsRemaining)}\n variant={attemptsRemaining <= 1 ? 'warning' : 'default'}\n />\n </div>\n\n {/* Error from previous attempt */}\n {error && (\n <div style={{\n marginBottom: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n display: 'flex',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--metakyc-danger, #ef4444)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, marginTop: '1px' }}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" /><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0, lineHeight: 1.5 }}>\n <strong>{t('appropriatenessTest.previousAttempt')}</strong> {error}\n </p>\n </div>\n )}\n\n {/* No attempts left */}\n {attemptsRemaining <= 0 && (\n <div style={{\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>\n {t('appropriatenessTest.allAttemptsUsed')}\n </p>\n </div>\n )}\n </CardContent>\n <CardFooter>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: onBack ? 'space-between' : 'flex-end', width: '100%' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>{t('common.back')}</Button>\n )}\n <Button type=\"button\" onClick={handleStartTest} disabled={attemptsRemaining <= 0}>\n {t('appropriatenessTest.startTest')}\n </Button>\n </div>\n </CardFooter>\n </Card>\n );\n }\n\n // ── Active test ───────────────────────────────────────────────────────\n\n const question = testData.appropriatenessQuestions[currentQ];\n const isLastQ = currentQ === totalQ - 1;\n const allAnswered = answeredCount === totalQ;\n const timerWarning = timeRemaining <= 60;\n\n return (\n <Card>\n {/* Header with timer */}\n <CardHeader>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div>\n <h2 style={{ fontSize: '18px', fontWeight: 700, color: 'var(--metakyc-text-primary, #111827)', margin: 0 }}>\n {testData.displayName}\n </h2>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', marginTop: '2px' }}>\n {t('appropriatenessTest.questionXofY', { current: currentQ + 1, total: totalQ })}\n </p>\n </div>\n\n {/* Timer */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 14px',\n borderRadius: '999px',\n backgroundColor: timerWarning\n ? 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 10%, transparent)'\n : 'var(--metakyc-surface, #f3f4f6)',\n transition: 'all 0.3s ease',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke={timerWarning ? 'var(--metakyc-danger, #ef4444)' : 'var(--metakyc-text-muted, #9ca3af)'}\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <span style={{\n fontSize: '16px',\n fontWeight: 700,\n fontVariantNumeric: 'tabular-nums',\n color: timerWarning ? 'var(--metakyc-danger, #ef4444)' : 'var(--metakyc-text-primary, #111827)',\n transition: 'color 0.3s ease',\n }}>\n {formatTime(timeRemaining)}\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div style={{ marginTop: '12px' }}>\n <div style={{\n height: '4px',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-border, #e5e7eb)',\n overflow: 'hidden',\n }}>\n <div style={{\n height: '100%',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n width: `${(answeredCount / totalQ) * 100}%`,\n transition: 'width 0.3s ease',\n }} />\n </div>\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: '4px',\n }}>\n <span style={{ fontSize: '11px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {answeredCount} {t('appropriatenessTest.answered')}\n </span>\n <span style={{ fontSize: '11px', color: 'var(--metakyc-text-muted, #9ca3af)' }}>\n {attemptsRemaining} {t('appropriatenessTest.attemptsLeft')}\n </span>\n </div>\n </div>\n </CardHeader>\n\n <CardContent>\n {question && (\n <QuestionCard\n question={question}\n index={currentQ}\n selectedAnswer={answers[question.id]}\n onSelect={(val) => handleAnswerChange(question.id, val)}\n disabled={isSubmitting}\n />\n )}\n\n {/* Quick nav dots */}\n {totalQ > 1 && (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n gap: '6px',\n marginTop: '20px',\n flexWrap: 'wrap',\n }}>\n {testData.appropriatenessQuestions.map((q, i) => (\n <button\n key={q.id}\n type=\"button\"\n onClick={() => setCurrentQ(i)}\n style={{\n width: '28px',\n height: '28px',\n borderRadius: '8px',\n border: i === currentQ\n ? '2px solid var(--metakyc-primary, #2563eb)'\n : '1px solid var(--metakyc-border, #e5e7eb)',\n backgroundColor: answers[q.id]\n ? (i === currentQ\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 15%, transparent)'\n : 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 8%, transparent)')\n : (i === currentQ\n ? 'var(--metakyc-surface, #f9fafb)'\n : 'var(--metakyc-background, #ffffff)'),\n color: answers[q.id]\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-text-muted, #9ca3af)',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {i + 1}\n </button>\n ))}\n </div>\n )}\n\n {/* Time expired banner */}\n {isTestExpired && (\n <div style={{\n marginTop: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, #f59e0b 10%, transparent)',\n border: '1px solid color-mix(in srgb, #f59e0b 25%, transparent)',\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#f59e0b\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <p style={{ fontSize: '13px', color: '#b45309', margin: 0, fontWeight: 500 }}>\n {t('appropriatenessTest.timesUp')}\n </p>\n </div>\n )}\n\n {/* Error */}\n {error && !isTestExpired && (\n <div style={{\n marginTop: '16px',\n padding: '12px 14px',\n borderRadius: '10px',\n backgroundColor: 'color-mix(in srgb, var(--metakyc-danger, #ef4444) 8%, transparent)',\n border: '1px solid color-mix(in srgb, var(--metakyc-danger, #ef4444) 20%, transparent)',\n }}>\n <p style={{ fontSize: '13px', color: 'var(--metakyc-danger, #ef4444)', margin: 0 }}>{error}</p>\n </div>\n )}\n </CardContent>\n\n {/* Footer */}\n <CardFooter>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%' }}>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n if (currentQ > 0) setCurrentQ((p) => p - 1);\n else onBack?.();\n }}\n disabled={isSubmitting}\n >\n {currentQ > 0 ? t('common.previous') : t('common.cancel')}\n </Button>\n\n <div style={{ display: 'flex', gap: '8px' }}>\n {!isLastQ && (\n <Button\n type=\"button\"\n onClick={() => setCurrentQ((p) => p + 1)}\n >\n {t('common.next')}\n </Button>\n )}\n {(isLastQ || allAnswered) && (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n onClick={() => handleSubmit()}\n disabled={!allAnswered && !isTestExpired}\n style={{ opacity: (allAnswered || isTestExpired) ? 1 : 0.5 }}\n >\n {isTestExpired ? t('appropriatenessTest.submitting') : t('appropriatenessTest.submitTest')}\n </Button>\n )}\n </div>\n </div>\n </CardFooter>\n </Card>\n );\n};\n\n// ── StatCard ──────────────────────────────────────────────────────────────\n\nconst STAT_ICONS: Record<string, React.ReactNode> = {\n questions: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\" /><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\n </svg>\n ),\n time: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><polyline points=\"12 6 12 12 16 14\" />\n </svg>\n ),\n target: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" /><circle cx=\"12\" cy=\"12\" r=\"6\" /><circle cx=\"12\" cy=\"12\" r=\"2\" />\n </svg>\n ),\n retry: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" /><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </svg>\n ),\n};\n\ninterface StatCardProps {\n icon: string;\n label: string;\n value: string;\n variant?: 'default' | 'warning';\n}\n\nconst StatCard: React.FC<StatCardProps> = ({ icon, label, value, variant = 'default' }) => {\n const isWarning = variant === 'warning';\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '14px',\n borderRadius: '10px',\n backgroundColor: isWarning\n ? 'color-mix(in srgb, #f59e0b 8%, transparent)'\n : 'var(--metakyc-surface, #f9fafb)',\n border: isWarning\n ? '1px solid color-mix(in srgb, #f59e0b 20%, transparent)'\n : '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <div style={{\n color: isWarning ? '#f59e0b' : 'var(--metakyc-primary, #2563eb)',\n flexShrink: 0,\n }}>\n {STAT_ICONS[icon]}\n </div>\n <div>\n <p style={{ fontSize: '12px', color: 'var(--metakyc-text-muted, #9ca3af)', margin: 0 }}>{label}</p>\n <p style={{\n fontSize: '15px',\n fontWeight: 600,\n color: isWarning ? '#b45309' : 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n marginTop: '1px',\n }}>\n {value}\n </p>\n </div>\n </div>\n );\n};\n\n// ── QuestionCard ──────────────────────────────────────────────────────────\n\ninterface QuestionCardProps {\n question: AppropriatenessQuestionOutputDto;\n index: number;\n selectedAnswer?: string;\n onSelect: (val: string) => void;\n disabled: boolean;\n}\n\nconst QuestionCard: React.FC<QuestionCardProps> = ({ question, selectedAnswer, onSelect, disabled }) => {\n return (\n <div>\n {/* Question header */}\n <div style={{ marginBottom: '16px' }}>\n {question.groupName && (\n <span style={{\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n color: 'var(--metakyc-primary, #2563eb)',\n marginBottom: '8px',\n }}>\n {question.groupName}\n </span>\n )}\n <h3 style={{\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--metakyc-text-primary, #111827)',\n margin: 0,\n lineHeight: 1.5,\n }}>\n {question.question}\n </h3>\n </div>\n\n {/* Answer options */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {question.answers.map((answer, ai) => {\n const isSelected = selectedAnswer === answer;\n return (\n <label\n key={ai}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '14px 16px',\n borderRadius: '10px',\n border: `2px solid ${isSelected ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-border, #e5e7eb)'}`,\n backgroundColor: isSelected\n ? 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 5%, var(--metakyc-background, #ffffff))'\n : 'var(--metakyc-background, #ffffff)',\n cursor: disabled ? 'default' : 'pointer',\n transition: 'all 0.15s ease',\n opacity: disabled ? 0.6 : 1,\n }}\n onMouseEnter={(e) => {\n if (!disabled && !isSelected) {\n e.currentTarget.style.borderColor = 'color-mix(in srgb, var(--metakyc-primary, #2563eb) 50%, var(--metakyc-border, #e5e7eb))';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.borderColor = 'var(--metakyc-border, #e5e7eb)';\n }\n }}\n >\n {/* Custom radio */}\n <div style={{\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n border: `2px solid ${isSelected ? 'var(--metakyc-primary, #2563eb)' : 'var(--metakyc-border, #d1d5db)'}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'border-color 0.15s ease',\n }}>\n {isSelected && (\n <div style={{\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n }} />\n )}\n </div>\n <input\n type=\"radio\"\n name={`q-${question.id}`}\n value={answer}\n checked={isSelected}\n onChange={() => onSelect(answer)}\n disabled={disabled}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span style={{\n fontSize: '14px',\n color: isSelected\n ? 'var(--metakyc-text-primary, #111827)'\n : 'var(--metakyc-text-secondary, #6b7280)',\n fontWeight: isSelected ? 500 : 400,\n transition: 'color 0.15s ease',\n }}>\n {answer}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useIdentityVerification } from '../../hooks';\nimport { useMetaKYC } from '../../context';\nimport { useTranslation } from '../../i18n/TranslationContext';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner } from '../core';\nimport { Checkbox } from '../core/Checkbox';\nimport { SearchableSelect } from '../core/SearchableSelect';\nimport { IdentityProviderManager } from '../../identity/provider-manager';\nimport { IdentityVerificationProvider, ApplicantDataDto } from '../../types';\nimport { FormPage, FormFieldEntry, FIELD_METADATA } from '../../types/form-config';\n\nexport interface IdentityVerificationStepProps {\n applicantId: number;\n onComplete?: () => void;\n onBack?: () => void;\n}\n\n/**\n * Identity verification step component\n * Shows review/confirm form BEFORE calling identity request\n */\nexport const IdentityVerificationStep: React.FC<IdentityVerificationStepProps> = ({\n applicantId,\n onComplete,\n onBack,\n}) => {\n const { t } = useTranslation();\n const { applicantService, baseInformationService, identityService, config, currentTheme } = useMetaKYC();\n const { identityData, provider, token, isLoading: identityLoading, error, requestIdentity, restartIdentity } =\n useIdentityVerification(applicantId);\n const [providerInstance, setProviderInstance] = useState<any>(null);\n const [applicantData, setApplicantData] = useState<ApplicantDataDto | null>(null);\n const [countries, setCountries] = useState<Array<{ value: string; label: string }>>([]);\n // Phone-number country list (value = countryCode e.g. \"+43\", label = \"+43 – Austria\")\n const [phoneCountries, setPhoneCountries] = useState<Array<{ value: string; label: string }>>([]);\n const [isLoadingData, setIsLoadingData] = useState(true);\n const [showProvider, setShowProvider] = useState(false);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n const hasAutoRequestedRef = React.useRef(false);\n\n // Dynamic review-form data (built-in editable field values)\n const [reviewData, setReviewData] = useState<Record<string, any>>({});\n // State for interactive custom fields on the review page (keyed by paramName)\n const [customData, setCustomData] = useState<Record<string, any>>({});\n\n // The configured review page (from theme) — first element is the single page\n const reviewPage: FormPage | null =\n (currentTheme?.reviewPageFields && currentTheme.reviewPageFields.length > 0)\n ? currentTheme.reviewPageFields[0]\n : null;\n\n // When review page is disabled: skip the review UI and auto-request identity\n const reviewPageDisabled = !!currentTheme?.reviewPageDisabled;\n // Keep a ref so async callbacks always read the latest value\n const reviewPageDisabledRef = useRef(false);\n reviewPageDisabledRef.current = reviewPageDisabled;\n\n const form = useForm({\n defaultValues: {\n street: '',\n streetNumber: '',\n city: '',\n zip: '',\n country: '',\n nationality: '',\n phonenumber: '',\n },\n });\n\n // Load applicant data and countries\n useEffect(() => {\n // ── Review page disabled: skip review UI, auto-request identity directly ──\n if (reviewPageDisabled) {\n if (!hasAutoRequestedRef.current) {\n hasAutoRequestedRef.current = true;\n requestIdentity()\n .then(() => setShowProvider(true))\n .catch(err => console.error('[Identity] Auto-request failed:', err))\n .finally(() => setIsLoadingData(false));\n }\n return;\n }\n\n const loadData = async () => {\n try {\n const [data, countriesData, phoneData] = await Promise.all([\n applicantService.getApplicantData(applicantId),\n baseInformationService.getCountries('', 'en'),\n baseInformationService.getCountries('', 'en', 40), // CountriesType.PhoneNumber\n ]);\n setApplicantData(data);\n \n // Build a deduplicated country option list (abbreviation3 as value)\n const seen = new Set<string>();\n const countryOptions = countriesData\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n setCountries(countryOptions);\n\n // Build phone-number country option list (countryCode as value, e.g. \"+43\")\n const phoneSeen = new Set<string>();\n const phoneOptions = phoneData\n .filter(c => c.countryCode)\n .map(c => ({ value: c.countryCode!, label: `${c.countryCode} – ${c.name}` }))\n .filter(c => {\n if (phoneSeen.has(c.value)) return false;\n phoneSeen.add(c.value);\n return true;\n });\n setPhoneCountries(phoneOptions);\n \n // Extract data from nested ApplicantRequestData\n const requestData = data.applicantRequestData;\n \n // Populate dynamic review-form data from applicant data\n setReviewData({\n firstName: requestData?.firstName || '',\n lastName: requestData?.lastName || '',\n email: requestData?.email || '',\n dateOfBirth: requestData?.dateOfBirth || '',\n title: requestData?.title || '',\n salutation: requestData?.salutation || '',\n phonenumber: requestData?.phonenumber || '',\n mobileCountryCode: requestData?.mobileCountryCode || '',\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n taxCountry: requestData?.taxCountry || '',\n countryOfBirth: requestData?.countryOfBirth || '',\n placeOfBirth: requestData?.placeOfBirth || '',\n educationLevel: requestData?.educationLevel || '',\n occupation: requestData?.occupation || '',\n taxNumber: requestData?.taxNumber || '',\n defaultLanguage: requestData?.defaultLanguage || '',\n });\n\n // Set form default values from applicant request data (static fallback)\n form.reset({\n street: requestData?.street || '',\n streetNumber: requestData?.streetNumber || '',\n city: requestData?.city || '',\n zip: requestData?.zip || '',\n country: requestData?.country || '',\n nationality: requestData?.nationality || '',\n phonenumber: requestData?.phonenumber || '',\n });\n\n // Auto-skip to provider only when the review page is explicitly disabled\n // AND the applicant already has an active identity session.\n // When the review page is enabled (default), always show it first.\n const hasExistingIdentity =\n data.kycRecords &&\n data.kycRecords.length > 0 &&\n data.kycRecords[0].providerTokenObject !== null;\n\n if (hasExistingIdentity && !hasAutoRequestedRef.current && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled + existing identity — auto-requesting...');\n hasAutoRequestedRef.current = true;\n try {\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('[Identity] Auto-request failed:', err);\n }\n }\n } catch (err) {\n console.error('Error loading applicant data:', err);\n } finally {\n setIsLoadingData(false);\n }\n };\n loadData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [applicantId]);\n\n // Only auto-show provider from cached hook state when the review page is disabled.\n // When review page is enabled the user must click Confirm to proceed.\n useEffect(() => {\n if (identityData && !showProvider && reviewPageDisabledRef.current) {\n console.log('[Identity] Review page disabled — showing cached provider');\n setShowProvider(true);\n }\n }, [identityData, showProvider]);\n\n // Check if token is expired or about to expire\n useEffect(() => {\n if (token) {\n // Check expiresAt field\n if (token.expiresAt) {\n const expirationTime = new Date(token.expiresAt).getTime();\n const now = Date.now();\n \n if (now >= expirationTime) {\n console.warn('[Identity] Token has expired (expiresAt)');\n setIsExpired(true);\n setProviderError(t('identity.sessionExpired'));\n return;\n }\n }\n\n // Check for expired token in URL or config\n if (token.url) {\n try {\n const url = new URL(token.url);\n // Check if URL contains expiration indicators\n const urlString = url.toString().toLowerCase();\n if (\n urlString.includes('expired') ||\n urlString.includes('invalid') ||\n urlString.includes('error')\n ) {\n console.warn('[Identity] Token URL indicates expiration');\n setIsExpired(true);\n setProviderError(t('identity.linkExpired'));\n return;\n }\n } catch (err) {\n console.error('[Identity] Invalid token URL');\n }\n }\n\n // Check token object for expiration indicators\n if (\n token.status === 'expired' ||\n token.error === 'expired' ||\n token.expired === true\n ) {\n console.warn('[Identity] Token object indicates expiration');\n setIsExpired(true);\n setProviderError(t('identity.sessionExpired'));\n return;\n }\n }\n }, [token]);\n\n // When the provider is Sumsub, always use the inline Web SDK within the MetaKYC SDK.\n // The link/iframe approach remains available for direct API consumers outside the SDK.\n const useSumsubSdk =\n provider !== null &&\n (provider as number) === IdentityVerificationProvider.Sumsub;\n\n // Initialize identity provider when ready\n useEffect(() => {\n if (provider !== null && token && !providerInstance && showProvider && !isExpired) {\n const providerType = provider as number;\n\n // ── Sumsub JS SDK mode (opt-in via config.identityProviders.sumsub) ─\n if (useSumsubSdk) {\n console.log('[Sumsub] Fetching access token for Web SDK…');\n setProviderError(null);\n\n (async () => {\n try {\n const accessToken = await identityService.refreshSumsubToken(applicantId);\n\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n providerConfig.accessToken = accessToken;\n providerConfig.onTokenRefresh = () =>\n identityService.refreshSumsubToken(applicantId);\n\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n instance.onComplete((payload: any) => {\n console.log('[Sumsub] Verification complete:', payload);\n onComplete?.();\n });\n instance.onError((err: any) => {\n console.error('[Sumsub] SDK error:', err);\n const msg = typeof err === 'string' ? err : err?.message || 'Unknown error';\n if (msg.toLowerCase().includes('expired')) {\n setIsExpired(true);\n setProviderError(t('identity.sessionExpiredRestart'));\n }\n });\n\n await instance.initialize('sumsub-websdk-container');\n console.log('[Sumsub] Web SDK launched');\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Sumsub] Initialization error:', err);\n setProviderError(t('identity.failedToInitialize', { message: err.message || err }));\n if (String(err.message || err).toLowerCase().includes('expired')) {\n setIsExpired(true);\n }\n }\n })();\n return;\n }\n\n // ── URL-based verification (iframe) for any provider ────────────────\n if (token.url) {\n console.log('[Identity] Loading provider URL for user verification:', token.url);\n setProviderError(null);\n\n try {\n new URL(token.url);\n\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] Initializing Risk SDK in background...');\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n instance.initialize()\n .then(() => console.log('[SardinAI] Risk SDK initialized in background'))\n .catch((err: Error) => console.warn('[SardinAI] Risk SDK init failed (non-blocking):', err));\n } catch (err: any) {\n console.warn('[SardinAI] Risk SDK setup failed (non-blocking):', err);\n }\n }\n\n setProviderInstance({ type: 'url', url: token.url });\n } catch (err: any) {\n console.error('[Identity] Invalid URL:', err);\n setProviderError(t('identity.invalidUrl'));\n setIsExpired(true);\n }\n return;\n }\n\n // ── SardinAI without URL: Risk SDK only (no UI) ─────────────────────\n if (providerType === IdentityVerificationProvider.SardinAI) {\n console.log('[SardinAI] No URL provided - initializing Risk SDK only...');\n setProviderError(null);\n\n try {\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n instance.initialize()\n .then(() => {\n console.log('[SardinAI] Risk SDK initialized successfully');\n setProviderInstance(instance);\n setTimeout(() => onComplete?.(), 2000);\n })\n .catch((err: Error) => {\n console.error('[SardinAI] Failed to initialize:', err);\n const errorMessage = err.message?.toLowerCase() || '';\n if (errorMessage.includes('expired') || errorMessage.includes('invalid') || errorMessage.includes('401') || errorMessage.includes('400')) {\n setIsExpired(true);\n setProviderError(t('identity.sessionExpiredOrInvalid'));\n } else {\n setProviderError(t('identity.failedToInitialize', { message: err.message }));\n }\n });\n } catch (err: any) {\n console.error('[SardinAI] Error creating provider:', err);\n setProviderError(t('identity.configurationError', { message: err.message }));\n }\n return;\n }\n\n // ── Fallback: other JS SDK providers (Onfido etc.) ──────────────────\n try {\n setProviderError(null);\n const providerConfig = IdentityProviderManager.parseProviderConfig(provider, token, config);\n const instance: any = IdentityProviderManager.createProvider(provider, providerConfig);\n\n if (providerType === IdentityVerificationProvider.Onfido) {\n instance.initialize('identity-container')\n .catch((err: Error) => {\n console.error('[Onfido] Initialization error:', err);\n setProviderError(t('identity.failedToInitialize', { message: err.message }));\n });\n }\n\n setProviderInstance(instance);\n } catch (err: any) {\n console.error('[Identity] Provider setup error:', err);\n setProviderError(t('identity.setupError', { message: err.message }));\n }\n }\n\n return () => {\n if (providerInstance && providerInstance.destroy) {\n try {\n providerInstance.destroy();\n } catch (err) {\n console.error('[Identity] Error destroying provider:', err);\n }\n }\n };\n }, [provider, token, providerInstance, showProvider, onComplete, isExpired, useSumsubSdk, applicantId, config, identityService]);\n\n // Handle confirm and start identity verification\n const handleConfirm = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n // Request identity verification\n await requestIdentity();\n setShowProvider(true);\n } catch (err) {\n console.error('Error starting identity verification:', err);\n }\n };\n\n // Handle restart verification\n const handleRestart = async () => {\n try {\n setProviderError(null);\n setIsExpired(false);\n setProviderInstance(null);\n \n console.log('[Identity] Restarting verification...');\n \n // Call restart identity endpoint\n await restartIdentity();\n setShowProvider(true);\n } catch (err: any) {\n console.error('Error restarting identity verification:', err);\n setProviderError(err.message || t('identity.failedToRestart'));\n }\n };\n\n if (isLoadingData || identityLoading) {\n return (\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center text-gray-600 dark:text-gray-400 mt-4\">\n {t('identity.loadingIdentity')}\n </p>\n </CardContent>\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card>\n <CardContent>\n <p className=\"text-danger-500\">Error: {error.message}</p>\n </CardContent>\n </Card>\n );\n }\n\n // Show error/expired state with restart option\n if (showProvider && (providerError || isExpired)) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('identity.sessionIssueTitle')}\n </h2>\n </CardHeader>\n <CardContent>\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg mb-6\">\n <div className=\"flex items-start\">\n <svg\n className=\"h-6 w-6 text-red-600 dark:text-red-400 mr-3 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div>\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-1\">\n {isExpired ? t('identity.sessionExpiredTitle') : t('identity.verificationError')}\n </h3>\n <p className=\"text-red-800 dark:text-red-200 text-sm\">\n {providerError || t('identity.sessionExpiredMessage')}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n {t('identity.whatToDoNext')}\n </h3>\n <ul className=\"text-blue-800 dark:text-blue-200 text-sm space-y-1 list-disc list-inside\">\n <li>{t('identity.clickRestart')}</li>\n <li>{t('identity.completeWithoutDelays')}</li>\n <li>{t('identity.ifIssuesPersist')}</li>\n </ul>\n </div>\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n <Button type=\"button\" onClick={handleRestart} disabled={identityLoading}>\n {identityLoading ? t('identity.restarting') : t('identity.restartVerification')}\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Show identity provider if already requested\n if (showProvider && identityData) {\n const providerType = provider as number;\n\n // ── Sumsub JS SDK mode: render inline container ───────────────────────\n if (useSumsubSdk) {\n return (\n <div style={{\n background: 'var(--metakyc-background, #ffffff)',\n borderRadius: '12px',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n overflow: 'hidden',\n }}>\n {/* Header */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '20px 24px',\n borderBottom: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <div>\n <h2 style={{\n margin: 0,\n fontSize: '20px',\n fontWeight: 700,\n color: 'var(--metakyc-text-primary, #111827)',\n }}>\n {t('identity.title')}\n </h2>\n <p style={{\n margin: '4px 0 0',\n fontSize: '14px',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}>\n {t('identity.subtitle')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleRestart}\n disabled={identityLoading}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n fontWeight: 500,\n borderRadius: '8px',\n border: '1px solid var(--metakyc-border, #d1d5db)',\n background: 'var(--metakyc-background, #ffffff)',\n color: 'var(--metakyc-text-primary, #111827)',\n cursor: identityLoading ? 'not-allowed' : 'pointer',\n opacity: identityLoading ? 0.5 : 1,\n }}\n >\n {identityLoading ? t('identity.restarting') : t('identity.restart')}\n </button>\n </div>\n\n {/* Sumsub SDK renders its own iframe here */}\n <div\n id=\"sumsub-websdk-container\"\n style={{\n minHeight: '520px',\n width: '100%',\n padding: '16px 24px',\n background: 'var(--metakyc-background, #ffffff)',\n }}\n />\n\n {/* Footer */}\n {onBack && (\n <div style={{\n padding: '16px 24px',\n borderTop: '1px solid var(--metakyc-border, #e5e7eb)',\n }}>\n <Button variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n </div>\n )}\n </div>\n );\n }\n\n // ── URL-based verification: show in iframe (any provider) ─────────────\n if (token?.url) {\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-2xl font-bold\">{t('identity.title')}</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n {t('identity.subtitle')}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRestart}\n disabled={identityLoading}\n >\n {t('identity.restart')}\n </Button>\n </div>\n </CardHeader>\n\n <CardContent>\n {/* Info box about expiration */}\n <div className=\"mb-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <p className=\"text-yellow-800 dark:text-yellow-200 text-sm\">\n {t('identity.importantExpiredMessage')}\n </p>\n </div>\n\n <div className=\"w-full\" style={{ height: '600px' }}>\n <iframe\n src={token.url}\n className=\"w-full h-full border-0 rounded-lg\"\n allow=\"camera; microphone; geolocation\"\n title=\"Identity Verification\"\n onLoad={(e) => {\n console.log('[Identity] Iframe loaded');\n // Try to detect expiration from iframe content (limited by CORS)\n try {\n const iframe = e.target as HTMLIFrameElement;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (iframeDoc) {\n const text = iframeDoc.body?.textContent?.toLowerCase() || '';\n if (\n text.includes('expired') ||\n text.includes('invalid') ||\n text.includes('error')\n ) {\n console.warn('[Identity] Iframe shows expiration message');\n setIsExpired(true);\n setProviderError(t('identity.linkExpired'));\n }\n }\n } catch (err) {\n // CORS restriction - can't access iframe content\n console.log('[Identity] Cannot check iframe content (CORS)');\n }\n }}\n />\n </div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // For SardinAI without URL: Show loading indicator while SDK collects data\n if (providerType === IdentityVerificationProvider.SardinAI) {\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">{t('identity.deviceRiskAssessment')}</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n {t('identity.analyzingDevice')}\n </p>\n </CardHeader>\n\n <CardContent>\n <div className=\"text-center py-12\">\n <Spinner className=\"mb-4\" />\n <p className=\"text-gray-600 dark:text-gray-400\">\n {t('identity.pleaseWaitDevice')}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-500 mt-2\">\n {t('identity.automaticProcess')}\n </p>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Otherwise, show SDK container (Onfido, etc.)\n return (\n <Card>\n <CardHeader>\n <h2 className=\"text-2xl font-bold\">{t('identity.title')}</h2>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n {t('identity.subtitle')}\n </p>\n </CardHeader>\n\n <CardContent>\n <div id=\"identity-container\" className=\"min-h-[400px]\"></div>\n </CardContent>\n\n {onBack && (\n <CardFooter>\n <Button variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n </CardFooter>\n )}\n </Card>\n );\n }\n\n // ── Helpers for the dynamic review page ───────────────────────────────────\n\n const COUNTRY_FIELD_META_TYPES = new Set(['country', 'nationality', 'taxCountry', 'countryOfBirth', 'mobileCountryCode', 'otherNationality']);\n\n const colStyle = (span: number | string | undefined = 4): React.CSSProperties => {\n const s = Math.min(4, Math.max(1, Number(span) || 4));\n return { gridColumn: `span ${s} / span ${s}` };\n };\n\n /** Format a raw field value for read-only display */\n const formatDisplayValue = (name: string, value: any): string => {\n if (!value && value !== 0) return '—';\n if (COUNTRY_FIELD_META_TYPES.has(name) && name !== 'mobileCountryCode') {\n const opt = countries.find(c => c.value === value);\n return opt ? opt.label : String(value);\n }\n return String(value);\n };\n\n // ── Help-text portal (inline ? button + modal) ────────────────────────────\n\n const ReviewHelpButton: React.FC<{ helpText: string }> = ({ helpText }) => {\n const [open, setOpen] = useState(false);\n const btnRef = useRef<HTMLButtonElement>(null);\n const [, setPos] = useState({ top: 0, left: 0 });\n\n const openModal = () => {\n if (btnRef.current) {\n const r = btnRef.current.getBoundingClientRect();\n setPos({ top: r.bottom + window.scrollY + 6, left: r.left + window.scrollX });\n }\n setOpen(true);\n };\n\n return (\n <>\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n ref={btnRef}\n onClick={openModal}\n style={{\n width: 18, height: 18, borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent', color: 'var(--metakyc-primary, #2563eb)',\n fontSize: 11, fontWeight: 700, cursor: 'pointer',\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0, lineHeight: 1,\n position: 'relative', zIndex: 2,\n }}\n >?</button>\n {open && ReactDOM.createPortal(\n <div\n style={{\n position: 'fixed', inset: 0, zIndex: 99999,\n background: 'rgba(0,0,0,0.55)',\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n onClick={() => setOpen(false)}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 8px)',\n padding: '20px 24px', maxWidth: 400, width: '90%',\n boxShadow: '0 24px 64px rgba(0,0,0,0.4)',\n }}\n >\n <div dangerouslySetInnerHTML={{ __html: helpText }} style={{ fontSize: 13, color: 'var(--metakyc-text-primary, #111827)', lineHeight: 1.6 }} />\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n style={{\n marginTop: 12, padding: '4px 12px', fontSize: 12,\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: 'var(--metakyc-border-radius, 6px)',\n background: 'transparent', cursor: 'pointer',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n >{t('common.close')}</button>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n };\n\n /** Wrap any field content with optional help text */\n const withHelp = (content: React.ReactNode, helpText?: string) => {\n if (!helpText) return content;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 5, flexWrap: 'nowrap' }}>\n <div style={{ flex: 1, minWidth: 0 }}>{content}</div>\n <div style={{ paddingTop: 24 }}>\n <ReviewHelpButton helpText={helpText} />\n </div>\n </div>\n );\n };\n\n // ── Interactive custom field renderer ─────────────────────────────────────\n\n const renderCustomField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n const key = `cf-${idx}`;\n const pn = f.paramName ?? '';\n const val = customData[pn];\n\n if (f.customType === 'br') {\n return <div key={key} style={{ ...colStyle(f.colSpan), minHeight: '0.5rem' }} />;\n }\n\n if (f.customType === 'paragraph') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n <div\n className=\"text-sm\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n </div>\n );\n }\n\n if (f.customType === 'html') {\n return (\n <div key={key} style={colStyle(f.colSpan)}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n if (f.customType === 'link') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <a\n href={f.linkUrl ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm underline\"\n style={{ color: 'var(--metakyc-primary, #6366f1)' }}\n >\n {f.displayText || f.label || f.linkText || f.linkUrl}\n </a>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n const checked = val === 'true' || val === true;\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <Checkbox\n checked={!!checked}\n onChange={v => setCustomData(prev => ({ ...prev, [pn]: String(v) }))}\n style={{ marginTop: 2 }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {f.customType === 'link_checkbox' && f.linkUrl ? (\n <><a href={f.linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--metakyc-primary, #6366f1)', textDecoration: 'underline' }}>{f.linkText || f.label}</a>{f.label && f.linkText ? ` ${f.label}` : ''}</>\n ) : (\n f.displayText || f.label\n )}\n </span>\n </label>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'group_checkbox') {\n const selected: string[] = Array.isArray(val) ? val : (val ? [val] : []);\n const toggleOpt = (v: string) => {\n if (f.singleSelect) {\n setCustomData(prev => ({ ...prev, [pn]: selected[0] === v ? [] : [v] }));\n } else {\n setCustomData(prev => ({\n ...prev,\n [pn]: selected.includes(v) ? selected.filter(x => x !== v) : [...selected, v],\n }));\n }\n };\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <Checkbox\n checked={selected.includes(opt.value)}\n onChange={() => toggleOpt(opt.value)}\n style={{ marginTop: 2 }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n if (f.customType === 'radio_group') {\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <div className=\"space-y-1.5\">\n {f.label && <p className=\"text-sm font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{f.displayText || f.label}</p>}\n {(f.options || []).map(opt => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={`rg-${pn}`}\n value={opt.value}\n checked={val === opt.value}\n onChange={() => setCustomData(prev => ({ ...prev, [pn]: opt.value }))}\n style={{ width: 16, height: 16, flexShrink: 0, marginTop: 2, accentColor: 'var(--metakyc-primary, #6366f1)' }}\n />\n <span className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{opt.label}</span>\n </label>\n ))}\n </div>,\n f.helpText\n )}\n </div>\n );\n }\n\n // text input custom field\n return (\n <div key={key} style={colStyle(f.colSpan)}>\n {withHelp(\n <Input\n label={f.displayText || f.label || pn}\n value={String(val ?? '')}\n onChange={e => setCustomData(prev => ({ ...prev, [pn]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Full field renderer (built-in + custom) ────────────────────────────────\n\n const renderReviewField = (f: FormFieldEntry, idx: number): React.ReactNode => {\n // Route custom fields\n if (f.isCustom) return renderCustomField(f, idx);\n\n const name = f.name ?? '';\n const meta = FIELD_METADATA[name];\n const label = f.displayText || meta?.label || name;\n const value = reviewData[name] ?? '';\n const isPhoneCountry = name === 'mobileCountryCode';\n const isCountry = !!meta?.countriesType && !isPhoneCountry;\n\n if (!f.editable) {\n return (\n <div key={`ro-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <>\n <label className=\"block text-sm font-medium mb-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{label}</label>\n <p className=\"text-sm\" style={{ color: 'var(--metakyc-text-primary, #111827)', minHeight: '1.5rem' }}>\n {formatDisplayValue(name, value)}\n </p>\n </>,\n f.helpText\n )}\n </div>\n );\n }\n\n // Mobile country code: searchable phone-number dropdown (value = \"+43\", label = \"+43 – Austria\")\n if (isPhoneCountry) {\n return (\n <div key={`epc-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: t('placeholders.selectCountryCode') }, ...phoneCountries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n if (isCountry) {\n return (\n <div key={`ec-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <SearchableSelect\n label={label}\n value={String(value)}\n onChange={v => setReviewData(prev => ({ ...prev, [name]: v }))}\n options={[{ value: '', label: t('common.select') }, ...countries]}\n />,\n f.helpText\n )}\n </div>\n );\n }\n\n return (\n <div key={`ei-${idx}`} style={colStyle(f.colSpan ?? 2)}>\n {withHelp(\n <Input\n label={label}\n type={meta?.type === 'date' ? 'date' : meta?.type === 'email' ? 'email' : 'text'}\n value={String(value)}\n onChange={e => setReviewData(prev => ({ ...prev, [name]: e.target.value }))}\n />,\n f.helpText\n )}\n </div>\n );\n };\n\n // ── Dynamic review page ────────────────────────────────────────────────────\n\n if (reviewPage) {\n const pageTitle = reviewPage.title || t('identity.reviewYourInformation');\n const pageSubtitle = reviewPage.subtitle || t('identity.reviewSubtitle');\n return (\n <form onSubmit={e => { e.preventDefault(); handleConfirm(); }}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {pageTitle}\n </h2>\n {pageSubtitle && (\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {pageSubtitle}\n </p>\n )}\n </CardHeader>\n\n <CardContent>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {reviewPage.fields.map((f, idx) => renderReviewField(f, idx))}\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n {t('identity.confirmAndStart')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n }\n\n // ── Static review page (fallback when no config) ────────────────────────\n\n return (\n <form onSubmit={form.handleSubmit(handleConfirm)}>\n <Card>\n <CardHeader>\n <h2 className=\"text-lg font-bold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('identity.reviewYourInformation')}\n </h2>\n <p className=\"mt-1 text-sm\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('identity.reviewSubtitle')}\n </p>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n {/* Read-only section */}\n <div className=\"space-y-4 pb-4\" style={{ borderBottom: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n {[\n { label: t('fields.name'), value: `${applicantData?.applicantRequestData?.firstName || ''} ${applicantData?.applicantRequestData?.lastName || ''}`.trim() },\n { label: t('fields.email'), value: applicantData?.applicantRequestData?.email },\n { label: t('fields.dateOfBirth'), value: applicantData?.applicantRequestData?.dateOfBirth || t('fields.notProvided') },\n ].map(({ label, value }) => (\n <div key={label}>\n <label className=\"block text-sm font-medium\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {label}\n </label>\n <p className=\"mt-1 text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{value}</p>\n </div>\n ))}\n </div>\n\n {/* Editable address fields */}\n <div className=\"space-y-4\">\n <h3 className=\"text-base font-semibold\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('fields.addressInformation')}\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller\n control={form.control}\n name=\"country\"\n render={({ field }) => (\n <SearchableSelect\n label={t('fields.country')}\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: t('placeholders.selectCountry') }, ...countries]}\n />\n )}\n />\n <Controller\n control={form.control}\n name=\"nationality\"\n render={({ field }) => (\n <SearchableSelect\n label={t('fields.nationality')}\n value={field.value}\n onChange={field.onChange}\n options={[{ value: '', label: t('placeholders.selectNationality') }, ...countries]}\n />\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"street\" render={({ field }) => <Input {...field} label={t('fields.street')} />} />\n <Controller control={form.control} name=\"streetNumber\" render={({ field }) => <Input {...field} label={t('fields.streetNumber')} />} />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Controller control={form.control} name=\"city\" render={({ field }) => <Input {...field} label={t('fields.city')} />} />\n <Controller control={form.control} name=\"zip\" render={({ field }) => <Input {...field} label={t('fields.zip')} />} />\n </div>\n\n <Controller control={form.control} name=\"phonenumber\" render={({ field }) => <Input {...field} label={t('fields.phoneNumber')} type=\"tel\" />} />\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onBack && (\n <Button type=\"button\" variant=\"outline\" onClick={onBack}>\n {t('common.back')}\n </Button>\n )}\n <Button type=\"submit\" isLoading={identityLoading}>\n {t('identity.confirmAndStart')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n );\n};\n","import React from 'react';\nimport { Card, CardContent, CardFooter, Button, Badge } from '../core';\nimport { KycStatus, ReviewStatus, WorkflowResultType } from '../../types';\nimport { useTranslation } from '../../i18n/TranslationContext';\n\nexport interface KycStatusDisplayProps {\n kycStatus: KycStatus | null;\n reviewStatus: ReviewStatus;\n workflowResult: WorkflowResultType | null;\n customMessage?: string;\n onContinue?: () => void;\n onContactSupport?: () => void;\n}\n\n/**\n * KYC Status Display Component\n * Shows appropriate UI based on KYC verification status\n */\nexport const KycStatusDisplay: React.FC<KycStatusDisplayProps> = ({\n kycStatus,\n reviewStatus,\n workflowResult,\n customMessage,\n onContinue,\n onContactSupport,\n}) => {\n const { t } = useTranslation();\n\n // Determine the primary status to display\n const getStatusInfo = () => {\n // Check KYC status first\n if (kycStatus === KycStatus.Approved) {\n return {\n type: 'success' as const,\n title: t('status.verificationApproved'),\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: t('status.verificationApprovedMsg'),\n };\n }\n\n if (kycStatus === KycStatus.Rejected) {\n return {\n type: 'error' as const,\n title: t('status.verificationRejected'),\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: t('status.verificationRejectedMsg'),\n };\n }\n\n if (kycStatus === KycStatus.Pending || kycStatus === KycStatus.InProgress) {\n return {\n type: 'pending' as const,\n title: t('status.verificationPending'),\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: t('status.verificationPendingMsg'),\n };\n }\n\n // Check review status\n if (reviewStatus === ReviewStatus.Approved) {\n return {\n type: 'success' as const,\n title: t('status.applicationApproved'),\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: t('status.applicationApprovedMsg'),\n };\n }\n\n if (reviewStatus === ReviewStatus.Reject) {\n return {\n type: 'error' as const,\n title: t('status.applicationRejected'),\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: t('status.applicationRejectedMsg'),\n };\n }\n\n if (reviewStatus === ReviewStatus.UnderReview || reviewStatus === ReviewStatus.AdminReview) {\n return {\n type: 'pending' as const,\n title: t('status.underReview'),\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: t('status.underReviewMsg'),\n };\n }\n\n // Check workflow result\n if (workflowResult === WorkflowResultType.Success) {\n return {\n type: 'success' as const,\n title: t('status.processComplete'),\n icon: '✓',\n iconBg: 'bg-green-100 dark:bg-green-900/30',\n iconColor: 'text-green-600 dark:text-green-400',\n message: t('status.processCompleteMsg'),\n };\n }\n\n if (workflowResult === WorkflowResultType.Failed) {\n return {\n type: 'error' as const,\n title: t('status.processFailed'),\n icon: '✕',\n iconBg: 'bg-red-100 dark:bg-red-900/30',\n iconColor: 'text-red-600 dark:text-red-400',\n message: t('status.processFailedMsg'),\n };\n }\n\n if (workflowResult === WorkflowResultType.AdminReview) {\n return {\n type: 'pending' as const,\n title: t('status.adminReviewRequired'),\n icon: '📋',\n iconBg: 'bg-yellow-100 dark:bg-yellow-900/30',\n iconColor: 'text-yellow-700 dark:text-yellow-400',\n message: t('status.adminReviewRequiredMsg'),\n };\n }\n\n // Default waiting state\n // Note: This should only show for non-workflow completion states\n return {\n type: 'pending' as const,\n title: t('status.processing'),\n icon: '⏱',\n iconBg: 'bg-blue-100 dark:bg-blue-900/30',\n iconColor: 'text-blue-600 dark:text-blue-400',\n message: t('status.processingMsg'),\n };\n };\n\n const statusInfo = getStatusInfo();\n\n return (\n <Card>\n <CardContent className=\"py-12\">\n {/* Status Icon */}\n <div className=\"flex justify-center mb-6\">\n <div\n className={`w-24 h-24 rounded-full flex items-center justify-center ${statusInfo.iconBg}`}\n >\n <span className={`text-5xl ${statusInfo.iconColor}`}>{statusInfo.icon}</span>\n </div>\n </div>\n\n {/* Title */}\n <h2 className=\"text-3xl font-bold text-center mb-4\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {statusInfo.title}\n </h2>\n\n {/* Status Badge */}\n <div className=\"flex justify-center mb-6\">\n <Badge\n variant={\n statusInfo.type === 'success'\n ? 'success'\n : statusInfo.type === 'error'\n ? 'danger'\n : statusInfo.type === 'pending'\n ? 'warning'\n : 'info'\n }\n >\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : ReviewStatus[reviewStatus]}\n </Badge>\n </div>\n\n {/* Message */}\n <p className=\"text-center mb-6 max-w-md mx-auto\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {customMessage || statusInfo.message}\n </p>\n\n {/* Status-specific content */}\n {statusInfo.type === 'success' && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-green-900 dark:text-green-100 mb-2\">\n {t('status.whatsNext')}\n </h3>\n <ul className=\"text-sm text-green-800 dark:text-green-200 space-y-1\">\n <li>✓ {t('status.identityVerified')}</li>\n <li>✓ {t('status.canProceed')}</li>\n <li>✓ {t('status.allFeaturesAccessible')}</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'error' && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-red-900 dark:text-red-100 mb-2\">\n {t('status.whatCanYouDo')}\n </h3>\n <ul className=\"text-sm text-red-800 dark:text-red-200 space-y-2\">\n <li>• {t('status.reviewSubmittedInfo')}</li>\n <li>• {t('status.contactSupportTeam')}</li>\n <li>• {t('status.resubmitIfNeeded')}</li>\n </ul>\n </div>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4 mb-6\">\n <h3 className=\"font-semibold text-blue-900 dark:text-blue-100 mb-2\">\n {t('status.whatHappensNext')}\n </h3>\n <ul className=\"text-sm text-blue-800 dark:text-blue-200 space-y-2\">\n <li>• {t('status.teamReviewing')}</li>\n <li>• {t('status.notifiedByEmail')}</li>\n <li>• {t('status.noActionRequired')}</li>\n </ul>\n </div>\n )}\n\n {/* Additional details */}\n <div className=\"mt-6 pt-6\" style={{ borderTop: '1px solid var(--metakyc-border, #e5e7eb)' }}>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('status.kycStatus')}</span>\n <div className=\"font-medium mt-1\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {kycStatus !== null && kycStatus !== undefined\n ? KycStatus[kycStatus]\n : t('status.notAvailable')}\n </div>\n </div>\n <div>\n <span style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('status.reviewStatus')}</span>\n <div className=\"font-medium mt-1\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {ReviewStatus[reviewStatus]}\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'center', gap: '1rem' }}>\n {statusInfo.type === 'success' && onContinue && (\n <Button onClick={onContinue} size=\"lg\">\n {t('common.continue')}\n </Button>\n )}\n\n {statusInfo.type === 'error' && (\n <>\n {onContactSupport && (\n <Button variant=\"outline\" onClick={onContactSupport}>\n {t('status.contactSupport')}\n </Button>\n )}\n {onContinue && (\n <Button onClick={onContinue}>\n {t('status.tryAgain')}\n </Button>\n )}\n </>\n )}\n\n {statusInfo.type === 'pending' && (\n <div className=\"text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('status.checkBackLater')}\n </p>\n </div>\n )}\n </CardFooter>\n </Card>\n );\n};\n","import React from 'react';\nimport { LogoConfig } from '../types/theme';\nimport { useTranslation } from '../i18n/TranslationContext';\n\nexport interface LogoProps {\n config?: LogoConfig;\n className?: string;\n}\n\n/**\n * Logo Component\n * Displays the configured logo in the top-left position\n */\nexport const Logo: React.FC<LogoProps> = ({ config, className = '' }) => {\n const { t } = useTranslation();\n\n // Don't render if logo is not visible or no URL provided\n if (!config?.visible || !config?.url) {\n return null;\n }\n\n return (\n <div className={`metakyc-logo ${className}`}>\n <img\n src={config.url}\n alt={config.alt || t('logo.companyLogo')}\n style={{\n width: config.width || 'auto',\n height: config.height || '40px',\n maxWidth: '100%',\n objectFit: 'contain',\n }}\n onError={(e) => {\n console.warn('[Logo] Failed to load logo:', config.url);\n // Hide on error\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { Logo } from './Logo';\nimport { useMetaKYC } from '../context';\n\nexport interface HeaderProps {\n /** Override the default title from theme */\n title?: string;\n /** Optional subtitle */\n subtitle?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Header Component\n * Displays logo and title inline, separated by | when both are present\n */\nexport const Header: React.FC<HeaderProps> = ({ \n title: titleProp, \n subtitle,\n className = '' \n}) => {\n const { currentTheme } = useMetaKYC();\n \n const title = titleProp || currentTheme?.title || '';\n const hasLogo = !!(currentTheme?.logo && currentTheme.logo.visible && currentTheme.logo.url);\n const hasTitle = !!title;\n\n if (!hasLogo && !hasTitle) return null;\n \n return (\n <div className={`metakyc-header ${className}`}>\n <div\n className=\"metakyc-header-title flex items-center text-xl font-bold\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {hasLogo && (\n <Logo config={currentTheme!.logo} />\n )}\n {hasLogo && hasTitle && (\n <span\n style={{ fontSize: '1.5rem', fontWeight: 300, color: 'var(--metakyc-text-muted, #9ca3af)', margin: '0 12px' }}\n >\n |\n </span>\n )}\n {hasTitle && (\n <span style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{title}</span>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm mt-1\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {subtitle}\n </p>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, MultiSelect, Spinner, SearchableSelect } from './core';\nimport { Checkbox } from './core/Checkbox';\nimport { ApplicantRegistrationRequestInput, GenderType } from '../types';\nimport type { ApplicantFormField } from '../client/config';\nimport {\n FIELD_METADATA, DEFAULT_VISIBLE_FIELDS, ALLOWED_LANGUAGES,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\nimport { useTranslation } from '../i18n/TranslationContext';\n\nexport interface CreateApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst SYSTEM_REQUIRED: ApplicantFormField[] = ['firstName', 'lastName', 'email', 'phonenumber', 'dateOfBirth'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\n// Shared option input style — matches QuestionnaireStep / RiskScoringStep\nconst OPTION_INPUT_STYLE: React.CSSProperties = {\n width: '16px', height: '16px', minWidth: '16px',\n flexShrink: 0, flexGrow: 0,\n accentColor: 'var(--metakyc-primary, #2563eb)',\n cursor: 'pointer',\n margin: 0, padding: 0,\n display: 'inline-block',\n verticalAlign: 'middle',\n};\n\n// ── Per-field help modal ──────────────────────────────────────────────────────\n\nconst FieldHelpWrapper: React.FC<{ helpText?: string; children: React.ReactNode }> = ({ helpText, children }) => {\n const [open, setOpen] = React.useState(false);\n if (!helpText) return <>{children}</>;\n\n const modal = open ? (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => setOpen(false)}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999999,\n background: 'rgba(0, 0, 0, 0.55)',\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n borderRadius: '12px',\n padding: '28px 24px 24px',\n maxWidth: '480px',\n width: '100%',\n maxHeight: '80vh',\n overflowY: 'auto',\n boxShadow: '0 24px 64px rgba(0,0,0,0.4)',\n position: 'relative',\n }}\n >\n {/* Close button */}\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n style={{\n position: 'absolute',\n top: '12px',\n right: '12px',\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n background: 'var(--metakyc-input-bg, #f3f4f6)',\n color: 'var(--metakyc-text-secondary, #6b7280)',\n fontSize: '16px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n\n {/* HTML content */}\n <div\n style={{\n color: 'var(--metakyc-text-primary, #111827)',\n fontSize: '14px',\n lineHeight: 1.75,\n }}\n dangerouslySetInnerHTML={{ __html: helpText }}\n />\n </div>\n </div>\n ) : null;\n\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '5px', flexWrap: 'nowrap' }}>\n {/* Field content — takes natural width so ? sits right next to short text */}\n {children}\n\n {/* Circular ? button — inline, immediately after the component */}\n <button\n type=\"button\"\n className=\"metakyc-help-btn\"\n onClick={() => setOpen(true)}\n aria-label=\"Help\"\n style={{\n flexShrink: 0,\n marginTop: '2px',\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n border: '1.5px solid var(--metakyc-primary, #2563eb)',\n background: 'transparent',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '10px',\n fontWeight: '700',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n padding: 0,\n position: 'relative',\n zIndex: 2,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'var(--metakyc-primary, #2563eb)';\n (e.currentTarget as HTMLButtonElement).style.color = '#ffffff';\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLButtonElement).style.background = 'transparent';\n (e.currentTarget as HTMLButtonElement).style.color = 'var(--metakyc-primary, #2563eb)';\n }}\n >\n ?\n </button>\n\n {typeof document !== 'undefined' && modal ? createPortal(modal, document.body) : null}\n </div>\n );\n};\n\n// ── CreateApplicantForm ───────────────────────────────────────────────────────\n\nexport const CreateApplicantForm: React.FC<CreateApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createApplicant, isLoading: isCreatingApplicant } = useApplicant();\n const { t } = useTranslation();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n /** Values that are pre-filled and never shown in the UI. */\n const hiddenValues: Record<string, string> = config.applicantForm?.hiddenValues || {};\n\n /** Values that are pre-filled and shown as read-only when the field is visible. */\n const initialValues: Record<string, string> = config.applicantForm?.initialValues || {};\n\n /**\n * Label display mode: client config takes precedence; otherwise falls back to\n * the tenant-wide setting from the backend theme; defaults to 'label'.\n */\n const fieldLabelMode = config.applicantForm?.fieldLabelMode || currentTheme?.fieldLabelMode || 'label';\n const showLabels = fieldLabelMode !== 'placeholder';\n\n // ── Theme-derived config ───────────────────────────────────────────────────\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.applicantFormPages && currentTheme.applicantFormPages.length > 0\n ? currentTheme.applicantFormPages\n : null),\n [currentTheme?.applicantFormPages]\n );\n\n const requiredFields: ApplicantFormField[] = useMemo(() => {\n const set = new Set<ApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.applicantFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as ApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as ApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.applicantFormRequiredFields, formPages]);\n\n const flatVisibleFields: ApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as ApplicantFormField);\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n let fields: ApplicantFormField[];\n if (config.applicantForm?.visibleFields) {\n fields = config.applicantForm.visibleFields;\n } else if (currentTheme?.applicantFormVisibleFields && currentTheme.applicantFormVisibleFields.length > 0) {\n fields = currentTheme.applicantFormVisibleFields as ApplicantFormField[];\n } else {\n fields = DEFAULT_VISIBLE_FIELDS;\n }\n const set = new Set<ApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }, [config.applicantForm?.visibleFields, currentTheme?.applicantFormVisibleFields, formPages]);\n\n // ── Countries (per-type map) ───────────────────────────────────────────────\n // Each country-type field passes its own CountriesType to the API.\n // We deduplicate by type and load all needed lists in parallel.\n\n const COUNTRY_FIELD_NAMES = new Set([\n 'country', 'nationality', 'taxCountry', 'countryOfBirth',\n 'mobileCountryCode', 'otherNationality',\n ]);\n\n /** Distinct CountriesType values needed for the current form configuration */\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n\n if (types.size === 0) types.add(undefined); // fallback: load all\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n // Track which types are currently in-flight (not yet resolved). Separate from\n // loadedTypesRef so concurrent loads of *different* types are all allowed.\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return; // wait for theme before loading countries\n\n // Only queue types that are neither already loaded nor currently in-flight\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n\n if (typesToLoad.length === 0) {\n // All needed types are loaded (or in-flight) — check if we can clear the spinner\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const isPhoneType = type === 40; // CountriesType.PhoneNumber\n const seen = new Set<string>();\n const list = data\n .map(c => {\n // For phone-number lists use countryCode (+43) as the stored value\n // and show it prominently in the label so the user can search by code.\n if (isPhoneType && c.countryCode) {\n return {\n value: c.countryCode,\n label: `${c.countryCode} – ${c.name}`,\n };\n }\n return { value: c.abbreviation3 || c.abbreviation, label: c.name };\n })\n .filter(c => {\n if (!c.value || seen.has(c.value)) return false;\n seen.add(c.value);\n return true;\n });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n // Clear spinner only when *all currently needed* types are fully loaded\n const allReady = neededCountryTypes.every(t => {\n const key = t != null ? String(t) : 'all';\n return loadedTypesRef.current.has(key);\n });\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n /** Get the countries list for a given field, respecting any per-entry type override. */\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ─────────────────────────────────────────────────────────────\n const BUILT_IN_FIELD_SET: Record<string, 1> = {\n firstName: 1, lastName: 1, title: 1, email: 1, dateOfBirth: 1,\n phonenumber: 1, mobileCountryCode: 1, street: 1, streetNumber: 1,\n zip: 1, city: 1, country: 1, nationality: 1, otherNationality: 1,\n defaultLanguage: 1, taxCountry: 1, placeOfBirth: 1, countryOfBirth: 1,\n salutation: 1, educationLevel: 1, occupation: 1, taxNumber: 1,\n };\n\n // Merge hidden built-in field values into the initial formData.\n const hiddenBuiltInFields = Object.fromEntries(\n Object.entries(hiddenValues).filter(([k]) => k in BUILT_IN_FIELD_SET)\n );\n\n // Built-in fields from initialValues (shown as read-only)\n const initialBuiltInFields = Object.fromEntries(\n Object.entries(initialValues).filter(([k]) => k in BUILT_IN_FIELD_SET)\n );\n\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n firstName: '', lastName: '', title: '', email: initialEmail, dateOfBirth: '',\n phonenumber: '', externalRefId: initialExternalRefId, mobileCountryCode: '',\n street: '', streetNumber: '', zip: '', city: '', country: '', nationality: '',\n otherNationality: [], defaultLanguage: 'EN', taxCountry: '', placeOfBirth: '',\n countryOfBirth: '', salutation: null, educationLevel: '', occupation: '', taxNumber: '',\n ...hiddenBuiltInFields,\n ...initialBuiltInFields,\n });\n\n // Custom field values — keyed by paramName\n // Pre-seed with any hidden custom param values.\n const hiddenCustomFields = Object.fromEntries(\n Object.entries(hiddenValues).filter(([k]) => !(k in hiddenBuiltInFields) && k !== 'externalRefId' && k !== 'workflowKey')\n );\n const [customData, setCustomData] = useState<Record<string, string>>({ ...hiddenCustomFields });\n\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n // Sequential navigation — every page is always reachable; conditional pages\n // show a gate checkbox at the top; if unchecked their fields are hidden and\n // the user can skip with \"Skip\" or fill in after checking.\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages\n ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1)\n : -1;\n\n const prevPageIndex = formPages\n ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1)\n : -1;\n\n // ── Per-page validation ────────────────────────────────────────────────────\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n\n for (const f of page.fields) {\n if (f.isCustom) {\n // display-only types — skip validation\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') {\n errs[f.paramName] = t('validation.fieldRequired', { field: displayLabel });\n }\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = t('validation.fieldRequired', { field: displayLabel });\n }\n }\n } else if (f.name) {\n const fieldName = f.name as ApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = t('validation.fieldRequired', { field: label });\n }\n }\n }\n }\n\n return errs;\n };\n\n // ── Submit / navigate ──────────────────────────────────────────────────────\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n\n // If this page is conditional and condition not met, skip validation (user is skipping)\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n return;\n }\n\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n\n if (nextPageIndex >= 0) {\n setCurrentPageIndex(nextPageIndex);\n } else {\n await doSubmit();\n }\n };\n\n const doSubmit = async () => {\n // Final validation: only pages whose condition is met\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) {\n allErrs = { ...allErrs, ...validatePage(page) };\n }\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n\n try {\n if (!formData.externalRefId || formData.externalRefId.trim() === '') {\n setGlobalError(t('createApplicant.externalRefIdRequired'));\n return;\n }\n\n const requestData: Partial<ApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId.trim(),\n };\n\n if (formPages) {\n // Page-based mode: collect fields from condition-met pages\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom && f.name) {\n const field = f.name as ApplicantFormField;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n }\n // Always include pre-filled required fields even if not on any page\n // (e.g. email pre-filled via config.applicantForm.email)\n for (const field of SYSTEM_REQUIRED) {\n if ((requestData as any)[field] === undefined) {\n const value = formData[field as ApplicantFormField];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n }\n }\n } else {\n // Flat mode: use all visible fields\n flatVisibleFields.forEach(field => {\n if (field === 'externalRefId') return;\n const value = formData[field];\n if (!isEmpty(value)) (requestData as any)[field] = value;\n });\n }\n\n // Merge custom field values from visible pages into applicantAdditionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n // Skip display-only types\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n\n const raw = customData[f.paramName] ?? '';\n let value: string;\n\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n // Boolean checkbox → human-readable yes/no\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n // text, group_checkbox, radio_group — pass the actual value\n value = raw;\n // Skip empty optional text fields instead of sending a blank value\n if (!value && !f.required) continue;\n }\n\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n // Inject hidden built-in field values that are not already in requestData.\n for (const [field, value] of Object.entries(hiddenBuiltInFields)) {\n if ((requestData as any)[field] === undefined && !isEmpty(value)) {\n (requestData as any)[field] = value;\n }\n }\n\n // Inject hidden custom param values into additionalDatas.\n const existingParams = new Set(additionalDatas.map(d => d.paramName));\n for (const [paramName, value] of Object.entries(hiddenCustomFields)) {\n if (!existingParams.has(paramName) && value) {\n additionalDatas.push({ paramName, value });\n }\n }\n\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createApplicant(requestData as ApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating applicant:', err);\n setGlobalError(err.message || t('createApplicant.failedToCreate'));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // Flat mode submit handler\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Flat mode: validate all required fields\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = FIELD_METADATA[field]?.label || field;\n setGlobalError(t('validation.fieldRequired', { field: label }));\n return;\n }\n }\n\n await doSubmit();\n };\n\n // ── Built-in field renderer ────────────────────────────────────────────────\n const renderBuiltInField = (\n field: ApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n fieldLabelModeOverride?: 'label' | 'placeholder',\n ) => {\n const metadata = FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n const isReadOnly = field in initialBuiltInFields;\n\n const elementKey = key ?? field;\n const commonProps = { required: isRequired };\n // Per-field mode takes priority; falls back to global showLabels.\n const fieldShowLabels = fieldLabelModeOverride ? fieldLabelModeOverride !== 'placeholder' : showLabels;\n const labelProp = fieldShowLabels ? labelText : undefined;\n const placeholderSuffix = fieldShowLabels ? '...' : labelText;\n\n switch (metadata.type) {\n case 'select':\n if (\n field === 'country' ||\n field === 'nationality' ||\n field === 'taxCountry' ||\n field === 'countryOfBirth' ||\n field === 'mobileCountryCode'\n ) {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${placeholderSuffix.toLowerCase()}` }, ...countryList]}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n if (field === 'salutation') {\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field]?.toString() || ''}\n onChange={val => handleChange(field, val ? Number(val) : null)}\n options={[\n { value: '', label: fieldShowLabels ? t('placeholders.selectSalutation') : labelText },\n { value: GenderType.Male.toString(), label: t('gender.male') },\n { value: GenderType.Female.toString(), label: t('gender.female') },\n { value: GenderType.Other.toString(), label: t('gender.other') },\n ]}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n if (field === 'defaultLanguage') {\n const langOptions = currentTheme?.allowedLanguages && currentTheme.allowedLanguages.length > 0\n ? ALLOWED_LANGUAGES.filter(l => currentTheme.allowedLanguages!.includes(l.value))\n : ALLOWED_LANGUAGES;\n return (\n <SearchableSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: fieldShowLabels ? t('placeholders.selectLanguage') : labelText }, ...langOptions]}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n return null;\n\n case 'multiselect':\n if (field === 'otherNationality') {\n const nationalityList = getCountriesForField(field, countriesTypeOverride);\n return (\n <MultiSelect\n key={elementKey}\n {...commonProps}\n label={labelProp}\n value={formData[field] || []}\n onChange={values => handleChange(field, values)}\n options={nationalityList}\n placeholder={fieldShowLabels ? t('placeholders.selectOtherNationalities') : labelText}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n />\n );\n }\n return null;\n\n case 'date':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"date\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n case 'email':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"email\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n case 'tel':\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"tel\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n\n default:\n return (\n <Input\n key={elementKey}\n {...commonProps}\n type=\"text\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer ──────────────────────────────────────────────────\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n // Per-field labelMode takes priority over global showLabels.\n const fieldShowLabels = f.labelMode ? f.labelMode !== 'placeholder' : showLabels;\n\n // ── Paragraph (display-only text block) ──────────────────────────────────\n if (f.customType === 'paragraph') {\n const text = f.displayText || f.label || '';\n return (\n <p\n key={`custom-${idx}`}\n className=\"metakyc-paragraph\"\n style={{\n fontSize: '14px',\n lineHeight: '1.7',\n margin: 0,\n color: 'var(--metakyc-text-secondary, #6b7280)',\n }}\n dangerouslySetInnerHTML={{ __html: text }}\n />\n );\n }\n\n // ── Raw HTML block (no additional wrapper styling) ────────────────────────\n if (f.customType === 'html') {\n return (\n <div\n key={`custom-${idx}`}\n dangerouslySetInnerHTML={{ __html: f.label || '' }}\n />\n );\n }\n\n // ── Line break / spacer ──────────────────────────────────────────────────\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n\n // ── Standalone hyperlink (display-only) ──────────────────────────────────\n if (f.customType === 'link') {\n const linkLabel = f.displayText || f.label || f.linkText || f.linkUrl || '';\n return (\n <div key={`custom-${idx}`} className=\"metakyc-link-field\">\n <a\n href={f.linkUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: 'var(--metakyc-primary, #2563eb)',\n fontSize: '14px',\n textDecoration: 'underline',\n cursor: 'pointer',\n }}\n >\n {linkLabel}\n <span style={{ fontSize: '10px', opacity: 0.7 }}>↗</span>\n </a>\n </div>\n );\n }\n\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n\n // Single checkbox\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Link + checkbox\n if (f.customType === 'link_checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {displayLabel}{' '}\n {f.linkUrl && (\n <a\n href={f.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline\"\n style={{ color: 'var(--metakyc-primary, #2563eb)' }}\n onClick={e => e.stopPropagation()}\n >\n {f.linkText || f.linkUrl}\n </a>\n )}\n {f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n // Checkbox group (multi-select OR single-select when f.singleSelect is true)\n if (f.customType === 'group_checkbox') {\n const selectedValues = (customData[f.paramName] || '').split(',').filter(Boolean);\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n {fieldShowLabels && (\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n )}\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => {\n const isChecked = f.singleSelect\n ? customData[f.paramName!] === opt.value\n : selectedValues.includes(opt.value);\n\n return (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={isChecked}\n onChange={v => {\n if (f.singleSelect) {\n handleCustomChange(f.paramName!, v ? opt.value : '');\n } else {\n const next = v\n ? [...selectedValues, opt.value]\n : selectedValues.filter(v2 => v2 !== opt.value);\n handleCustomChange(f.paramName!, next.join(','));\n }\n }}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n );\n })}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Radio group (single-select)\n if (f.customType === 'radio_group') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1.5\">\n {fieldShowLabels && (\n <div\n className=\"text-sm font-medium\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </div>\n )}\n <div className=\"metakyc-options-group\" style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {(f.options || []).map(opt => (\n <label\n key={opt.value}\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <input\n type=\"radio\"\n checked={customData[f.paramName!] === opt.value}\n onChange={() => handleCustomChange(f.paramName!, opt.value)}\n name={`radio-group-${f.paramName}-${idx}`}\n className=\"metakyc-option-input\"\n style={OPTION_INPUT_STYLE}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4' }}\n >\n {opt.label}\n </span>\n </label>\n ))}\n </div>\n {err && <p className=\"text-red-500 text-xs\">{err}</p>}\n </div>\n );\n }\n\n // Default: text input\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={fieldShowLabels ? `${displayLabel}${f.required ? ' *' : ''}` : undefined}\n placeholder={fieldShowLabels ? undefined : displayLabel}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Render a page's fields in a 2-col grid ────────────────────────────────\n // For conditional pages: shows the gate checkbox at the TOP of the page.\n // Fields are only revealed once the checkbox is checked.\n const renderPageFields = (page: FormPage, _pageIndex: number) => {\n const conditionMet = isConditionMet(page);\n\n return (\n <div className=\"space-y-4\">\n {/* Gate checkbox — shown at top when this page has a condition */}\n {page.conditionalOn && (\n <FieldHelpWrapper helpText={page.conditionalHelpText}>\n <label\n className=\"metakyc-option-label\"\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', margin: 0, padding: 0 }}\n >\n <Checkbox\n checked={conditionMet}\n onChange={v => handleCustomChange(page.conditionalOn!, v ? 'true' : 'false')}\n />\n <span\n className=\"metakyc-option-text\"\n style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)', lineHeight: '1.4', fontWeight: 500 }}\n >\n {page.conditionalOn}\n </span>\n </label>\n </FieldHelpWrapper>\n )}\n\n {/* Fields — only shown when condition is met (or page has no condition) */}\n {conditionMet && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {page.fields.map((f, idx) => {\n const span = Math.min(4, Math.max(1, Number(f.colSpan) || 4));\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} style={{ gridColumn: `span ${span} / span ${span}` }}>\n <FieldHelpWrapper helpText={f.helpText}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as ApplicantFormField, key, f.displayText, f.countriesType, f.labelMode)}\n </FieldHelpWrapper>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ────────────────────────────────────────────────────────────────\n // Wait for theme and countries before deciding which mode to render.\n // Without this guard the flat form could flash briefly while the paged\n // configuration is still arriving from the backend.\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n {t('common.loadingForm')}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ────────────────────────────────────────────────────────\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n {/* SDK main title from theme config */}\n <CardHeader>\n <Header title={currentTheme?.title || t('createApplicant.title')} />\n </CardHeader>\n\n <CardContent>\n {/* Per-page title / subtitle — compact, inside content area */}\n {(page.title || page.subtitle || page.description) && (\n <div className=\"mb-4\">\n {page.title && (\n <h3\n className=\"font-semibold text-base\"\n style={{ color: 'var(--metakyc-text-primary, #111827)' }}\n >\n {page.title}\n </h3>\n )}\n {page.subtitle && (\n <p\n className=\"text-sm mt-0.5\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.subtitle}\n </p>\n )}\n {page.description && page.description !== page.subtitle && (\n <p\n className=\"text-xs mt-1\"\n style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}\n >\n {page.description}\n </p>\n )}\n </div>\n )}\n\n {/* Page progress indicator (dot/segment style) */}\n {totalPages > 1 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '1rem' }}>\n {formPages.map((_, idx) => (\n <div\n key={idx}\n style={{\n height: '0.375rem',\n borderRadius: '9999px',\n transition: 'all 150ms',\n ...(idx === currentPageIndex\n ? { flex: '1 1 0%', backgroundColor: 'var(--metakyc-primary, #2563eb)',opacity: 0.3 }\n : idx < currentPageIndex\n ? { width: '2rem', backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { width: '2rem', backgroundColor: '#e5e7eb', opacity: 0.3 }),\n }}\n />\n ))}\n <span style={{ fontSize: '0.75rem', color: 'var(--metakyc-text-muted, #9ca3af)', flexShrink: 0 }}>\n {currentPageIndex + 1} / {totalPages}\n </span>\n </div>\n )}\n\n {/* Error summary */}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>{t('common.errorPrefix')}</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => (\n <p key={i} className=\"text-red-600 text-sm\">{msg}</p>\n ))}\n </div>\n )}\n\n {renderPageFields(page, currentPageIndex)}\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n {!isFirst && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}\n >\n {t('common.previous')}\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button\n type=\"button\"\n isLoading={isSubmitting || isCreatingApplicant}\n onClick={isLast ? doSubmit : handleNext}\n >\n {isLast\n ? (page.conditionalOn && !condMet ? t('common.skipAndSubmit') : t('common.submit'))\n : (page.conditionalOn && !condMet ? t('common.skip') : t('common.next'))}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ────────────────────────────────────────────────────\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || t('createApplicant.title')} />\n </CardHeader>\n\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>{t('common.errorPrefix')}</strong> {globalError}</p>\n </div>\n )}\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {flatVisibleFields.map(field => (\n <div key={field} style={{ gridColumn: 'span 4 / span 4' }}>\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n {t('createApplicant.createApplicant')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useMetaKYC } from '../context';\nimport { useApplicant } from '../hooks';\nimport { Card, CardHeader, CardContent, CardFooter, Button, Input, Spinner, SearchableSelect } from './core';\nimport { Checkbox } from './core/Checkbox';\nimport { CompanyApplicantRegistrationRequestInput } from '../types';\nimport type { CompanyApplicantFormField } from '../client/config';\nimport {\n COMPANY_FIELD_METADATA, DEFAULT_COMPANY_VISIBLE_FIELDS,\n FormPage, FormFieldEntry,\n} from '../types/form-config';\nimport { Header } from './Header';\nimport { useTranslation } from '../i18n/TranslationContext';\n\nexport interface CreateCompanyApplicantFormProps {\n workflowKey?: string;\n externalRefId?: string;\n onSuccess: (applicantId: number) => void;\n onCancel?: () => void;\n}\n\nconst SYSTEM_REQUIRED: CompanyApplicantFormField[] = ['companyName', 'email'];\n\nfunction isEmpty(val: unknown): boolean {\n return val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0);\n}\n\nexport const CreateCompanyApplicantForm: React.FC<CreateCompanyApplicantFormProps> = ({\n workflowKey: workflowKeyProp,\n externalRefId: externalRefIdProp,\n onSuccess,\n onCancel,\n}) => {\n const { config, baseInformationService, currentTheme } = useMetaKYC();\n const { createCompanyApplicant, isLoading: isCreatingApplicant } = useApplicant();\n const { t } = useTranslation();\n\n const workflowKey = workflowKeyProp || config.applicantForm?.workflowKey;\n if (!workflowKey) {\n throw new Error(\n 'workflowKey is required. Provide it either as a prop to CreateCompanyApplicantForm or set it in config.applicantForm.workflowKey'\n );\n }\n\n const initialExternalRefId = externalRefIdProp || config.applicantForm?.externalRefId || '';\n const initialEmail = config.applicantForm?.email || '';\n\n /** Values that are pre-filled and shown as read-only when the field is visible. */\n const initialValues: Record<string, string> = config.applicantForm?.initialValues || {};\n\n const fieldLabelMode = config.applicantForm?.fieldLabelMode || currentTheme?.fieldLabelMode || 'label';\n const showLabels = fieldLabelMode !== 'placeholder';\n\n // ── Theme-derived config ──\n const formPages: FormPage[] | null = useMemo(\n () => (currentTheme?.companyFormPages && currentTheme.companyFormPages.length > 0\n ? currentTheme.companyFormPages\n : null),\n [currentTheme?.companyFormPages]\n );\n\n const requiredFields: CompanyApplicantFormField[] = useMemo(() => {\n const set = new Set<CompanyApplicantFormField>(SYSTEM_REQUIRED);\n const clientReq = currentTheme?.companyFormRequiredFields;\n if (clientReq) for (const f of clientReq) set.add(f as CompanyApplicantFormField);\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && f.required) set.add(f.name as CompanyApplicantFormField);\n }\n }\n }\n return Array.from(set);\n }, [currentTheme?.companyFormRequiredFields, formPages]);\n\n const flatVisibleFields: CompanyApplicantFormField[] = useMemo(() => {\n if (formPages) {\n const fields = formPages\n .flatMap(p => p.fields)\n .filter(f => !f.isCustom && f.name)\n .map(f => f.name as CompanyApplicantFormField);\n const set = new Set<CompanyApplicantFormField>(fields);\n for (const r of SYSTEM_REQUIRED) set.add(r);\n return Array.from(set);\n }\n if (config.applicantForm?.visibleFields) {\n return config.applicantForm.visibleFields as unknown as CompanyApplicantFormField[];\n }\n if (currentTheme?.companyFormVisibleFields && currentTheme.companyFormVisibleFields.length > 0) {\n return currentTheme.companyFormVisibleFields as CompanyApplicantFormField[];\n }\n return DEFAULT_COMPANY_VISIBLE_FIELDS;\n }, [config.applicantForm?.visibleFields, currentTheme?.companyFormVisibleFields, formPages]);\n\n // ── Countries ──\n const COUNTRY_FIELD_NAMES = new Set(['countryResidence', 'addressCountry']);\n\n const neededCountryTypes = useMemo((): Array<number | undefined> => {\n const types = new Set<number | undefined>();\n if (formPages) {\n for (const page of formPages) {\n for (const f of page.fields) {\n if (!f.isCustom && f.name && COUNTRY_FIELD_NAMES.has(f.name)) {\n types.add(f.countriesType ?? COMPANY_FIELD_METADATA[f.name]?.countriesType);\n }\n }\n }\n } else {\n for (const field of flatVisibleFields) {\n if (COUNTRY_FIELD_NAMES.has(field)) {\n types.add(COMPANY_FIELD_METADATA[field]?.countriesType);\n }\n }\n }\n if (types.size === 0) types.add(undefined);\n return Array.from(types);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [flatVisibleFields, formPages]);\n\n const [countriesMap, setCountriesMap] = useState<Record<string, Array<{ value: string; label: string }>>>({});\n const [isLoadingCountries, setIsLoadingCountries] = useState(true);\n const loadingTypesRef = useRef(new Set<string>());\n const loadedTypesRef = useRef(new Set<string>());\n\n useEffect(() => {\n if (!currentTheme) return;\n const typesToLoad = neededCountryTypes.filter(t => {\n const key = t != null ? String(t) : 'all';\n return !loadedTypesRef.current.has(key) && !loadingTypesRef.current.has(key);\n });\n if (typesToLoad.length === 0) {\n const allReady = neededCountryTypes.every(t => loadedTypesRef.current.has(t != null ? String(t) : 'all'));\n if (allReady) setIsLoadingCountries(false);\n return;\n }\n setIsLoadingCountries(true);\n const keys = typesToLoad.map(t => (t != null ? String(t) : 'all'));\n keys.forEach(k => loadingTypesRef.current.add(k));\n const load = async () => {\n try {\n const entries = await Promise.all(\n typesToLoad.map(async (type) => {\n const key = type != null ? String(type) : 'all';\n const data = await baseInformationService.getCountries('', config.locale || 'en', type);\n const seen = new Set<string>();\n const list = data\n .map(c => ({ value: c.abbreviation3 || c.abbreviation, label: c.name }))\n .filter(c => { if (!c.value || seen.has(c.value)) return false; seen.add(c.value); return true; });\n loadedTypesRef.current.add(key);\n loadingTypesRef.current.delete(key);\n return [key, list] as const;\n })\n );\n setCountriesMap(prev => ({ ...prev, ...Object.fromEntries(entries) }));\n } catch (err) {\n keys.forEach(k => loadingTypesRef.current.delete(k));\n console.error('Failed to load countries:', err);\n } finally {\n const allReady = neededCountryTypes.every(t => loadedTypesRef.current.has(t != null ? String(t) : 'all'));\n if (allReady) setIsLoadingCountries(false);\n }\n };\n load();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [neededCountryTypes, currentTheme]);\n\n const getCountriesForField = (field: string, override?: number): Array<{ value: string; label: string }> => {\n const type = override ?? COMPANY_FIELD_METADATA[field]?.countriesType;\n const key = type != null ? String(type) : 'all';\n return countriesMap[key] || [];\n };\n\n // ── Form state ──\n const COMPANY_BUILT_IN_FIELD_SET: Record<string, 1> = {\n companyName: 1, registrationNumber: 1, email: 1, phone: 1,\n countryResidence: 1, legalAddress: 1, incorporatedOn: 1,\n controlScheme: 1, taxId: 1, registrationLocation: 1, website: 1,\n postalAddress: 1, street: 1, streetNumber: 1, city: 1, state: 1,\n postalCode: 1, addressCountry: 1, lei: 1,\n };\n\n const initialBuiltInFields = Object.fromEntries(\n Object.entries(initialValues).filter(([k]) => k in COMPANY_BUILT_IN_FIELD_SET)\n );\n\n const [formData, setFormData] = useState<Record<string, any>>({\n workflowKey,\n companyName: '', email: initialEmail, phone: '',\n registrationNumber: '', countryResidence: '',\n legalAddress: '', incorporatedOn: '', controlScheme: '',\n taxId: '', registrationLocation: '', website: '',\n postalAddress: '', street: '', streetNumber: '',\n city: '', state: '', postalCode: '', addressCountry: '',\n lei: '', externalRefId: initialExternalRefId,\n ...initialBuiltInFields,\n });\n const [customData, setCustomData] = useState<Record<string, string>>({});\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\n const [pageErrors, setPageErrors] = useState<Record<string, string>>({});\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleChange = (field: string, value: any) =>\n setFormData(prev => ({ ...prev, [field]: value }));\n const handleCustomChange = (paramName: string, value: string) =>\n setCustomData(prev => ({ ...prev, [paramName]: value }));\n\n const isConditionMet = (page: FormPage): boolean =>\n !page.conditionalOn || customData[page.conditionalOn] === 'true';\n\n const nextPageIndex = formPages ? (currentPageIndex < formPages.length - 1 ? currentPageIndex + 1 : -1) : -1;\n const prevPageIndex = formPages ? (currentPageIndex > 0 ? currentPageIndex - 1 : -1) : -1;\n\n // ── Per-page validation ──\n const validatePage = (page: FormPage): Record<string, string> => {\n const errs: Record<string, string> = {};\n for (const f of page.fields) {\n if (f.isCustom) {\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n if (f.required && f.paramName) {\n const val = customData[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n if (val !== 'true') errs[f.paramName] = t('validation.fieldRequired', { field: displayLabel });\n } else if (!val || val.trim() === '') {\n errs[f.paramName] = t('validation.fieldRequired', { field: displayLabel });\n }\n }\n } else if (f.name) {\n const fieldName = f.name as CompanyApplicantFormField;\n if (requiredFields.includes(fieldName)) {\n if (isEmpty(formData[fieldName])) {\n const label = f.displayText || COMPANY_FIELD_METADATA[fieldName]?.label || fieldName;\n errs[fieldName] = t('validation.fieldRequired', { field: label });\n }\n }\n }\n }\n return errs;\n };\n\n // ── Submit / navigate ──\n const handleNext = async () => {\n if (!formPages) return;\n const page = formPages[currentPageIndex];\n if (page.conditionalOn && !isConditionMet(page)) {\n setPageErrors({});\n if (nextPageIndex >= 0) setCurrentPageIndex(nextPageIndex);\n else await doSubmit();\n return;\n }\n const errs = validatePage(page);\n if (Object.keys(errs).length > 0) { setPageErrors(errs); return; }\n setPageErrors({});\n if (nextPageIndex >= 0) setCurrentPageIndex(nextPageIndex);\n else await doSubmit();\n };\n\n const doSubmit = async () => {\n if (formPages) {\n let allErrs: Record<string, string> = {};\n for (const page of formPages) {\n if (isConditionMet(page)) allErrs = { ...allErrs, ...validatePage(page) };\n }\n if (Object.keys(allErrs).length > 0) { setPageErrors(allErrs); return; }\n }\n\n setIsSubmitting(true);\n setGlobalError(null);\n try {\n const requestData: Partial<CompanyApplicantRegistrationRequestInput> = {\n workflowKey: formData.workflowKey,\n externalRefId: formData.externalRefId?.trim() || undefined,\n };\n\n const fieldsToCollect = formPages\n ? formPages.filter(p => isConditionMet(p)).flatMap(p => p.fields).filter(f => !f.isCustom && f.name).map(f => f.name!)\n : flatVisibleFields as string[];\n\n for (const field of fieldsToCollect) {\n const value = formData[field];\n if (!isEmpty(value)) {\n // Map SDK field names to the backend DTO property names\n switch (field) {\n case 'companyName': (requestData as any).companyName = value; break;\n case 'email': (requestData as any).companyEmail = value; break;\n case 'phone': (requestData as any).companyPhone = value; break;\n case 'registrationNumber': (requestData as any).companyRegistrationNumber = value; break;\n case 'countryResidence': (requestData as any).companyCountry = value; break;\n case 'city': (requestData as any).companyCity = value; break;\n case 'street': (requestData as any).companyStreet = value; break;\n case 'postalCode': (requestData as any).companyZip = value; break;\n default: (requestData as any)[field] = value; break;\n }\n }\n }\n\n // Custom fields → additionalDatas\n const additionalDatas: Array<{ paramName: string; value: string }> = [];\n if (formPages) {\n for (const page of formPages) {\n if (!isConditionMet(page)) continue;\n for (const f of page.fields) {\n if (!f.isCustom || !f.paramName) continue;\n if (f.customType === 'paragraph' || f.customType === 'html' || f.customType === 'br' || f.customType === 'link') continue;\n const raw = customData[f.paramName] ?? '';\n let value: string;\n if (f.customType === 'checkbox' || f.customType === 'link_checkbox') {\n value = raw === 'true' ? 'yes' : 'no';\n } else {\n value = raw;\n if (!value && !f.required) continue;\n }\n additionalDatas.push({ paramName: f.paramName, value });\n }\n }\n }\n if (additionalDatas.length > 0) {\n (requestData as any).applicantAdditionalDatas = additionalDatas;\n }\n\n const result = await createCompanyApplicant(requestData as CompanyApplicantRegistrationRequestInput);\n onSuccess(result.applicantId);\n } catch (err: any) {\n console.error('Error creating company applicant:', err);\n setGlobalError(err.message || t('createCompany.failedToCreate'));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleFlatSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n for (const field of requiredFields) {\n if (isEmpty(formData[field])) {\n const label = COMPANY_FIELD_METADATA[field]?.label || field;\n setGlobalError(t('validation.fieldRequired', { field: label }));\n return;\n }\n }\n await doSubmit();\n };\n\n // ── Built-in field renderer ──\n const renderBuiltInField = (\n field: CompanyApplicantFormField,\n key?: string,\n displayText?: string,\n countriesTypeOverride?: number,\n fieldLabelModeOverride?: 'label' | 'placeholder',\n ) => {\n const metadata = COMPANY_FIELD_METADATA[field];\n if (!metadata) return null;\n const isRequired = requiredFields.includes(field);\n const fieldError = pageErrors[field];\n const labelText = displayText || metadata.label;\n const isReadOnly = field in initialBuiltInFields;\n const elementKey = key ?? field;\n const fieldShowLabels = fieldLabelModeOverride ? fieldLabelModeOverride !== 'placeholder' : showLabels;\n const labelProp = fieldShowLabels ? labelText : undefined;\n const placeholderSuffix = fieldShowLabels ? '...' : labelText;\n\n switch (metadata.type) {\n case 'select':\n if (field === 'countryResidence' || field === 'addressCountry') {\n const countryList = getCountriesForField(field, countriesTypeOverride);\n return (\n <SearchableSelect\n key={elementKey}\n required={isRequired}\n label={labelProp}\n value={formData[field] || ''}\n onChange={val => handleChange(field, val)}\n options={[{ value: '', label: `Select ${placeholderSuffix.toLowerCase()}` }, ...countryList]}\n disabled={isLoadingCountries}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n return null;\n case 'date':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"date\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n case 'email':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"email\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n case 'tel':\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"tel\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n default:\n return (\n <Input\n key={elementKey}\n required={isRequired}\n type=\"text\"\n label={labelProp}\n placeholder={fieldShowLabels ? undefined : labelText}\n value={formData[field] || ''}\n onChange={e => handleChange(field, e.target.value)}\n readOnly={isReadOnly}\n error={fieldError}\n />\n );\n }\n };\n\n // ── Custom field renderer (simplified — same structure as individual) ──\n const renderCustomField = (f: FormFieldEntry, idx: number) => {\n if (f.customType === 'paragraph') {\n return (\n <p key={`custom-${idx}`} style={{ fontSize: '14px', lineHeight: '1.7', margin: 0, color: 'var(--metakyc-text-secondary, #6b7280)' }}\n dangerouslySetInnerHTML={{ __html: f.displayText || f.label || '' }} />\n );\n }\n if (f.customType === 'html') {\n return <div key={`custom-${idx}`} dangerouslySetInnerHTML={{ __html: f.label || '' }} />;\n }\n if (f.customType === 'br') {\n return <div key={`custom-${idx}`} style={{ height: '12px' }} />;\n }\n if (f.customType === 'link') {\n return (\n <div key={`custom-${idx}`}>\n <a href={f.linkUrl || '#'} target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ color: 'var(--metakyc-primary, #2563eb)', fontSize: '14px', textDecoration: 'underline' }}>\n {f.displayText || f.label || f.linkText || f.linkUrl || ''}\n </a>\n </div>\n );\n }\n if (!f.paramName) return null;\n const err = pageErrors[f.paramName];\n const displayLabel = f.displayText || f.label || f.paramName;\n const fieldShowLabels = f.labelMode ? f.labelMode !== 'placeholder' : showLabels;\n\n if (f.customType === 'checkbox') {\n return (\n <div key={`custom-${idx}`} className=\"flex flex-col gap-1\">\n <label style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer' }}>\n <Checkbox checked={customData[f.paramName] === 'true'}\n onChange={v => handleCustomChange(f.paramName!, v ? 'true' : 'false')} />\n <span style={{ fontSize: '14px', color: 'var(--metakyc-text-primary, #111827)' }}>\n {displayLabel}{f.required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </span>\n </label>\n {err && <p className=\"text-red-500 text-xs mt-0.5\">{err}</p>}\n </div>\n );\n }\n\n return (\n <Input\n key={`custom-${idx}`}\n type=\"text\"\n label={fieldShowLabels ? `${displayLabel}${f.required ? ' *' : ''}` : undefined}\n placeholder={fieldShowLabels ? undefined : displayLabel}\n value={customData[f.paramName] || ''}\n onChange={e => handleCustomChange(f.paramName!, e.target.value)}\n required={f.required}\n error={err}\n />\n );\n };\n\n // ── Page field rendering ──\n const renderPageFields = (page: FormPage) => {\n const conditionMet = isConditionMet(page);\n return (\n <div className=\"space-y-4\">\n {page.conditionalOn && (\n <label style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer' }}>\n <Checkbox checked={conditionMet}\n onChange={v => handleCustomChange(page.conditionalOn!, v ? 'true' : 'false')} />\n <span style={{ fontSize: '14px', fontWeight: 500 }}>{page.conditionalOn}</span>\n </label>\n )}\n {conditionMet && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {page.fields.map((f, idx) => {\n const span = Math.min(4, Math.max(1, Number(f.colSpan) || 4));\n const key = f.isCustom ? `custom-${idx}-${f.paramName}` : `builtin-${f.name}-${idx}`;\n return (\n <div key={key} style={{ gridColumn: `span ${span} / span ${span}` }}>\n {f.isCustom\n ? renderCustomField(f, idx)\n : renderBuiltInField(f.name as CompanyApplicantFormField, key, f.displayText, f.countriesType, f.labelMode)}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n // ── Loading ──\n if (!currentTheme || isLoadingCountries) {\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)', fontSize: '0.875rem' }}>\n {t('common.loadingForm')}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // ── PAGE-BASED MODE ──\n if (formPages) {\n const page = formPages[currentPageIndex] ?? formPages[0];\n const isFirst = prevPageIndex === -1;\n const isLast = nextPageIndex === -1;\n const totalPages = formPages.length;\n const condMet = isConditionMet(page);\n const errorMessages = Object.values(pageErrors);\n\n return (\n <div className=\"metakyc-sdk\">\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || t('createCompany.title')} />\n </CardHeader>\n <CardContent>\n {(page.title || page.subtitle) && (\n <div className=\"mb-4\">\n {page.title && <h3 className=\"font-semibold text-base\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{page.title}</h3>}\n {page.subtitle && <p className=\"text-sm mt-0.5\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{page.subtitle}</p>}\n </div>\n )}\n {(globalError || errorMessages.length > 0) && (\n <div className=\"mb-4 p-3 bg-red-50 border border-red-200 rounded-lg\">\n {globalError && <p className=\"text-red-600 text-sm\"><strong>{t('common.errorPrefix')}</strong> {globalError}</p>}\n {errorMessages.map((msg, i) => <p key={i} className=\"text-red-600 text-sm\">{msg}</p>)}\n </div>\n )}\n {totalPages > 1 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '1rem' }}>\n {formPages.map((_, idx) => (\n <div key={idx}\n style={{\n height: '0.375rem',\n borderRadius: '9999px',\n transition: 'all 150ms',\n ...(idx === currentPageIndex\n ? { flex: '1 1 0%', backgroundColor: 'var(--metakyc-primary, #2563eb)', opacity: 0.3 }\n : idx < currentPageIndex\n ? { width: '2rem', backgroundColor: 'var(--metakyc-primary-light, #93c5fd)', opacity: 0.7 }\n : { width: '2rem', backgroundColor: '#e5e7eb', opacity: 0.3 }),\n }}\n />\n ))}\n <span style={{ fontSize: '0.75rem', color: 'var(--metakyc-text-muted, #9ca3af)', flexShrink: 0 }}>{currentPageIndex + 1} / {totalPages}</span>\n </div>\n )}\n {renderPageFields(page)}\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <div>\n {!isFirst && (\n <Button type=\"button\" variant=\"outline\"\n onClick={() => { setCurrentPageIndex(prevPageIndex); setPageErrors({}); }}\n disabled={isSubmitting || isCreatingApplicant}>\n {t('common.previous')}\n </Button>\n )}\n {isFirst && onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n </div>\n <Button type=\"button\" isLoading={isSubmitting || isCreatingApplicant} onClick={isLast ? doSubmit : handleNext}>\n {isLast ? (page.conditionalOn && !condMet ? t('common.skipAndSubmit') : t('common.submit')) : (page.conditionalOn && !condMet ? t('common.skip') : t('common.next'))}\n </Button>\n </CardFooter>\n </Card>\n </div>\n );\n }\n\n // ── FLAT (CLASSIC) MODE ──\n return (\n <div className=\"metakyc-sdk\">\n <form onSubmit={handleFlatSubmit}>\n <Card>\n <CardHeader>\n <Header title={currentTheme?.title || t('createCompany.title')} />\n </CardHeader>\n <CardContent>\n {globalError && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-600 text-sm\"><strong>{t('common.errorPrefix')}</strong> {globalError}</p>\n </div>\n )}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: '1rem' }}>\n {flatVisibleFields.map(field => (\n <div key={field} style={{ gridColumn: 'span 4 / span 4' }}>\n {renderBuiltInField(field)}\n </div>\n ))}\n </div>\n </CardContent>\n <CardFooter style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {onCancel && (\n <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isCreatingApplicant}>\n Cancel\n </Button>\n )}\n <Button type=\"submit\" isLoading={isSubmitting || isCreatingApplicant}>\n {t('createCompany.registerCompany')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n </div>\n );\n};\n","import React from 'react';\nimport { useKycWorkflow } from '../hooks';\nimport { WorkflowStepAction, WorkflowResultType, ApplicantProgressStatus } from '../types';\nimport { QuestionnaireStep, UploadDocumentStep, OverviewStep, RiskScoringStep, InvestorCategorizationStep, AppropriatenessTestStep } from './steps';\nimport { IdentityVerificationStep } from './identity';\nimport { KycStatusDisplay } from './status';\nimport { Card, CardContent, Spinner, Badge } from './core';\nimport { Header } from './Header';\nimport { useTranslation } from '../i18n/TranslationContext';\n\nexport interface KycWorkflowProps {\n applicantId: number;\n onComplete?: (result: WorkflowResultType) => void;\n onError?: (error: Error) => void;\n className?: string;\n}\n\n/**\n * Main KYC workflow component\n * Automatically renders the current step and handles progression\n */\nexport const KycWorkflow: React.FC<KycWorkflowProps> = ({\n applicantId,\n onComplete,\n onError,\n className,\n}) => {\n const { t } = useTranslation();\n const { \n progress, \n currentStep, \n steps, \n workflowKey,\n nextWorkflowKey,\n hasWorkflowChanged,\n isLoading, \n error, \n moveBack, \n refreshProgress \n } = useKycWorkflow(applicantId);\n \n const [workflowChangeAcknowledged, setWorkflowChangeAcknowledged] = React.useState(false);\n const stepperScrollRef = React.useRef<HTMLDivElement>(null);\n\n // Handle errors\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Handle completion\n React.useEffect(() => {\n if (progress?.workflowResult && onComplete) {\n onComplete(progress.workflowResult);\n }\n }, [progress?.workflowResult, onComplete]);\n\n // Reset workflow change acknowledgment when workflow actually changes\n React.useEffect(() => {\n if (hasWorkflowChanged) {\n setWorkflowChangeAcknowledged(false);\n }\n }, [hasWorkflowChanged]);\n\n if (isLoading || !progress) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{t('workflow.loadingWorkflow')}</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <p className=\"text-lg mb-4\" style={{ color: 'var(--metakyc-danger, #ef4444)' }}>{t('workflow.errorOccurred')}</p>\n <p style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>{error.message}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show workflow change notification if workflow has changed and not acknowledged\n if (hasWorkflowChanged && !workflowChangeAcknowledged) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <div className=\"text-center py-8\">\n <div className=\"mb-6\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full mb-4\" style={{ backgroundColor: 'var(--metakyc-primary-light, #dbeafe)' }}>\n <svg className=\"w-8 h-8\" style={{ color: 'var(--metakyc-primary, #2563eb)' }} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n </div>\n \n <h3 className=\"text-xl font-semibold mb-2\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>\n {t('workflow.workflowTransition')}\n </h3>\n \n <p className=\"mb-6\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {t('workflow.workflowUpdatedMessage')}\n </p>\n \n <div className=\"rounded-lg p-4 mb-6 max-w-md mx-auto\" style={{ backgroundColor: 'var(--metakyc-surface, #f9fafb)' }}>\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-left\">\n <p className=\"mb-1\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('workflow.previousWorkflow')}</p>\n <p className=\"font-medium\" style={{ color: 'var(--metakyc-text-primary, #111827)' }}>{workflowKey}</p>\n </div>\n <svg className=\"w-6 h-6 mx-4\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n <div className=\"text-right\">\n <p className=\"mb-1\" style={{ color: 'var(--metakyc-text-muted, #9ca3af)' }}>{t('workflow.newWorkflow')}</p>\n <p className=\"font-medium\" style={{ color: 'var(--metakyc-primary, #2563eb)' }}>{nextWorkflowKey}</p>\n </div>\n </div>\n {progress.nextWorkflowName && (\n <p className=\"text-center mt-2 text-xs\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {progress.nextWorkflowName}\n </p>\n )}\n </div>\n \n <button\n onClick={() => setWorkflowChangeAcknowledged(true)}\n className=\"px-6 py-3 font-medium rounded-lg transition-opacity hover:opacity-90\"\n style={{ backgroundColor: 'var(--metakyc-primary, #2563eb)', color: '#ffffff' }}\n >\n {t('workflow.continueNewWorkflow')}\n </button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Show status display ONLY for finished or on hold states\n // IdentityPending should show the identity verification step\n // InProgress should show the workflow steps\n if (\n progress.status === ApplicantProgressStatus.Finished ||\n progress.status === ApplicantProgressStatus.OnHold\n ) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n onContinue={\n onComplete && progress.workflowResult\n ? () => onComplete(progress.workflowResult!)\n : undefined\n }\n onContactSupport={() => {\n // Could be configured via props\n if (typeof window !== 'undefined') {\n window.location.href = 'mailto:support@example.com';\n }\n }}\n />\n </div>\n );\n }\n\n // For InProgress and IdentityPending status, show the workflow steps\n if (!currentStep) {\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n <Card>\n <CardContent>\n <Spinner className=\"my-8\" />\n <p className=\"text-center mt-4\" style={{ color: 'var(--metakyc-text-secondary, #6b7280)' }}>\n {progress.status === ApplicantProgressStatus.IdentityPending\n ? t('workflow.loadingIdentityVerification')\n : t('workflow.loadingCurrentStep')}\n </p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Get a human-readable fallback name based on step action type\n const getStepFallbackName = (action: WorkflowStepAction): string => {\n switch (action) {\n case WorkflowStepAction.Overview: return t('stepNames.overview');\n case WorkflowStepAction.Questionaries: return t('stepNames.questionnaire');\n case WorkflowStepAction.UploadDocument: return t('stepNames.documents');\n case WorkflowStepAction.IdentitySdk: return t('stepNames.identity');\n case WorkflowStepAction.RiskScoring: return t('stepNames.riskAssessment');\n case WorkflowStepAction.InvestorCategorization: return t('stepNames.investorCategorization');\n case WorkflowStepAction.AppropriatenessTest: return t('stepNames.appropriatenessTest');\n case WorkflowStepAction.AdditionalData: return t('stepNames.additionalData');\n case WorkflowStepAction.ManualReview: return t('stepNames.review');\n default: return '';\n }\n };\n\n // Render workflow progress\n const renderProgress = () => {\n const visibleSteps = steps.filter(step => step.visibility !== false);\n const currentVisibleStepIndex = visibleSteps.findIndex(s => s.order === currentStep.order);\n const currentStepNumber = currentVisibleStepIndex >= 0 ? currentVisibleStepIndex + 1 : 1;\n const totalVisibleSteps = visibleSteps.length;\n // Inclusive progress: step 1 of 3 → 33%, step 2 of 3 → 67%, step 3 of 3 → 100%\n const progressPercent = totalVisibleSteps > 1\n ? ((currentVisibleStepIndex + 1) / totalVisibleSteps) * 100\n : 100;\n\n return (\n <div style={{\n marginBottom: '24px',\n backgroundColor: 'var(--metakyc-surface, var(--metakyc-background, #ffffff))',\n borderRadius: '0.75rem',\n border: '1px solid var(--metakyc-border, #e5e7eb)',\n padding: '1rem 1.5rem',\n overflow: 'hidden',\n }}>\n {/* Header row */}\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', marginBottom: '16px' }}>\n <Header />\n <Badge variant={progress.status === 1 ? 'info' : 'success'}>\n {t('common.stepXofY', { current: currentStepNumber, total: totalVisibleSteps })}\n </Badge>\n </div>\n\n {/* Overall progress bar — track at 0.3 opacity, fill full opacity */}\n <div style={{ position: 'relative', height: '4px', borderRadius: '999px', overflow: 'hidden', marginBottom: '16px' }}>\n <div style={{ position: 'absolute', inset: 0, backgroundColor: 'var(--metakyc-border, #e5e7eb)', opacity: 0.3 }} />\n <div style={{\n position: 'absolute', top: 0, left: 0, bottom: 0,\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n opacity: 0.3,\n width: `${progressPercent}%`,\n transition: 'width 0.4s ease',\n }} />\n </div>\n\n {/* Stepper — scrollable container */}\n <StepperNav\n ref={stepperScrollRef}\n visibleSteps={visibleSteps}\n currentVisibleStepIndex={currentVisibleStepIndex}\n getStepFallbackName={getStepFallbackName}\n />\n </div>\n );\n };\n\n // Render current step\n const renderCurrentStep = () => {\n const stepProps = {\n applicantId,\n onComplete: async () => {\n // Refresh progress after each step completion\n await refreshProgress();\n },\n onBack: currentStep.order > 0 ? moveBack : undefined,\n };\n\n switch (currentStep.action) {\n case WorkflowStepAction.Questionaries:\n return <QuestionnaireStep {...stepProps} />;\n\n case WorkflowStepAction.UploadDocument:\n return <UploadDocumentStep {...stepProps} />;\n\n case WorkflowStepAction.Overview:\n return <OverviewStep {...stepProps} />;\n\n case WorkflowStepAction.IdentitySdk:\n return <IdentityVerificationStep {...stepProps} />;\n\n case WorkflowStepAction.RiskScoring:\n return <RiskScoringStep {...stepProps} />;\n\n case WorkflowStepAction.AdditionalData:\n case WorkflowStepAction.InvestorCategorization:\n return <InvestorCategorizationStep {...stepProps} />;\n\n case WorkflowStepAction.AppropriatenessTest:\n return <AppropriatenessTestStep {...stepProps} />;\n\n case WorkflowStepAction.ManualReview:\n // ManualReview shows status display\n return (\n <KycStatusDisplay\n kycStatus={progress.kycStatus}\n reviewStatus={progress.reviewStatus}\n workflowResult={progress.workflowResult}\n customMessage={progress.customMessage}\n />\n );\n\n default:\n // Unknown step - show message but don't show status display\n // This should be a workflow step, not a final status\n return (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <div className=\"mb-4\">\n <Spinner />\n </div>\n <p className=\"text-gray-600 dark:text-gray-400 mb-2\">\n {t('workflow.processingStep')} {currentStep.title || currentStep.name}\n </p>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('workflow.actionType')} {WorkflowStepAction[currentStep.action]}\n </p>\n </CardContent>\n </Card>\n );\n }\n };\n\n return (\n <div className={`metakyc-sdk ${className || ''}`}>\n {renderProgress()}\n {renderCurrentStep()}\n </div>\n );\n};\n\n// ── StepperNav ────────────────────────────────────────────────────────────\n\ninterface StepperNavProps {\n visibleSteps: import('../types').StepInfo[];\n currentVisibleStepIndex: number;\n getStepFallbackName: (action: WorkflowStepAction) => string;\n}\n\nconst StepperNav = React.forwardRef<HTMLDivElement, StepperNavProps>(\n ({ visibleSteps, currentVisibleStepIndex, getStepFallbackName }, ref) => {\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const activeRef = React.useRef<HTMLDivElement>(null);\n\n React.useImperativeHandle(ref, () => scrollContainerRef.current!);\n\n React.useEffect(() => {\n if (activeRef.current && scrollContainerRef.current) {\n const container = scrollContainerRef.current;\n const el = activeRef.current;\n const scrollLeft = el.offsetLeft - container.offsetWidth / 2 + el.offsetWidth / 2;\n container.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });\n }\n }, [currentVisibleStepIndex]);\n\n return (\n <div\n ref={scrollContainerRef}\n className=\"metakyc-stepper-scroll\"\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n WebkitOverflowScrolling: 'touch',\n padding: '4px 0',\n gap: '0',\n }}\n >\n {visibleSteps.map((step, index) => {\n const isCompleted = index < currentVisibleStepIndex;\n const isCurrent = index === currentVisibleStepIndex;\n const isActive = isCompleted || isCurrent;\n const label = step.displayName || step.name || getStepFallbackName(step.action) || `Step ${index + 1}`;\n\n return (\n <React.Fragment key={step.order}>\n <div\n ref={isCurrent ? activeRef : undefined}\n style={{\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n {/* Circle */}\n <div style={{\n width: '28px',\n height: '28px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 600,\n flexShrink: 0,\n transition: 'all 0.2s ease',\n ...(isActive ? {\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n color: '#ffffff',\n border: 'none',\n } : {\n backgroundColor: 'transparent',\n color: 'var(--metakyc-text-muted, #9ca3af)',\n border: '2px solid var(--metakyc-border, #e5e7eb)',\n }),\n }}>\n {isCompleted ? (\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n index + 1\n )}\n </div>\n\n {/* Label */}\n <span style={{\n marginLeft: '6px',\n fontSize: '13px',\n whiteSpace: 'nowrap',\n fontWeight: isCurrent ? 600 : 400,\n color: isCurrent\n ? 'var(--metakyc-text-primary, #111827)'\n : isCompleted\n ? 'var(--metakyc-primary, #2563eb)'\n : 'var(--metakyc-text-muted, #9ca3af)',\n transition: 'color 0.2s ease',\n }}>\n {label}\n </span>\n </div>\n\n {/* Connector line */}\n {index < visibleSteps.length - 1 && (\n <div style={{\n flex: '1 1 0%',\n minWidth: '16px',\n height: '2px',\n margin: '0 8px',\n borderRadius: '999px',\n backgroundColor: 'var(--metakyc-primary, #2563eb)',\n opacity: isCompleted ? 1 : 0.25,\n transition: 'opacity 0.2s ease',\n }} />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n);\n","import { z } from 'zod';\nimport { QuestionnaireOutput } from '../types';\n\n/**\n * Generate zod schema for question values (reserved for future use)\n */\n/* Commented out for future use\nfunction generateQuestionValuesSchema(question: QuestionDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.string());\n\n // Apply required validation\n if (question.isRequired) {\n schema = (schema as z.ZodArray<any>).min(1, question.errorMessage || 'This field is required');\n } else {\n schema = schema.optional();\n }\n\n // Apply regex validation for the first value (single answer)\n if (!question.canMultipleAnswer && question.regex) {\n const regex = new RegExp(question.regex);\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || regex.test(val[0]),\n { message: question.errorMessage || 'Invalid format' }\n );\n }\n\n // Apply min/max validation for string length\n if (!question.canMultipleAnswer) {\n if (question.min !== undefined && question.min !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length >= question.min!,\n { message: `Minimum length is ${question.min}` }\n );\n }\n if (question.max !== undefined && question.max !== null) {\n schema = (schema as z.ZodArray<any>).refine(\n (val: string[]) => !val || val.length === 0 || val[0].length <= question.max!,\n { message: `Maximum length is ${question.max}` }\n );\n }\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from questionnaire with grouped questions support\n */\nexport function generateQuestionnaireSchema(_questionnaire: QuestionnaireOutput) {\n // Generate schema for grouped questions structure\n // questionResults: [[{questionId, values}], [{questionId, values}], ...]\n return z.object({\n questionResults: z.any(),\n }).passthrough(); // Allow extra fields\n}\n","import { z } from 'zod';\nimport { UploadDocumentOutputDto, UploadDocumentFileDto } from '../types';\n\n/**\n * Generate zod schema for a single upload document file\n */\nfunction generateUploadDocumentFileSchema(file: UploadDocumentFileDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.array(z.instanceof(File));\n\n if (file.isRequired) {\n schema = (schema as z.ZodArray<any>).min(\n 1,\n `${file.displayName} is required`\n );\n } else {\n schema = schema.optional();\n }\n\n // Validate multiple files\n if (!file.multipleFile) {\n schema = (schema as z.ZodArray<any> | z.ZodOptional<z.ZodArray<any>>).refine(\n (files) => !files || files.length <= 1,\n { message: 'Only one file is allowed' }\n );\n }\n\n // Validate file size\n if (file.maxEachFileSizeByte > 0) {\n schema = (schema as any).refine(\n (files: File[] | undefined) =>\n !files || files.every((f) => f.size <= file.maxEachFileSizeByte),\n { message: `File size must not exceed ${Math.round(file.maxEachFileSizeByte / 1024 / 1024)}MB` }\n );\n }\n\n // Validate file type\n if (file.allowedTypes) {\n const allowedMimeTypes = file.allowedTypes.split(',').map((t) => t.trim());\n schema = (schema as any).refine(\n (files: File[] | undefined) => {\n if (!files) return true;\n return files.every((f) =>\n allowedMimeTypes.some((type) => {\n if (type.endsWith('/*')) {\n return f.type.startsWith(type.slice(0, -2));\n }\n return f.type === type;\n })\n );\n },\n { message: 'Invalid file type' }\n );\n }\n\n return schema;\n}\n\n/**\n * Generate zod schema from upload document\n */\nexport function generateUploadDocumentSchema(uploadDocument: UploadDocumentOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n uploadDocument.uploadDocumentFiles.forEach((file) => {\n const fieldName = `file_${file.id}`;\n schemaObject[fieldName] = generateUploadDocumentFileSchema(file);\n });\n\n return z.object(schemaObject);\n}\n","import { z } from 'zod';\nimport { RiskCriteriaDto } from '../types';\n\n/**\n * Generate zod schema for a single risk criterion (reserved for future use)\n */\n/* Commented out for future use\nfunction generateCriterionSchema(criterion: RiskCriteriaDto): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n // Base schema based on value data type\n switch (criterion.valueDataType) {\n case ValueDataType.Integer:\n schema = z.coerce.number().int();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Money:\n schema = z.coerce.number();\n if (criterion.min !== undefined && criterion.min !== null) {\n schema = (schema as z.ZodNumber).min(criterion.min);\n }\n if (criterion.max !== undefined && criterion.max !== null) {\n schema = (schema as z.ZodNumber).max(criterion.max);\n }\n break;\n\n case ValueDataType.Boolean:\n schema = z.boolean();\n break;\n\n case ValueDataType.Date:\n schema = z.string();\n break;\n\n case ValueDataType.Country:\n case ValueDataType.String:\n default:\n schema = z.string();\n if (criterion.regex) {\n const regex = new RegExp(criterion.regex);\n schema = (schema as z.ZodString).regex(regex, 'Invalid format');\n }\n break;\n }\n\n // Apply required validation\n if (criterion.isRequired) {\n if (schema instanceof z.ZodString) {\n schema = schema.min(1, `${criterion.displayName} is required`);\n }\n } else {\n schema = schema.optional();\n }\n\n return schema;\n}\n*/\n\n/**\n * Generate zod schema from risk criteria\n * Only validates user inputs (values), not metadata (riskCriteriaId)\n */\nexport function generateRiskScoringSchema(_criteria: RiskCriteriaDto[]) {\n // Don't validate the structure - just allow any data\n // Individual field validation happens during rendering\n return z.any();\n}\n","import { z } from 'zod';\nimport { AppropriatenessTestOutputDto, AppropriatenessQuestionOutputDto } from '../types';\n\n/**\n * Generate zod schema for a single appropriateness question\n */\nfunction generateQuestionSchema(_question: AppropriatenessQuestionOutputDto): z.ZodTypeAny {\n // All questions are required in the appropriateness test\n return z.string().min(1, 'This question is required');\n}\n\n/**\n * Generate zod schema from appropriateness test\n */\nexport function generateAppropriatenessSchema(test: AppropriatenessTestOutputDto) {\n const schemaObject: Record<string, z.ZodTypeAny> = {};\n\n test.appropriatenessQuestions.forEach((question) => {\n const fieldName = `question_${question.id}`;\n schemaObject[fieldName] = generateQuestionSchema(question);\n });\n\n return z.object(schemaObject);\n}\n\n// Simple schema for compatibility\nexport const appropriatenessTestSchema = z.any();\n"],"names":["WorkflowStepAction","WorkflowResultType","ApplicantProgressStatus","ApplicantProgressOnHoldReason","RiskLevel","KycStatus","ReviewStatus","ApplicantStatus","KycProcessStatus","IdentityVerificationProvider","UserType","GenderType","FileType","DocumentReviewStatus","AppropriatenessQuestionType","ValueDataType","RiskCriteriaType","CriteriaBuiltInType","InvestorCategorizationType","InvestorCategoryType","CountriesType","FIELD_METADATA","COMPANY_FIELD_METADATA","DEFAULT_COMPANY_VISIBLE_FIELDS","DEFAULT_VISIBLE_FIELDS","ALLOWED_LANGUAGES","ThemePreset","defaultConfig","EndpointBuilder","config","controller","action","customKey","MetaKYCError","message","code","details","validationErrors","response","__publicField","ErrorHandler","error","data","HttpClient","axios","token","originalRequest","_a","resolve","params","url","ApplicantService","httpClient","input","applicantId","language","externalRefId","QuestionnaireService","UploadDocumentService","AppropriatenessTestService","OverviewService","RiskScoringService","IdentityService","BaseInformationService","filter","lng","type","InvestorCategorizationService","defaultTheme","corporateTheme","fintechTheme","healthcareTheme","modernTheme","minimalTheme","themePresets","getThemePreset","preset","ThemeService","theme","parsed","p","isOldFormat","f","overrides","baseTheme","TranslationService","locale","EventEmitter","event","callback","callbacks","WorkflowState","progress","previousStep","_b","StepRouter","handler","WorkflowOrchestrator","applicantService","questionnaireService","uploadDocumentService","appropriatenessTestService","overviewService","riskScoringService","_identityService","investorCategorizationService","loadScript","src","id","reject","script","isScriptLoaded","removeScript","SUMSUB_CDN","cssVar","name","fallback","el","buildThemeCssStr","primary","primaryHover","bg","surface","textPrimary","textSecondary","textMuted","border","SumsubProvider","containerId","conf","uiConf","builder","payload","OnfidoProvider","SardinAIProvider","c","r","environment","region","sardineHost","loader","firstScript","clientId","flow","enableBiometrics","enablePortScanning","noscript","img","options","IdentityProviderManager","provider","tokenObject","contextConfig","sumsubCtx","sardinConfig","ThemeManager","colors","typo","space","varMap","k","v","css","str","en","de","fr","es","it","pt","nl","pl","ru","zh","ja","ar","tr","sv","da","fi","no","bundledLocales","nb","resolvePath","obj","path","parts","cur","interpolate","template","_","key","val","deepMerge","base","override","result","overrideVal","getBundledDictionary","normalized","createTFunction","dict","value","TranslationContext","createContext","CACHE_PREFIX","TranslationProvider","fetchTranslations","children","normalizedLocale","initialDict","useMemo","bundled","cached","dictionary","setDictionary","useState","useEffect","cancelled","remote","merged","err","jsx","useTranslation","ctx","useContext","MetaKYCContext","SDK_VERSION","STYLE_ID","injected","injectCriticalCSS","style","cssText","THEME_CACHE_KEY","MetaKYCProvider","currentTheme","setCurrentTheme","isLoadingThemeRef","React","hasLoadedThemeRef","services","identityService","baseInformationService","themeService","translationService","themeManager","useCallback","jsxs","useMetaKYC","context","fileToBase64","file","reader","base64","validateFileSize","maxSizeBytes","validateFileType","allowedTypes","prefix","formatFileSize","bytes","sizes","i","getAcceptString","cn","classes","STORAGE_KEYS","saveApplicantId","getApplicantId","stored","clearApplicantId","saveWorkflowState","state","getWorkflowState","clearWorkflowState","clearAllStorage","useKycWorkflow","createOrchestrator","setProgress","isLoading","setIsLoading","setError","orchestratorRef","useRef","effectiveApplicantId","isLoadingRef","hasLoadedRef","loadProgress","refreshProgress","moveToNext","moveBack","submitCurrentStep","sortedSteps","a","b","hasWorkflowChanged","useQuestionnaire","questionnaire","setQuestionnaire","initialAnswers","setInitialAnswers","isSubmitting","setIsSubmitting","load","applicantData","textToAnswers","qr","answers","allQuestions","g","q","submit","useUploadDocument","uploadDocument","setUploadDocument","uploadProgress","setUploadProgress","useAppropriatenessTest","test","setTest","setResult","submitResult","useOverview","overview","setOverview","passOverview","useIdentityVerification","identityData","setIdentityData","isRequestingRef","requestIdentity","redirectUrl","ttl","requestCompanyIdentity","restartIdentity","useRiskScoring","criteria","setCriteria","latestResult","cr","values","useApplicant","isCreatingRef","isLoadingDataRef","generateSardinAISessionKey","createApplicant","sessionKey","createCompanyApplicant","getApplicantData","stopProgress","VARIANT_STYLES","Button","variant","size","disabled","className","props","baseStyles","sizeStyles","sizeInline","Input","forwardRef","label","helperText","leftIcon","rightIcon","ref","Card","CardHeader","CardContent","CardFooter","BOX_BASE","Checkbox","checked","onChange","uncheckedBorder","uncheckedBg","checkedColor","e","Badge","Spinner","Select","placeholder","option","idx","DROPDOWN_MAX_HEIGHT","MultiSelect","placeholderProp","disabledProp","readOnly","required","t","isOpen","setIsOpen","search","setSearch","pos","setPos","portalColors","setPortalColors","containerRef","triggerRef","dropdownRef","calcPos","rect","openUp","snapPortalColors","s","open","close","target","update","filteredOptions","o","toggleOption","optionValue","removeValue","getLabel","borderColor","primaryColor","primaryLight","hoverBg","dropdownPanel","focusBorder","isSelected","createPortal","SearchableSelect","searchRef","handleToggle","selectedLabel","handleSelect","optValue","optDisabled","getFileIcon","FileUpload","subtitle","accept","multiple","maxSize","isDragging","setIsDragging","sizeError","setSizeError","inputRef","handleFiles","files","fileArray","handleDragOver","handleDragLeave","handleDrop","handleClick","removeFile","index","newFiles","displayError","hasFiles","icon","isImage","previewUrl","PhoneInput","countryCode","onCountryCodeChange","mergeClasses","array","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","prop","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","ChevronLeft","ChevronRight","validateQuestion","question","isEmpty","first","num","buildPages","groups","flat","gi","qi","map","pq","qs","QuestionnaireStep","onComplete","onBack","setAnswers","fieldErrors","setFieldErrors","currentPage","setCurrentPage","pages","isLastPage","currentQuestions","setAnswer","questionId","prev","validatePage","newErrors","handleNext","handleBack","handleSubmit","questionResults","QuestionField","vals","qType","answer","v2","docFiles","df","UploadDocumentStep","setFiles","submitError","setSubmitError","pageErrors","setPageErrors","currentDocs","totalPages","validateCurrentPage","errs","uploadDocumentResults","docFile","fileList","valueList","OverviewStep","handleConfirm","step","resolveLocale","isMoneyWithOptions","criterion","formatMoneyLabel","raw","fmt","validateCriterion","isNumeric","cs","getInputType","RiskScoringStep","autoSubmitted","setAutoSubmitted","currentCriteria","criteriaId","criteriaValueInputs","x","CriterionField","inputType","moneyOptions","InvestorCategorizationStep","selectedType","setSelectedType","parseTimeSpan","ts","formatTime","seconds","m","AppropriatenessTestStep","testData","setTestData","timeRemaining","setTimeRemaining","isTestStarted","setIsTestStarted","isTestExpired","setIsTestExpired","waitTimeRemaining","setWaitTimeRemaining","currentQ","setCurrentQ","resultScreen","setResultScreen","w","handleStartTest","handleAnswerChange","qId","reloadTestData","unanswered","resetTest","attemptsRemaining","totalQ","answeredCount","handleRetake","Fragment","StatCard","isLastQ","allAnswered","timerWarning","QuestionCard","STAT_ICONS","isWarning","selectedAnswer","onSelect","ai","IdentityVerificationStep","identityLoading","providerInstance","setProviderInstance","setApplicantData","countries","setCountries","phoneCountries","setPhoneCountries","isLoadingData","setIsLoadingData","showProvider","setShowProvider","providerError","setProviderError","isExpired","setIsExpired","hasAutoRequestedRef","reviewData","setReviewData","customData","setCustomData","reviewPage","reviewPageDisabled","reviewPageDisabledRef","form","useForm","countriesData","phoneData","seen","countryOptions","phoneSeen","phoneOptions","requestData","expirationTime","urlString","useSumsubSdk","providerType","accessToken","providerConfig","instance","errorMessage","handleRestart","iframe","iframeDoc","text","_c","COUNTRY_FIELD_META_TYPES","colStyle","span","formatDisplayValue","opt","ReviewHelpButton","helpText","setOpen","btnRef","openModal","ReactDOM","withHelp","content","renderCustomField","pn","selected","toggleOpt","renderReviewField","meta","isPhoneCountry","isCountry","pageTitle","pageSubtitle","_d","Controller","field","KycStatusDisplay","kycStatus","reviewStatus","workflowResult","customMessage","onContinue","onContactSupport","statusInfo","Logo","Header","titleProp","title","hasLogo","hasTitle","SYSTEM_REQUIRED","OPTION_INPUT_STYLE","FieldHelpWrapper","modal","CreateApplicantForm","workflowKeyProp","externalRefIdProp","onSuccess","onCancel","isCreatingApplicant","workflowKey","initialExternalRefId","initialEmail","hiddenValues","initialValues","_e","showLabels","_f","formPages","requiredFields","set","clientReq","page","flatVisibleFields","fields","_g","COUNTRY_FIELD_NAMES","neededCountryTypes","types","countriesMap","setCountriesMap","isLoadingCountries","setIsLoadingCountries","loadingTypesRef","loadedTypesRef","typesToLoad","keys","entries","isPhoneType","list","getCountriesForField","BUILT_IN_FIELD_SET","hiddenBuiltInFields","initialBuiltInFields","formData","setFormData","hiddenCustomFields","currentPageIndex","setCurrentPageIndex","globalError","setGlobalError","handleChange","handleCustomChange","paramName","isConditionMet","nextPageIndex","prevPageIndex","displayLabel","fieldName","doSubmit","allErrs","additionalDatas","existingParams","d","handleFlatSubmit","renderBuiltInField","displayText","countriesTypeOverride","fieldLabelModeOverride","metadata","isRequired","fieldError","labelText","isReadOnly","elementKey","commonProps","fieldShowLabels","labelProp","placeholderSuffix","countryList","langOptions","l","nationalityList","linkLabel","selectedValues","isChecked","next","renderPageFields","_pageIndex","conditionMet","isFirst","isLast","condMet","errorMessages","msg","CreateCompanyApplicantForm","COMPANY_BUILT_IN_FIELD_SET","fieldsToCollect","KycWorkflow","onError","currentStep","steps","nextWorkflowKey","workflowChangeAcknowledged","setWorkflowChangeAcknowledged","stepperScrollRef","getStepFallbackName","renderProgress","visibleSteps","currentVisibleStepIndex","currentStepNumber","totalVisibleSteps","progressPercent","StepperNav","renderCurrentStep","stepProps","scrollContainerRef","activeRef","container","scrollLeft","isCompleted","isCurrent","isActive","generateQuestionnaireSchema","_questionnaire","z","generateUploadDocumentFileSchema","schema","allowedMimeTypes","generateUploadDocumentSchema","schemaObject","generateRiskScoringSchema","_criteria","generateQuestionSchema","_question","generateAppropriatenessSchema","appropriatenessTestSchema"],"mappings":"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","x_google_ignoreList":[80,81,82,83,84,85,86,87,88,89]}
|