{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "compliance-sanctions-screener",
  "title": "Compliance Sanctions Screener",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-vue/blocks/compliance-sanctions-screener/ComplianceSanctionsScreener.vue",
      "content": "<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport {\n  AlertTriangle,\n  Ban,\n  Building2,\n  Check,\n  CheckCircle2,\n  Eye,\n  FileSearch,\n  Globe,\n  Info,\n  RefreshCw,\n  RotateCcw,\n  Search,\n  ShieldAlert,\n  ShieldCheck,\n  ShieldX,\n  Sliders,\n  User,\n  Users,\n  X,\n} from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Slider } from '@/components/ui/slider'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport type {\n  ComplianceSanctionsScreenerProps,\n  EntityType,\n  MatchStatus,\n  NotificationBanner,\n  SanctionAttributeComparison,\n  SanctionRecord,\n} from './compliance-sanctions-types'\nimport { defaultSanctionRecords } from './compliance-sanctions-data'\nimport SanctionsInvestigationDialog from './SanctionsInvestigationDialog.vue'\n\nexport type {\n  ComplianceSanctionsScreenerProps,\n  EntityType,\n  MatchStatus,\n  NotificationBanner,\n  SanctionAttributeComparison,\n  SanctionRecord,\n}\n\nconst props = withDefaults(defineProps<ComplianceSanctionsScreenerProps>(), {\n  initialSearch: 'Viktor Ivanov',\n  initialCountry: 'all',\n  initialThreshold: 85,\n})\n\nconst searchQuery = ref(props.initialSearch)\nconst selectedCountry = ref(props.initialCountry)\nconst selectedEntityType = ref<'all' | EntityType>('all')\nconst thresholdValue = ref<number[]>([props.initialThreshold])\n\nconst records = ref<SanctionRecord[]>(\n  props.initialRecords\n    ? JSON.parse(JSON.stringify(props.initialRecords))\n    : JSON.parse(JSON.stringify(defaultSanctionRecords)),\n)\n\n// Watch props in case parent changes them\nwatch(\n  () => props.initialRecords,\n  (newVal) => {\n    if (newVal) {\n      records.value = JSON.parse(JSON.stringify(newVal))\n    }\n  },\n)\n\nconst isBatchScreening = ref(false)\nconst notificationBanner = ref<{ message: string; type: 'success' | 'warning' | 'info' | 'destructive' } | null>(null)\n\nconst selectedRecord = ref<SanctionRecord | null>(null)\nconst isInvestigationOpen = ref(false)\n\nfunction openInvestigation(record: SanctionRecord) {\n  selectedRecord.value = record\n  isInvestigationOpen.value = true\n}\n\nfunction showNotification(message: string, type: 'success' | 'warning' | 'info' | 'destructive' = 'info') {\n  notificationBanner.value = { message, type }\n  setTimeout(() => {\n    if (notificationBanner.value?.message === message) {\n      notificationBanner.value = null\n    }\n  }, 4500)\n}\n\nfunction handleRunBatchScreening() {\n  isBatchScreening.value = true\n  setTimeout(() => {\n    isBatchScreening.value = false\n    showNotification(\n      'Batch screening completed. 1,420 entities cross-referenced against 4 global registries. 12 matches flagged.',\n      'success',\n    )\n  }, 1200)\n}\n\nfunction handleClearFalsePositive(record: SanctionRecord) {\n  record.matchStatus = 'cleared_false_positive'\n  showNotification(\n    `False positive cleared for \"${record.entityName}\". Compliance audit log logged with officer signature.`,\n    'success',\n  )\n}\n\nfunction handleBlockEntity(record: SanctionRecord) {\n  record.matchStatus = 'blocked'\n  showNotification(\n    `Entity \"${record.entityName}\" confirmed PROHIBITED. Asset freeze locked and SAR report staged for FinCEN / EU MLRO.`,\n    'destructive',\n  )\n}\n\nfunction handleEscalate(record: SanctionRecord) {\n  showNotification(\n    `Case for \"${record.entityName}\" escalated to Senior Compliance Officer & Legal Counsel for review.`,\n    'warning',\n  )\n  isInvestigationOpen.value = false\n}\n\nfunction handleResetFilters() {\n  searchQuery.value = ''\n  selectedCountry.value = 'all'\n  selectedEntityType.value = 'all'\n  thresholdValue.value = [85]\n  showNotification('Filters reset to default workbench view.', 'info')\n}\n\nconst currentThreshold = computed(() => thresholdValue.value[0] ?? 85)\n\nconst filteredRecords = computed(() => {\n  return records.value.filter((record) => {\n    // Search query filter\n    if (searchQuery.value.trim()) {\n      const q = searchQuery.value.toLowerCase().trim()\n      const matchesName = record.entityName.toLowerCase().includes(q)\n      const matchesAlias = record.aliases.some((a) => a.toLowerCase().includes(q))\n      const matchesList = record.sanctionList.toLowerCase().includes(q)\n      const matchesId = record.nationalIdOrLei.toLowerCase().includes(q)\n      const matchesSummary = record.matchedAttributesSummary.toLowerCase().includes(q)\n      if (!matchesName && !matchesAlias && !matchesList && !matchesId && !matchesSummary) {\n        return false\n      }\n    }\n\n    // Country filter\n    if (selectedCountry.value !== 'all' && record.country !== selectedCountry.value) {\n      return false\n    }\n\n    // Entity Type filter\n    if (selectedEntityType.value !== 'all' && record.entityType !== selectedEntityType.value) {\n      return false\n    }\n\n    return true\n  })\n})\n\n// Telemetry statistics\nconst totalScreenedCount = 1420\nconst clearedCount = computed(() => {\n  const baseCleared = 1408\n  const additionalCleared = records.value.filter((r) => r.matchStatus === 'cleared_false_positive').length\n  const newlyBlocked = records.value.filter((r) => r.matchStatus === 'blocked').length\n  return baseCleared + additionalCleared - newlyBlocked\n})\n\nconst flaggedCount = computed(() => {\n  const basePending = 12\n  const cleared = records.value.filter((r) => r.matchStatus === 'cleared_false_positive').length\n  const blocked = records.value.filter((r) => r.matchStatus === 'blocked').length\n  return Math.max(0, basePending - cleared - blocked)\n})\n\nconst blockedCount = computed(() => {\n  const manuallyBlocked = records.value.filter((r) => r.matchStatus === 'blocked').length\n  return manuallyBlocked\n})\n</script>\n\n<template>\n  <div :class=\"cn('text-foreground w-full space-y-6', props.class)\">\n    <!-- Header Section -->\n    <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n      <div>\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <h1 class=\"text-xl font-bold tracking-tight sm:text-2xl\">AML / OFAC Sanctions &amp; PEP Screening</h1>\n          <Badge wrap variant=\"outline\" class=\"border-success/30 bg-success/10 text-success gap-1.5 py-0.5\">\n            <span class=\"bg-success size-1.5 animate-pulse rounded-full\" />\n            <span class=\"font-medium\">OFAC SDN, EU Consolidated, UK HMT, UN Sanctions · Synced 10m ago</span>\n          </Badge>\n        </div>\n        <p class=\"text-muted-foreground mt-1 text-xs sm:text-sm\">\n          Automated identity verification, Politically Exposed Persons (PEP), and multilateral sanctions screening\n          workbench.\n        </p>\n      </div>\n\n      <div class=\"flex shrink-0 items-center gap-2\">\n        <Button\n          variant=\"default\"\n          size=\"sm\"\n          :disabled=\"isBatchScreening\"\n          class=\"cursor-pointer gap-2 shadow-xs\"\n          @click=\"handleRunBatchScreening\"\n        >\n          <RefreshCw :class=\"cn('size-4', isBatchScreening && 'animate-spin')\" />\n          <span>{{ isBatchScreening ? 'Screening 1,420 Records...' : 'Run Batch Screening' }}</span>\n        </Button>\n      </div>\n    </div>\n\n    <!-- Notification Toast / Banner -->\n    <div\n      v-if=\"notificationBanner\"\n      :class=\"\n        cn(\n          'flex items-center justify-between gap-3 rounded-lg border px-4 py-3 text-xs transition-colors duration-200 sm:text-sm',\n          notificationBanner.type === 'success' && 'border-success/30 bg-success/10 text-success',\n          notificationBanner.type === 'warning' && 'border-warning/30 bg-warning/10 text-warning',\n          notificationBanner.type === 'destructive' && 'bg-destructive/10 border-destructive/30 text-destructive',\n          notificationBanner.type === 'info' && 'bg-primary/10 border-primary/20 text-primary',\n        )\n      \"\n    >\n      <div class=\"flex min-w-0 items-center gap-2\">\n        <CheckCircle2 v-if=\"notificationBanner.type === 'success'\" class=\"size-4 shrink-0\" />\n        <AlertTriangle v-else-if=\"notificationBanner.type === 'warning'\" class=\"size-4 shrink-0\" />\n        <Ban v-else-if=\"notificationBanner.type === 'destructive'\" class=\"size-4 shrink-0\" />\n        <Info v-else class=\"size-4 shrink-0\" />\n        <span>{{ notificationBanner.message }}</span>\n      </div>\n      <button\n        aria-label=\"Dismiss notification\"\n        type=\"button\"\n        class=\"rounded-md p-1 transition-colors hover:bg-black/5 dark:hover:bg-white/10\"\n        @click=\"notificationBanner = null\"\n      >\n        <X class=\"size-3.5\" />\n      </button>\n    </div>\n\n    <!-- 4 Screening Telemetry Cards -->\n    <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n      <!-- Card 1: Total Screened -->\n      <Card class=\"border-border/80 border shadow-xs\">\n        <CardContent class=\"p-4 sm:p-5\">\n          <div class=\"flex items-center justify-between\">\n            <span class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Total Screened Today</span>\n            <div class=\"bg-muted text-muted-foreground flex size-8 items-center justify-center rounded-md\">\n              <Users class=\"size-4\" />\n            </div>\n          </div>\n          <div class=\"mt-3 flex items-baseline gap-2\">\n            <span class=\"text-2xl font-bold tracking-tight tabular-nums\">{{\n              totalScreenedCount.toLocaleString()\n            }}</span>\n            <span class=\"text-muted-foreground text-xs font-medium\">Entities</span>\n          </div>\n          <p class=\"text-muted-foreground mt-1 text-xs\">\n            <span class=\"text-success font-medium\">+14.2%</span> vs yesterday · 38 automated batches\n          </p>\n        </CardContent>\n      </Card>\n\n      <!-- Card 2: Clear / No Matches -->\n      <Card class=\"border-border/80 border shadow-xs\">\n        <CardContent class=\"p-4 sm:p-5\">\n          <div class=\"flex items-center justify-between\">\n            <span class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Clear / No Matches</span>\n            <div class=\"bg-success/10 text-success flex size-8 items-center justify-center rounded-md\">\n              <ShieldCheck class=\"size-4\" />\n            </div>\n          </div>\n          <div class=\"mt-3 flex items-baseline gap-2\">\n            <span class=\"text-success text-success text-2xl font-bold tracking-tight tabular-nums\">\n              {{ clearedCount.toLocaleString() }}\n            </span>\n            <span class=\"text-success text-success text-xs font-semibold tabular-nums\">Cleared · 99.2%</span>\n          </div>\n          <p class=\"text-muted-foreground mt-1 text-xs\">Low Risk · 0 PEP matches · 0 adverse media</p>\n        </CardContent>\n      </Card>\n\n      <!-- Card 3: Potential Matches Flagged -->\n      <Card class=\"border-border/80 border shadow-xs\">\n        <CardContent class=\"p-4 sm:p-5\">\n          <div class=\"flex items-center justify-between\">\n            <span class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\"\n              >Potential Matches Flagged</span\n            >\n            <div class=\"bg-warning/10 text-warning flex size-8 items-center justify-center rounded-md\">\n              <AlertTriangle class=\"size-4\" />\n            </div>\n          </div>\n          <div class=\"mt-3 flex items-baseline gap-2\">\n            <span class=\"text-warning text-warning text-2xl font-bold tracking-tight tabular-nums\">\n              {{ flaggedCount }}\n            </span>\n            <span class=\"text-warning text-xs font-semibold\">Pending Review</span>\n          </div>\n          <p class=\"text-muted-foreground mt-1 text-xs\">Action required · SLA &lt;2h · 1 high confidence</p>\n        </CardContent>\n      </Card>\n\n      <!-- Card 4: Confirmed Prohibited Matches -->\n      <Card class=\"border-border/80 border shadow-xs\">\n        <CardContent class=\"p-4 sm:p-5\">\n          <div class=\"flex items-center justify-between\">\n            <span class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\"\n              >Confirmed Prohibited Matches</span\n            >\n            <div class=\"bg-destructive/10 text-destructive flex size-8 items-center justify-center rounded-md\">\n              <Ban class=\"size-4\" />\n            </div>\n          </div>\n          <div class=\"mt-3 flex items-baseline gap-2\">\n            <span\n              class=\"text-2xl font-bold tracking-tight tabular-nums\"\n              :class=\"blockedCount > 0 ? 'text-destructive' : 'text-foreground'\"\n            >\n              {{ blockedCount }}\n            </span>\n            <span class=\"text-muted-foreground text-xs font-semibold\">Blocked</span>\n          </div>\n          <p class=\"text-muted-foreground mt-1 text-xs\">Asset freeze locked · FinCEN SAR ready</p>\n        </CardContent>\n      </Card>\n    </div>\n\n    <!-- Real-Time Entity Search Bar & Fuzzy Threshold Workbench -->\n    <Card class=\"border-border/80 bg-card border shadow-xs\">\n      <CardContent class=\"space-y-4 p-4 sm:p-5\">\n        <div class=\"grid grid-cols-1 items-end gap-4 md:grid-cols-12\">\n          <!-- Search Input -->\n          <div class=\"space-y-1.5 md:col-span-4\">\n            <label for=\"entity-search-input\" class=\"text-foreground flex items-center gap-1.5 text-xs font-medium\">\n              <Search class=\"text-muted-foreground size-3.5\" />\n              <span>Search Individual / Entity Name</span>\n            </label>\n            <div class=\"relative\">\n              <Input\n                id=\"entity-search-input\"\n                v-model=\"searchQuery\"\n                type=\"text\"\n                placeholder=\"Search name, alias, ID or passport...\"\n                class=\"bg-background pl-8 text-xs sm:text-sm\"\n              />\n              <Search\n                class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\"\n              />\n              <button\n                aria-label=\"Clear search\"\n                v-if=\"searchQuery\"\n                type=\"button\"\n                class=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-2.5 -translate-y-1/2\"\n                @click=\"searchQuery = ''\"\n              >\n                <X class=\"size-3.5\" />\n              </button>\n            </div>\n          </div>\n\n          <!-- Country Filter Dropdown -->\n          <div class=\"space-y-1.5 md:col-span-3\">\n            <label class=\"text-foreground flex items-center gap-1.5 text-xs font-medium\">\n              <Globe class=\"text-muted-foreground size-3.5\" />\n              <span>Country / Domicile Filter</span>\n            </label>\n            <Select v-model=\"selectedCountry\">\n              <SelectTrigger class=\"bg-background w-full text-xs sm:text-sm [&>span]:truncate [&>svg]:shrink-0\">\n                <SelectValue placeholder=\"All Countries\" />\n              </SelectTrigger>\n              <SelectContent>\n                <SelectItem value=\"all\">All Countries</SelectItem>\n                <SelectItem value=\"Russia\">Russia (Russian Federation)</SelectItem>\n                <SelectItem value=\"United States\">United States (USA)</SelectItem>\n                <SelectItem value=\"Cyprus\">Cyprus (EU)</SelectItem>\n                <SelectItem value=\"United Kingdom\">United Kingdom (UK)</SelectItem>\n                <SelectItem value=\"Switzerland\">Switzerland (CH)</SelectItem>\n                <SelectItem value=\"United Arab Emirates\">United Arab Emirates (UAE)</SelectItem>\n              </SelectContent>\n            </Select>\n          </div>\n\n          <!-- Entity Type Pills -->\n          <div class=\"space-y-1.5 md:col-span-2\">\n            <label class=\"text-foreground flex items-center gap-1.5 text-xs font-medium\">\n              <Building2 class=\"text-muted-foreground size-3.5\" />\n              <span>Entity Type</span>\n            </label>\n            <div class=\"bg-muted border-input flex h-9 items-center gap-1 rounded-md border p-1\">\n              <button\n                type=\"button\"\n                :class=\"\n                  cn(\n                    'flex-1 rounded px-2 py-1 text-xs font-medium transition-colors',\n                    selectedEntityType === 'all'\n                      ? 'bg-background text-foreground shadow-xs'\n                      : 'text-muted-foreground hover:text-foreground',\n                  )\n                \"\n                @click=\"selectedEntityType = 'all'\"\n              >\n                All\n              </button>\n              <button\n                type=\"button\"\n                :class=\"\n                  cn(\n                    'flex-1 rounded px-2 py-1 text-xs font-medium transition-colors',\n                    selectedEntityType === 'individual'\n                      ? 'bg-background text-foreground shadow-xs'\n                      : 'text-muted-foreground hover:text-foreground',\n                  )\n                \"\n                @click=\"selectedEntityType = 'individual'\"\n              >\n                Indiv.\n              </button>\n              <button\n                type=\"button\"\n                :class=\"\n                  cn(\n                    'flex-1 rounded px-2 py-1 text-xs font-medium transition-colors',\n                    selectedEntityType === 'corporate'\n                      ? 'bg-background text-foreground shadow-xs'\n                      : 'text-muted-foreground hover:text-foreground',\n                  )\n                \"\n                @click=\"selectedEntityType = 'corporate'\"\n              >\n                Corp.\n              </button>\n            </div>\n          </div>\n\n          <!-- Match Threshold Slider -->\n          <div class=\"space-y-1.5 md:col-span-3\">\n            <div class=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-1\">\n              <label class=\"text-foreground flex items-center gap-1.5 text-xs font-medium\">\n                <Sliders class=\"text-muted-foreground size-3.5\" />\n                <span>Match Threshold</span>\n              </label>\n              <Badge wrap variant=\"secondary\" class=\"text-xs font-semibold tabular-nums\">\n                {{ currentThreshold }}% Fuzzy Match\n              </Badge>\n            </div>\n            <div class=\"pt-1.5\">\n              <Slider v-model=\"thresholdValue\" :min=\"50\" :max=\"100\" :step=\"1\" class=\"w-full\" />\n            </div>\n          </div>\n        </div>\n\n        <!-- Filter helper status bar -->\n        <div\n          class=\"border-border/60 text-muted-foreground flex flex-wrap items-center justify-between gap-2 border-t pt-2 text-xs\"\n        >\n          <div class=\"flex min-w-0 items-center gap-2\">\n            <span\n              >Showing <strong class=\"text-foreground tabular-nums\">{{ filteredRecords.length }}</strong> of\n              <strong class=\"text-foreground tabular-nums\">{{ records.length }}</strong> screening audit records</span\n            >\n            <span\n              v-if=\"searchQuery || selectedCountry !== 'all' || selectedEntityType !== 'all'\"\n              class=\"text-muted-foreground/60\"\n              >· Filters applied</span\n            >\n          </div>\n          <div class=\"flex min-w-0 items-center gap-2\">\n            <Button\n              v-if=\"searchQuery || selectedCountry !== 'all' || selectedEntityType !== 'all' || currentThreshold !== 85\"\n              variant=\"ghost\"\n              size=\"sm\"\n              class=\"text-muted-foreground hover:text-foreground h-7 gap-1 text-xs\"\n              @click=\"handleResetFilters\"\n            >\n              <RotateCcw class=\"size-3\" />\n              <span>Reset Filters</span>\n            </Button>\n          </div>\n        </div>\n      </CardContent>\n    </Card>\n\n    <!-- Screening Match Results Table -->\n    <Card class=\"border-border/80 overflow-hidden border shadow-xs\">\n      <CardHeader class=\"border-border/60 border-b p-4 pb-3 sm:p-5\">\n        <div class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n          <div>\n            <CardTitle class=\"text-base font-semibold\">Active Screening Queue &amp; Target List Matches</CardTitle>\n            <CardDescription class=\"mt-0.5 text-xs\">\n              Real-time fuzzy scoring across OFAC SDN, Sectoral SSI, EU Restrictive Measures, and UN Security Council\n              lists.\n            </CardDescription>\n          </div>\n          <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n            <span class=\"bg-warning inline-block size-2 rounded-full\" />\n            <span>Amber: Requires Review</span>\n            <span class=\"bg-destructive ml-2 inline-block size-2 rounded-full\" />\n            <span>Red: Prohibited Asset Freeze</span>\n          </div>\n        </div>\n      </CardHeader>\n\n      <div class=\"overflow-x-auto\">\n        <Table>\n          <TableHeader class=\"bg-muted/40\">\n            <TableRow>\n              <TableHead class=\"min-w-[220px]\">Entity Name &amp; Classification</TableHead>\n              <TableHead class=\"min-w-[140px]\">Match Score &amp; Status</TableHead>\n              <TableHead class=\"min-w-[200px]\">Designated Watchlist / Program</TableHead>\n              <TableHead class=\"min-w-[220px]\">Matched Attributes</TableHead>\n              <TableHead class=\"min-w-[130px]\">Jurisdiction</TableHead>\n              <TableHead class=\"min-w-[220px] text-right\">Actions</TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            <TableRow\n              v-for=\"record in filteredRecords\"\n              :key=\"record.id\"\n              :class=\"\n                cn(\n                  'hover:bg-muted/30 transition-colors',\n                  record.matchStatus === 'potential_match' && 'bg-warning/[0.02]',\n                  record.matchStatus === 'prohibited_match' && 'bg-destructive/[0.03]',\n                  record.matchStatus === 'blocked' && 'bg-destructive/[0.06] opacity-90',\n                )\n              \"\n            >\n              <!-- 1. Entity Name & Classification -->\n              <TableCell class=\"py-3.5 align-top font-medium\">\n                <div class=\"flex items-start gap-2.5\">\n                  <div\n                    :class=\"\n                      cn(\n                        'mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg text-xs font-bold',\n                        record.entityType === 'individual'\n                          ? 'bg-primary/10 text-primary'\n                          : 'bg-secondary text-secondary-foreground',\n                      )\n                    \"\n                  >\n                    <User v-if=\"record.entityType === 'individual'\" class=\"size-4\" />\n                    <Building2 v-else class=\"size-4\" />\n                  </div>\n                  <div>\n                    <div class=\"flex items-center gap-1.5\">\n                      <span class=\"text-foreground font-semibold\">{{ record.entityName }}</span>\n                      <Badge wrap variant=\"outline\" class=\"px-1.5 py-0 text-xs uppercase\">\n                        {{ record.entityType }}\n                      </Badge>\n                    </div>\n                    <p v-if=\"record.originalScript\" class=\"text-muted-foreground mt-0.5 text-xs\">\n                      {{ record.originalScript }}\n                    </p>\n                    <div\n                      v-if=\"record.aliases && record.aliases.length > 0\"\n                      class=\"text-muted-foreground/80 mt-1 flex flex-wrap gap-1 text-xs\"\n                    >\n                      <span class=\"font-medium\">AKAs:</span>\n                      <span\n                        >{{ record.aliases.slice(0, 2).join(', ')\n                        }}{{ record.aliases.length > 2 ? ` (+${record.aliases.length - 2} more)` : '' }}</span\n                      >\n                    </div>\n                  </div>\n                </div>\n              </TableCell>\n\n              <!-- 2. Match Score & Status -->\n              <TableCell class=\"py-3.5 align-top\">\n                <div class=\"space-y-1\">\n                  <!-- Badges based on score and status -->\n                  <div v-if=\"record.matchStatus === 'blocked'\">\n                    <Badge wrap variant=\"destructive\" class=\"gap-1 text-xs font-semibold\">\n                      <Ban class=\"size-3\" />\n                      <span>Blocked &amp; Frozen</span>\n                    </Badge>\n                  </div>\n                  <div v-else-if=\"record.matchStatus === 'cleared_false_positive'\">\n                    <Badge\n                      wrap\n                      variant=\"outline\"\n                      class=\"border-success/30 bg-success/10 text-success gap-1 text-xs font-semibold\"\n                    >\n                      <CheckCircle2 class=\"size-3\" />\n                      <span>Cleared (False Positive)</span>\n                    </Badge>\n                  </div>\n                  <div v-else-if=\"record.matchScore >= 95\">\n                    <Badge wrap variant=\"destructive\" class=\"gap-1 text-xs font-semibold tabular-nums\">\n                      <ShieldX class=\"size-3\" />\n                      <span>{{ record.matchScore }}% Critical Match</span>\n                    </Badge>\n                  </div>\n                  <div v-else-if=\"record.matchScore >= currentThreshold\">\n                    <Badge\n                      wrap\n                      variant=\"outline\"\n                      class=\"border-warning/40 bg-warning/15 text-warning text-warning gap-1 text-xs font-semibold tabular-nums\"\n                    >\n                      <AlertTriangle class=\"size-3\" />\n                      <span>{{ record.matchScore }}% Match</span>\n                    </Badge>\n                  </div>\n                  <div v-else>\n                    <Badge\n                      wrap\n                      variant=\"outline\"\n                      class=\"border-success/30 bg-success/10 text-success text-success gap-1 text-xs font-semibold tabular-nums\"\n                    >\n                      <Check class=\"size-3\" />\n                      <span>{{ record.matchScore }}% Match · Clear</span>\n                    </Badge>\n                  </div>\n\n                  <div class=\"text-muted-foreground text-xs tabular-nums\">Screened {{ record.lastScreened }}</div>\n                </div>\n              </TableCell>\n\n              <!-- 3. Target Sanctions List & Programs -->\n              <TableCell class=\"py-3.5 align-top\">\n                <div class=\"space-y-1\">\n                  <div class=\"text-foreground text-xs font-medium\">\n                    {{ record.sanctionList }}\n                  </div>\n                  <div class=\"text-muted-foreground line-clamp-2 text-xs\">\n                    {{ record.program }}\n                  </div>\n                  <div v-if=\"record.pepLevel\" class=\"text-warning text-xs font-medium\">\n                    {{ record.pepLevel }}\n                  </div>\n                </div>\n              </TableCell>\n\n              <!-- 4. Matched Attributes -->\n              <TableCell class=\"py-3.5 align-top\">\n                <div class=\"space-y-1 text-xs\">\n                  <div class=\"text-foreground font-medium\">\n                    {{ record.matchedAttributesSummary }}\n                  </div>\n                  <div class=\"text-muted-foreground tabular-nums\">ID: {{ record.nationalIdOrLei }}</div>\n                  <div class=\"text-muted-foreground max-w-[240px] truncate\">\n                    {{ record.address }}\n                  </div>\n                </div>\n              </TableCell>\n\n              <!-- 5. Jurisdiction -->\n              <TableCell class=\"py-3.5 align-top\">\n                <div class=\"space-y-1 text-xs\">\n                  <div class=\"text-foreground flex items-center gap-1 font-medium\">\n                    <Globe class=\"text-muted-foreground size-3 shrink-0\" />\n                    <span>{{ record.country }}</span>\n                  </div>\n                  <div class=\"text-muted-foreground\">\n                    {{ record.jurisdiction }}\n                  </div>\n                </div>\n              </TableCell>\n\n              <!-- 6. Actions -->\n              <TableCell class=\"py-3.5 text-right align-top\">\n                <div class=\"flex flex-col items-end justify-end gap-1.5 sm:flex-row sm:items-center\">\n                  <!-- Review Match button always present -->\n                  <Button\n                    variant=\"outline\"\n                    size=\"sm\"\n                    class=\"h-8 cursor-pointer gap-1.5 text-xs\"\n                    @click=\"openInvestigation(record)\"\n                  >\n                    <Eye class=\"size-3.5\" />\n                    <span>Review Match</span>\n                  </Button>\n\n                  <!-- Contextual buttons for Viktor Ivanov -->\n                  <template\n                    v-if=\"\n                      record.id === 'SANCT-2026-001' &&\n                      record.matchStatus !== 'cleared_false_positive' &&\n                      record.matchStatus !== 'blocked'\n                    \"\n                  >\n                    <Button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      class=\"text-success hover:bg-success/10 hover:text-success h-8 cursor-pointer gap-1 text-xs\"\n                      @click=\"handleClearFalsePositive(record)\"\n                    >\n                      <Check class=\"size-3.5\" />\n                      <span>Clear False Positive</span>\n                    </Button>\n                    <Button\n                      variant=\"destructive\"\n                      size=\"sm\"\n                      class=\"h-8 cursor-pointer gap-1 text-xs\"\n                      @click=\"handleBlockEntity(record)\"\n                    >\n                      <Ban class=\"size-3.5\" />\n                      <span>Block &amp; Freeze</span>\n                    </Button>\n                  </template>\n\n                  <!-- Contextual buttons for Sberbank -->\n                  <template v-if=\"record.id === 'SANCT-2026-004' && record.matchStatus !== 'blocked'\">\n                    <Button\n                      variant=\"destructive\"\n                      size=\"sm\"\n                      class=\"h-8 cursor-pointer gap-1 text-xs\"\n                      @click=\"handleBlockEntity(record)\"\n                    >\n                      <Ban class=\"size-3.5\" />\n                      <span>Block Entity</span>\n                    </Button>\n                  </template>\n                </div>\n              </TableCell>\n            </TableRow>\n\n            <TableRow v-if=\"filteredRecords.length === 0\">\n              <TableCell colspan=\"6\" class=\"text-muted-foreground py-10 text-center\">\n                <div class=\"flex flex-col items-center justify-center gap-2\">\n                  <FileSearch class=\"text-muted-foreground/50 size-8\" />\n                  <p class=\"text-sm font-medium\">No matching screening records found</p>\n                  <p class=\"text-xs\">Adjust your search keyword, country filter, or match threshold.</p>\n                  <Button variant=\"outline\" size=\"sm\" class=\"mt-2 text-xs\" @click=\"handleResetFilters\">\n                    Reset Filters\n                  </Button>\n                </div>\n              </TableCell>\n            </TableRow>\n          </TableBody>\n        </Table>\n      </div>\n    </Card>\n\n    <!-- Sanction Match Investigation Modal / Dialog -->\n    <SanctionsInvestigationDialog\n      v-model:open=\"isInvestigationOpen\"\n      :selected-record=\"selectedRecord\"\n      :threshold-value=\"currentThreshold\"\n      @clear=\"handleClearFalsePositive\"\n      @escalate=\"handleEscalate\"\n      @block=\"handleBlockEntity\"\n    />\n  </div>\n</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/ComplianceSanctionsScreener.vue"
    },
    {
      "path": "packages/registry-vue/blocks/compliance-sanctions-screener/SanctionsInvestigationDialog.vue",
      "content": "<script setup lang=\"ts\">\nimport { Ban, Check, Layers, ShieldAlert, ShieldCheck } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport type { SanctionRecord } from './compliance-sanctions-types'\n\ninterface Props {\n  open: boolean\n  selectedRecord: SanctionRecord | null\n  thresholdValue: number\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n  'update:open': [value: boolean]\n  clear: [record: SanctionRecord]\n  escalate: [record: SanctionRecord]\n  block: [record: SanctionRecord]\n}>()\n\nfunction handleClear() {\n  if (props.selectedRecord) {\n    emit('clear', props.selectedRecord)\n    emit('update:open', false)\n  }\n}\n\nfunction handleEscalate() {\n  if (props.selectedRecord) {\n    emit('escalate', props.selectedRecord)\n  }\n}\n\nfunction handleBlock() {\n  if (props.selectedRecord) {\n    emit('block', props.selectedRecord)\n    emit('update:open', false)\n  }\n}\n</script>\n\n<template>\n  <Dialog :open=\"open\" @update:open=\"(val) => emit('update:open', val)\">\n    <DialogContent v-if=\"selectedRecord\" class=\"max-h-[90vh] overflow-y-auto sm:max-w-3xl\">\n      <DialogHeader>\n        <div class=\"flex min-w-0 items-center gap-2.5\">\n          <div\n            :class=\"\n              cn(\n                'flex size-9 shrink-0 items-center justify-center rounded-lg',\n                selectedRecord.matchScore >= 85 ? 'bg-warning/15 text-warning' : 'bg-success/15 text-success',\n              )\n            \"\n          >\n            <ShieldAlert v-if=\"selectedRecord.matchScore >= 85\" class=\"size-5\" />\n            <ShieldCheck v-else class=\"size-5\" />\n          </div>\n          <div>\n            <DialogTitle class=\"text-base font-bold sm:text-lg\">\n              Sanction Match Investigation &amp; Attribute Comparison\n            </DialogTitle>\n            <DialogDescription class=\"text-muted-foreground mt-0.5 text-xs\">\n              Detailed biometric, legal entity registry, and designated watchlist reconciliation audit trail.\n            </DialogDescription>\n          </div>\n        </div>\n      </DialogHeader>\n\n      <div class=\"space-y-4 py-2\">\n        <!-- Entity Overview Banner -->\n        <div class=\"border-border bg-muted/40 grid grid-cols-1 gap-3 rounded-lg border p-3 text-xs sm:grid-cols-3\">\n          <div>\n            <span class=\"text-muted-foreground block\">Subject Entity Name</span>\n            <strong class=\"text-foreground text-sm font-semibold\">{{ selectedRecord.entityName }}</strong>\n            <div v-if=\"selectedRecord.originalScript\" class=\"text-muted-foreground mt-0.5 text-xs\">\n              {{ selectedRecord.originalScript }}\n            </div>\n          </div>\n          <div>\n            <span class=\"text-muted-foreground block\">Fuzzy Algorithm Score</span>\n            <div class=\"mt-0.5 flex items-center gap-1.5\">\n              <span\n                class=\"text-sm font-bold tabular-nums\"\n                :class=\"selectedRecord.matchScore >= 85 ? 'text-warning' : 'text-success'\"\n              >\n                {{ selectedRecord.matchScore }}% Match\n              </span>\n              <Badge\n                :variant=\"\n                  selectedRecord.matchScore >= 95\n                    ? 'destructive'\n                    : selectedRecord.matchScore >= 85\n                      ? 'outline'\n                      : 'success'\n                \"\n                class=\"py-0 text-xs whitespace-normal\"\n              >\n                {{\n                  selectedRecord.matchScore >= 95\n                    ? 'Critical Risk'\n                    : selectedRecord.matchScore >= 85\n                      ? 'High Confidence'\n                      : 'Clear / Clean'\n                }}\n              </Badge>\n            </div>\n            <span class=\"text-muted-foreground text-xs\">Threshold: {{ thresholdValue }}%</span>\n          </div>\n          <div>\n            <span class=\"text-muted-foreground block\">Primary Watchlist Source</span>\n            <strong class=\"text-foreground mt-0.5 line-clamp-1 font-medium\">{{ selectedRecord.sanctionList }}</strong>\n            <span class=\"text-muted-foreground text-xs\">{{ selectedRecord.jurisdiction }}</span>\n          </div>\n        </div>\n\n        <!-- Attribute Comparison Matrix -->\n        <div class=\"space-y-2\">\n          <h4 class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\">\n            <Layers class=\"text-primary size-3.5\" />\n            <span>Attribute-by-Attribute Verification Matrix</span>\n          </h4>\n\n          <div class=\"border-border overflow-hidden rounded-lg border\">\n            <div class=\"overflow-x-auto\">\n              <Table>\n                <TableHeader class=\"bg-muted/60\">\n                  <TableRow>\n                    <TableHead class=\"w-[140px] text-xs\">Attribute</TableHead>\n                    <TableHead class=\"min-w-[160px] text-xs\">Submitted Query Data</TableHead>\n                    <TableHead class=\"min-w-[200px] text-xs\">Designated Watchlist Record</TableHead>\n                    <TableHead class=\"w-[130px] text-right text-xs\">Match Verdict</TableHead>\n                  </TableRow>\n                </TableHeader>\n                <TableBody>\n                  <TableRow\n                    v-for=\"(attr, idx) in selectedRecord.attributeComparisons\"\n                    :key=\"idx\"\n                    class=\"hover:bg-muted/20 text-xs\"\n                  >\n                    <TableCell class=\"text-foreground py-2.5 align-top font-medium\">\n                      {{ attr.field }}\n                    </TableCell>\n                    <TableCell class=\"text-muted-foreground py-2.5 align-top\">\n                      <span class=\"text-foreground font-medium\">{{ attr.submittedValue }}</span>\n                    </TableCell>\n                    <TableCell class=\"py-2.5 align-top\">\n                      <div class=\"space-y-0.5\">\n                        <span class=\"text-foreground font-medium\">{{ attr.watchlistValue }}</span>\n                        <p v-if=\"attr.note\" class=\"text-muted-foreground/80 text-xs italic\">\n                          {{ attr.note }}\n                        </p>\n                      </div>\n                    </TableCell>\n                    <TableCell class=\"py-2.5 text-right align-top\">\n                      <Badge\n                        v-if=\"attr.matchType === 'exact'\"\n                        variant=\"destructive\"\n                        class=\"text-xs font-semibold whitespace-normal tabular-nums\"\n                      >\n                        {{ attr.score }}% Exact Match\n                      </Badge>\n                      <Badge\n                        v-else-if=\"attr.matchType === 'fuzzy' || attr.matchType === 'partial'\"\n                        variant=\"outline\"\n                        class=\"border-warning/40 bg-warning/15 text-warning text-warning text-xs font-semibold whitespace-normal tabular-nums\"\n                      >\n                        {{ attr.score }}% Fuzzy Hit\n                      </Badge>\n                      <Badge\n                        v-else\n                        wrap\n                        variant=\"outline\"\n                        class=\"border-success/30 bg-success/10 text-success text-xs font-semibold\"\n                      >\n                        Clear\n                      </Badge>\n                    </TableCell>\n                  </TableRow>\n                </TableBody>\n              </Table>\n            </div>\n          </div>\n        </div>\n\n        <!-- Legal Authority & Compliance Advisory Warning -->\n        <div\n          v-if=\"selectedRecord.matchScore >= 85\"\n          class=\"border-destructive/30 bg-destructive/5 text-foreground space-y-2 rounded-lg border p-3.5 text-xs\"\n        >\n          <div class=\"text-destructive flex min-w-0 items-center gap-2 font-semibold\">\n            <ShieldAlert class=\"size-4\" />\n            <span>Mandatory Sanctions Compliance &amp; Asset Freeze Notice (31 CFR Part 587)</span>\n          </div>\n          <p class=\"text-muted-foreground\">\n            If confirmed prohibited, all property and interests in property of this entity within U.S. or EU\n            jurisdiction must be immediately blocked and reported to OFAC / designated national sanctions authorities\n            within 10 business days.\n          </p>\n          <div class=\"text-muted-foreground flex flex-wrap items-center gap-3 font-mono text-xs\">\n            <span>Program: {{ selectedRecord.program }}</span>\n            <span>•</span>\n            <span>SAR Filing: Required within 30d</span>\n          </div>\n        </div>\n      </div>\n\n      <DialogFooter\n        class=\"border-border flex flex-col-reverse gap-2 border-t pt-3 sm:flex-row sm:items-center sm:justify-between\"\n      >\n        <DialogClose as-child>\n          <Button variant=\"outline\" size=\"sm\" class=\"text-xs\"> Dismiss / Close </Button>\n        </DialogClose>\n\n        <div class=\"flex min-w-0 items-center gap-2\">\n          <Button\n            v-if=\"selectedRecord.matchStatus !== 'cleared_false_positive'\"\n            variant=\"outline\"\n            size=\"sm\"\n            class=\"text-success hover:bg-success/10 hover:text-success gap-1.5 text-xs\"\n            @click=\"handleClear\"\n          >\n            <Check class=\"size-3.5\" />\n            <span>Clear False Positive</span>\n          </Button>\n\n          <Button variant=\"secondary\" size=\"sm\" class=\"gap-1.5 text-xs\" @click=\"handleEscalate\">\n            <ShieldAlert class=\"size-3.5\" />\n            <span>Escalate to MLRO</span>\n          </Button>\n\n          <Button\n            v-if=\"selectedRecord.matchStatus !== 'blocked'\"\n            variant=\"destructive\"\n            size=\"sm\"\n            class=\"gap-1.5 text-xs\"\n            @click=\"handleBlock\"\n          >\n            <Ban class=\"size-3.5\" />\n            <span>Confirm Prohibited &amp; Block</span>\n          </Button>\n        </div>\n      </DialogFooter>\n    </DialogContent>\n  </Dialog>\n</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/SanctionsInvestigationDialog.vue"
    },
    {
      "path": "packages/registry-vue/blocks/compliance-sanctions-screener/compliance-sanctions-types.ts",
      "content": "import type { HTMLAttributes } from 'vue'\n\nexport type MatchStatus = 'potential_match' | 'prohibited_match' | 'clear' | 'cleared_false_positive' | 'blocked'\nexport type EntityType = 'individual' | 'corporate'\n\nexport interface SanctionAttributeComparison {\n  field: string\n  submittedValue: string\n  watchlistValue: string\n  matchType: 'exact' | 'fuzzy' | 'partial' | 'clean' | 'unmatched'\n  score: number\n  note?: string\n}\n\nexport interface SanctionRecord {\n  id: string\n  entityName: string\n  originalScript?: string\n  entityType: EntityType\n  matchScore: number\n  matchStatus: MatchStatus\n  sanctionList: string\n  program: string\n  matchedAttributesSummary: string\n  country: string\n  jurisdiction: string\n  dateOfBirthOrIncorporation: string\n  nationalIdOrLei: string\n  address: string\n  aliases: string[]\n  pepLevel?: string\n  remarks?: string\n  lastScreened: string\n  attributeComparisons: SanctionAttributeComparison[]\n}\n\nexport interface NotificationBanner {\n  message: string\n  type: 'success' | 'warning' | 'destructive' | 'info'\n}\n\nexport interface ComplianceSanctionsScreenerProps {\n  initialSearch?: string\n  initialCountry?: string\n  initialThreshold?: number\n  initialRecords?: SanctionRecord[]\n  class?: HTMLAttributes['class']\n}\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/compliance-sanctions-types.ts"
    },
    {
      "path": "packages/registry-vue/blocks/compliance-sanctions-screener/compliance-sanctions-data.ts",
      "content": "import type { SanctionRecord } from './compliance-sanctions-types'\n\nexport const defaultSanctionRecords: SanctionRecord[] = [\n  {\n    id: 'SANCT-2026-001',\n    entityName: 'Viktor Ivanov',\n    originalScript: 'Иванов Виктор Петрович',\n    entityType: 'individual',\n    matchScore: 94,\n    matchStatus: 'potential_match',\n    sanctionList: 'OFAC SDN List · Sectoral Sanctions',\n    program: 'UKRAINE-EO13662 · Executive Order 14024',\n    matchedAttributesSummary: 'DOB 1974, Russia, Passport 77-04-889102',\n    country: 'Russia',\n    jurisdiction: 'US (OFAC) / EU / UK',\n    dateOfBirthOrIncorporation: '1974-05-12',\n    nationalIdOrLei: '77-04-889102 (RUS)',\n    address: 'Presnenskaya Naberezhnaya 12, Moscow, Russia',\n    aliases: ['Victor Ivanov', 'V. P. Ivanov', 'Viktor Petrovich Ivanov'],\n    pepLevel: 'PEP Tier 2 · Former Deputy Minister of Industry',\n    remarks: 'Designated under Executive Order 14024 for operating in the financial and defense sector.',\n    lastScreened: '10m ago',\n    attributeComparisons: [\n      {\n        field: 'Full Legal Name',\n        submittedValue: 'Viktor Ivanov',\n        watchlistValue: 'IVANOV, Viktor Petrovich (Иванов Виктор Петрович)',\n        matchType: 'fuzzy',\n        score: 96,\n        note: 'Transliteration and patronymic expansion matched',\n      },\n      {\n        field: 'Known Aliases & AKAs',\n        submittedValue: 'Victor Ivanov, V. P. Ivanov',\n        watchlistValue: 'Viktor Ivanov, Victor Petrovich Ivanov, Victor Ivanov-Karpov',\n        matchType: 'partial',\n        score: 94,\n        note: 'Direct alias hit in OFAC Specially Designated database',\n      },\n      {\n        field: 'Date of Birth / Inception',\n        submittedValue: '1974-05-12',\n        watchlistValue: '1974-05-12 (Moscow, USSR / Russian Federation)',\n        matchType: 'exact',\n        score: 100,\n        note: '100% exact cryptographic DOB date match',\n      },\n      {\n        field: 'Passport / National ID',\n        submittedValue: '77-04-889102 (Russian Federation)',\n        watchlistValue: '77-04-889102 / Int. Passport 51-09-112344',\n        matchType: 'exact',\n        score: 100,\n        note: 'Official primary national identity document match',\n      },\n      {\n        field: 'Registered Address',\n        submittedValue: 'Presnenskaya Naberezhnaya 12, Moscow',\n        watchlistValue: 'Presnenskaya Embankment 12, Fl. 4, Moscow 123112, Russia',\n        matchType: 'fuzzy',\n        score: 92,\n        note: 'Street and district normalization matched',\n      },\n      {\n        field: 'PEP Status & Legal Program',\n        submittedValue: 'Executive Director (Disclosed Non-PEP)',\n        watchlistValue: 'OFAC SDN [UKRAINE-EO13662] · PEP Tier 2 · Mandatory Asset Freeze',\n        matchType: 'exact',\n        score: 100,\n        note: 'Undeclared PEP Tier 2 designation active on UK HMT / EU Sanctions',\n      },\n    ],\n  },\n  {\n    id: 'SANCT-2026-002',\n    entityName: 'Sarah Connor',\n    originalScript: 'Sarah Connor',\n    entityType: 'individual',\n    matchScore: 12,\n    matchStatus: 'clear',\n    sanctionList: 'No Sanctions Matches (All Databases Checked)',\n    program: 'None · Standard Retail Profile',\n    matchedAttributesSummary: 'No sanction matches · Low risk profile',\n    country: 'United States',\n    jurisdiction: 'Global / FATF Compliant',\n    dateOfBirthOrIncorporation: '1985-02-28',\n    nationalIdOrLei: 'SSN ***-**-4910',\n    address: '742 Evergreen Terrace, Los Angeles, CA 90001, USA',\n    aliases: ['Sarah J. Connor'],\n    pepLevel: 'Non-PEP',\n    remarks: 'Clear of all OFAC, EU, UN, and PEP lists. Auto-approved by automated compliance pipeline.',\n    lastScreened: '18m ago',\n    attributeComparisons: [\n      {\n        field: 'Full Legal Name',\n        submittedValue: 'Sarah Connor',\n        watchlistValue: 'CONNOR, Sara Helena (Low Soundex Similarity)',\n        matchType: 'fuzzy',\n        score: 18,\n        note: 'Distant phonetical overlap below decision threshold',\n      },\n      {\n        field: 'Known Aliases & AKAs',\n        submittedValue: 'Sarah J. Connor',\n        watchlistValue: 'No matching designated aliases found',\n        matchType: 'clean',\n        score: 0,\n        note: 'Zero hits across all official alias directories',\n      },\n      {\n        field: 'Date of Birth / Inception',\n        submittedValue: '1985-02-28',\n        watchlistValue: '1962-11-04 (Bogota, Colombia)',\n        matchType: 'unmatched',\n        score: 0,\n        note: 'DOB discrepancy (>22 years divergence)',\n      },\n      {\n        field: 'Passport / National ID',\n        submittedValue: 'SSN ***-**-4910 (USA)',\n        watchlistValue: 'COL-9902148 (Republic of Colombia)',\n        matchType: 'unmatched',\n        score: 0,\n        note: 'Different country of issuance and identifier structure',\n      },\n      {\n        field: 'Registered Address',\n        submittedValue: '742 Evergreen Terrace, Los Angeles, CA, USA',\n        watchlistValue: 'Calle 72 #10-34, Bogota, Colombia',\n        matchType: 'unmatched',\n        score: 0,\n        note: 'Zero geographic intersection',\n      },\n      {\n        field: 'PEP Status & Legal Program',\n        submittedValue: 'Individual Retail Client',\n        watchlistValue: 'Clean / Unrestricted Jurisdiction',\n        matchType: 'clean',\n        score: 0,\n        note: 'No adverse media or PEP exposure',\n      },\n    ],\n  },\n  {\n    id: 'SANCT-2026-003',\n    entityName: 'Elena Rostova',\n    originalScript: 'Elena Rostova-Dimitriou',\n    entityType: 'individual',\n    matchScore: 0,\n    matchStatus: 'clear',\n    sanctionList: 'No Sanctions Matches (All Databases Checked)',\n    program: 'None · Private Banking Profile',\n    matchedAttributesSummary: 'No sanction matches · High assurance clean record',\n    country: 'Cyprus',\n    jurisdiction: 'EU / Global Compliant',\n    dateOfBirthOrIncorporation: '1991-09-17',\n    nationalIdOrLei: 'CY-ID 9920194',\n    address: 'Archbishop Makarios III Ave 45, Limassol 3025, Cyprus',\n    aliases: ['Elena Rostova-Dimitriou'],\n    pepLevel: 'Non-PEP',\n    remarks: 'Verified clean record across UN Consolidated, OFAC SDN, UK HMT, and Interpol Red Notices.',\n    lastScreened: '32m ago',\n    attributeComparisons: [\n      {\n        field: 'Full Legal Name',\n        submittedValue: 'Elena Rostova',\n        watchlistValue: 'No target record matches identified in any watchlist',\n        matchType: 'clean',\n        score: 0,\n        note: 'Zero hits across 42 global sanction jurisdictions',\n      },\n      {\n        field: 'Known Aliases & AKAs',\n        submittedValue: 'Elena Rostova-Dimitriou',\n        watchlistValue: 'No target record matches',\n        matchType: 'clean',\n        score: 0,\n        note: 'Zero alias records found',\n      },\n      {\n        field: 'Date of Birth / Inception',\n        submittedValue: '1991-09-17',\n        watchlistValue: 'No target record matches',\n        matchType: 'clean',\n        score: 0,\n        note: 'Clean verification result',\n      },\n      {\n        field: 'Passport / National ID',\n        submittedValue: 'CY-ID 9920194 (Cyprus / EU)',\n        watchlistValue: 'No target record matches',\n        matchType: 'clean',\n        score: 0,\n        note: 'Clean verification result',\n      },\n      {\n        field: 'Registered Address',\n        submittedValue: 'Archbishop Makarios III Ave 45, Limassol, Cyprus',\n        watchlistValue: 'No target record matches',\n        matchType: 'clean',\n        score: 0,\n        note: 'Verified standard EU residential registry',\n      },\n      {\n        field: 'PEP Status & Legal Program',\n        submittedValue: 'Private Banking Client',\n        watchlistValue: 'Verified Non-PEP · Zero Adverse Media Flag',\n        matchType: 'clean',\n        score: 0,\n        note: 'Clean compliance status',\n      },\n    ],\n  },\n  {\n    id: 'SANCT-2026-004',\n    entityName: 'Sberbank Trade Corp',\n    originalScript: 'ПАО Сбербанк / Sberbank Trade Corp',\n    entityType: 'corporate',\n    matchScore: 98,\n    matchStatus: 'prohibited_match',\n    sanctionList: 'EU Sanctions Article 5',\n    program: 'EU Reg 833/2014 Annex XIII · UK Sanctions S.I. 2022/194 · OFAC SSI Directives',\n    matchedAttributesSummary: 'LEI RU-9912048, Sector: Financials, Subsidiary of Sberbank PJSC',\n    country: 'Russia',\n    jurisdiction: 'EU / UK / OFAC Sectoral',\n    dateOfBirthOrIncorporation: '2008-11-14',\n    nationalIdOrLei: 'LEI: 253400X89892182 / INN: 7707083893',\n    address: 'Vavilova St 19, Moscow, 117997, Russia',\n    aliases: ['Sber Trade LLC', 'Sberbank Trading House', 'PJSC Sberbank Sub-Entity'],\n    pepLevel: 'State-Owned Enterprise (SOE) · Comprehensive Asset Freeze',\n    remarks:\n      'Subject to broad asset freeze and prohibitions on financial dealings, capital markets, and correspondent accounts.',\n    lastScreened: '1h ago',\n    attributeComparisons: [\n      {\n        field: 'Legal Entity Name',\n        submittedValue: 'Sberbank Trade Corp',\n        watchlistValue: 'PJSC SBERBANK / Sberbank Trade Corp (ПАО Сбербанк)',\n        matchType: 'exact',\n        score: 99,\n        note: 'Substantial majority-owned direct subsidiary matching designated parent',\n      },\n      {\n        field: 'Known Aliases & AKAs',\n        submittedValue: 'Sber Trade LLC, Sberbank Trading House',\n        watchlistValue: 'Sberbank Trading House / Sber Trade / Sberbank Capital LLC',\n        matchType: 'exact',\n        score: 100,\n        note: '100% match on registered trading names in EU Annex XIII',\n      },\n      {\n        field: 'Date of Incorporation',\n        submittedValue: '2008-11-14',\n        watchlistValue: '2008-11-14 (Moscow, Russian Federation)',\n        matchType: 'exact',\n        score: 100,\n        note: 'Registration date matching corporate charter record',\n      },\n      {\n        field: 'LEI / Corporate Tax ID',\n        submittedValue: 'LEI 253400X89892182 / INN 7707083893',\n        watchlistValue: 'LEI 253400X89892182 / INN 7707083893 / OGRN 1027700132195',\n        matchType: 'exact',\n        score: 100,\n        note: 'Unique global Legal Entity Identifier (LEI) direct match',\n      },\n      {\n        field: 'Registered Head Office',\n        submittedValue: 'Vavilova St 19, Moscow, 117997, Russia',\n        watchlistValue: '19 Vavilova St, Moscow 117997, Russian Federation',\n        matchType: 'exact',\n        score: 98,\n        note: 'Exact match with sanctioned financial headquarters address',\n      },\n      {\n        field: 'Sanction Program & Enforcement',\n        submittedValue: 'Corporate Investment Account',\n        watchlistValue: 'EU Article 5 / UK HMT Sanctions / OFAC 50% Rule Asset Freeze',\n        matchType: 'exact',\n        score: 100,\n        note: 'Mandatory transaction blocking and immediate regulatory freeze required',\n      },\n    ],\n  },\n]\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/compliance-sanctions-data.ts"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/card.json",
    "https://uipkge.dev/r/vue/dialog.json",
    "https://uipkge.dev/r/vue/input.json",
    "https://uipkge.dev/r/vue/select.json",
    "https://uipkge.dev/r/vue/slider.json",
    "https://uipkge.dev/r/vue/table.json"
  ],
  "description": "AML/KYC OFAC, Politically Exposed Persons (PEP), and global sanctions list screening workbench with fuzzy match threshold tuning, real-time entity inspection modal, and prohibited match enforcement.",
  "categories": [
    "legal",
    "dashboard",
    "finance",
    "security"
  ]
}