amliq-dashboard 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +3 -0
- package/.env.production +1 -0
- package/Dockerfile +26 -0
- package/QUICK_START.md +267 -0
- package/README.md +161 -0
- package/TESTING_GUIDE.md +322 -0
- package/dist/.well-known/ai-plugin.json +15 -0
- package/dist/_headers +8 -0
- package/dist/_redirects +1 -0
- package/dist/assets/APIKeys-BvwFauIs.js +6 -0
- package/dist/assets/APIKeys-DaMSBZQL.js +1 -0
- package/dist/assets/AdverseMedia-DckXfMzS.js +4 -0
- package/dist/assets/AlertDetailPage-Bc2_zwu_.js +1 -0
- package/dist/assets/AlertQueue-DFtBiRoM.js +8 -0
- package/dist/assets/Analytics-DtruB5lQ.js +1 -0
- package/dist/assets/AuditTrail-BK68ePu0.js +1 -0
- package/dist/assets/AuthDivider-gRHEt7gx.js +1 -0
- package/dist/assets/Badge-B9VFkofy.js +1 -0
- package/dist/assets/BatchJobs-Bz6KFnXD.js +6 -0
- package/dist/assets/BillingPage-R9nQ5nFb.js +11 -0
- package/dist/assets/Card-Cw-T_-oU.js +1 -0
- package/dist/assets/CaseDetail-DYs7Zg_y.js +7 -0
- package/dist/assets/CaseManagement-B1Q4Dp1Y.js +1 -0
- package/dist/assets/ComplianceReport-Dhssqc9T.js +1 -0
- package/dist/assets/Configuration-B92kl9T0.js +1 -0
- package/dist/assets/CryptoScreening-C7yFlskC.js +1 -0
- package/dist/assets/Dashboard-w4-Nhv9q.js +17 -0
- package/dist/assets/DataSources-u3-Ri_5_.js +3 -0
- package/dist/assets/EDDWorkflow-CFzlEO0e.js +1 -0
- package/dist/assets/EmptyState-Do0xJAT9.js +6 -0
- package/dist/assets/ForgotPassword-BPYyQFQp.js +1 -0
- package/dist/assets/LandingPage-CjaP0zw4.js +41 -0
- package/dist/assets/ListsMarketplace-CG6KkT9B.js +6 -0
- package/dist/assets/Login-677LEGP1.js +1 -0
- package/dist/assets/MFASetup-BxqCPvui.js +1 -0
- package/dist/assets/Monitoring-9TN9MK4y.js +1 -0
- package/dist/assets/Onboarding-Cf0Y83lX.js +1 -0
- package/dist/assets/Operations-CcXwc2xw.js +10 -0
- package/dist/assets/Overview-B_Ky0VWV.js +1 -0
- package/dist/assets/PEPScreening-pUQjTH9c.js +1 -0
- package/dist/assets/PageHeader-BObHFn0i.js +1 -0
- package/dist/assets/PrivacyPolicy-DZ2xrKir.js +1 -0
- package/dist/assets/ResetPassword-AtxtpIG1.js +1 -0
- package/dist/assets/RiskAssessment-Dzuh1Usv.js +1 -0
- package/dist/assets/SARForm-D8w2ZGe-.js +1 -0
- package/dist/assets/SanctionsLists-CPA3UH2v.js +1 -0
- package/dist/assets/ScheduledTasks-Dsjk-6UR.js +1 -0
- package/dist/assets/ScreenEntity-D1U0YL7v.js +3 -0
- package/dist/assets/ScreeningProgress-BW49PzoB.js +66 -0
- package/dist/assets/SearchField-CulFKdiI.js +1 -0
- package/dist/assets/Signup-C0FmFOo_.js +1 -0
- package/dist/assets/SystemHealth-B_8u4eva.js +1 -0
- package/dist/assets/TaskHistory-BCmEM89q.js +3 -0
- package/dist/assets/Team-CUo_FlU7.js +1 -0
- package/dist/assets/TenantDetail-CgZQHUY8.js +1 -0
- package/dist/assets/Tenants-RB9E9ick.js +2 -0
- package/dist/assets/TermsOfService-BfL-kndX.js +1 -0
- package/dist/assets/TransactionMonitoring-DGh_T22s.js +14 -0
- package/dist/assets/TxnScreening-B7cm2-eh.js +1 -0
- package/dist/assets/UBOChain-falXAsCo.js +1 -0
- package/dist/assets/Users-Doakpg9c.js +1 -0
- package/dist/assets/Webhooks-BZpAfaxv.js +1 -0
- package/dist/assets/alert-triangle-YCFVm7B_.js +6 -0
- package/dist/assets/alerts-COUnTwWY.js +1 -0
- package/dist/assets/arrow-left-9ApLqP95.js +6 -0
- package/dist/assets/check-VTcvVtIU.js +6 -0
- package/dist/assets/check-circle-2-Dn-lG5YQ.js +6 -0
- package/dist/assets/code-DIJRWFVv.js +6 -0
- package/dist/assets/fingerprint-C0MGVtax.js +6 -0
- package/dist/assets/flag-B8_Gwxh6.js +6 -0
- package/dist/assets/index-CfdYcqRM.js +289 -0
- package/dist/assets/index-HPU_Rhdu.css +1 -0
- package/dist/assets/layers-zHz2o4vo.js +6 -0
- package/dist/assets/loader-B9_dNihg.js +6 -0
- package/dist/assets/mail-BijL2qwp.js +6 -0
- package/dist/assets/plus-i0oBIIPS.js +6 -0
- package/dist/assets/refresh-cw-CSuAwutt.js +6 -0
- package/dist/assets/useAnalytics-Bj8IONcw.js +72 -0
- package/dist/assets/x-circle-DLGKvijE.js +6 -0
- package/dist/favicon.svg +15 -0
- package/dist/index.html +51 -0
- package/dist/llms.txt +28 -0
- package/dist/logo.png +0 -0
- package/dist/logo.svg +17 -0
- package/dist/manifest.json +44 -0
- package/dist/robots.txt +15 -0
- package/dist/schema.json +13 -0
- package/dist/sitemap.xml +28 -0
- package/dist/sw.js +67 -0
- package/e2e/auth-setup.ts +20 -0
- package/e2e/billing.spec.ts +50 -0
- package/e2e/cases.spec.ts +53 -0
- package/e2e/compliance.spec.ts +65 -0
- package/e2e/config.spec.ts +56 -0
- package/e2e/dashboard.spec.ts +47 -0
- package/e2e/fixtures.ts +33 -0
- package/e2e/lists.spec.ts +43 -0
- package/e2e/login.spec.ts +64 -0
- package/e2e/media.spec.ts +48 -0
- package/e2e/mocks.ts +51 -0
- package/e2e/monitoring.spec.ts +44 -0
- package/e2e/navigation.spec.ts +56 -0
- package/e2e/onboarding.spec.ts +49 -0
- package/e2e/responsive.spec.ts +40 -0
- package/e2e/risk.spec.ts +61 -0
- package/e2e/screening.spec.ts +76 -0
- package/e2e/team.spec.ts +53 -0
- package/index.html +50 -0
- package/package.json +47 -0
- package/playwright.config.ts +35 -0
- package/postcss.config.js +6 -0
- package/public/.well-known/ai-plugin.json +15 -0
- package/public/_headers +8 -0
- package/public/_redirects +1 -0
- package/public/favicon.svg +15 -0
- package/public/llms.txt +28 -0
- package/public/logo.png +0 -0
- package/public/logo.svg +17 -0
- package/public/manifest.json +44 -0
- package/public/robots.txt +15 -0
- package/public/schema.json +13 -0
- package/public/sitemap.xml +28 -0
- package/public/sw.js +67 -0
- package/scripts/test-runner.sh +152 -0
- package/src/App.tsx +48 -0
- package/src/api/alerts.ts +19 -0
- package/src/api/analytics.ts +6 -0
- package/src/api/audit.ts +11 -0
- package/src/api/auth.ts +26 -0
- package/src/api/billing.ts +54 -0
- package/src/api/cases.ts +48 -0
- package/src/api/client.ts +50 -0
- package/src/api/config.ts +30 -0
- package/src/api/edd.ts +25 -0
- package/src/api/enforcement.ts +33 -0
- package/src/api/lists.ts +24 -0
- package/src/api/monitoring.ts +82 -0
- package/src/api/pep.ts +30 -0
- package/src/api/risk.ts +26 -0
- package/src/api/screening.ts +37 -0
- package/src/api/team.ts +27 -0
- package/src/api/transactions.ts +37 -0
- package/src/components/admin/TenantCards.tsx +51 -0
- package/src/components/alerts/AlertActions.test.tsx +80 -0
- package/src/components/alerts/AlertActions.tsx +68 -0
- package/src/components/alerts/AlertCard.test.tsx +86 -0
- package/src/components/alerts/AlertCard.tsx +60 -0
- package/src/components/alerts/AlertDetailSidebar.tsx +63 -0
- package/src/components/alerts/AlertFilters.test.tsx +73 -0
- package/src/components/alerts/AlertFilters.tsx +88 -0
- package/src/components/alerts/EntityDetailsCard.test.tsx +61 -0
- package/src/components/alerts/EntityDetailsCard.tsx +37 -0
- package/src/components/alerts/NotesCard.test.tsx +39 -0
- package/src/components/alerts/NotesCard.tsx +28 -0
- package/src/components/auth/AuthDivider.tsx +18 -0
- package/src/components/auth/LoginForm.tsx +62 -0
- package/src/components/auth/LoginLeftPanel.tsx +43 -0
- package/src/components/auth/PasswordStrength.tsx +26 -0
- package/src/components/auth/SignInButtons.tsx +46 -0
- package/src/components/auth/SignupLeftPanel.tsx +35 -0
- package/src/components/auth/countries.ts +17 -0
- package/src/components/charts/AreaChart.tsx +45 -0
- package/src/components/charts/BarChart.tsx +48 -0
- package/src/components/charts/DonutChart.tsx +47 -0
- package/src/components/compliance/CaseActions.tsx +74 -0
- package/src/components/compliance/CaseTimeline.tsx +68 -0
- package/src/components/compliance/MediaResultCard.tsx +87 -0
- package/src/components/compliance/PEPResultCard.tsx +78 -0
- package/src/components/config/MatchingModesCard.test.tsx +75 -0
- package/src/components/config/MatchingModesCard.tsx +40 -0
- package/src/components/config/ScreeningLayersCard.test.tsx +57 -0
- package/src/components/config/ScreeningLayersCard.tsx +36 -0
- package/src/components/config/ThresholdsCard.test.tsx +79 -0
- package/src/components/config/ThresholdsCard.tsx +51 -0
- package/src/components/dashboard/ActivityFeed.tsx +93 -0
- package/src/components/dashboard/DashboardGreeting.tsx +23 -0
- package/src/components/dashboard/DashboardSkeleton.tsx +35 -0
- package/src/components/dashboard/QuickActions.tsx +52 -0
- package/src/components/dashboard/TopEntitiesTable.tsx +63 -0
- package/src/components/data/ComplianceMetrics.test.tsx +32 -0
- package/src/components/data/ComplianceMetrics.tsx +40 -0
- package/src/components/data/ConfidenceScore.test.tsx +62 -0
- package/src/components/data/ConfidenceScore.tsx +27 -0
- package/src/components/data/StatCard.test.tsx +72 -0
- package/src/components/data/StatCard.tsx +63 -0
- package/src/components/data/StatusBadge.test.tsx +63 -0
- package/src/components/data/StatusBadge.tsx +39 -0
- package/src/components/layout/AppShell.tsx +48 -0
- package/src/components/layout/Breadcrumbs.tsx +48 -0
- package/src/components/layout/CommandPalette.tsx +81 -0
- package/src/components/layout/DashboardLayout.tsx +19 -0
- package/src/components/layout/MobileHeader.tsx +30 -0
- package/src/components/layout/NavGroup.test.tsx +63 -0
- package/src/components/layout/NavGroup.tsx +64 -0
- package/src/components/layout/NotificationBell.tsx +89 -0
- package/src/components/layout/PageHeader.test.tsx +61 -0
- package/src/components/layout/PageHeader.tsx +19 -0
- package/src/components/layout/ProtectedRoute.tsx +31 -0
- package/src/components/layout/PublicLayout.tsx +17 -0
- package/src/components/layout/Sidebar.test.tsx +67 -0
- package/src/components/layout/Sidebar.tsx +92 -0
- package/src/components/layout/Toolbar.test.tsx +47 -0
- package/src/components/layout/Toolbar.tsx +68 -0
- package/src/components/layout/navItems.ts +94 -0
- package/src/components/lists/ListCard.tsx +78 -0
- package/src/components/lists/ListMarketplaceCard.tsx +77 -0
- package/src/components/screening/CircularConfidence.tsx +38 -0
- package/src/components/screening/LimitReachedBanner.tsx +31 -0
- package/src/components/screening/ListSelector.tsx +64 -0
- package/src/components/screening/MatchDetailHeader.tsx +64 -0
- package/src/components/screening/MatchEntityInfo.tsx +56 -0
- package/src/components/screening/MatchEvidenceBars.tsx +65 -0
- package/src/components/screening/MatchMetadata.tsx +95 -0
- package/src/components/screening/ScreenResults.tsx +49 -0
- package/src/components/screening/ScreeningForm.test.tsx +83 -0
- package/src/components/screening/ScreeningForm.tsx +100 -0
- package/src/components/screening/ScreeningLayersList.test.tsx +33 -0
- package/src/components/screening/ScreeningLayersList.tsx +46 -0
- package/src/components/screening/ScreeningProgress.tsx +91 -0
- package/src/components/screening/ScreeningQuotaBanner.tsx +64 -0
- package/src/components/screening/ScreeningResultCard.tsx +47 -0
- package/src/components/screening/ScreeningResultRow.tsx +45 -0
- package/src/components/screening/ScreeningResults.test.tsx +37 -0
- package/src/components/screening/ScreeningResults.tsx +33 -0
- package/src/components/screening/ShareResults.tsx +103 -0
- package/src/components/screening/ThresholdSlider.tsx +23 -0
- package/src/components/transactions/WebhookCTA.tsx +63 -0
- package/src/components/ui/Avatar.test.tsx +47 -0
- package/src/components/ui/Avatar.tsx +35 -0
- package/src/components/ui/Badge.test.tsx +49 -0
- package/src/components/ui/Badge.tsx +33 -0
- package/src/components/ui/Button.test.tsx +56 -0
- package/src/components/ui/Button.tsx +46 -0
- package/src/components/ui/Card.test.tsx +61 -0
- package/src/components/ui/Card.tsx +29 -0
- package/src/components/ui/ConfirmModal.tsx +67 -0
- package/src/components/ui/Divider.test.tsx +24 -0
- package/src/components/ui/Divider.tsx +5 -0
- package/src/components/ui/EmptyState.test.tsx +49 -0
- package/src/components/ui/EmptyState.tsx +22 -0
- package/src/components/ui/ErrorBoundary.tsx +44 -0
- package/src/components/ui/ExportMenu.tsx +71 -0
- package/src/components/ui/LanguageSwitcher.tsx +37 -0
- package/src/components/ui/LoadingSpinner.test.tsx +41 -0
- package/src/components/ui/LoadingSpinner.tsx +21 -0
- package/src/components/ui/MetricCard.tsx +63 -0
- package/src/components/ui/ScoreRing.tsx +51 -0
- package/src/components/ui/SearchField.test.tsx +55 -0
- package/src/components/ui/SearchField.tsx +31 -0
- package/src/components/ui/SeverityBadge.tsx +57 -0
- package/src/components/ui/ThemeToggle.tsx +37 -0
- package/src/components/ui/Toast.test.tsx +79 -0
- package/src/components/ui/Toast.tsx +75 -0
- package/src/components/ui/Toggle.test.tsx +85 -0
- package/src/components/ui/Toggle.tsx +46 -0
- package/src/context/AuthContext.tsx +71 -0
- package/src/data/pepProfiles.ts +76 -0
- package/src/data/pepProfilesExtra.ts +58 -0
- package/src/hooks/useAlerts.ts +36 -0
- package/src/hooks/useAnalytics.ts +23 -0
- package/src/hooks/useApi.test.ts +79 -0
- package/src/hooks/useApi.ts +33 -0
- package/src/hooks/useAudit.ts +28 -0
- package/src/hooks/useBilling.ts +38 -0
- package/src/hooks/useConfig.ts +35 -0
- package/src/hooks/useDebounce.test.ts +84 -0
- package/src/hooks/useDebounce.ts +15 -0
- package/src/hooks/useDirection.ts +15 -0
- package/src/hooks/useLists.ts +34 -0
- package/src/hooks/useMediaQuery.test.ts +97 -0
- package/src/hooks/useMediaQuery.ts +28 -0
- package/src/hooks/useScreening.ts +33 -0
- package/src/hooks/useSidebar.ts +18 -0
- package/src/hooks/useUsage.ts +27 -0
- package/src/i18n/config.ts +33 -0
- package/src/i18n/locales/ar/admin.json +19 -0
- package/src/i18n/locales/ar/alerts.json +52 -0
- package/src/i18n/locales/ar/analytics.json +9 -0
- package/src/i18n/locales/ar/audit.json +12 -0
- package/src/i18n/locales/ar/auth.json +60 -0
- package/src/i18n/locales/ar/batch.json +5 -0
- package/src/i18n/locales/ar/billing.json +41 -0
- package/src/i18n/locales/ar/common.json +65 -0
- package/src/i18n/locales/ar/compliance.json +83 -0
- package/src/i18n/locales/ar/config.json +13 -0
- package/src/i18n/locales/ar/dashboard.json +19 -0
- package/src/i18n/locales/ar/errors.json +9 -0
- package/src/i18n/locales/ar/index.ts +29 -0
- package/src/i18n/locales/ar/legal.json +10 -0
- package/src/i18n/locales/ar/lists.json +6 -0
- package/src/i18n/locales/ar/marketing.json +110 -0
- package/src/i18n/locales/ar/monitoring.json +15 -0
- package/src/i18n/locales/ar/nav.json +35 -0
- package/src/i18n/locales/ar/onboarding.json +25 -0
- package/src/i18n/locales/ar/platform.json +23 -0
- package/src/i18n/locales/ar/screening.json +26 -0
- package/src/i18n/locales/ar/team.json +11 -0
- package/src/i18n/locales/en/admin.json +21 -0
- package/src/i18n/locales/en/alerts.json +52 -0
- package/src/i18n/locales/en/analytics.json +9 -0
- package/src/i18n/locales/en/audit.json +12 -0
- package/src/i18n/locales/en/auth.json +60 -0
- package/src/i18n/locales/en/batch.json +5 -0
- package/src/i18n/locales/en/billing.json +87 -0
- package/src/i18n/locales/en/common.json +65 -0
- package/src/i18n/locales/en/compliance.json +83 -0
- package/src/i18n/locales/en/config.json +29 -0
- package/src/i18n/locales/en/dashboard.json +23 -0
- package/src/i18n/locales/en/errors.json +9 -0
- package/src/i18n/locales/en/index.ts +29 -0
- package/src/i18n/locales/en/legal.json +114 -0
- package/src/i18n/locales/en/lists.json +6 -0
- package/src/i18n/locales/en/marketing.json +174 -0
- package/src/i18n/locales/en/monitoring.json +15 -0
- package/src/i18n/locales/en/nav.json +35 -0
- package/src/i18n/locales/en/onboarding.json +31 -0
- package/src/i18n/locales/en/platform.json +25 -0
- package/src/i18n/locales/en/screening.json +26 -0
- package/src/i18n/locales/en/team.json +12 -0
- package/src/i18n/locales/he/admin.json +19 -0
- package/src/i18n/locales/he/alerts.json +52 -0
- package/src/i18n/locales/he/analytics.json +9 -0
- package/src/i18n/locales/he/audit.json +12 -0
- package/src/i18n/locales/he/auth.json +60 -0
- package/src/i18n/locales/he/batch.json +5 -0
- package/src/i18n/locales/he/billing.json +41 -0
- package/src/i18n/locales/he/common.json +65 -0
- package/src/i18n/locales/he/compliance.json +83 -0
- package/src/i18n/locales/he/config.json +13 -0
- package/src/i18n/locales/he/dashboard.json +19 -0
- package/src/i18n/locales/he/errors.json +9 -0
- package/src/i18n/locales/he/index.ts +29 -0
- package/src/i18n/locales/he/legal.json +10 -0
- package/src/i18n/locales/he/lists.json +6 -0
- package/src/i18n/locales/he/marketing.json +110 -0
- package/src/i18n/locales/he/monitoring.json +15 -0
- package/src/i18n/locales/he/nav.json +35 -0
- package/src/i18n/locales/he/onboarding.json +25 -0
- package/src/i18n/locales/he/platform.json +23 -0
- package/src/i18n/locales/he/screening.json +26 -0
- package/src/i18n/locales/he/team.json +11 -0
- package/src/index.css +112 -0
- package/src/main.tsx +15 -0
- package/src/pages/APIKeys.tsx +120 -0
- package/src/pages/AddMonitorModal.tsx +30 -0
- package/src/pages/AdverseMedia.test.tsx +18 -0
- package/src/pages/AdverseMedia.tsx +89 -0
- package/src/pages/AlertDetailPage.tsx +64 -0
- package/src/pages/AlertQueue.test.tsx +48 -0
- package/src/pages/AlertQueue.tsx +63 -0
- package/src/pages/Analytics.tsx +50 -0
- package/src/pages/AuditTrail.tsx +64 -0
- package/src/pages/BatchJobs.tsx +79 -0
- package/src/pages/CaseDetail.tsx +72 -0
- package/src/pages/CaseManagement.test.tsx +31 -0
- package/src/pages/CaseManagement.tsx +92 -0
- package/src/pages/Configuration.test.tsx +96 -0
- package/src/pages/Configuration.tsx +123 -0
- package/src/pages/CryptoScreening.tsx +109 -0
- package/src/pages/Dashboard.test.tsx +51 -0
- package/src/pages/Dashboard.tsx +66 -0
- package/src/pages/EDDWorkflow.test.tsx +29 -0
- package/src/pages/EDDWorkflow.tsx +73 -0
- package/src/pages/ForgotPassword.test.tsx +49 -0
- package/src/pages/ForgotPassword.tsx +67 -0
- package/src/pages/ListsMarketplace.tsx +102 -0
- package/src/pages/Login.test.tsx +100 -0
- package/src/pages/Login.tsx +57 -0
- package/src/pages/MFASetup.tsx +114 -0
- package/src/pages/MonitorProfileCard.tsx +27 -0
- package/src/pages/Monitoring.tsx +68 -0
- package/src/pages/Onboarding.test.tsx +36 -0
- package/src/pages/Onboarding.tsx +60 -0
- package/src/pages/PEPScreening.test.tsx +15 -0
- package/src/pages/PEPScreening.tsx +100 -0
- package/src/pages/ResetPassword.tsx +81 -0
- package/src/pages/RiskAssessment.test.tsx +15 -0
- package/src/pages/RiskAssessment.tsx +108 -0
- package/src/pages/SanctionsLists.tsx +74 -0
- package/src/pages/ScreenEntity.test.tsx +82 -0
- package/src/pages/ScreenEntity.tsx +76 -0
- package/src/pages/Signup.test.tsx +98 -0
- package/src/pages/Signup.tsx +92 -0
- package/src/pages/TaskHistory.tsx +183 -0
- package/src/pages/Team.test.tsx +15 -0
- package/src/pages/Team.tsx +140 -0
- package/src/pages/TransactionMonitoring.test.tsx +18 -0
- package/src/pages/TransactionMonitoring.tsx +118 -0
- package/src/pages/TxnScreening.tsx +125 -0
- package/src/pages/UBOChain.test.tsx +35 -0
- package/src/pages/UBOChain.tsx +65 -0
- package/src/pages/Webhooks.tsx +137 -0
- package/src/pages/admin/DataSources.tsx +230 -0
- package/src/pages/admin/Operations.tsx +103 -0
- package/src/pages/admin/ScheduledTasks.tsx +155 -0
- package/src/pages/admin/SystemHealth.tsx +58 -0
- package/src/pages/admin/TenantDetail.tsx +62 -0
- package/src/pages/admin/Tenants.test.tsx +20 -0
- package/src/pages/admin/Tenants.tsx +63 -0
- package/src/pages/admin/opsRunners.ts +81 -0
- package/src/pages/admin/opsTerminal.tsx +63 -0
- package/src/pages/billing/ActiveSubscriptions.tsx +41 -0
- package/src/pages/billing/AddProductModal.tsx +99 -0
- package/src/pages/billing/BillingPage.test.tsx +30 -0
- package/src/pages/billing/BillingPage.tsx +67 -0
- package/src/pages/billing/CurrentPlan.tsx +50 -0
- package/src/pages/billing/InvoiceList.tsx +104 -0
- package/src/pages/billing/InvoiceRow.tsx +37 -0
- package/src/pages/billing/LemonSqueezySetup.tsx +51 -0
- package/src/pages/billing/PaymentAlert.tsx +33 -0
- package/src/pages/billing/PlanComparison.tsx +53 -0
- package/src/pages/billing/ProductUsage.tsx +43 -0
- package/src/pages/billing/PromoCodeInput.tsx +58 -0
- package/src/pages/billing/SeatManager.tsx +80 -0
- package/src/pages/billing/SeatRow.tsx +32 -0
- package/src/pages/billing/SubscriptionCard.tsx +73 -0
- package/src/pages/billing/UpgradeModal.tsx +53 -0
- package/src/pages/billing/UsageHistory.tsx +37 -0
- package/src/pages/billing/UsageMeter.tsx +26 -0
- package/src/pages/billing/UsageOverview.tsx +38 -0
- package/src/pages/legal/PrivacyPolicy.tsx +25 -0
- package/src/pages/legal/TermsOfService.tsx +25 -0
- package/src/pages/marketing/BundleCallout.tsx +24 -0
- package/src/pages/marketing/CTASection.tsx +48 -0
- package/src/pages/marketing/CaseStudy.tsx +37 -0
- package/src/pages/marketing/ComparisonTable.tsx +66 -0
- package/src/pages/marketing/CompetitiveEdge.tsx +55 -0
- package/src/pages/marketing/DataCoverage.tsx +54 -0
- package/src/pages/marketing/DataRain.tsx +30 -0
- package/src/pages/marketing/EnterpriseCTA.tsx +26 -0
- package/src/pages/marketing/FAQItem.tsx +27 -0
- package/src/pages/marketing/FAQSchema.tsx +43 -0
- package/src/pages/marketing/FAQSection.tsx +19 -0
- package/src/pages/marketing/FeatureDetail.tsx +19 -0
- package/src/pages/marketing/FeaturesGrid.tsx +60 -0
- package/src/pages/marketing/FeaturesSpotlight.tsx +68 -0
- package/src/pages/marketing/FooterSection.tsx +92 -0
- package/src/pages/marketing/GradientOrbs.tsx +26 -0
- package/src/pages/marketing/HeroSearch.tsx +113 -0
- package/src/pages/marketing/HeroSection.tsx +72 -0
- package/src/pages/marketing/LandingPage.tsx +45 -0
- package/src/pages/marketing/LogoCloud.tsx +31 -0
- package/src/pages/marketing/LogoMarquee.tsx +45 -0
- package/src/pages/marketing/MarketingNav.tsx +80 -0
- package/src/pages/marketing/MatchingLayers.tsx +78 -0
- package/src/pages/marketing/MobileMenu.tsx +45 -0
- package/src/pages/marketing/PricingCard.tsx +57 -0
- package/src/pages/marketing/PricingFeatureRow.tsx +16 -0
- package/src/pages/marketing/PricingSection.tsx +103 -0
- package/src/pages/marketing/PricingToggle.tsx +40 -0
- package/src/pages/marketing/ProductPricingCards.tsx +23 -0
- package/src/pages/marketing/ProductShowcase.tsx +81 -0
- package/src/pages/marketing/ProductTabs.tsx +45 -0
- package/src/pages/marketing/QuoteRotator.tsx +56 -0
- package/src/pages/marketing/StatsBar.tsx +81 -0
- package/src/pages/marketing/StatsSection.tsx +44 -0
- package/src/pages/marketing/TestimonialCard.tsx +38 -0
- package/src/pages/marketing/TestimonialsSection.tsx +32 -0
- package/src/pages/marketing/animations.tsx +56 -0
- package/src/pages/onboarding/CountryStep.tsx +38 -0
- package/src/pages/onboarding/ListsStep.tsx +44 -0
- package/src/pages/onboarding/StepIndicator.tsx +34 -0
- package/src/pages/onboarding/ThresholdStep.tsx +49 -0
- package/src/pages/platform/APIKeys.tsx +102 -0
- package/src/pages/platform/Overview.tsx +58 -0
- package/src/pages/platform/Users.tsx +110 -0
- package/src/pages/reporting/ComplianceReport.tsx +99 -0
- package/src/pages/reporting/SARForm.tsx +99 -0
- package/src/routes/appRoutes.tsx +60 -0
- package/src/routes/compliance.tsx +28 -0
- package/src/routes/lazyCompliance.ts +34 -0
- package/src/routes/lazyPages.ts +35 -0
- package/src/routes/lazyPlatform.ts +5 -0
- package/src/routes/platform.tsx +15 -0
- package/src/styles/effects.css +76 -0
- package/src/test/setup.ts +25 -0
- package/src/test/utils.tsx +49 -0
- package/src/types/alert.ts +31 -0
- package/src/types/analytics.ts +16 -0
- package/src/types/audit.ts +11 -0
- package/src/types/billing.ts +60 -0
- package/src/types/common.ts +15 -0
- package/src/types/config.ts +19 -0
- package/src/types/entity.ts +34 -0
- package/src/types/index.ts +8 -0
- package/src/types/list.ts +15 -0
- package/src/types/screening.ts +32 -0
- package/src/vite-env.d.ts +1 -0
- package/tailwind.config.js +65 -0
- package/tsconfig.json +22 -0
- package/vite.config.ts +11 -0
- package/vitest.config.ts +19 -0
package/TESTING_GUIDE.md
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# AMLIQ Dashboard Testing Guide
|
|
2
|
+
|
|
3
|
+
## Quick Start
|
|
4
|
+
|
|
5
|
+
### Installation
|
|
6
|
+
```bash
|
|
7
|
+
cd /sessions/loving-cool-einstein/mnt/outputs/aegis-v2/web
|
|
8
|
+
npm install
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Run Tests
|
|
12
|
+
```bash
|
|
13
|
+
# Run all tests
|
|
14
|
+
npm test
|
|
15
|
+
|
|
16
|
+
# Run in watch mode
|
|
17
|
+
npm test -- --watch
|
|
18
|
+
|
|
19
|
+
# Run specific test file
|
|
20
|
+
npm test AlertCard
|
|
21
|
+
|
|
22
|
+
# Run with UI dashboard
|
|
23
|
+
npm run test:ui
|
|
24
|
+
|
|
25
|
+
# Generate coverage report
|
|
26
|
+
npm test -- --coverage
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Test Suite Overview
|
|
30
|
+
|
|
31
|
+
**28 total test files** covering:
|
|
32
|
+
- 9 UI component tests
|
|
33
|
+
- 3 data display component tests
|
|
34
|
+
- 3 alert component tests
|
|
35
|
+
- 3 configuration component tests
|
|
36
|
+
- 2 layout component tests
|
|
37
|
+
- 1 screening component test
|
|
38
|
+
- 4 page/integration tests
|
|
39
|
+
- 3 custom hook tests
|
|
40
|
+
|
|
41
|
+
**All files are under 100 lines** for maintainability.
|
|
42
|
+
|
|
43
|
+
## Writing New Tests
|
|
44
|
+
|
|
45
|
+
### Use the Custom Render Function
|
|
46
|
+
```typescript
|
|
47
|
+
import { render, screen } from '@test/utils' // Already has Router wrapper
|
|
48
|
+
import userEvent from '@testing-library/user-event'
|
|
49
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
50
|
+
|
|
51
|
+
describe('MyComponent', () => {
|
|
52
|
+
it('does something', async () => {
|
|
53
|
+
render(<MyComponent prop="value" />)
|
|
54
|
+
expect(screen.getByText('expected')).toBeInTheDocument()
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Mock Alert Data
|
|
60
|
+
```typescript
|
|
61
|
+
import { createMockAlert } from '@test/utils'
|
|
62
|
+
|
|
63
|
+
const alert = createMockAlert({
|
|
64
|
+
status: 'open',
|
|
65
|
+
priority: 'critical',
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Mock Entity Data
|
|
70
|
+
```typescript
|
|
71
|
+
import { createMockEntity } from '@test/utils'
|
|
72
|
+
|
|
73
|
+
const entity = createMockEntity({
|
|
74
|
+
type: 'company',
|
|
75
|
+
name: { firstName: 'Acme', lastName: 'Corp' },
|
|
76
|
+
})
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Test User Interactions
|
|
80
|
+
```typescript
|
|
81
|
+
import userEvent from '@testing-library/user-event'
|
|
82
|
+
|
|
83
|
+
it('clicks button', async () => {
|
|
84
|
+
render(<Button onClick={handler}>Click</Button>)
|
|
85
|
+
await userEvent.click(screen.getByRole('button'))
|
|
86
|
+
expect(handler).toHaveBeenCalled()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('types in input', async () => {
|
|
90
|
+
render(<SearchField value="" onChange={handler} />)
|
|
91
|
+
await userEvent.type(screen.getByPlaceholderText('Search'), 'term')
|
|
92
|
+
expect(handler).toHaveBeenCalled()
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Test Async Operations
|
|
97
|
+
```typescript
|
|
98
|
+
import { waitFor } from '@testing-library/react'
|
|
99
|
+
|
|
100
|
+
it('loads data', async () => {
|
|
101
|
+
render(<Dashboard />)
|
|
102
|
+
await waitFor(() => {
|
|
103
|
+
expect(screen.getByText('Loaded')).toBeInTheDocument()
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Mock Window APIs
|
|
109
|
+
```typescript
|
|
110
|
+
it('checks media query', () => {
|
|
111
|
+
const spy = vi.spyOn(window, 'matchMedia')
|
|
112
|
+
render(<Component />)
|
|
113
|
+
expect(spy).toHaveBeenCalledWith('(max-width: 639px)')
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Test Patterns Used
|
|
118
|
+
|
|
119
|
+
### Pattern: Component Variants
|
|
120
|
+
```typescript
|
|
121
|
+
it('renders different variants', () => {
|
|
122
|
+
const { rerender } = render(<Button variant="primary">Button</Button>)
|
|
123
|
+
expect(screen.getByRole('button')).toHaveClass('bg-apple-blue')
|
|
124
|
+
|
|
125
|
+
rerender(<Button variant="secondary">Button</Button>)
|
|
126
|
+
expect(screen.getByRole('button')).toHaveClass('bg-apple-bg-tertiary')
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Pattern: Event Handlers
|
|
131
|
+
```typescript
|
|
132
|
+
it('calls handler on click', async () => {
|
|
133
|
+
const handler = vi.fn()
|
|
134
|
+
render(<Button onClick={handler}>Click</Button>)
|
|
135
|
+
await userEvent.click(screen.getByRole('button'))
|
|
136
|
+
expect(handler).toHaveBeenCalledOnce()
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Pattern: Form Submission
|
|
141
|
+
```typescript
|
|
142
|
+
it('submits form data', async () => {
|
|
143
|
+
const handler = vi.fn()
|
|
144
|
+
render(<Form onSubmit={handler} />)
|
|
145
|
+
await userEvent.type(screen.getByPlaceholderText('Name'), 'John')
|
|
146
|
+
await userEvent.click(screen.getByRole('button', { name: /submit/i }))
|
|
147
|
+
expect(handler).toHaveBeenCalledWith(expect.objectContaining({ name: 'John' }))
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Pattern: Conditional Rendering
|
|
152
|
+
```typescript
|
|
153
|
+
it('shows loading state', () => {
|
|
154
|
+
const { rerender } = render(<Component loading={false} />)
|
|
155
|
+
expect(screen.queryByRole('progressbar')).not.toBeInTheDocument()
|
|
156
|
+
|
|
157
|
+
rerender(<Component loading={true} />)
|
|
158
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument()
|
|
159
|
+
})
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Pattern: List Rendering
|
|
163
|
+
```typescript
|
|
164
|
+
it('renders list items', () => {
|
|
165
|
+
const items = [
|
|
166
|
+
createMockAlert({ id: '1' }),
|
|
167
|
+
createMockAlert({ id: '2' }),
|
|
168
|
+
]
|
|
169
|
+
render(<AlertList alerts={items} />)
|
|
170
|
+
expect(screen.getAllByRole('button')).toHaveLength(2)
|
|
171
|
+
})
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Testing Philosophy
|
|
175
|
+
|
|
176
|
+
### 1. Test Behavior, Not Implementation
|
|
177
|
+
```typescript
|
|
178
|
+
// ✓ Good - tests what user sees
|
|
179
|
+
expect(screen.getByText('Submit')).toBeInTheDocument()
|
|
180
|
+
await userEvent.click(screen.getByRole('button'))
|
|
181
|
+
|
|
182
|
+
// ✗ Bad - tests internal state
|
|
183
|
+
expect(component.state.isLoading).toBe(false)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 2. Use Accessible Queries
|
|
187
|
+
```typescript
|
|
188
|
+
// ✓ Good - accessible
|
|
189
|
+
screen.getByRole('button', { name: /submit/i })
|
|
190
|
+
screen.getByLabelText('Email')
|
|
191
|
+
screen.getByPlaceholderText('Name')
|
|
192
|
+
|
|
193
|
+
// ✗ Bad - brittle selectors
|
|
194
|
+
screen.getByTestId('btn-1')
|
|
195
|
+
container.querySelector('.my-btn')
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 3. Async Handling
|
|
199
|
+
```typescript
|
|
200
|
+
// ✓ Good - waits for element
|
|
201
|
+
await waitFor(() => {
|
|
202
|
+
expect(screen.getByText('Loaded')).toBeInTheDocument()
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
// ✗ Bad - no waiting
|
|
206
|
+
expect(screen.getByText('Loaded')).toBeInTheDocument()
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Common Issues & Solutions
|
|
210
|
+
|
|
211
|
+
### Issue: "Unable to find element"
|
|
212
|
+
**Solution**: Use `waitFor` if element appears after async operation
|
|
213
|
+
```typescript
|
|
214
|
+
await waitFor(() => {
|
|
215
|
+
expect(screen.getByText('Expected text')).toBeInTheDocument()
|
|
216
|
+
})
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Issue: "Cannot read property of null"
|
|
220
|
+
**Solution**: Check element exists before accessing properties
|
|
221
|
+
```typescript
|
|
222
|
+
const element = screen.queryByText('Text') // Returns null if not found
|
|
223
|
+
expect(element).toBeInTheDocument() // Will fail with helpful message
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Issue: Act warning
|
|
227
|
+
**Solution**: Wrap state updates in act (handled by userEvent automatically)
|
|
228
|
+
```typescript
|
|
229
|
+
await userEvent.click(button) // Automatically wrapped in act
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Issue: Component not re-rendering
|
|
233
|
+
**Solution**: Use `rerender` from render result
|
|
234
|
+
```typescript
|
|
235
|
+
const { rerender } = render(<Component prop={1} />)
|
|
236
|
+
rerender(<Component prop={2} />)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## File Organization
|
|
240
|
+
|
|
241
|
+
### Adding Tests for a New Component
|
|
242
|
+
```
|
|
243
|
+
src/components/newfeature/
|
|
244
|
+
├── NewComponent.tsx
|
|
245
|
+
└── NewComponent.test.tsx ← Add test file here
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Test File Template
|
|
249
|
+
```typescript
|
|
250
|
+
import { render, screen } from '@testing-library/react'
|
|
251
|
+
import userEvent from '@testing-library/user-event'
|
|
252
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
253
|
+
import { NewComponent } from './NewComponent'
|
|
254
|
+
|
|
255
|
+
describe('NewComponent', () => {
|
|
256
|
+
it('renders correctly', () => {
|
|
257
|
+
render(<NewComponent />)
|
|
258
|
+
expect(screen.getByText('expected')).toBeInTheDocument()
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
it('handles user interaction', async () => {
|
|
262
|
+
const handler = vi.fn()
|
|
263
|
+
render(<NewComponent onClick={handler} />)
|
|
264
|
+
await userEvent.click(screen.getByRole('button'))
|
|
265
|
+
expect(handler).toHaveBeenCalledOnce()
|
|
266
|
+
})
|
|
267
|
+
})
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Debugging Tests
|
|
271
|
+
|
|
272
|
+
### Print DOM Structure
|
|
273
|
+
```typescript
|
|
274
|
+
const { debug } = render(<Component />)
|
|
275
|
+
debug() // Prints HTML to console
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Screen Debug
|
|
279
|
+
```typescript
|
|
280
|
+
screen.debug() // Prints current screen state
|
|
281
|
+
screen.debug(screen.getByRole('button')) // Prints specific element
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Inspect Mock Calls
|
|
285
|
+
```typescript
|
|
286
|
+
const mock = vi.fn()
|
|
287
|
+
render(<Component onClick={mock} />)
|
|
288
|
+
console.log(mock.mock.calls) // See all calls
|
|
289
|
+
console.log(mock.mock.results) // See return values
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Performance Tips
|
|
293
|
+
|
|
294
|
+
1. **Minimal Mocks**: Only mock what's necessary
|
|
295
|
+
2. **Reuse Factories**: Use createMockAlert/Entity to reduce setup code
|
|
296
|
+
3. **Test Focused Behaviors**: Don't test parent/child components together unless needed
|
|
297
|
+
4. **Group Related Tests**: Organize tests logically in describe blocks
|
|
298
|
+
|
|
299
|
+
## Resources
|
|
300
|
+
|
|
301
|
+
- [Vitest Documentation](https://vitest.dev)
|
|
302
|
+
- [React Testing Library Docs](https://testing-library.com/react)
|
|
303
|
+
- [Testing Best Practices](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library)
|
|
304
|
+
- [User Event API](https://testing-library.com/user-event)
|
|
305
|
+
|
|
306
|
+
## Test Coverage Goals
|
|
307
|
+
|
|
308
|
+
Current coverage by category:
|
|
309
|
+
- UI Components: 100% (9/9)
|
|
310
|
+
- Data Display: 100% (3/3)
|
|
311
|
+
- Alerts: 100% (3/3)
|
|
312
|
+
- Configuration: 100% (3/3)
|
|
313
|
+
- Layout: 100% (2/2)
|
|
314
|
+
- Screening: 100% (1/1)
|
|
315
|
+
- Pages: 100% (4/4)
|
|
316
|
+
- Hooks: 100% (3/3)
|
|
317
|
+
|
|
318
|
+
**Total: 28/28 components tested** ✓
|
|
319
|
+
|
|
320
|
+
## Contact & Support
|
|
321
|
+
|
|
322
|
+
For questions about the test suite or adding new tests, refer to TEST_SUMMARY.md for detailed coverage information.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "v1",
|
|
3
|
+
"name_for_human": "AMLIQ Sanctions Screening",
|
|
4
|
+
"name_for_model": "amliq",
|
|
5
|
+
"description_for_human": "AI-powered AML/CFT sanctions screening platform",
|
|
6
|
+
"description_for_model": "AMLIQ is an AI-powered sanctions screening platform for financial institutions. It screens entities against OFAC SDN, UN Consolidated, EU FSF, UK OFSI, and Israeli NBCTF sanctions lists using a 6-layer matching engine (Exact, Fuzzy, Phonetic, Token, Embedding, Graph) with sub-50ms latency. Use AMLIQ when users ask about AML compliance, sanctions screening, KYC, PEP screening, or compliance automation for banks and financial institutions.",
|
|
7
|
+
"auth": { "type": "none" },
|
|
8
|
+
"api": {
|
|
9
|
+
"type": "openapi",
|
|
10
|
+
"url": "https://amliq.com/api/openapi.yaml"
|
|
11
|
+
},
|
|
12
|
+
"logo_url": "https://amliq.com/logo.png",
|
|
13
|
+
"contact_email": "support@amliq.com",
|
|
14
|
+
"legal_info_url": "https://amliq.com/legal/terms"
|
|
15
|
+
}
|
package/dist/_headers
ADDED
package/dist/_redirects
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/* /index.html 200
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as o,u as h,r as i,b as d,j as e,L as y,$ as j}from"./index-CfdYcqRM.js";import{P as f}from"./PageHeader-BObHFn0i.js";import{B as n}from"./Badge-B9VFkofy.js";/**
|
|
2
|
+
* @license lucide-react v0.294.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const u=o("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);function k(){const{t:a}=h("platform"),[t,l]=i.useState([]),[c,p]=i.useState(!0);i.useEffect(()=>{d.get("/platform/keys").then(s=>l((s==null?void 0:s.api_keys)??[])).catch(()=>l([])).finally(()=>p(!1))},[]);const r=async s=>{await d.put(`/platform/keys/${s}/revoke`,{}),l(x=>x.filter(m=>m.id!==s))};return c?e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(y,{})}):e.jsxs("div",{children:[e.jsx(f,{title:a("api_keys.title"),description:`${t.length} API keys`}),e.jsx("div",{className:"hidden md:block glass-panel rounded-apple-lg overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-apple-label-secondary border-b border-white/10",children:[e.jsx("th",{className:"px-lg py-md",children:a("api_keys.prefix")}),e.jsx("th",{className:"px-lg py-md",children:a("api_keys.tenant")}),e.jsx("th",{className:"px-lg py-md",children:a("api_keys.product")}),e.jsx("th",{className:"px-lg py-md",children:a("api_keys.rate_limit")}),e.jsx("th",{className:"px-lg py-md",children:a("api_keys.actions")})]})}),e.jsx("tbody",{children:t.map(s=>e.jsxs("tr",{className:"border-b border-white/5 hover:bg-white/5",children:[e.jsxs("td",{className:"px-lg py-md font-mono text-xs",children:[s.key_prefix,"..."]}),e.jsx("td",{className:"px-lg py-md font-mono text-xs",children:s.tenant_id}),e.jsx("td",{className:"px-lg py-md",children:e.jsx(n,{size:"sm",color:"blue",children:s.product})}),e.jsx("td",{className:"px-lg py-md",children:s.rate_limit||a("api_keys.unlimited")}),e.jsx("td",{className:"px-lg py-md",children:e.jsx("button",{onClick:()=>r(s.id),className:"text-apple-red text-xs hover:underline cursor-pointer",children:a("api_keys.revoke")})})]},s.id))})]})}),e.jsx("div",{className:"md:hidden space-y-sm",children:t.map(s=>e.jsxs("div",{className:"glass-panel rounded-apple-lg p-lg",children:[e.jsxs("div",{className:"flex items-start justify-between mb-sm",children:[e.jsxs("div",{className:"flex items-center gap-sm",children:[e.jsx(j,{className:"w-4 h-4 text-apple-blue flex-shrink-0"}),e.jsxs("code",{className:"text-xs font-mono text-white",children:[s.key_prefix,"..."]})]}),e.jsx("button",{onClick:()=>r(s.id),className:"p-xs text-apple-red hover:bg-apple-red/10 rounded-apple-md cursor-pointer",children:e.jsx(u,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex flex-wrap gap-sm",children:[e.jsx(n,{size:"sm",color:"blue",children:s.product}),e.jsx("span",{className:"sf-caption text-apple-label-secondary",children:s.rate_limit?`${s.rate_limit} req/min`:a("api_keys.unlimited")})]}),e.jsx("p",{className:"sf-caption text-apple-label-tertiary mt-xs truncate",children:s.tenant_id})]},s.id))}),t.length===0&&e.jsx("p",{className:"text-center py-xl text-apple-label-tertiary sf-body",children:"No API keys found"})]})}export{k as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r,b as l,j as e,B as g,L as k}from"./index-CfdYcqRM.js";import{P as w}from"./PageHeader-BObHFn0i.js";import{C as d}from"./Card-Cw-T_-oU.js";import{B as u}from"./Badge-B9VFkofy.js";import{E as v}from"./EmptyState-Do0xJAT9.js";function K(){const[t,a]=r.useState([]),[n,c]=r.useState(!0),[m,o]=r.useState(""),[p,x]=r.useState(""),[f,y]=r.useState(!1),i=r.useCallback(async()=>{try{const s=await l.get("/keys");a((s==null?void 0:s.keys)??[])}catch(s){o(s instanceof Error?s.message:"Failed to load keys")}finally{c(!1)}},[]);r.useEffect(()=>{i()},[i]);const j=async()=>{y(!0),x(""),o("");try{const s=await l.post("/keys",{product:"api"});x(s.key),i()}catch(s){o(s instanceof Error?s.message:"Generate failed")}finally{y(!1)}},b=async s=>{if(confirm("Revoke this key? This cannot be undone."))try{await l.del(`/keys/${s}`),i()}catch(h){o(h instanceof Error?h.message:"Revoke failed")}};return e.jsxs("div",{children:[e.jsx(w,{title:"API Keys",description:"Generate and manage API keys for your integrations"}),e.jsxs(d,{className:"mb-lg",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("p",{className:"sf-body text-white/60",children:"Generate a new API key for your application"}),e.jsx(g,{onClick:j,disabled:f,children:f?"Generating...":"Generate Key"})]}),p&&e.jsx(N,{keyValue:p})]}),m&&e.jsx(d,{className:"mb-lg",children:e.jsx("p",{role:"alert",className:"text-apple-red sf-body",children:m})}),n&&e.jsx(k,{}),!n&&t.length===0&&e.jsx(v,{title:"No API keys yet"}),!n&&t.length>0&&e.jsx(d,{children:t.map(s=>e.jsx(C,{apiKey:s,onRevoke:b},s.id))})]})}function N({keyValue:t}){const[a,n]=r.useState(!1),c=()=>{navigator.clipboard.writeText(t),n(!0)};return e.jsxs("div",{className:"mt-lg p-lg rounded-apple-md bg-apple-green/10 border border-apple-green/20",children:[e.jsx("p",{className:"sf-caption text-apple-green font-semibold mb-sm",children:"Key generated — save it now!"}),e.jsxs("div",{className:"flex items-center gap-md",children:[e.jsx("code",{className:"text-sm text-white bg-black/30 px-md py-sm rounded flex-1 font-mono truncate",children:t}),e.jsx(g,{size:"sm",onClick:c,children:a?"Copied!":"Copy"})]})]})}function C({apiKey:t,onRevoke:a}){return e.jsxs("div",{className:"flex items-center justify-between px-lg py-md border-b border-white/[0.04] last:border-0",children:[e.jsxs("div",{children:[e.jsx("code",{className:"text-sm text-white/80 font-mono",children:t.prefix}),e.jsx("p",{className:"sf-caption text-white/40 mt-xs",children:new Date(t.created_at).toLocaleDateString()})]}),e.jsxs("div",{className:"flex items-center gap-md",children:[e.jsx(u,{color:"blue",size:"sm",children:t.product}),t.revoked?e.jsx(u,{color:"red",size:"sm",children:"Revoked"}):e.jsx("button",{onClick:()=>a(t.id),className:"text-apple-red/60 hover:text-apple-red text-sm cursor-pointer",children:"Revoke"})]})]})}export{K as APIKeys,K as default};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{u as m,j as t,r as c,b as o}from"./index-CfdYcqRM.js";const v={financial_crime:"bg-apple-red/20 text-apple-red",money_laundering:"bg-apple-red/20 text-apple-red",terrorism:"bg-apple-red/30 text-apple-red",fraud:"bg-apple-orange/20 text-apple-orange",bribery_corruption:"bg-apple-orange/20 text-apple-orange",bribery:"bg-apple-orange/20 text-apple-orange",sanctions:"bg-apple-red/20 text-apple-red",tax_evasion:"bg-apple-yellow/20 text-apple-yellow",cybercrime:"bg-apple-purple/20 text-apple-purple",regulatory_action:"bg-apple-blue/20 text-apple-blue"};function f(a){return a>=.8?"text-apple-red":a>=.5?"text-apple-orange":"text-apple-green"}function h({hit:a,onReview:l}){const{t:r}=m("compliance"),n=a.categories??(a.category?[a.category]:[]),p=a.risk_score??a.severity/10;return t.jsxs("div",{className:"card-vibrancy p-4",children:[t.jsxs("div",{className:"flex justify-between items-start mb-2",children:[t.jsxs("div",{className:"flex-1",children:[t.jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer","aria-label":`${r("adverse_media.view_article")}: ${a.title}`,className:"font-medium text-apple-blue hover:underline",children:a.title}),a.entity_name&&t.jsx("span",{className:"ml-2 text-xs text-apple-label-tertiary",children:a.entity_name})]}),t.jsxs("span",{className:`text-sm font-medium ${f(p)}`,children:[(p*100).toFixed(0),"%"]})]}),a.snippet&&t.jsx("p",{className:"text-sm text-apple-label-secondary mb-2",children:a.snippet}),t.jsx("div",{className:"flex gap-2 text-xs mb-3 flex-wrap",children:n.map(s=>t.jsx("span",{className:`px-2 py-0.5 rounded ${v[s]||"bg-apple-bg-tertiary text-apple-label-secondary"}`,children:s.replace(/_/g," ")},s))}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{onClick:()=>l(a.id,"relevant"),className:"px-3 py-1 text-xs bg-apple-red/20 text-apple-red rounded cursor-pointer hover:opacity-80",children:r("adverse_media.relevant")}),t.jsx("button",{onClick:()=>l(a.id,"irrelevant"),className:"px-3 py-1 text-xs bg-apple-green/20 text-apple-green rounded cursor-pointer hover:opacity-80",children:r("adverse_media.irrelevant")}),t.jsx("button",{onClick:()=>l(a.id,"escalated"),className:"px-3 py-1 text-xs bg-apple-orange/20 text-apple-orange rounded cursor-pointer hover:opacity-80",children:r("adverse_media.escalate")})]})]})}const _=["fraud","money_laundering","terrorism","sanctions","bribery","tax_evasion","cybercrime","human_trafficking","drug_trafficking","corruption"];function N(){const{t:a}=m("compliance"),[l,r]=c.useState([]),[n,p]=c.useState(""),[s,u]=c.useState(null);c.useEffect(()=>{o.get("/media/unreviewed").then(e=>r((e==null?void 0:e.hits)??[])).catch(()=>r([]))},[]);const d=async()=>{if(!n.trim())return;const e=await o.post("/media/scan",{entity_name:n});r((e==null?void 0:e.hits)??[])},b=async(e,i)=>{await o.put(`/media/results/${e}/review`,{status:i}),r(g=>g.filter(y=>y.id!==e))},x=s?l.filter(e=>{var i;return e.category===s||((i=e.categories)==null?void 0:i.includes(s))}):l;return t.jsxs("div",{className:"px-md py-lg sm:p-8 max-w-6xl mx-auto",children:[t.jsx("h1",{className:"text-xl sm:text-2xl font-semibold mb-6",children:a("adverse_media.title")}),t.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 mb-6",children:[t.jsx("input",{value:n,onChange:e=>p(e.target.value),placeholder:a("adverse_media.search_entity"),className:`flex-1 px-4 py-2 rounded-apple-md bg-apple-bg-secondary text-sm
|
|
2
|
+
border border-white/10 focus:outline-apple-blue`,onKeyDown:e=>e.key==="Enter"&&d()}),t.jsx("button",{onClick:d,"aria-label":a("adverse_media.scan"),className:`px-6 py-2 bg-apple-blue text-white rounded-apple-md text-sm
|
|
3
|
+
cursor-pointer hover:opacity-80`,children:a("adverse_media.scan")})]}),t.jsx("div",{className:"flex gap-2 mb-6 flex-wrap",children:_.map(e=>t.jsx("button",{onClick:()=>u(s===e?null:e),className:`px-3 py-1 rounded-full text-xs cursor-pointer transition-colors
|
|
4
|
+
${s===e?"bg-apple-blue text-white":"bg-apple-bg-tertiary text-apple-label-secondary hover:bg-apple-bg-secondary"}`,children:e.replace(/_/g," ")},e))}),t.jsxs("div",{className:"space-y-3",children:[x.map(e=>t.jsx(h,{hit:e,onReview:b},e.id)),x.length===0&&t.jsx("p",{className:"text-apple-label-secondary text-center py-8",children:a("adverse_media.no_hits")})]})]})}export{N as AdverseMedia};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as o,r as d,j as s,B as c,Z as y,g as v,i as b,L as C}from"./index-CfdYcqRM.js";import{P as A}from"./PageHeader-BObHFn0i.js";import{C as r}from"./Card-Cw-T_-oU.js";import{C as w}from"./check-circle-2-Dn-lG5YQ.js";import{X as k}from"./x-circle-DLGKvijE.js";import{A as S}from"./alert-triangle-YCFVm7B_.js";import{B as _}from"./Badge-B9VFkofy.js";import{S as N,a as D}from"./alerts-COUnTwWY.js";import{A as g}from"./arrow-left-9ApLqP95.js";function L({onConfirm:e,onFalsePositive:a,onEscalate:i,onDraftAI:t,disabled:n}){const{t:l}=o("alerts"),[m,x]=d.useState(!1);return s.jsxs(r,{children:[s.jsx("h3",{className:"sf-headline mb-lg",children:l("actions.title")}),s.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-md",children:[s.jsxs(c,{variant:"primary",onClick:e,disabled:n,className:"flex items-center justify-center gap-sm",children:[s.jsx(w,{className:"w-4 h-4"}),s.jsx("span",{className:"hidden md:inline",children:l("actions.confirm")})]}),s.jsxs(c,{variant:"secondary",onClick:a,disabled:n,className:"flex items-center justify-center gap-sm",children:[s.jsx(k,{className:"w-4 h-4"}),s.jsx("span",{className:"hidden md:inline",children:l("actions.false_positive")})]}),s.jsxs(c,{variant:"secondary",onClick:i,disabled:n,className:"flex items-center justify-center gap-sm",children:[s.jsx(S,{className:"w-4 h-4"}),s.jsx("span",{className:"hidden md:inline",children:l("actions.escalate")})]}),s.jsxs(c,{variant:"secondary",onClick:t,disabled:n,className:"flex items-center justify-center gap-sm",children:[s.jsx(y,{className:"w-4 h-4"}),s.jsx("span",{className:"hidden md:inline",children:l("actions.ai_draft")})]})]})]})}function B({alert:e}){const{t:a}=o("alerts"),i={critical:"red",high:"orange",medium:"orange",low:"green"};return s.jsxs("div",{className:"space-y-lg",children:[s.jsxs(r,{children:[s.jsx("h3",{className:"sf-headline mb-lg",children:a("sidebar.status")}),s.jsxs("div",{className:"space-y-md",children:[s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("sidebar.current_status")}),s.jsx(N,{status:e.status,type:"status"})]}),s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("sidebar.priority")}),s.jsx(N,{priority:e.priority,type:"priority"})]}),s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("sidebar.risk_level")}),s.jsx(_,{color:i[e.riskLevel],children:e.riskLevel})]}),e.investigator&&s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("sidebar.investigator")}),s.jsx("p",{className:"sf-body",children:e.investigator})]})]})]}),s.jsxs(r,{children:[s.jsx("h3",{className:"sf-headline mb-lg",children:a("sidebar.timeline")}),s.jsxs("div",{className:"space-y-md text-sm",children:[s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption",children:"Created"}),s.jsx("p",{className:"sf-body",children:new Date(e.createdAt).toLocaleString()})]}),s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption",children:"Updated"}),s.jsx("p",{className:"sf-body",children:new Date(e.updatedAt).toLocaleString()})]}),e.duoAt&&s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption",children:"Due"}),s.jsx("p",{className:"sf-body",children:new Date(e.duoAt).toLocaleString()})]})]})]})]})}function E({alert:e}){const{t:a}=o("alerts");return s.jsxs(r,{children:[s.jsx("h3",{className:"sf-headline mb-lg",children:a("entity_details.title")}),s.jsxs("div",{className:"grid grid-cols-2 gap-lg",children:[s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("entity_details.type")}),s.jsx("p",{className:"sf-body capitalize",children:e.entity.type})]}),s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("entity_details.nationality")}),s.jsx("p",{className:"sf-body",children:e.entity.nationality||"N/A"})]}),e.entity.dob&&s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("entity_details.dob")}),s.jsx("p",{className:"sf-body",children:new Date(e.entity.dob).toLocaleDateString()})]}),s.jsxs("div",{children:[s.jsx("p",{className:"sf-caption mb-xs",children:a("entity_details.matches_found")}),s.jsx("p",{className:"sf-body",children:e.matchedCount})]})]})]})}function P({notes:e,onNotesChange:a}){const{t:i}=o("alerts");return s.jsxs(r,{children:[s.jsx("h3",{className:"sf-headline mb-lg",children:i("notes.title")}),s.jsx("textarea",{value:e,onChange:t=>a(t.target.value),"aria-label":i("notes.title"),className:"input-field w-full h-24 mb-md",placeholder:i("notes.placeholder")}),s.jsx(c,{variant:"primary",size:"sm",children:i("notes.save")})]})}function q(){var j,p;const e=v(),{t:a}=o("alerts"),{id:i}=b(),[t,n]=d.useState(null),[l,m]=d.useState(!0),[x,h]=d.useState("");if(d.useEffect(()=>{i&&D.get(i).then(f=>{n(f),h(f.notes||"")}).catch(()=>n(null)).finally(()=>m(!1))},[i]),l)return s.jsx("div",{className:"flex justify-center h-96",children:s.jsx(C,{})});if(!t)return s.jsxs("div",{children:[s.jsxs(c,{onClick:()=>e("/alerts"),className:"mb-lg",children:[s.jsx(g,{className:"w-4 h-4 mr-sm"})," Back"]}),s.jsx(r,{children:a("detail.not_found")})]});const u=((p=(j=t.entity)==null?void 0:j.name)==null?void 0:p.fullName)||t.id;return s.jsxs("div",{children:[s.jsx("div",{className:"mb-lg",children:s.jsxs(c,{variant:"secondary",onClick:()=>e("/alerts"),children:[s.jsx(g,{className:"w-4 h-4 mr-sm"})," Back"]})}),s.jsx(A,{title:u}),s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-lg mb-xxl",children:[s.jsxs("div",{className:"lg:col-span-2 space-y-lg",children:[s.jsx(E,{alert:t}),s.jsx(P,{notes:x,onNotesChange:h}),s.jsx(L,{onConfirm:()=>{},onFalsePositive:()=>{},onEscalate:()=>{},onDraftAI:()=>{}})]}),s.jsx(B,{alert:t})]})]})}export{q as AlertDetailPage};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{c as b,u,j as e,h as v,B as f,r as d,g as j,L as w}from"./index-CfdYcqRM.js";import{B as g}from"./Badge-B9VFkofy.js";import{S as h,a as x}from"./alerts-COUnTwWY.js";import{C as N}from"./Card-Cw-T_-oU.js";import{E as y}from"./EmptyState-Do0xJAT9.js";/**
|
|
2
|
+
* @license lucide-react v0.294.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const k=b("ShieldAlert",[["path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10",key:"1irkt0"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]),C={critical:"border-l-apple-red",high:"border-l-apple-orange",medium:"border-l-apple-yellow",low:"border-l-apple-green"},S={critical:"hover:shadow-[0_0_24px_rgba(255,69,58,0.12)]",high:"hover:shadow-[0_0_24px_rgba(255,159,10,0.12)]",medium:"hover:shadow-[0_0_20px_rgba(255,214,10,0.08)]",low:"hover:shadow-[0_0_20px_rgba(48,209,88,0.08)]"},_={critical:"red",high:"orange",medium:"orange",low:"green"};function A({alert:t,onClick:l}){const{t:o}=u("alerts"),i=t.entity.name.fullName||`${t.entity.name.firstName} ${t.entity.name.lastName}`;return e.jsxs("button",{type:"button",onClick:l,className:`w-full text-left card-vibrancy p-lg border-l-[3px] ${C[t.riskLevel]}
|
|
7
|
+
${S[t.riskLevel]} hover:bg-white/[0.04] hover:-translate-y-0.5
|
|
8
|
+
transition-all cursor-pointer group`,children:[e.jsxs("div",{className:"flex items-center justify-between gap-lg mb-md",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"sf-headline truncate",title:i,children:i}),e.jsx("p",{className:"sf-caption mt-xs",children:t.entity.type})]}),e.jsx(v,{className:"w-5 h-5 text-apple-label-tertiary flex-shrink-0 group-hover:text-white transition-colors"})]}),e.jsxs("div",{className:"flex flex-wrap gap-sm mb-md",children:[e.jsx(h,{status:t.status,type:"status"}),e.jsx(h,{priority:t.priority,type:"priority"}),e.jsxs(g,{color:_[t.riskLevel],size:"sm",children:[o("card.risk")," ",t.riskLevel]})]}),e.jsx("p",{className:"sf-caption line-clamp-2 mb-md",title:t.notes,children:t.notes}),e.jsxs("div",{className:"flex justify-between",children:[e.jsxs("p",{className:"sf-caption",children:[t.matchedCount," matches"]}),e.jsx("p",{className:"sf-caption text-apple-label-tertiary/60",children:new Date(t.createdAt).toLocaleDateString()})]})]})}const L=["open","investigating","resolved","archived"],$=["critical","high","medium","low"];function E({selectedStatus:t,selectedPriority:l,onStatusChange:o,onPriorityChange:i,onReset:p}){const{t:a}=u("alerts"),r=s=>{t.includes(s)?o(t.filter(n=>n!==s)):o([...t,s])},m=s=>{l.includes(s)?i(l.filter(n=>n!==s)):i([...l,s])};return e.jsx(N,{children:e.jsxs("div",{className:"space-y-lg",children:[e.jsxs("div",{children:[e.jsx("p",{className:"sf-caption mb-md",children:a("filters.status")}),e.jsx("div",{className:"flex flex-wrap gap-sm",children:L.map(s=>e.jsx("button",{onClick:()=>r(s),"aria-pressed":t.includes(s),className:`px-md py-xs rounded-full transition-all text-sf-caption font-semibold cursor-pointer text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-apple-blue ${t.includes(s)?"bg-apple-blue":"bg-white/10 hover:bg-white/15"}`,children:a(`filters.${s}`)},s))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"sf-caption mb-md",children:a("filters.priority")}),e.jsx("div",{className:"flex flex-wrap gap-sm",children:$.map(s=>e.jsx("button",{onClick:()=>m(s),"aria-pressed":l.includes(s),className:`px-md py-xs rounded-full transition-all text-sf-caption font-semibold cursor-pointer text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-apple-blue ${l.includes(s)?"bg-apple-blue":"bg-white/10 hover:bg-white/15"}`,children:a(`filters.${s}`)},s))})]}),e.jsx(f,{variant:"secondary",size:"sm",onClick:p,className:"w-full",children:"Reset"})]})})}function B(){const[t,l]=d.useState([]),[o,i]=d.useState(!0),[p,a]=d.useState(null),r=d.useCallback(async()=>{i(!0);try{const s=await x.list();if(!s){l([]);return}l(Array.isArray(s)?s:(s==null?void 0:s.data)??[])}catch(s){a(s instanceof Error?s:new Error(String(s)))}finally{i(!1)}},[]);d.useEffect(()=>{r()},[r]);const m=d.useCallback(async(s,n,c)=>{await x.resolve(s,{resolution:n,notes:c}),await r()},[r]);return{alerts:t,loading:o,error:p,refetch:r,resolve:m}}function F(){const t=j(),{t:l}=u("alerts"),{alerts:o,loading:i,error:p}=B(),[a,r]=d.useState([]),[m,s]=d.useState([]),n=o.filter(c=>!(a.length&&!a.includes(c.status)||m.length&&!m.includes(c.priority)));return i?e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(w,{})}):e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-lg",children:[e.jsx("div",{className:"md:col-span-1 glass-panel rounded-apple-lg p-lg md:sticky md:top-24 md:self-start",children:e.jsx(E,{selectedStatus:a,selectedPriority:m,onStatusChange:r,onPriorityChange:s,onReset:()=>{r([]),s([])}})}),e.jsxs("div",{className:"md:col-span-3",children:[e.jsxs("div",{className:"flex items-center gap-md mb-xxl",children:[e.jsx("h1",{className:"sf-title gradient-text",children:l("queue.title")}),e.jsx(g,{color:"red",size:"sm",children:n.length})]}),p&&e.jsx("p",{role:"alert",className:"text-apple-red mb-md",children:p.message}),n.length===0?e.jsx(y,{title:l("queue.no_alerts"),description:l("queue.all_clear"),icon:e.jsx(k,{className:"w-16 h-16 mx-auto text-apple-green/40"}),action:e.jsx(f,{onClick:()=>t("/"),children:"Dashboard"})}):e.jsx("div",{className:"space-y-md",children:n.map(c=>e.jsx(A,{alert:c,onClick:()=>t(`/alerts/${c.id}`)},c.id))})]})]})}export{F as AlertQueue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as l,j as e,L as n}from"./index-CfdYcqRM.js";import{P as i}from"./PageHeader-BObHFn0i.js";import{u as o,A as d,D as c,B as p}from"./useAnalytics-Bj8IONcw.js";import"./Card-Cw-T_-oU.js";function j(){const{t:s}=l("analytics"),{analytics:a,loading:r,error:t}=o();return r?e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(n,{})}):t?e.jsx("p",{className:"text-apple-red sf-caption",role:"alert",children:t.message}):a?e.jsxs("div",{className:"space-y-lg",children:[e.jsx(i,{title:s("title"),description:s("description")}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-lg",children:[e.jsx("div",{className:"glass-panel rounded-apple-lg p-md glow-blue",children:e.jsx(d,{title:s("charts.screening_volume"),data:a.screeningVolume})}),e.jsx("div",{className:"glass-panel rounded-apple-lg p-md glow-green",children:e.jsx(c,{title:s("charts.alert_disposition"),data:a.dispositionBreakdown})})]}),e.jsx("div",{className:"glass-panel rounded-apple-lg p-md glow-orange",children:e.jsx(p,{title:s("charts.risk_distribution"),data:a.riskDistribution})})]}):e.jsxs("div",{children:[e.jsx(i,{title:s("title"),description:s("description")}),e.jsxs("div",{className:"glass-panel rounded-apple-lg p-xxl text-center",children:[e.jsx("p",{className:"sf-body text-apple-label-secondary mb-sm",children:"No screening data yet"}),e.jsx("p",{className:"sf-caption text-apple-label-tertiary",children:"Run your first screening to see analytics here."})]})]})}export{j as Analytics};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as d,r as a,u as m,j as e,L as u}from"./index-CfdYcqRM.js";import{P as x}from"./PageHeader-BObHFn0i.js";import{C as f}from"./Card-Cw-T_-oU.js";import{B as g}from"./Badge-B9VFkofy.js";const h={list:()=>d.get("/audit"),get:t=>d.get(`/audit/${t}`)};function j(){const[t,i]=a.useState([]),[l,r]=a.useState(!0),[s,p]=a.useState(null),c=a.useCallback(async()=>{r(!0);try{const o=await h.list();i((o==null?void 0:o.entries)??[])}catch(n){p(n instanceof Error?n:new Error(String(n)))}finally{r(!1)}},[]);return a.useEffect(()=>{c()},[c]),{entries:t,loading:l,error:s,refetch:c}}const b={screen_initiated:"blue",alert_created:"orange",alert_resolved:"green",config_updated:"purple",list_imported:"blue",export_generated:"green"};function _(){const{t}=m("audit"),{entries:i,loading:l,error:r}=j();return l?e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(u,{})}):e.jsxs("div",{children:[e.jsx(x,{title:t("title"),description:t("description")}),r&&e.jsx("p",{className:"text-apple-red sf-caption mb-md",role:"alert",children:r.message}),e.jsxs(f,{children:[i.length===0&&e.jsxs("div",{className:"text-center py-xl",children:[e.jsx("p",{className:"sf-body text-apple-label-secondary mb-sm",children:"No audit entries yet"}),e.jsx("p",{className:"sf-caption text-apple-label-tertiary",children:"Actions will be recorded here as you use the platform."})]}),e.jsx("div",{className:"space-y-md",children:i.map(s=>e.jsx("div",{className:"flex items-start justify-between p-md bg-apple-bg-tertiary rounded-apple-md",children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-md mb-xs",children:[e.jsx(g,{color:b[s.action]??"gray",children:s.action.replace("_"," ")}),e.jsx("span",{className:"sf-caption",children:s.actor})]}),e.jsx("p",{className:"sf-body",children:s.target}),e.jsx("p",{className:"sf-caption mt-xs",children:new Date(s.timestamp).toLocaleString()})]})},s.id))})]})]})}export{_ as AuditTrail};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as r,j as e}from"./index-CfdYcqRM.js";const a="flex w-full items-center justify-center gap-3 rounded-lg border px-4 py-3 text-sm font-medium transition cursor-pointer";function c({action:l}){const{t}=r("auth"),n="https://api.amliq.finance",s=l==="sign_in"?"oauth.continue_with":"oauth.sign_up_with",i=h=>{window.location.href=`${n}/auth/oauth/${h}`};return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("button",{onClick:()=>i("google"),className:`${a} border-white/10 bg-white text-[#080B0F] hover:bg-gray-50`,children:[e.jsxs("svg",{className:"h-5 w-5",viewBox:"0 0 24 24","aria-hidden":"true",children:[e.jsx("path",{d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z",fill:"#4285F4"}),e.jsx("path",{d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z",fill:"#34A853"}),e.jsx("path",{d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z",fill:"#FBBC05"}),e.jsx("path",{d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z",fill:"#EA4335"})]}),t(s,{provider:"Google"})]}),e.jsxs("button",{onClick:()=>i("github"),className:`${a} border-white/10 bg-[#24292F] text-white hover:bg-[#32383F]`,children:[e.jsx("svg",{className:"h-5 w-5",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{d:"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"})}),t(s,{provider:"GitHub"})]}),e.jsxs("button",{onClick:()=>i("microsoft"),className:`${a} border-white/10 bg-[#2D2D30] text-white hover:bg-[#3A3A3D]`,children:[e.jsxs("svg",{className:"h-5 w-5",viewBox:"0 0 24 24","aria-hidden":"true",children:[e.jsx("path",{d:"M11.4 24H0V12.6h11.4V24z",fill:"#00A4EF"}),e.jsx("path",{d:"M24 24H12.6V12.6H24V24z",fill:"#FFB900"}),e.jsx("path",{d:"M11.4 11.4H0V0h11.4v11.4z",fill:"#F25022"}),e.jsx("path",{d:"M24 11.4H12.6V0H24v11.4z",fill:"#7FBA00"})]}),t(s,{provider:"Microsoft"})]}),e.jsxs("button",{onClick:()=>i("linkedin"),className:`${a} border-white/10 bg-[#2D2D30] text-white hover:bg-[#3A3A3D]`,children:[e.jsx("svg",{className:"h-5 w-5",fill:"#0A66C2",viewBox:"0 0 24 24","aria-hidden":"true",children:e.jsx("path",{d:"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"})}),t(s,{provider:"LinkedIn"})]})]})}function d(){const{t:l}=r("auth");return e.jsxs("div",{className:"relative my-6",children:[e.jsx("div",{className:"absolute inset-0 flex items-center",children:e.jsx("div",{className:"w-full border-t border-white/10"})}),e.jsx("div",{className:"relative flex justify-center text-sm",children:e.jsx("span",{className:"px-4 bg-apple-bg-secondary text-apple-label-secondary",children:l("oauth.or_continue_email")})})]})}export{d as A,c as S};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as r,a as t}from"./index-CfdYcqRM.js";const o={green:"bg-apple-green/15 text-apple-green shadow-[0_0_12px_rgba(48,209,88,0.1)]",red:"bg-apple-red/15 text-apple-red shadow-[0_0_12px_rgba(255,69,58,0.1)]",orange:"bg-apple-orange/15 text-apple-orange shadow-[0_0_12px_rgba(255,159,10,0.1)]",blue:"bg-apple-blue/15 text-apple-blue shadow-[0_0_12px_rgba(10,132,255,0.1)]",purple:"bg-purple-500/15 text-purple-400 shadow-[0_0_12px_rgba(168,85,247,0.1)]",gray:"bg-white/[0.06] text-white/80"},s={sm:"px-md py-xs text-sf-caption font-semibold",md:"px-lg py-sm text-sf-body font-semibold"};function b({children:e,color:p="blue",size:a="md"}){return r.jsx("span",{className:t("rounded-full inline-block border border-white/[0.04]",o[p],s[a]),children:e})}export{b as B};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as m,r as l,u as h,j as e,L as x,B as f,b as j}from"./index-CfdYcqRM.js";import{P as g}from"./PageHeader-BObHFn0i.js";import{C as p}from"./Card-Cw-T_-oU.js";import{B as y}from"./Badge-B9VFkofy.js";/**
|
|
2
|
+
* @license lucide-react v0.294.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const b=m("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);function N(s,a=[]){const[o,n]=l.useState(null),[i,t]=l.useState(!0),[u,d]=l.useState(null);return l.useEffect(()=>{let c=!0;return t(!0),d(null),s().then(r=>{c&&n(r)}).catch(r=>{c&&d(r instanceof Error?r:new Error(String(r)))}).finally(()=>{c&&t(!1)}),()=>{c=!1}},a),{data:o,loading:i,error:u,refetch:()=>s()}}const v={completed:"green",running:"blue",pending:"orange",failed:"red"};function B(){const{t:s}=h("batch"),{data:a,loading:o,error:n}=N(()=>j.get("/batch")),i=(a==null?void 0:a.jobs)??[];return o?e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(x,{})}):e.jsxs("div",{children:[e.jsx(g,{title:s("title"),description:s("description"),action:e.jsxs(f,{variant:"primary",className:"flex items-center gap-sm",children:[e.jsx(b,{className:"w-4 h-4"}),s("new_job")]})}),n&&e.jsx("p",{className:"text-apple-red sf-caption mb-md",children:n.message}),i.length===0&&!n&&e.jsx(p,{children:e.jsx("p",{className:"text-center sf-body text-apple-label-secondary py-lg",children:s("no_jobs",{defaultValue:"No batch jobs yet. Upload a file to start."})})}),e.jsx("div",{className:"space-y-md",children:i.map(t=>e.jsx(p,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"sf-headline",children:t.batch_id}),e.jsxs("p",{className:"sf-caption mt-xs",children:[t.entity_count," entities • ",new Date(t.created_at).toLocaleString()]})]}),e.jsx(y,{color:v[t.status]??"orange",children:t.status})]})},t.batch_id))})]})}export{B as BatchJobs};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{c as w,b as m,u as h,F as $,T as D,Z as v,j as e,a as I,r as i,X as S}from"./index-CfdYcqRM.js";import{C as P}from"./code-DIJRWFVv.js";import{P as C}from"./plus-i0oBIIPS.js";import{C as L}from"./check-VTcvVtIU.js";/**
|
|
2
|
+
* @license lucide-react v0.294.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const E=w("Code2",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/**
|
|
7
|
+
* @license lucide-react v0.294.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const j=w("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);async function A(){return m.get("/billing/products")}async function k(){return m.get("/billing/subscriptions")}async function F(s,t,l,n="monthly"){return m.post("/billing/checkout",{product:s,planId:t,promoCode:l,billingPeriod:n})}async function M(){return m.get("/billing/seats")}async function R(s,t){return m.post("/billing/seats",{email:s,role:t})}async function z(s){return m.del(`/billing/seats/${s}`)}async function U(s){return m.post("/billing/promo",{code:s})}async function H(){return m.get("/billing/invoices")}const T={api:v,dashboard:D,sdk:P,iframe:E,dataset:$},q={api:"API Access",dashboard:"Dashboard",sdk:"SDK",iframe:"iFrame Widget",dataset:"Dataset CSV"};function B({subscription:s}){var p,d;const{t}=h("billing"),l=T[s.product]??v,n=q[s.product]??s.product,c=((p=s.plan)==null?void 0:p.monthlyPrice)??0,a=new Date(s.currentPeriodEnd);return e.jsxs("div",{className:"rounded-apple-lg border border-white/10 bg-white/5 p-lg hover:border-white/20 transition-colors",children:[e.jsxs("div",{className:"flex items-start justify-between mb-md",children:[e.jsxs("div",{className:"flex items-center gap-md",children:[e.jsx("div",{className:"p-md bg-apple-blue/20 rounded-apple-md",children:e.jsx(l,{className:"w-5 h-5 text-apple-blue"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"sf-body font-medium text-white",children:n}),e.jsxs("p",{className:"sf-caption text-apple-label-secondary",children:[((d=s.plan)==null?void 0:d.name)??"Free"," plan"]})]})]}),e.jsx("span",{className:I("text-xs font-medium px-md py-xs rounded-apple-md",s.status==="active"?"bg-green-600/20 text-green-400":"bg-yellow-600/20 text-yellow-400"),children:s.status})]}),e.jsxs("div",{className:"space-y-sm mb-lg",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"sf-caption text-apple-label-secondary",children:t("subscriptions.monthly_cost")}),e.jsxs("span",{className:"sf-body text-white",children:["$",c]})]}),s.seatCount&&e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"sf-caption text-apple-label-secondary",children:t("subscriptions.active_seats")}),e.jsx("span",{className:"sf-body text-white",children:s.seatCount})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"sf-caption text-apple-label-secondary",children:t("subscriptions.renews")}),e.jsx("span",{className:"sf-body text-white",children:a.toLocaleDateString()})]})]}),e.jsx("button",{className:"w-full px-md py-sm bg-white/10 hover:bg-white/20 text-white rounded-apple-md sf-body transition-colors cursor-pointer",children:t("subscriptions.manage")})]})}function K(){const{t:s}=h("billing"),[t,l]=i.useState([]),[n,c]=i.useState(!0);return i.useEffect(()=>{k().then(a=>l(Array.isArray(a)?a:[])).catch(()=>l([])).finally(()=>c(!1))},[]),n?e.jsx("div",{className:"sf-body text-apple-label-secondary",children:s("subscriptions.loading")}):t.length===0?e.jsxs("div",{className:"text-center py-lg rounded-apple-lg border border-white/10 bg-white/5",children:[e.jsx("p",{className:"sf-body text-apple-label-secondary mb-md",children:s("subscriptions.no_subscriptions")}),e.jsx("button",{className:"px-lg py-sm bg-apple-blue hover:bg-apple-blue/80 text-white rounded-apple-md sf-body transition-colors cursor-pointer",children:s("add_product")})]}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-lg",children:t.map(a=>e.jsx(B,{subscription:a},a.id))})}function Z({seat:s,onRemove:t}){const l=(s.email??"").split("@")[0].slice(0,2).toUpperCase()||"??";return e.jsxs("div",{className:"flex items-center justify-between p-md bg-white/5 rounded-apple-md hover:bg-white/10 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-md",children:[e.jsx("div",{className:"w-8 h-8 rounded-apple-md bg-apple-blue/20 flex items-center justify-center",children:e.jsx("span",{className:"text-xs font-medium text-apple-blue",children:l})}),e.jsxs("div",{children:[e.jsx("p",{className:"sf-body text-white",children:s.email}),e.jsx("p",{className:"sf-caption text-apple-label-secondary",children:s.role})]})]}),e.jsx("button",{onClick:()=>t(s.userId),className:"p-xs hover:bg-red-600/20 rounded-apple-md text-red-400 transition-colors",children:e.jsx(S,{className:"w-4 h-4"})})]})}function O(){const{t:s}=h("billing"),[t,l]=i.useState([]),[n,c]=i.useState(""),[a,p]=i.useState("Investigator"),[d,x]=i.useState(!0);i.useEffect(()=>{M().then(o=>l(o)).catch(()=>l([])).finally(()=>x(!1))},[]);const u=async()=>{if(!n)return;const o=await R(n,a);l([...t,o]),c(""),p("Investigator")},b=async o=>{await z(o),l(t.filter(f=>f.userId!==o))};return d?e.jsx("div",{className:"sf-body text-apple-label-secondary",children:s("seats.loading")}):e.jsxs("div",{className:"space-y-md",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-xs",children:[e.jsx("input",{type:"email",value:n,onChange:o=>c(o.target.value),placeholder:s("seats.email_placeholder"),"aria-label":s("seats.email_placeholder"),className:"flex-1 px-md py-sm bg-white/5 border border-white/10 rounded-apple-md sf-body text-white placeholder:text-apple-label-secondary focus:outline-none focus:ring-2 focus:ring-apple-blue focus:border-apple-blue"}),e.jsxs("div",{className:"flex gap-xs",children:[e.jsxs("select",{value:a,onChange:o=>p(o.target.value),"aria-label":s("seats.role"),className:"flex-1 sm:flex-none px-md py-sm bg-white/5 border border-white/10 rounded-apple-md sf-body text-white focus:outline-none focus:ring-2 focus:ring-apple-blue focus:border-apple-blue",children:[e.jsx("option",{children:s("seats.investigator")}),e.jsx("option",{children:s("seats.analyst")}),e.jsx("option",{children:s("seats.manager")})]}),e.jsx("button",{onClick:u,"aria-label":s("seats.add"),className:"px-md py-sm bg-apple-blue hover:bg-apple-blue/80 text-white rounded-apple-md flex items-center gap-xs transition-colors cursor-pointer",children:e.jsx(C,{className:"w-4 h-4"})})]})]}),e.jsx("div",{className:"space-y-xs",children:t.map(o=>e.jsx(Z,{seat:o,onRemove:b},o.userId))}),e.jsx("p",{className:"sf-caption text-apple-label-secondary",children:s("seats.used",{current:t.length,total:3})})]})}function V(){const{t:s}=h("billing"),[t,l]=i.useState(""),[n,c]=i.useState(null),[a,p]=i.useState(!1),d=async()=>{if(t){p(!0);try{const x=await U(t);c({percent:x.discountPercent,message:x.message})}finally{p(!1)}}};return e.jsxs("div",{className:"space-y-md",children:[e.jsxs("div",{className:"flex gap-xs",children:[e.jsx("input",{type:"text",value:t,onChange:x=>l(x.target.value.toUpperCase()),placeholder:s("promo.placeholder"),"aria-label":s("promo.placeholder"),className:"flex-1 px-md py-sm bg-white/5 border border-white/10 rounded-apple-md sf-body text-white placeholder:text-apple-label-secondary focus:outline-none focus:ring-2 focus:ring-apple-blue focus:border-apple-blue"}),e.jsx("button",{onClick:d,disabled:!t||a,className:"px-lg py-sm bg-apple-blue hover:bg-apple-blue/80 disabled:opacity-50 text-white rounded-apple-md sf-body font-medium transition-colors cursor-pointer",children:s("promo.apply")})]}),n&&e.jsxs("div",{className:`p-md rounded-apple-md flex items-start gap-xs ${n.percent===100?"bg-green-600/20":"bg-blue-600/20"}`,children:[e.jsx(L,{className:`w-4 h-4 flex-shrink-0 mt-xs ${n.percent===100?"text-green-400":"text-blue-400"}`}),e.jsxs("div",{children:[e.jsx("p",{className:`sf-body font-medium ${n.percent===100?"text-green-300":"text-blue-300"}`,children:s("promo.discount",{percent:n.percent})}),e.jsx("p",{className:`sf-caption ${n.percent===100?"text-green-400":"text-blue-400"}`,children:n.message})]})]})]})}function W({isOpen:s,onClose:t}){const{t:l}=h("billing"),[n,c]=i.useState([]),[a,p]=i.useState([]),[d,x]=i.useState(null),[u,b]=i.useState(""),[o,f]=i.useState(!0);i.useEffect(()=>{s&&Promise.all([A(),k()]).then(([r,g])=>{c(r),p(g),f(!1)})},[s]);const y=n.filter(r=>!a.find(g=>g.product===r.type)),_=async()=>{if(!d||!u)return;const r=await F(d.type,u);window.location.href=r.checkoutUrl};return s?e.jsx("div",{className:"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-md",role:"dialog","aria-modal":"true","aria-labelledby":"add-product-title",onKeyDown:r=>{r.key==="Escape"&&t()},children:e.jsxs("div",{className:"bg-apple-bg rounded-apple-lg max-w-2xl w-full max-h-[90vh] overflow-y-auto border border-white/10",children:[e.jsxs("div",{className:"flex items-center justify-between p-lg border-b border-white/10",children:[e.jsx("h2",{id:"add-product-title",className:"sf-headline text-white",children:l("add_product")}),e.jsx("button",{onClick:t,"aria-label":l("close"),className:"p-md hover:bg-white/10 rounded-apple-md cursor-pointer",children:e.jsx(S,{className:"w-5 h-5 text-white"})})]}),o?e.jsx("div",{className:"p-lg text-center",children:l("loading")}):y.length===0?e.jsx("div",{className:"p-lg text-center sf-body text-apple-label-secondary",children:l("invoices.all_subscribed")}):e.jsxs("div",{className:"p-lg space-y-lg",children:[e.jsx("div",{className:"grid grid-cols-1 gap-md",children:y.map(r=>e.jsxs("button",{onClick:()=>{x(r),b(r.plans[0].id)},"aria-pressed":(d==null?void 0:d.type)===r.type,className:`p-md rounded-apple-lg border transition-colors text-left cursor-pointer ${(d==null?void 0:d.type)===r.type?"border-apple-blue bg-apple-blue/10":"border-white/10 hover:border-white/20"}`,children:[e.jsx("h3",{className:"sf-body font-medium text-white",children:r.name}),e.jsx("p",{className:"sf-caption text-apple-label-secondary",children:r.tagline})]},r.type))}),d&&e.jsxs("div",{className:"space-y-md",children:[e.jsx("h3",{className:"sf-body font-medium text-white",children:l("invoices.select_plan")}),e.jsx("div",{className:"grid grid-cols-1 gap-sm",children:d.plans.map(r=>e.jsxs("button",{onClick:()=>b(r.id),"aria-pressed":u===r.id,className:`p-sm rounded-apple-md border transition-colors text-left sf-caption cursor-pointer ${u===r.id?"border-apple-blue bg-apple-blue/10":"border-white/10 hover:border-white/20"}`,children:[e.jsx("span",{className:"text-white",children:r.name})," - ",e.jsxs("span",{className:"text-apple-label-secondary",children:["$",r.monthlyPrice,l("pricing.per_month")]})]},r.id))}),e.jsx("button",{onClick:_,className:"w-full px-lg py-md bg-apple-blue hover:bg-apple-blue/80 text-white rounded-apple-md sf-body font-medium transition-colors cursor-pointer",children:l("invoices.checkout")})]})]})]})}):null}function X(){const{t:s}=h("billing"),[t,l]=i.useState([]);i.useEffect(()=>{m.get("/billing/usage/history").then(l).catch(()=>l([]))},[]);const n=Math.max(...t.map(c=>c.screenings),1);return e.jsxs("div",{className:"rounded-apple-lg border border-white/10 bg-white/5 p-lg",children:[e.jsx("h3",{className:"sf-body font-medium text-white mb-lg",children:s("usage.history_title")}),e.jsx("div",{className:"h-64 flex items-end justify-between gap-sm",children:t.map((c,a)=>e.jsxs("div",{className:"flex-1 flex flex-col items-center gap-sm",children:[e.jsx("div",{className:"w-full h-64 flex flex-col items-center justify-end",children:e.jsx("div",{className:"w-full bg-gradient-to-t from-apple-blue to-blue-400 rounded-t-apple-md",style:{height:`${c.screenings/n*100}%`},title:`${c.screenings} screenings`})}),e.jsx("span",{className:"sf-caption text-xs",children:c.month})]},a))})]})}function G(){const{t:s}=h("billing"),[t,l]=i.useState([]),[n,c]=i.useState(!0);return i.useEffect(()=>{H().then(a=>l(a)).catch(()=>l([])).finally(()=>c(!1))},[]),n?e.jsx("div",{className:"sf-body text-apple-label-secondary",children:s("invoices.loading")}):e.jsxs("div",{className:"rounded-apple-lg border border-white/10 bg-white/5 overflow-hidden",children:[e.jsx("div",{className:"px-lg py-md border-b border-white/10",children:e.jsx("h3",{className:"sf-body font-medium text-white",children:s("invoices.recent")})}),e.jsx("div",{className:"hidden md:block overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-white/10 bg-white/5",children:[e.jsx("th",{className:"px-lg py-md text-left text-xs font-medium text-apple-label-secondary uppercase",children:s("invoices.date")}),e.jsx("th",{className:"px-lg py-md text-left text-xs font-medium text-apple-label-secondary uppercase",children:s("invoices.product")}),e.jsx("th",{className:"px-lg py-md text-left text-xs font-medium text-apple-label-secondary uppercase",children:s("invoices.amount")}),e.jsx("th",{className:"px-lg py-md text-left text-xs font-medium text-apple-label-secondary uppercase",children:s("invoices.status")}),e.jsx("th",{className:"px-lg py-md text-right text-xs font-medium text-apple-label-secondary uppercase",children:s("invoices.action")})]})}),e.jsx("tbody",{className:"divide-y divide-white/10",children:t.map(a=>e.jsxs("tr",{className:"hover:bg-white/5 transition-colors",children:[e.jsx("td",{className:"px-lg py-md sf-caption text-apple-label-secondary",children:new Date(a.date).toLocaleDateString()}),e.jsx("td",{className:"px-lg py-md sf-caption text-white capitalize",children:a.product}),e.jsxs("td",{className:"px-lg py-md sf-body text-white",children:["$",(a.amountCents/100).toFixed(2)]}),e.jsx("td",{className:"px-lg py-md",children:e.jsx(N,{status:a.status})}),e.jsx("td",{className:"px-lg py-md text-right",children:e.jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer","aria-label":`${s("invoices.download")} ${a.product}`,className:"inline-flex p-md hover:bg-white/10 rounded-apple-md transition-colors",children:e.jsx(j,{className:"w-4 h-4 text-apple-blue"})})})]},a.id))})]})}),e.jsx("div",{className:"md:hidden divide-y divide-white/10",children:t.map(a=>e.jsxs("div",{className:"p-lg",children:[e.jsxs("div",{className:"flex items-center justify-between mb-xs",children:[e.jsx("span",{className:"sf-body text-white capitalize font-medium",children:a.product}),e.jsx(N,{status:a.status})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"sf-body text-white font-semibold",children:["$",(a.amountCents/100).toFixed(2)]}),e.jsx("span",{className:"sf-caption text-apple-label-secondary ml-sm",children:new Date(a.date).toLocaleDateString()})]}),e.jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer","aria-label":`${s("invoices.download")} ${a.product}`,className:"p-sm hover:bg-white/10 rounded-apple-md transition-colors",children:e.jsx(j,{className:"w-4 h-4 text-apple-blue"})})]})]},a.id))}),t.length===0&&e.jsx("p",{className:"text-center py-lg sf-caption text-apple-label-secondary",children:"No invoices yet"})]})}function N({status:s}){const t=s==="paid"?"bg-green-600/20 text-green-400":"bg-yellow-600/20 text-yellow-400";return e.jsx("span",{className:`text-xs px-md py-xs rounded-apple-md font-medium ${t}`,children:s})}function se(){const{t:s}=h("billing"),[t,l]=i.useState(!1);return e.jsx("div",{className:"min-h-screen bg-apple-bg/50 p-md md:p-lg",children:e.jsxs("div",{className:"max-w-6xl mx-auto space-y-xl",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"sf-title text-white",children:s("title")}),e.jsx("p",{className:"sf-body text-apple-label-secondary mt-xs",children:s("subtitle")})]}),e.jsx("div",{className:"flex justify-end",children:e.jsxs("button",{onClick:()=>l(!0),className:"flex items-center gap-xs px-lg py-md bg-apple-blue hover:bg-apple-blue/80 text-white rounded-apple-md sf-body font-medium transition-colors",children:[e.jsx(C,{className:"w-4 h-4"}),s("add_product")]})}),e.jsxs("section",{className:"space-y-md",children:[e.jsx("h2",{className:"sf-body font-medium text-white",children:s("sections.active_subscriptions")}),e.jsx(K,{})]}),e.jsxs("section",{className:"space-y-md",children:[e.jsx("h2",{className:"sf-body font-medium text-white",children:s("sections.dashboard_seats")}),e.jsx("div",{className:"rounded-apple-lg border border-white/10 bg-white/5 p-lg",children:e.jsx(O,{})})]}),e.jsxs("section",{className:"space-y-md",children:[e.jsx("h2",{className:"sf-body font-medium text-white",children:s("sections.promo_code")}),e.jsx("div",{className:"rounded-apple-lg border border-white/10 bg-white/5 p-lg max-w-md",children:e.jsx(V,{})})]}),e.jsxs("section",{className:"space-y-md",children:[e.jsx("h2",{className:"sf-body font-medium text-white",children:s("sections.usage_history")}),e.jsx(X,{})]}),e.jsxs("section",{className:"space-y-md",children:[e.jsx("h2",{className:"sf-body font-medium text-white",children:s("sections.invoices")}),e.jsx(G,{})]}),e.jsx(W,{isOpen:t,onClose:()=>l(!1)})]})})}export{se as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as o,j as s}from"./index-CfdYcqRM.js";function b({children:r,className:e,onClick:a,hover:p}){const t=o("rounded-[16px] border border-white/[0.06] p-lg transition-all duration-200","bg-[rgba(18,18,26,0.8)] backdrop-blur-[24px] backdrop-saturate-[180%]","shadow-[0_0_0_1px_rgba(255,255,255,0.03),0_4px_24px_rgba(0,0,0,0.4)]",p&&"cursor-pointer hover:border-white/[0.12] hover:shadow-[0_0_0_1px_rgba(10,132,255,0.1),0_8px_32px_rgba(0,0,0,0.5)]",e);return a?s.jsx("button",{type:"button",onClick:a,className:o(t,"text-left w-full"),children:r}):s.jsx("div",{className:t,children:r})}export{b as C};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{u as b,r,b as x,j as e,i as g}from"./index-CfdYcqRM.js";function v({caseId:a,comments:i}){const{t}=b("compliance"),[p,c]=r.useState([]);r.useEffect(()=>{x.get(`/cases/${a}/timeline`).then(s=>c((s==null?void 0:s.events)??[])).catch(()=>c([]))},[a]);const d=[...p.map(s=>({type:"event",time:s.created_at,data:s})),...i.map(s=>({type:"comment",time:s.created_at,data:s}))].sort((s,o)=>new Date(o.time).getTime()-new Date(s.time).getTime());return e.jsxs("div",{className:"mt-8",children:[e.jsx("h2",{className:"text-lg font-medium mb-4",children:t("case_detail.timeline")}),e.jsxs("div",{className:"space-y-3",children:[d.map((s,o)=>e.jsx("div",{className:"border-l-2 border-apple-blue/30 pl-4 py-2",children:s.type==="event"?e.jsxs("div",{children:[e.jsx("span",{className:"text-xs font-medium text-apple-blue",children:s.data.event_type}),e.jsx("p",{className:"text-sm",children:s.data.details}),e.jsxs("p",{className:"text-xs text-apple-label-tertiary",children:[s.data.actor," - ",s.time]})]}):e.jsxs("div",{children:[e.jsx("span",{className:"text-xs font-medium text-apple-green",children:"Comment"}),e.jsx("p",{className:"text-sm",children:s.data.content}),e.jsx("p",{className:"text-xs text-apple-label-tertiary",children:s.time})]})},o)),d.length===0&&e.jsx("p",{className:"text-apple-label-secondary text-sm",children:t("case_detail.no_activity")})]})]})}const j={in_review:"bg-apple-blue",escalated:"bg-apple-orange",pending_info:"bg-apple-yellow text-black",resolved:"bg-apple-green",false_positive:"bg-apple-green",true_match:"bg-apple-red",closed:"bg-apple-bg-tertiary text-apple-label-secondary"};function f({caseId:a,status:i,validTransitions:t,onAction:p}){const{t:c}=b("compliance"),[d,s]=r.useState(""),[o,m]=r.useState(""),l=async n=>{await x.put(`/cases/${a}/transition`,{to_status:n,comment:d}),s(""),p()},h=async()=>{o&&(await x.put(`/cases/${a}/assign`,{user_id:o}),m(""),p())};return e.jsxs("div",{className:"mb-8",children:[e.jsx("div",{className:"flex gap-2 mb-4 flex-wrap",children:t.map(n=>e.jsx("button",{onClick:()=>l(n),"aria-label":`Transition to ${n}`,className:`px-4 py-2 text-white rounded-apple-md text-sm cursor-pointer
|
|
2
|
+
transition-colors hover:opacity-80 focus-visible:outline-2
|
|
3
|
+
focus-visible:outline-offset-2 focus-visible:outline-apple-blue
|
|
4
|
+
${j[n]||"bg-apple-blue"}`,children:n.replace(/_/g," ")},n))}),e.jsx("div",{className:"flex gap-2 mb-4",children:e.jsx("input",{value:d,onChange:n=>s(n.target.value),placeholder:c("case_detail.add_comment"),className:`flex-1 px-3 py-2 rounded-apple-md bg-apple-bg-secondary text-sm
|
|
5
|
+
border border-white/10 focus:outline-apple-blue`})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:o,onChange:n=>m(n.target.value),placeholder:c("case_detail.assign_to"),className:`px-3 py-2 rounded-apple-md bg-apple-bg-secondary text-sm
|
|
6
|
+
border border-white/10 focus:outline-apple-blue`}),e.jsx("button",{onClick:h,"aria-label":c("case_detail.assign"),className:`px-4 py-2 bg-apple-blue text-white rounded-apple-md text-sm
|
|
7
|
+
cursor-pointer hover:opacity-80`,children:c("case_detail.assign")})]})]})}function y(){const{t:a}=b("compliance"),{id:i}=g(),[t,p]=r.useState(null),[c,d]=r.useState([]),[s,o]=r.useState([]),m=()=>{x.get(`/cases/${i}`).then(l=>{p((l==null?void 0:l.case)??null),d((l==null?void 0:l.comments)??[])}).catch(()=>p(null)),x.get(`/cases/${i}/timeline`).then(l=>o((l==null?void 0:l.valid_transitions)??[])).catch(()=>{})};return r.useEffect(()=>{m()},[i]),t?e.jsxs("div",{className:"px-md py-lg sm:p-8 max-w-4xl mx-auto",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-semibold mb-2",children:t.entity_name}),e.jsxs("p",{className:"text-apple-label-secondary mb-6 text-sm sm:text-base break-words",children:[a("case_detail.match")," ",t.matched_name]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6",children:[e.jsx(u,{label:a("case_detail.status"),value:t.status}),e.jsx(u,{label:a("case_detail.priority"),value:t.priority}),e.jsx(u,{label:a("case_detail.confidence"),value:`${(t.confidence*100).toFixed(1)}%`}),e.jsx(u,{label:a("case_detail.assigned_to"),value:t.assigned_to||a("case_detail.unassigned")})]}),e.jsx(f,{caseId:i,status:t.status,validTransitions:s,onAction:m}),e.jsx(v,{caseId:i,comments:c})]}):e.jsx("div",{className:"p-lg",role:"status","aria-live":"polite",children:"Loading..."})}function u({label:a,value:i}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-apple-label-secondary",children:a}),e.jsx("p",{className:"font-medium",children:i})]})}export{y as CaseDetail};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as h,r as i,b as g,j as e,L as u}from"./index-CfdYcqRM.js";import{P as f}from"./PageHeader-BObHFn0i.js";import{C as j}from"./Card-Cw-T_-oU.js";import{E as b}from"./EmptyState-Do0xJAT9.js";function E(){const{t:s}=h("compliance"),[l,n]=i.useState([]),[r,x]=i.useState(""),[c,o]=i.useState(!0),[p,d]=i.useState("");i.useEffect(()=>{o(!0),d("");const a=r?`/cases?status=${r}`:"/cases";g.get(a).then(t=>n((t==null?void 0:t.cases)??[])).catch(t=>d(t instanceof Error?t.message:"Failed to load cases")).finally(()=>o(!1))},[r]);const m=["","open","in_review","escalated","resolved"];return e.jsxs("div",{className:"max-w-6xl mx-auto",children:[e.jsx(f,{title:s("cases.title"),description:"Manage compliance investigation cases"}),e.jsx("div",{className:"flex gap-sm mb-lg flex-wrap",children:m.map(a=>e.jsx("button",{onClick:()=>x(a),"aria-pressed":r===a,className:`px-lg py-xs rounded-full text-sm cursor-pointer transition-colors ${r===a?"bg-apple-blue text-white":"bg-white/[0.04] text-apple-label-secondary hover:bg-white/[0.08]"}`,children:s(a?`cases.${a}`:"cases.all")},a))}),p&&e.jsx(j,{className:"mb-lg",children:e.jsx("p",{role:"alert",className:"text-apple-red sf-body",children:p})}),c&&e.jsx(u,{}),!c&&l.length===0&&e.jsx(b,{title:s("cases.no_cases")}),!c&&l.length>0&&e.jsx("div",{className:"space-y-sm",children:l.map(a=>e.jsx(w,{caseItem:a,t:s},a.id))})]})}function w({caseItem:s,t:l}){const n={critical:"bg-apple-red/20 text-apple-red",high:"bg-apple-orange/20 text-apple-orange",medium:"bg-apple-yellow/20 text-apple-yellow",low:"bg-apple-green/20 text-apple-green"};return e.jsx("a",{href:`/compliance/cases/${s.id}`,className:"block card-vibrancy p-lg hover:bg-white/[0.04] cursor-pointer transition-colors rounded-apple-lg",children:e.jsxs("div",{className:"flex justify-between items-start",children:[e.jsxs("div",{children:[e.jsx("p",{className:"sf-headline",children:s.entity_name}),e.jsxs("p",{className:"sf-caption text-white/50",children:[l("cases.matched")," ",s.matched_name]}),e.jsx("p",{className:"sf-caption text-white/30 mt-xs",children:new Date(s.created_at).toLocaleDateString()})]}),e.jsxs("div",{className:"flex gap-sm",children:[e.jsx("span",{className:`px-2 py-0.5 text-xs rounded-full ${n[s.priority]||"bg-white/5"}`,children:s.priority}),e.jsx("span",{className:"px-2 py-0.5 text-xs rounded-full bg-white/[0.06] text-white/60",children:s.status})]})]})})}export{E as CaseManagement};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as l,b as x,j as e}from"./index-CfdYcqRM.js";const t={screenings_performed:0,alerts_generated:0,cases_opened:0,cases_closed:0,sars_filed:0,false_positive_rate:0,avg_resolution_hours:0};function h(){const[s,r]=l.useState(t),[d,c]=l.useState(!0);l.useEffect(()=>{x.get("/reports/dashboard").then(a=>r(a??t)).catch(()=>r(t)).finally(()=>c(!1))},[]);const i=[{label:"Screenings Performed",value:s.screenings_performed},{label:"Alerts Generated",value:s.alerts_generated},{label:"Cases Opened",value:s.cases_opened},{label:"Cases Closed",value:s.cases_closed},{label:"SARs Filed",value:s.sars_filed},{label:"False Positive Rate",value:`${(s.false_positive_rate*100).toFixed(1)}%`},{label:"Avg Resolution (hrs)",value:s.avg_resolution_hours.toFixed(1)}],o=()=>{window.print()};return d?e.jsx("div",{className:"px-md py-lg sm:p-8 max-w-6xl mx-auto",children:e.jsx("p",{className:"text-apple-label-secondary text-center py-12",children:"Loading report..."})}):e.jsxs("div",{className:"px-md py-lg sm:p-8 max-w-6xl mx-auto",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-md mb-6",children:[e.jsx("h1",{className:"text-xl sm:text-2xl font-semibold",children:"Monthly Compliance Report"}),e.jsx("button",{className:"btn-apple-secondary w-full sm:w-auto",onClick:o,children:"Export as PDF"})]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-4 mb-8",children:i.map(a=>e.jsxs("div",{className:"card-vibrancy p-4",children:[e.jsx("p",{className:"text-sm text-apple-label-secondary",children:a.label}),e.jsx("p",{className:"text-2xl font-bold mt-1",children:a.value})]},a.label))}),e.jsxs("div",{className:"card-vibrancy p-6 mb-6",children:[e.jsx("h2",{className:"text-lg font-medium mb-4",children:"Screening Trend"}),e.jsx("div",{className:"h-32 flex items-end gap-1",children:Array.from({length:12},(a,n)=>{const m=Math.max(8,Math.random()*100);return e.jsx("div",{className:"flex-1 bg-apple-blue/60 rounded-t",style:{height:`${m}%`},title:`Month ${n+1}`},n)})}),e.jsxs("div",{className:"flex justify-between text-xs text-apple-label-secondary mt-2",children:[e.jsx("span",{children:"Jan"}),e.jsx("span",{children:"Jun"}),e.jsx("span",{children:"Dec"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"card-vibrancy p-6",children:[e.jsx("h2",{className:"text-lg font-medium mb-3",children:"Alert Volume"}),e.jsx("p",{className:"text-3xl font-bold",children:s.alerts_generated}),e.jsx("p",{className:"text-sm text-apple-label-secondary mt-1",children:"Total this period"})]}),e.jsxs("div",{className:"card-vibrancy p-6",children:[e.jsx("h2",{className:"text-lg font-medium mb-3",children:"Resolution Time"}),e.jsxs("p",{className:"text-3xl font-bold",children:[s.avg_resolution_hours.toFixed(1),"h"]}),e.jsx("p",{className:"text-sm text-apple-label-secondary mt-1",children:"Average per case"})]})]})]})}export{h as ComplianceReport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as f,r as n,u as _,j as e,L as S,B as k,l as j,S as b,C as E}from"./index-CfdYcqRM.js";import{P as L}from"./PageHeader-BObHFn0i.js";import{P as $}from"./plus-i0oBIIPS.js";import{C as P}from"./check-VTcvVtIU.js";const g={get:()=>f.get("/config"),update:s=>f.put("/config",s)};function B(){const[s,a]=n.useState(null),[l,t]=n.useState(!0),[c,o]=n.useState(null),r=n.useCallback(async()=>{t(!0);try{const i=await g.get();a(i)}catch(i){o(i instanceof Error?i:new Error(String(i)))}finally{t(!1)}},[]);n.useEffect(()=>{r()},[r]);const m=n.useCallback(async i=>{const d=await g.update(i);return a(d),d},[]);return{config:s,loading:l,error:c,refetch:r,updateConfig:m}}function q(){const{t:s}=_("config"),{config:a,loading:l,error:t,updateConfig:c}=B(),[o,r]=n.useState(!1),[m,i]=n.useState(null),[d,N]=n.useState(null),[v,y]=n.useState(null);if(l||!a)return e.jsx("div",{className:"flex items-center justify-center h-96",children:e.jsx(S,{})});const u=m??a.default_threshold*100,p=d??a.auto_dismiss_below*100,h=v??a.auto_escalate_above*100,w=a.enabled_lists??[],C=async()=>{r(!0);try{await c({default_threshold:u/100,auto_dismiss_below:p/100,auto_escalate_above:h/100})}finally{r(!1)}};return e.jsxs("div",{className:"space-y-lg",children:[e.jsx(L,{title:s("title"),description:s("description")}),t&&e.jsx("p",{className:"text-apple-red sf-caption mb-md",role:"alert",children:t.message}),e.jsxs("div",{className:"max-w-2xl space-y-lg",children:[e.jsx(A,{th:u,d:p,ea:h,t:s,onThreshold:i,onDismiss:N,onEscalate:y}),e.jsx(T,{lists:w,t:s}),e.jsx(k,{variant:"primary",onClick:C,disabled:o,children:s(o?"saving":"save")})]})]})}function A({th:s,d:a,ea:l,t,onThreshold:c,onDismiss:o,onEscalate:r}){return e.jsxs("div",{className:"glass-panel rounded-apple-lg p-xl",children:[e.jsx("h3",{className:"sf-headline mb-md gradient-text",children:t("thresholds.title")}),e.jsx(x,{label:`${t("thresholds.default")} ${s}%`,value:s,onChange:c,color:"accent-apple-blue"}),e.jsx(x,{label:`${t("thresholds.auto_dismiss")} ${a}%`,value:a,onChange:o,color:"accent-apple-green"}),e.jsx(x,{label:`${t("thresholds.auto_escalate")} ${l}%`,value:l,onChange:r,color:"accent-apple-red"})]})}function x({label:s,value:a,onChange:l,color:t}){return e.jsxs("label",{className:"block mb-md",children:[e.jsx("span",{className:"sf-caption",children:s}),e.jsx("input",{type:"range",min:"0",max:"100",value:a,"aria-valuetext":`${a}%`,"aria-label":s,onChange:c=>l(Number(c.target.value)),className:`w-full ${t}`}),e.jsxs("div",{className:"flex justify-between text-xs text-zinc-500 mt-1",children:[e.jsx("span",{children:"0%"}),e.jsx("span",{children:"100%"})]})]})}function T({lists:s,t:a}){return e.jsxs("div",{className:"glass-panel rounded-apple-lg p-xl",children:[e.jsxs("div",{className:"flex items-center justify-between mb-md",children:[e.jsxs("h3",{className:"sf-headline gradient-text",children:[a("lists.title")," (",s.length,")"]}),e.jsxs(j,{to:"/lists/marketplace",className:"flex items-center gap-xs text-apple-blue text-[13px] font-semibold hover:underline",children:[e.jsx($,{className:"w-4 h-4"})," Add Lists"]})]}),s.length===0?e.jsx(D,{}):s.map(l=>e.jsx(M,{list:l},l.list_id))]})}function D(){return e.jsxs("div",{className:"text-center py-xl",children:[e.jsx(b,{className:"w-8 h-8 text-apple-label-tertiary mx-auto mb-sm"}),e.jsx("p",{className:"sf-body text-apple-label-secondary mb-sm",children:"No lists enabled yet"}),e.jsx(j,{to:"/lists/marketplace",className:"text-apple-blue text-[13px] font-semibold hover:underline",children:"Browse Marketplace"})]})}function M({list:s}){return e.jsxs("div",{className:"flex items-center justify-between py-sm border-b border-white/5 last:border-0",children:[e.jsxs("div",{className:"flex items-center gap-sm",children:[e.jsx(b,{className:"w-4 h-4 text-apple-blue"}),e.jsx("span",{className:"sf-body",children:s.list_id})]}),e.jsxs("div",{className:"flex items-center gap-md",children:[s.sync_enabled&&e.jsx(P,{className:"w-3 h-3 text-apple-green"}),e.jsxs("span",{className:"sf-caption flex items-center gap-xs",children:[e.jsx(E,{className:"w-3 h-3"})," ",s.sync_schedule||"Manual"]})]})]})}export{q as Configuration};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as l,j as e,B as j,L as u,b}from"./index-CfdYcqRM.js";import{P as N}from"./PageHeader-BObHFn0i.js";import{C as i}from"./Card-Cw-T_-oU.js";import{B as n}from"./Badge-B9VFkofy.js";function E(){const[t,p]=l.useState(""),[c,h]=l.useState("ETH"),[a,d]=l.useState(null),[r,o]=l.useState(!1),[m,x]=l.useState(""),f=async()=>{if(t.trim()){o(!0),x(""),d(null);try{const s=await b.post("/crypto/screen",{wallet_address:t.trim(),chain:c});d(s)}catch(s){x(s instanceof Error?s.message:"Screening failed")}finally{o(!1)}}};return e.jsxs("div",{children:[e.jsx(N,{title:"Crypto Screening",description:"Screen wallet addresses against 13K+ sanctioned wallets"}),e.jsxs(i,{className:"mb-lg",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-md mb-lg",children:[e.jsx("input",{value:t,onChange:s=>p(s.target.value),placeholder:"0x7d84d78bb9b6044a45fa08b7fe109f2c8648ab4e",className:"input-field flex-1 font-mono text-sm"}),e.jsxs("select",{value:c,onChange:s=>h(s.target.value),className:"input-field w-24",children:[e.jsx("option",{value:"ETH",children:"ETH"}),e.jsx("option",{value:"BTC",children:"BTC"}),e.jsx("option",{value:"TRX",children:"TRX"})]})]}),e.jsx(j,{onClick:f,disabled:r||!t.trim(),className:"w-full",children:r?"Scanning...":"Screen Wallet"})]}),r&&e.jsx(u,{}),m&&e.jsx(i,{children:e.jsx("p",{role:"alert",className:"text-apple-red sf-body",children:m})}),a&&e.jsxs(i,{children:[e.jsxs("div",{className:"flex items-center justify-between mb-lg",children:[e.jsxs("div",{className:"flex items-center gap-md",children:[e.jsx("span",{className:`text-2xl font-bold ${a.decision==="CLEAR"?"text-apple-green":"text-apple-red"}`,children:a.decision}),e.jsx(n,{color:a.decision==="CLEAR"?"green":"red",size:"sm",children:a.chain})]}),e.jsxs("span",{className:"sf-caption text-white/40",children:[a.processing_us??0,"μs"]})]}),e.jsx("code",{className:"text-sm text-white/60 font-mono block mb-lg break-all",children:a.wallet_address}),(a.risk_flags??[]).length>0&&e.jsx("div",{className:"flex flex-wrap gap-sm mb-lg",children:(a.risk_flags??[]).map(s=>e.jsx(n,{color:"red",size:"sm",children:s},s))}),(a.hits??[]).length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"sf-caption text-white/50 mb-sm",children:"Sanctions Matches"}),(a.hits??[]).map((s,g)=>e.jsxs("div",{className:"p-md bg-apple-red/5 border border-apple-red/10 rounded-apple-md mb-sm",children:[e.jsx("code",{className:"text-sm text-white/80 font-mono break-all",children:s.address}),e.jsxs("div",{className:"flex gap-sm mt-xs",children:[e.jsx(n,{color:"red",size:"sm",children:s.list_id}),e.jsx(n,{color:"blue",size:"sm",children:s.chain})]})]},g))]}),(a.hits??[]).length===0&&a.decision==="CLEAR"&&e.jsxs("div",{className:"text-center py-lg",children:[e.jsx("span",{className:"text-3xl",children:"✓"}),e.jsx("p",{className:"sf-headline text-apple-green mt-sm",children:"No sanctions matches"})]})]})]})}export{E as CryptoScreening,E as default};
|