{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "compliance-soc2-readiness",
  "title": "Compliance Soc2 Readiness",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/compliance-soc2-readiness/compliance-soc2-readiness.component.ts",
      "content": "// Vanta/Drata-style SOC 2 Type II, ISO 27001, and HIPAA compliance readiness dashboard\n// with framework selector tabs, audit readiness scorecards, 4 control pillar health bars,\n// continuous automated evidence test tables with verified artifact badges, and auditor\n// trust center portal controls. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  AlertCircle,\n  AlertTriangle,\n  ArrowUpRight,\n  BadgeCheck,\n  Calendar,\n  Check,\n  CheckCircle2,\n  Clock,\n  Download,\n  Eye,\n  FileDown,\n  FileText,\n  Filter,\n  KeyRound,\n  Lock,\n  LucideAngularModule,\n  RefreshCw,\n  Search,\n  Server,\n  Shield,\n  ShieldCheck,\n  Users,\n  X,\n  Zap,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\nimport { UiTabsComponent, UiTabsListComponent, UiTabsTriggerComponent } from '@/ui/tabs/tabs.component'\n\nexport interface PillarData {\n  code: string\n  title: string\n  description: string\n  score: number\n  passed: number\n  total: number\n  status: string\n  statusVariant: 'success' | 'warning' | 'secondary'\n  highlights: string[]\n  iconType: 'key' | 'shield' | 'activity' | 'users' | 'lock' | 'server' | 'file'\n}\n\nexport interface EvidenceTestItem {\n  id: string\n  code: string\n  name: string\n  description: string\n  category: 'Identity & Auth' | 'Cloud Infrastructure' | 'Security Operations' | 'DevOps & CI/CD' | 'People & HR'\n  frequency: 'Continuous (1h)' | 'Daily' | 'Monthly' | 'Quarterly'\n  status: 'Passing' | 'Needs Attention'\n  statusVariant: 'success' | 'warning'\n  artifact: string\n  verified: boolean\n  lastTested: string\n  auditorNotes: string\n}\n\nexport interface FrameworkConfig {\n  id: string\n  tabLabel: string\n  name: string\n  badge: string\n  standard: string\n  score: number\n  readinessLabel: string\n  period: string\n  auditor: string\n  totalPassing: number\n  totalTests: number\n  pillars: PillarData[]\n  tests: EvidenceTestItem[]\n  trustCenterUrl: string\n}\n\nconst frameworksData: Record<string, FrameworkConfig> = {\n  soc2: {\n    id: 'soc2',\n    tabLabel: 'SOC 2 Type II',\n    name: 'SOC 2 Type II Readiness',\n    badge: 'Security & Confidentiality',\n    standard: 'AICPA Trust Services Criteria (CC1–CC9)',\n    score: 96,\n    readinessLabel: '96% Audit Ready',\n    period: 'Jan 1, 2026 – Dec 31, 2026',\n    auditor: 'KPMG LLP · Sarah Jenkins, CPA/CISA',\n    totalPassing: 69,\n    totalTests: 71,\n    pillars: [\n      {\n        code: 'CC1',\n        title: 'Access Control & IAM',\n        description: 'Identity federation, MFA enforcement, and least-privilege role provisioning.',\n        score: 100,\n        passed: 24,\n        total: 24,\n        status: '100% Passed · 24/24 tests',\n        statusVariant: 'success',\n        highlights: ['FIDO2/WebAuthn Hardware MFA', 'Just-In-Time Role Elevation'],\n        iconType: 'key',\n      },\n      {\n        code: 'CC2',\n        title: 'Encryption & Key Management',\n        description: 'Data encryption in-transit & at rest with automated CMK key rotation.',\n        score: 98,\n        passed: 18,\n        total: 18,\n        status: '98% Passed · 18/18 tests',\n        statusVariant: 'success',\n        highlights: ['AWS KMS Envelope CMKs', 'TLS 1.3 Strict Cipher Suites'],\n        iconType: 'shield',\n      },\n      {\n        code: 'CC3',\n        title: 'Incident Response & Logging',\n        description: 'Immutable audit trail ingesters, P1 runbooks, and real-time SIEM alerts.',\n        score: 94,\n        passed: 15,\n        total: 16,\n        status: '94% Passed · 15/16 tests',\n        statusVariant: 'warning',\n        highlights: ['Immutable WORM S3 Bucket', 'Quarterly Drill Executed'],\n        iconType: 'activity',\n      },\n      {\n        code: 'CC4',\n        title: 'Employee Security & Vendor Risk',\n        description: 'Background checks, awareness training, and third-party vendor DPA reviews.',\n        score: 92,\n        passed: 12,\n        total: 13,\n        status: '92% Passed · 12/13 tests',\n        statusVariant: 'secondary',\n        highlights: ['100% Staff Security Training', 'Tier 1 Vendor DPA Signed'],\n        iconType: 'users',\n      },\n    ],\n    tests: [\n      {\n        id: 'test-soc2-1',\n        code: 'CC6.1',\n        name: 'MFA Enforced for All Staff',\n        description: 'Continuous sync with Okta IAM confirming hardware/TOTP MFA active on all active seats.',\n        category: 'Identity & Auth',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'okta-mfa-sync-v2.json',\n        verified: true,\n        lastTested: '4m ago',\n        auditorNotes: '100% of 248 accounts verified with WebAuthn/FIDO2 hardware key enforcement.',\n      },\n      {\n        id: 'test-soc2-2',\n        code: 'CC6.6',\n        name: 'DB Storage Encrypted with KMS',\n        description: 'All production RDS PostgreSQL and Redis storage volumes encrypted at rest with AWS KMS.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'aws-kms-rds-audit-prod.json',\n        verified: true,\n        lastTested: '12m ago',\n        auditorNotes: 'AES-256 GCM encryption validated across primary cluster and 4 replica volumes.',\n      },\n      {\n        id: 'test-soc2-3',\n        code: 'CC7.2',\n        name: 'Quarterly Penetration Test Completed',\n        description: 'Independent gray-box network and web application penetration test with zero open criticals.',\n        category: 'Security Operations',\n        frequency: 'Quarterly',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'BishopFox-Pentest-Q2-2026.pdf',\n        verified: true,\n        lastTested: 'Aug 12, 2026',\n        auditorNotes: 'Full remediation verified within 14-day SLA. Attestation signed by Bishop Fox.',\n      },\n      {\n        id: 'test-soc2-4',\n        code: 'CC6.7',\n        name: 'Automated Backup Verification Daily',\n        description: 'Daily point-in-time cross-region database snapshot validation and SHA-256 checksum test.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Daily',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 's3-replica-checksum-20260821.log',\n        verified: true,\n        lastTested: '2h ago',\n        auditorNotes: 'Automated restore drill executed with RPO < 5m and RTO < 15m.',\n      },\n      {\n        id: 'test-soc2-5',\n        code: 'CC8.1',\n        name: 'Branch Protection & PR Reviews Enforced',\n        description: 'GitHub repository rulesets require min 2 peer reviews, signed commits, and passing CI.',\n        category: 'DevOps & CI/CD',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'github-branch-policy-main.json',\n        verified: true,\n        lastTested: '18m ago',\n        auditorNotes: 'Zero bypass permissions granted. Administrator force-push strictly disabled.',\n      },\n      {\n        id: 'test-soc2-6',\n        code: 'CC9.2',\n        name: 'Third-Party Vendor Risk Assessment',\n        description: 'Annual SOC 2 Type II report collection and DPA compliance review for active SaaS vendors.',\n        category: 'People & HR',\n        frequency: 'Monthly',\n        status: 'Needs Attention',\n        statusVariant: 'warning',\n        artifact: 'vendor-risk-matrix-2026.csv',\n        verified: false,\n        lastTested: 'Yesterday',\n        auditorNotes: '1 vendor report renewal pending (Datadog EU renewal contract awaiting counter-signature).',\n      },\n    ],\n    trustCenterUrl: 'https://trust.uipkge.dev',\n  },\n  iso27001: {\n    id: 'iso27001',\n    tabLabel: 'ISO 27001',\n    name: 'ISO/IEC 27001:2022 ISMS',\n    badge: 'Information Security Management',\n    standard: 'Annex A Controls (A.5 – A.8) · Stage 2 Ready',\n    score: 94,\n    readinessLabel: '94% Stage 2 Ready',\n    period: 'Audit Cycle 2026–2027',\n    auditor: 'BSI Group · Henrik Lindqvist, Lead Auditor',\n    totalPassing: 88,\n    totalTests: 93,\n    pillars: [\n      {\n        code: 'A.5',\n        title: 'Organizational Controls',\n        description: 'Information security policies, supplier governance, and asset inventories.',\n        score: 96,\n        passed: 35,\n        total: 37,\n        status: '96% Passed · 35/37 controls',\n        statusVariant: 'success',\n        highlights: ['Approved Security Policies', 'Supplier Risk Classification'],\n        iconType: 'shield',\n      },\n      {\n        code: 'A.6',\n        title: 'People Controls',\n        description: 'Screening, remote work guidelines, and continuous infosec education.',\n        score: 92,\n        passed: 8,\n        total: 8,\n        status: '92% Passed · 8/8 controls',\n        statusVariant: 'success',\n        highlights: ['Annual Training Certification', 'Formal Disciplinary Rules'],\n        iconType: 'users',\n      },\n      {\n        code: 'A.7',\n        title: 'Physical Controls',\n        description: 'Physical security perimeters, clear desk, and device screen lock policies.',\n        score: 100,\n        passed: 14,\n        total: 14,\n        status: '100% Passed · 14/14 controls',\n        statusVariant: 'success',\n        highlights: ['Zero Trust Cloud Infrastructure', 'Automated Screen Locking'],\n        iconType: 'lock',\n      },\n      {\n        code: 'A.8',\n        title: 'Technological Controls',\n        description: 'Endpoint protection, access rights, network security, and vulnerability management.',\n        score: 93,\n        passed: 31,\n        total: 34,\n        status: '93% Passed · 31/34 controls',\n        statusVariant: 'warning',\n        highlights: ['EDR on 100% Managed Laptops', 'Zero Trust Network Architecture'],\n        iconType: 'server',\n      },\n    ],\n    tests: [\n      {\n        id: 'test-iso-1',\n        code: 'A.8.2',\n        name: 'Privileged Access Rights Review',\n        description: 'Quarterly review and revocation of administrative privileges on AWS and cloud IdPs.',\n        category: 'Identity & Auth',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'iam-privileged-access-matrix.json',\n        verified: true,\n        lastTested: '8m ago',\n        auditorNotes: 'All root credentials locked behind hardware token in safe storage.',\n      },\n      {\n        id: 'test-iso-2',\n        code: 'A.8.24',\n        name: 'Use of Cryptography & Key Management',\n        description: 'Enforcement of cryptographic standard policies for data in transit and at rest.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'crypto-policy-attestation.json',\n        verified: true,\n        lastTested: '15m ago',\n        auditorNotes: 'TLS 1.3 enforced globally. Insecure TLS 1.0/1.1 disabled.',\n      },\n      {\n        id: 'test-iso-3',\n        code: 'A.5.24',\n        name: 'Infosec Incident Management Plan',\n        description: 'Annual test of incident response playbooks and SIEM real-time alerting integration.',\n        category: 'Security Operations',\n        frequency: 'Quarterly',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'incident-drill-simulation-2026.pdf',\n        verified: true,\n        lastTested: 'Aug 04, 2026',\n        auditorNotes: 'Mean time to acknowledge (MTTA) under 3 minutes recorded during drill.',\n      },\n      {\n        id: 'test-iso-4',\n        code: 'A.8.9',\n        name: 'Configuration Management Validation',\n        description: 'Infrastructure-as-Code Terraform state tracking and drift detection alerts.',\n        category: 'DevOps & CI/CD',\n        frequency: 'Daily',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'terraform-drift-scan-log.json',\n        verified: true,\n        lastTested: '1h ago',\n        auditorNotes: '100% cloud resources provisioned strictly via verified CI pipelines.',\n      },\n      {\n        id: 'test-iso-5',\n        code: 'A.6.3',\n        name: 'Security Awareness & Training',\n        description: 'Tracking employee onboarding training completion and phishing simulation resilience.',\n        category: 'People & HR',\n        frequency: 'Monthly',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'knowbe4-training-summary-q2.csv',\n        verified: true,\n        lastTested: 'Aug 18, 2026',\n        auditorNotes: '98.4% staff passed quarterly spear-phishing test simulation.',\n      },\n      {\n        id: 'test-iso-6',\n        code: 'A.5.19',\n        name: 'Supplier Security Governance',\n        description: 'Formal security evaluation and risk scoring for external vendors processing company data.',\n        category: 'People & HR',\n        frequency: 'Monthly',\n        status: 'Needs Attention',\n        statusVariant: 'warning',\n        artifact: 'iso-vendor-evaluation-register.csv',\n        verified: false,\n        lastTested: '2 days ago',\n        auditorNotes: 'Annual security questionnaire overdue for 2 low-risk sub-contractors.',\n      },\n    ],\n    trustCenterUrl: 'https://trust.uipkge.dev',\n  },\n  hipaa: {\n    id: 'hipaa',\n    tabLabel: 'HIPAA Security Rule',\n    name: 'HIPAA Security & Privacy Rule',\n    badge: 'Healthcare & ePHI Protection',\n    standard: '45 CFR Part 160 & Part 164 Subparts A, C, E',\n    score: 98,\n    readinessLabel: '98% Compliant',\n    period: 'Active Assessment · 2026',\n    auditor: 'Coalfire Systems · HIPAA Assessor',\n    totalPassing: 42,\n    totalTests: 43,\n    pillars: [\n      {\n        code: '164.308',\n        title: 'Administrative Safeguards',\n        description: 'Security management process, workforce clearance, and contingency operations.',\n        score: 97,\n        passed: 18,\n        total: 18,\n        status: '97% Passed · 18/18 tests',\n        statusVariant: 'success',\n        highlights: ['Emergency Mode Operations', 'Violation Sanction Policy'],\n        iconType: 'shield',\n      },\n      {\n        code: '164.310',\n        title: 'Physical Safeguards',\n        description: 'Facility access controls, workstation security, and device media control.',\n        score: 100,\n        passed: 10,\n        total: 10,\n        status: '100% Passed · 10/10 tests',\n        statusVariant: 'success',\n        highlights: ['Encrypted SSD Storage Media', 'Biometric Facility Access'],\n        iconType: 'lock',\n      },\n      {\n        code: '164.312',\n        title: 'Technical Safeguards',\n        description: 'ePHI encryption, unique user identification, and automated session timeout.',\n        score: 96,\n        passed: 12,\n        total: 13,\n        status: '96% Passed · 12/13 tests',\n        statusVariant: 'warning',\n        highlights: ['15-Minute Auto-Lock Policy', 'SHA-256 Audit Trail Integrity'],\n        iconType: 'server',\n      },\n      {\n        code: '164.314',\n        title: 'Organizational Requirements',\n        description: 'Business Associate Agreements (BAAs) with all vendors handling ePHI.',\n        score: 100,\n        passed: 2,\n        total: 2,\n        status: '100% Passed · 2/2 BAAs',\n        statusVariant: 'success',\n        highlights: ['AWS HIPAA BAA Signed', 'Cloudflare HIPAA BAA Signed'],\n        iconType: 'users',\n      },\n    ],\n    tests: [\n      {\n        id: 'test-hipaa-1',\n        code: '164.312(a)(1)',\n        name: 'Unique User ePHI Access Identification',\n        description: 'Every healthcare provider and system operator assigned a unique non-shared login.',\n        category: 'Identity & Auth',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'hipaa-identity-access-log.json',\n        verified: true,\n        lastTested: '10m ago',\n        auditorNotes: 'Zero generic or shared accounts found across electronic health records.',\n      },\n      {\n        id: 'test-hipaa-2',\n        code: '164.312(a)(2)(iii)',\n        name: 'Automatic Logoff Configuration',\n        description: 'System automatically terminates an electronic session after 15 minutes of inactivity.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'session-timeout-policy-test.json',\n        verified: true,\n        lastTested: '22m ago',\n        auditorNotes: 'Verified on web, desktop app, and clinician mobile portals.',\n      },\n      {\n        id: 'test-hipaa-3',\n        code: '164.312(b)',\n        name: 'Audit Controls & 6-Year Retention',\n        description: 'Immutable audit logs recording access, modification, and export of electronic patient data.',\n        category: 'Security Operations',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'audit-worm-retention-spec.json',\n        verified: true,\n        lastTested: '5m ago',\n        auditorNotes: 'AWS S3 Object Lock in Compliance Mode active with 6-year retention policy.',\n      },\n      {\n        id: 'test-hipaa-4',\n        code: '164.312(e)(1)',\n        name: 'Transmission Security TLS 1.3',\n        description: 'ePHI in transit encrypted across public networks using TLS 1.3 with HSTS enabled.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'tls-cipher-scan-report.json',\n        verified: true,\n        lastTested: '30m ago',\n        auditorNotes: 'A+ SSL Labs score verified on all public API endpoints.',\n      },\n      {\n        id: 'test-hipaa-5',\n        code: '164.314(a)(1)',\n        name: 'Active BAAs for All Cloud Vendors',\n        description: 'Executed Business Associate Agreements signed with all subprocessors with access to ePHI.',\n        category: 'People & HR',\n        frequency: 'Monthly',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'signed-baa-register-2026.pdf',\n        verified: true,\n        lastTested: 'Aug 15, 2026',\n        auditorNotes: 'BAA signed with AWS, Twilio, SendGrid, and Datadog.',\n      },\n      {\n        id: 'test-hipaa-6',\n        code: '164.308(a)(7)',\n        name: 'Contingency & Disaster Recovery Plan',\n        description: 'Documented emergency mode operations and annual disaster recovery failover drill.',\n        category: 'Security Operations',\n        frequency: 'Quarterly',\n        status: 'Needs Attention',\n        statusVariant: 'warning',\n        artifact: 'dr-failover-drill-q2.pdf',\n        verified: false,\n        lastTested: '3 days ago',\n        auditorNotes: 'Q3 secondary region failover drill scheduled for next Tuesday.',\n      },\n    ],\n    trustCenterUrl: 'https://trust.uipkge.dev',\n  },\n  gdpr: {\n    id: 'gdpr',\n    tabLabel: 'GDPR',\n    name: 'General Data Protection Regulation',\n    badge: 'Data Privacy & Subject Rights',\n    standard: 'Regulation (EU) 2016/679 · DPO Supervised',\n    score: 95,\n    readinessLabel: '95% Compliant',\n    period: 'Annual Privacy Review · 2026',\n    auditor: 'Internal DPO & Lead Data Authority',\n    totalPassing: 32,\n    totalTests: 34,\n    pillars: [\n      {\n        code: 'Art 25',\n        title: 'Data Protection by Design',\n        description: 'Pseudonymization, data minimization, and automated retention limits.',\n        score: 94,\n        passed: 9,\n        total: 10,\n        status: '94% Passed · 9/10 tests',\n        statusVariant: 'success',\n        highlights: ['Automated 90-Day PII Purge', 'Data Minimization Schemas'],\n        iconType: 'shield',\n      },\n      {\n        code: 'Art 30',\n        title: 'Records of Processing (RoPA)',\n        description: 'Complete registry of personal data processing categories and legal purposes.',\n        score: 100,\n        passed: 8,\n        total: 8,\n        status: '100% Passed · 8/8 records',\n        statusVariant: 'success',\n        highlights: ['Dynamic RoPA Data Flow', 'Lawful Basis Cataloged'],\n        iconType: 'file',\n      },\n      {\n        code: 'Art 32',\n        title: 'Security of Processing',\n        description: 'Technical safeguards, encryption, and regular vulnerability assessments.',\n        score: 96,\n        passed: 11,\n        total: 11,\n        status: '100% Passed · 11/11 tests',\n        statusVariant: 'success',\n        highlights: ['Field-Level PII Encryption', 'Zero-Trust Bastion Access'],\n        iconType: 'lock',\n      },\n      {\n        code: 'Art 33/34',\n        title: 'Breach Notification Protocol',\n        description: '72-hour supervisory authority notification process and risk assessments.',\n        score: 90,\n        passed: 4,\n        total: 5,\n        status: '90% Passed · 4/5 tests',\n        statusVariant: 'warning',\n        highlights: ['72-Hour DPA Escalation SLA', 'Subject Notification Workflow'],\n        iconType: 'activity',\n      },\n    ],\n    tests: [\n      {\n        id: 'test-gdpr-1',\n        code: 'Art 17',\n        name: 'Right to Erasure / DSR Pipeline',\n        description: 'Automated user data deletion across database tables and 3rd party integrations in < 30 days.',\n        category: 'DevOps & CI/CD',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'dsr-erasure-orchestrator.json',\n        verified: true,\n        lastTested: '14m ago',\n        auditorNotes: 'Mean time to complete erasure request: 4.2 hours.',\n      },\n      {\n        id: 'test-gdpr-2',\n        code: 'Art 30',\n        name: 'RoPA Inventory Live Synchronization',\n        description:\n          'Data classification tags synced with schema catalog to ensure full records of processing coverage.',\n        category: 'Identity & Auth',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'ropa-schema-mapping-v3.json',\n        verified: true,\n        lastTested: '6m ago',\n        auditorNotes: '100% of PII data fields mapped to lawful basis.',\n      },\n      {\n        id: 'test-gdpr-3',\n        code: 'Art 28',\n        name: 'Data Processing Agreements (DPAs)',\n        description: 'Standard Contractual Clauses (SCCs) and DPAs executed with all EU data processors.',\n        category: 'People & HR',\n        frequency: 'Monthly',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'dpa-register-eu-2026.pdf',\n        verified: true,\n        lastTested: 'Aug 10, 2026',\n        auditorNotes: 'All sub-processors compliant with EU-US Data Privacy Framework.',\n      },\n      {\n        id: 'test-gdpr-4',\n        code: 'Art 7',\n        name: 'Cookie Consent & Preference CMP',\n        description: 'Explicit opt-in banner blocking non-essential tracking prior to affirmative user consent.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'cmp-consent-telemetry.json',\n        verified: true,\n        lastTested: '1h ago',\n        auditorNotes: 'Zero tracking cookies loaded prior to consent confirmation.',\n      },\n      {\n        id: 'test-gdpr-5',\n        code: 'Art 32(1)(a)',\n        name: 'PII Field-Level Encryption at Rest',\n        description: 'Names, emails, and financial identifiers hashed or encrypted with AES-256 before storage.',\n        category: 'Cloud Infrastructure',\n        frequency: 'Continuous (1h)',\n        status: 'Passing',\n        statusVariant: 'success',\n        artifact: 'field-encryption-audit.json',\n        verified: true,\n        lastTested: '25m ago',\n        auditorNotes: 'KMS envelope encryption active on all customer records.',\n      },\n      {\n        id: 'test-gdpr-6',\n        code: 'Art 33',\n        name: '72-Hour Breach Notification Drill',\n        description: 'Tabletop simulation testing supervisory authority DPA notification within statutory 72h window.',\n        category: 'Security Operations',\n        frequency: 'Quarterly',\n        status: 'Needs Attention',\n        statusVariant: 'warning',\n        artifact: 'gdpr-breach-playbook-2026.pdf',\n        verified: false,\n        lastTested: '4 days ago',\n        auditorNotes: 'DPO escalation contact list updated; tabletop review due in Q3.',\n      },\n    ],\n    trustCenterUrl: 'https://trust.uipkge.dev',\n  },\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-compliance-soc2-readiness, [ui-compliance-soc2-readiness]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiProgressComponent,\n    UiSeparatorComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n    UiTabsComponent,\n    UiTabsListComponent,\n    UiTabsTriggerComponent,\n  ],\n  template: `\n    <div data-slot=\"compliance-soc2-readiness\" [class]=\"rootClass\">\n      <!-- Framework Selector Tabs -->\n      <ui-tabs [value]=\"activeFrameworkId()\" (valueChange)=\"activeFrameworkId.set($event)\" class=\"w-full\">\n        <div class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n          <ui-tabs-list class=\"grid w-full grid-cols-2 md:w-auto md:grid-cols-4\">\n            <button ui-tabs-trigger value=\"soc2\" class=\"text-xs font-medium\">SOC 2 Type II</button>\n            <button ui-tabs-trigger value=\"iso27001\" class=\"text-xs font-medium\">ISO 27001</button>\n            <button ui-tabs-trigger value=\"hipaa\" class=\"text-xs font-medium\">HIPAA Security Rule</button>\n            <button ui-tabs-trigger value=\"gdpr\" class=\"text-xs font-medium\">GDPR</button>\n          </ui-tabs-list>\n\n          <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n            <span class=\"bg-success inline-flex size-2 rounded-full\"></span>\n            <span>Real-time Telemetry Ingestion Active</span>\n          </div>\n        </div>\n\n        <!-- Executive Overview Card -->\n        <div ui-card class=\"border-border bg-card mt-4 shadow-xs\">\n          <div ui-card-content class=\"p-6\">\n            <div class=\"flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n              <!-- Left: Framework info -->\n              <div class=\"space-y-2\">\n                <div class=\"flex flex-wrap items-center gap-2.5\">\n                  <h1 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n                    {{ currentFramework().name }}\n                  </h1>\n                  <span ui-badge variant=\"secondary\" class=\"font-medium\">\n                    {{ currentFramework().badge }}\n                  </span>\n                </div>\n                <p class=\"text-muted-foreground text-xs sm:text-sm\">\n                  {{ currentFramework().standard }}\n                </p>\n                <div class=\"text-muted-foreground flex flex-wrap items-center gap-3 pt-1 text-xs\">\n                  <span ui-badge variant=\"outline\" class=\"gap-1.5 font-normal\">\n                    <lucide-icon [img]=\"Calendar\" class=\"size-3.5\" />\n                    {{ currentFramework().period }}\n                  </span>\n                  <div ui-separator orientation=\"vertical\" class=\"hidden h-3.5 sm:block\"></div>\n                  <span>\n                    Lead Assessor: <strong class=\"text-foreground font-medium\">{{ currentFramework().auditor }}</strong>\n                  </span>\n                </div>\n              </div>\n\n              <!-- Right: Big Score Card & Action Buttons -->\n              <div class=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n                <!-- Score Badge -->\n                <div\n                  class=\"border-success/30 bg-success/10 flex items-center gap-3.5 rounded-xl border p-3.5 shadow-xs\"\n                >\n                  <div class=\"bg-success/20 text-success flex size-11 shrink-0 items-center justify-center rounded-lg\">\n                    <lucide-icon [img]=\"ShieldCheck\" class=\"size-6\" />\n                  </div>\n                  <div class=\"space-y-0.5\">\n                    <div class=\"flex items-baseline gap-2\">\n                      <span class=\"text-success text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">\n                        {{ currentFramework().score }}%\n                      </span>\n                      <span ui-badge variant=\"success\" class=\"gap-1 px-2 text-xs font-semibold\">\n                        <lucide-icon [img]=\"CheckCircle2\" class=\"size-3\" />\n                        {{ readinessShort() }}\n                      </span>\n                    </div>\n                    <p class=\"text-muted-foreground text-xs\">\n                      {{ currentFramework().totalPassing }}/{{ currentFramework().totalTests }} Continuous Controls\n                      Passing\n                    </p>\n                  </div>\n                </div>\n\n                <!-- Action Buttons -->\n                <div class=\"flex flex-wrap gap-2.5 sm:flex-col\">\n                  <button\n                    ui-button\n                    variant=\"default\"\n                    size=\"sm\"\n                    class=\"gap-2 shadow-xs\"\n                    (click)=\"handleScheduleReview()\"\n                  >\n                    @if (scheduleRequested()) {\n                      <lucide-icon [img]=\"Check\" class=\"text-success size-4\" />\n                    } @else {\n                      <lucide-icon [img]=\"Calendar\" class=\"size-4\" />\n                    }\n                    <span>{{ scheduleRequested() ? 'Review Requested!' : 'Schedule Auditor Review' }}</span>\n                  </button>\n\n                  <button ui-button variant=\"outline\" size=\"sm\" class=\"gap-2 shadow-xs\" (click)=\"handleExportPackage()\">\n                    @if (exportSuccess()) {\n                      <lucide-icon [img]=\"Check\" class=\"text-success size-4\" />\n                    } @else {\n                      <lucide-icon [img]=\"FileDown\" class=\"size-4\" />\n                    }\n                    <span>{{ exportSuccess() ? 'Package Exported!' : 'Export Compliance Package' }}</span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- 4 Compliance Control Pillar Cards -->\n        <div class=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n          @for (pillar of currentFramework().pillars; track pillar.code) {\n            <div ui-card class=\"border-border bg-card hover:border-border shadow-xs transition-colors\">\n              <div ui-card-header class=\"p-4 pb-2\">\n                <div class=\"flex items-start justify-between gap-2\">\n                  <div class=\"flex items-center gap-2\">\n                    <div\n                      class=\"bg-muted text-foreground border-border flex size-8 shrink-0 items-center justify-center rounded-lg border\"\n                    >\n                      <lucide-icon [img]=\"pillarIcon(pillar.iconType)\" class=\"size-4\" />\n                    </div>\n                    <span ui-badge variant=\"outline\" class=\"font-mono text-xs font-semibold\">\n                      {{ pillar.code }}\n                    </span>\n                  </div>\n\n                  <span ui-badge [variant]=\"pillar.statusVariant\" class=\"text-xs font-medium\">\n                    {{ pillarChip(pillar) }}\n                  </span>\n                </div>\n\n                <h3 ui-card-title class=\"mt-2 text-sm leading-snug font-semibold\">\n                  {{ pillar.title }}\n                </h3>\n                <p ui-card-description class=\"line-clamp-2 text-xs\">\n                  {{ pillar.description }}\n                </p>\n              </div>\n\n              <div ui-card-content class=\"space-y-3 p-4 pt-1\">\n                <div class=\"space-y-1.5\">\n                  <div class=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5 text-xs\">\n                    <span class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">\n                      {{ pillar.score }}%\n                    </span>\n                    <span class=\"text-muted-foreground font-medium tabular-nums\">\n                      {{ pillar.passed }}/{{ pillar.total }} tests\n                    </span>\n                  </div>\n                  <div ui-progress [value]=\"pillar.score\" class=\"h-1.5 w-full\"></div>\n                </div>\n\n                <!-- Bullet highlights -->\n                <div class=\"bg-muted/40 border-border/60 space-y-1 rounded-md border p-2 text-xs\">\n                  @for (highlight of pillar.highlights; track highlight) {\n                    <div class=\"text-muted-foreground flex items-center gap-1.5\">\n                      <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-3 shrink-0\" />\n                      <span class=\"truncate\">{{ highlight }}</span>\n                    </div>\n                  }\n                </div>\n              </div>\n            </div>\n          }\n        </div>\n\n        <!-- Automated Evidence Tests Table Card -->\n        <div ui-card class=\"border-border bg-card mt-6 shadow-xs\">\n          <div ui-card-header class=\"flex flex-col gap-4 pb-4 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <div class=\"flex items-center gap-2\">\n                <h3 ui-card-title class=\"text-base font-semibold\">Automated Evidence Tests</h3>\n                <span ui-badge variant=\"secondary\" class=\"font-mono text-xs\">\n                  {{ filteredTests().length }} Active\n                </span>\n              </div>\n              <p ui-card-description class=\"text-xs\">\n                Continuous synthetic and policy compliance evaluation across infrastructure and IAM.\n              </p>\n            </div>\n\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <button\n                ui-button\n                variant=\"outline\"\n                size=\"sm\"\n                class=\"gap-1.5 text-xs shadow-xs\"\n                [disabled]=\"isTestingAll()\"\n                (click)=\"handleRunAllTests()\"\n              >\n                <lucide-icon [img]=\"RefreshCw\" [class]=\"runAllIconClass\" />\n                <span>{{ isTestingAll() ? 'Evaluating Tests...' : 'Run All Automated Tests' }}</span>\n              </button>\n            </div>\n          </div>\n\n          <!-- Filter & Search Toolbar -->\n          <div class=\"border-border/60 border-t p-4 pt-3 pb-3\">\n            <div class=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n              <div class=\"relative flex-1\">\n                <lucide-icon\n                  [img]=\"Search\"\n                  class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-3.5 -translate-y-1/2\"\n                />\n                <input\n                  [value]=\"searchQuery()\"\n                  (input)=\"searchQuery.set($any($event.target).value)\"\n                  type=\"text\"\n                  placeholder=\"Filter by control code, name, category, or evidence artifact...\"\n                  class=\"border-border bg-background placeholder:text-muted-foreground focus-visible:ring-ring h-8 w-full rounded-md border px-3 pl-8 text-xs focus-visible:ring-2 focus-visible:outline-none\"\n                />\n              </div>\n\n              <div class=\"flex flex-wrap items-center gap-1.5\">\n                <span class=\"text-muted-foreground mr-1 flex items-center gap-1 text-xs font-medium\">\n                  <lucide-icon [img]=\"Filter\" class=\"size-3\" />\n                  Category:\n                </span>\n                @for (cat of availableCategories(); track cat) {\n                  <button type=\"button\" [class]=\"categoryPillClass(cat)\" (click)=\"selectedCategory.set(cat)\">\n                    {{ cat === 'all' ? 'All Categories' : cat }}\n                  </button>\n                }\n              </div>\n            </div>\n          </div>\n\n          <!-- Table Container -->\n          <div ui-card-content class=\"p-0\">\n            <div class=\"border-border/60 overflow-x-auto border-t\">\n              <table ui-table>\n                <thead ui-table-header class=\"bg-muted/50\">\n                  <tr ui-table-row>\n                    <th ui-table-head class=\"min-w-[220px] text-xs\">Control & Rule Name</th>\n                    <th ui-table-head class=\"text-xs\">Domain Category</th>\n                    <th ui-table-head class=\"text-xs\">Frequency</th>\n                    <th ui-table-head class=\"text-xs\">Status</th>\n                    <th ui-table-head class=\"text-xs\">Evidence Artifact</th>\n                    <th ui-table-head class=\"text-right text-xs\">Actions</th>\n                  </tr>\n                </thead>\n                <tbody ui-table-body>\n                  @for (test of filteredTests(); track test.id) {\n                    <tr ui-table-row class=\"hover:bg-muted/20\">\n                      <!-- Control Code & Name -->\n                      <td ui-table-cell class=\"py-3\">\n                        <div class=\"space-y-0.5\">\n                          <div class=\"flex items-center gap-2\">\n                            <span class=\"text-foreground font-mono text-xs font-bold\">{{ test.code }}</span>\n                            <span class=\"text-foreground text-xs font-semibold\">{{ test.name }}</span>\n                          </div>\n                          <p class=\"text-muted-foreground max-w-sm text-xs leading-relaxed sm:max-w-md\">\n                            {{ test.description }}\n                          </p>\n                        </div>\n                      </td>\n\n                      <!-- Category -->\n                      <td ui-table-cell class=\"py-3\">\n                        <span ui-badge variant=\"outline\" class=\"text-xs font-normal\">\n                          {{ test.category }}\n                        </span>\n                      </td>\n\n                      <!-- Frequency -->\n                      <td ui-table-cell class=\"text-muted-foreground py-3 text-xs\">\n                        <div class=\"flex items-center gap-1.5 font-medium\">\n                          <lucide-icon [img]=\"Clock\" class=\"size-3.5\" />\n                          <span>{{ test.frequency }}</span>\n                        </div>\n                        <span class=\"text-muted-foreground/70 block text-xs\"> Tested: {{ lastTestedFor(test) }} </span>\n                      </td>\n\n                      <!-- Status -->\n                      <td ui-table-cell class=\"py-3\">\n                        <span ui-badge [variant]=\"test.statusVariant\" class=\"gap-1 text-xs font-medium\">\n                          @if (test.status === 'Passing') {\n                            <lucide-icon [img]=\"CheckCircle2\" class=\"size-3\" />\n                          } @else {\n                            <lucide-icon [img]=\"AlertTriangle\" class=\"size-3\" />\n                          }\n                          {{ test.status }}\n                        </span>\n                      </td>\n\n                      <!-- Evidence Artifact Link -->\n                      <td ui-table-cell class=\"py-3\">\n                        <button\n                          type=\"button\"\n                          class=\"hover:border-primary/40 hover:bg-muted/60 focus-visible:ring-ring group border-border/80 bg-muted/30 flex items-center gap-1.5 rounded-md border px-2 py-1 text-left transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                          (click)=\"viewEvidence(test)\"\n                        >\n                          <lucide-icon\n                            [img]=\"FileText\"\n                            class=\"text-muted-foreground group-hover:text-foreground size-3.5 shrink-0\"\n                          />\n                          <span class=\"text-foreground max-w-[150px] truncate font-mono text-xs sm:max-w-[200px]\">\n                            {{ test.artifact }}\n                          </span>\n                          @if (test.verified) {\n                            <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-3 shrink-0\" />\n                          }\n                        </button>\n                      </td>\n\n                      <!-- Action Buttons -->\n                      <td ui-table-cell class=\"py-3 text-right\">\n                        <div class=\"flex items-center justify-end gap-1.5\">\n                          <button\n                            ui-button\n                            variant=\"ghost\"\n                            size=\"xs\"\n                            class=\"h-7 gap-1 text-xs\"\n                            [disabled]=\"isRunning(test.id)\"\n                            (click)=\"handleRunTest(test.id)\"\n                          >\n                            <lucide-icon [img]=\"RefreshCw\" [class]=\"runIconClass(test.id)\" />\n                            <span class=\"hidden sm:inline\">Test Now</span>\n                          </button>\n\n                          <button\n                            ui-button\n                            variant=\"outline\"\n                            size=\"xs\"\n                            class=\"h-7 gap-1 text-xs\"\n                            (click)=\"viewEvidence(test)\"\n                          >\n                            <lucide-icon [img]=\"Eye\" class=\"size-3\" />\n                            <span>Evidence</span>\n                          </button>\n                        </div>\n                      </td>\n                    </tr>\n                  }\n\n                  @if (filteredTests().length === 0) {\n                    <tr ui-table-row>\n                      <td ui-table-cell colspan=\"6\" class=\"py-8 text-center\">\n                        <p class=\"text-muted-foreground text-xs\">No automated compliance tests match your query.</p>\n                      </td>\n                    </tr>\n                  }\n                </tbody>\n              </table>\n            </div>\n          </div>\n        </div>\n\n        <!-- Auditor Access & Trust Center Preview Strip -->\n        <div ui-card class=\"border-border bg-card mt-6 overflow-hidden shadow-xs\">\n          <div ui-card-content class=\"p-6\">\n            <div class=\"flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n              <div class=\"flex items-start gap-4\">\n                <div\n                  class=\"bg-primary/10 text-primary border-primary/20 flex size-11 shrink-0 items-center justify-center rounded-xl border\"\n                >\n                  <lucide-icon [img]=\"BadgeCheck\" class=\"size-6\" />\n                </div>\n                <div class=\"space-y-1\">\n                  <div class=\"flex flex-wrap items-center gap-2\">\n                    <h3 class=\"text-foreground text-base font-semibold\">Auditor Access & Public Trust Center</h3>\n                    <span ui-badge variant=\"outline\" class=\"gap-1 font-mono text-xs\">\n                      <span class=\"bg-success size-1.5 rounded-full\"></span>\n                      Vault Online\n                    </span>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">\n                    Cryptographically verifiable evidence room configured for continuous compliance review by\n                    <strong class=\"text-foreground font-medium\">{{ currentFramework().auditor }}</strong\n                    >.\n                  </p>\n                  <div class=\"text-muted-foreground flex flex-wrap items-center gap-3 pt-1 text-xs\">\n                    <span>Access Grant: <strong class=\"text-foreground font-medium\">Valid for 14 days</strong></span>\n                    <div ui-separator orientation=\"vertical\" class=\"hidden h-3 sm:block\"></div>\n                    <span\n                      >Trust Portal:\n                      <span class=\"text-foreground font-mono\">{{ currentFramework().trustCenterUrl }}</span></span\n                    >\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"flex flex-wrap items-center gap-2.5 sm:self-start lg:self-center\">\n                <a [href]=\"currentFramework().trustCenterUrl\" target=\"_blank\" rel=\"noreferrer\" class=\"inline-flex\">\n                  <button ui-button variant=\"outline\" size=\"sm\" class=\"gap-1.5 shadow-xs\">\n                    <lucide-icon [img]=\"ArrowUpRight\" class=\"size-4\" />\n                    <span>Preview Live Trust Center</span>\n                  </button>\n                </a>\n\n                <button ui-button variant=\"secondary\" size=\"sm\" class=\"gap-1.5 shadow-xs\">\n                  <lucide-icon [img]=\"KeyRound\" class=\"size-4\" />\n                  <span>Manage Auditor Access</span>\n                </button>\n              </div>\n            </div>\n          </div>\n\n          <!-- Bottom Audit Ingestion Watermark -->\n          <div\n            class=\"bg-muted/40 border-border flex flex-col gap-2 border-t px-6 py-2.5 text-xs sm:flex-row sm:items-center sm:justify-between\"\n          >\n            <div class=\"text-muted-foreground flex items-center gap-2 font-mono\">\n              <span class=\"bg-success size-1.5 rounded-full\"></span>\n              <span>Ledger Stamp: 0x9b4a8e217f0a4421b8c1992019a · SHA-256 Verified</span>\n            </div>\n            <span class=\"text-muted-foreground font-mono text-xs\">\n              Framework: {{ currentFramework().tabLabel }} · Last Evaluation: Just now\n            </span>\n          </div>\n        </div>\n      </ui-tabs>\n\n      <!-- Modal / Sheet Preview for Evidence Artifact -->\n      @if (activeEvidenceModal(); as modal) {\n        <div\n          role=\"dialog\"\n          aria-modal=\"true\"\n          class=\"bg-background/80 fixed inset-0 z-50 flex items-center justify-center p-4 backdrop-blur-sm\"\n          (click)=\"closeEvidenceModal()\"\n        >\n          <div ui-card class=\"border-border bg-card w-full max-w-lg shadow-lg\" (click)=\"$event.stopPropagation()\">\n            <div ui-card-header class=\"flex flex-row items-center justify-between pb-3\">\n              <div class=\"space-y-1\">\n                <div class=\"flex items-center gap-2\">\n                  <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">{{ modal.code }}</span>\n                  <h3 ui-card-title class=\"text-base font-semibold\">Evidence Verification Details</h3>\n                </div>\n                <p ui-card-description class=\"text-xs\">{{ modal.name }}</p>\n              </div>\n              <button\n                ui-button\n                variant=\"ghost\"\n                size=\"icon-sm\"\n                class=\"size-7\"\n                aria-label=\"Close evidence modal\"\n                (click)=\"closeEvidenceModal()\"\n              >\n                <lucide-icon [img]=\"X\" class=\"size-4\" />\n              </button>\n            </div>\n\n            <div ui-card-content class=\"space-y-4 text-xs\">\n              <div class=\"bg-muted/40 border-border/80 space-y-2 rounded-lg border p-3\">\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground font-medium\">Artifact File:</span>\n                  <span class=\"text-foreground font-mono font-semibold\">{{ modal.artifact }}</span>\n                </div>\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground font-medium\">Verification Status:</span>\n                  <span ui-badge [variant]=\"modal.statusVariant\" class=\"gap-1 text-xs\">\n                    @if (modal.verified) {\n                      <lucide-icon [img]=\"CheckCircle2\" class=\"size-3\" />\n                    } @else {\n                      <lucide-icon [img]=\"AlertCircle\" class=\"size-3\" />\n                    }\n                    {{ modal.verified ? 'Cryptographically Verified' : 'Action Required' }}\n                  </span>\n                </div>\n                <div class=\"flex items-center justify-between\">\n                  <span class=\"text-muted-foreground font-medium\">Test Frequency:</span>\n                  <span class=\"text-foreground font-mono\">{{ modal.frequency }}</span>\n                </div>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <span class=\"text-muted-foreground font-medium\">Auditor Evaluation Notes:</span>\n                <p class=\"bg-muted/20 border-border text-foreground rounded-md border p-2.5 leading-relaxed\">\n                  {{ modal.auditorNotes }}\n                </p>\n              </div>\n\n              <div class=\"flex items-center justify-end gap-2 pt-2\">\n                <button\n                  aria-label=\"Close evidence modal\"\n                  ui-button\n                  variant=\"outline\"\n                  size=\"sm\"\n                  class=\"text-xs\"\n                  (click)=\"closeEvidenceModal()\"\n                >\n                  Close\n                </button>\n                <button\n                  aria-label=\"Close evidence modal\"\n                  ui-button\n                  variant=\"default\"\n                  size=\"sm\"\n                  class=\"gap-1.5 text-xs\"\n                  (click)=\"closeEvidenceModal()\"\n                >\n                  <lucide-icon [img]=\"Download\" class=\"size-3.5\" />\n                  Download Artifact\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class UiComplianceSoc2ReadinessComponent {\n  protected readonly AlertCircle = AlertCircle\n  protected readonly AlertTriangle = AlertTriangle\n  protected readonly ArrowUpRight = ArrowUpRight\n  protected readonly BadgeCheck = BadgeCheck\n  protected readonly Calendar = Calendar\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Download = Download\n  protected readonly Eye = Eye\n  protected readonly FileDown = FileDown\n  protected readonly FileText = FileText\n  protected readonly Filter = Filter\n  protected readonly KeyRound = KeyRound\n  protected readonly Lock = Lock\n  protected readonly RefreshCw = RefreshCw\n  protected readonly Search = Search\n  protected readonly Server = Server\n  protected readonly Shield = Shield\n  protected readonly ShieldCheck = ShieldCheck\n  protected readonly Users = Users\n  protected readonly X = X\n  protected readonly Zap = Zap\n\n  @Input() set defaultFramework(v: string | undefined) {\n    if (v) this.activeFrameworkId.set(v)\n  }\n  @Input('class') className?: string\n\n  readonly activeFrameworkId = signal('soc2')\n  readonly searchQuery = signal('')\n  readonly selectedCategory = signal<string>('all')\n  readonly runningTestIds = signal<Record<string, boolean>>({})\n  readonly lastTestedMap = signal<Record<string, string>>({})\n  readonly activeEvidenceModal = signal<EvidenceTestItem | null>(null)\n  readonly isTestingAll = signal(false)\n  readonly scheduleRequested = signal(false)\n  readonly exportSuccess = signal(false)\n\n  readonly currentFramework = computed(() => frameworksData[this.activeFrameworkId()] ?? frameworksData['soc2']!)\n\n  readonly readinessShort = computed(() => {\n    const fw = this.currentFramework()\n    return fw.readinessLabel.replace(`${fw.score}% `, '')\n  })\n\n  readonly availableCategories = computed(() => {\n    const cats = new Set<string>()\n    this.currentFramework().tests.forEach((t) => cats.add(t.category))\n    return ['all', ...Array.from(cats)]\n  })\n\n  readonly filteredTests = computed(() => {\n    const q = this.searchQuery().trim().toLowerCase()\n    const cat = this.selectedCategory()\n    return this.currentFramework().tests.filter((test) => {\n      const matchesCat = cat === 'all' || test.category === cat\n      const matchesQuery =\n        !q ||\n        test.code.toLowerCase().includes(q) ||\n        test.name.toLowerCase().includes(q) ||\n        test.description.toLowerCase().includes(q) ||\n        test.artifact.toLowerCase().includes(q) ||\n        test.category.toLowerCase().includes(q)\n      return matchesCat && matchesQuery\n    })\n  })\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  get runAllIconClass(): string {\n    return cn('size-3.5', this.isTestingAll() && 'animate-spin')\n  }\n\n  runIconClass(id: string): string {\n    return cn('size-3', this.isRunning(id) && 'animate-spin')\n  }\n\n  categoryPillClass(cat: string): string {\n    return cn(\n      'focus-visible:ring-ring inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none',\n      this.selectedCategory() === cat\n        ? 'border-primary bg-primary text-primary-foreground shadow-xs'\n        : 'border-border bg-card text-muted-foreground hover:bg-accent hover:text-foreground',\n    )\n  }\n\n  pillarIcon(iconType: string): unknown {\n    switch (iconType) {\n      case 'key':\n        return KeyRound\n      case 'shield':\n        return ShieldCheck\n      case 'activity':\n        return Zap\n      case 'users':\n        return Users\n      case 'lock':\n        return Lock\n      case 'server':\n        return Server\n      case 'file':\n        return FileText\n      default:\n        return Shield\n    }\n  }\n\n  pillarChip(pillar: PillarData): string {\n    if (pillar.score === 100) return 'Zero Gaps'\n    if (pillar.statusVariant === 'warning') return '1 Warning'\n    return 'Passing'\n  }\n\n  isRunning(id: string): boolean {\n    return !!this.runningTestIds()[id]\n  }\n\n  lastTestedFor(test: EvidenceTestItem): string {\n    return this.lastTestedMap()[test.id] ?? test.lastTested\n  }\n\n  handleRunTest(testId: string): void {\n    this.runningTestIds.update((prev) => ({ ...prev, [testId]: true }))\n    setTimeout(() => {\n      this.runningTestIds.update((prev) => ({ ...prev, [testId]: false }))\n      this.lastTestedMap.update((prev) => ({ ...prev, [testId]: 'Just now' }))\n    }, 500)\n  }\n\n  handleRunAllTests(): void {\n    this.isTestingAll.set(true)\n    setTimeout(() => {\n      this.isTestingAll.set(false)\n      const next: Record<string, string> = {}\n      this.currentFramework().tests.forEach((t) => {\n        next[t.id] = 'Just now'\n      })\n      this.lastTestedMap.update((prev) => ({ ...prev, ...next }))\n    }, 700)\n  }\n\n  handleScheduleReview(): void {\n    this.scheduleRequested.set(true)\n    setTimeout(() => this.scheduleRequested.set(false), 3000)\n  }\n\n  handleExportPackage(): void {\n    this.exportSuccess.set(true)\n    setTimeout(() => this.exportSuccess.set(false), 3000)\n  }\n\n  viewEvidence(test: EvidenceTestItem): void {\n    this.activeEvidenceModal.set(test)\n  }\n\n  closeEvidenceModal(): void {\n    this.activeEvidenceModal.set(null)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/compliance-soc2-readiness/compliance-soc2-readiness.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/compliance-soc2-readiness/index.ts",
      "content": "export {\n  UiComplianceSoc2ReadinessComponent,\n  type PillarData,\n  type EvidenceTestItem,\n  type FrameworkConfig,\n} from './compliance-soc2-readiness.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/compliance-soc2-readiness/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/progress.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/table.json",
    "https://uipkge.dev/r/angular/tabs.json"
  ],
  "description": "Vanta/Drata-style SOC 2 Type II, ISO 27001, and HIPAA compliance readiness dashboard with framework selector tabs, audit readiness scorecards, 4 control pillar health bars, continuous automated evidence test tables with verified artifact badges, and auditor trust center portal controls.",
  "categories": [
    "legal",
    "app",
    "security"
  ]
}