{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "data-retention-policy-manager",
  "title": "Data Retention Policy Manager",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/data-retention-policy-manager/DataRetentionPolicyManager.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Archive,\n  Check,\n  CheckCircle2,\n  Clock,\n  Copy,\n  Database,\n  DollarSign,\n  HardDriveDownload,\n  MoreHorizontal,\n  Pencil,\n  Play,\n  Plus,\n  RefreshCw,\n  Search,\n  ShieldCheck,\n  FileText,\n  Info,\n  Trash2,\n  X,\n} from 'lucide-react'\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 {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Progress } from '@/components/ui/progress'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Switch } from '@/components/ui/switch'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\n\nexport type EngineType = 'Snowflake' | 'BigQuery' | 'Databricks' | 'Postgres'\nexport type ArchiveTierType = 'Glacier Deep' | 'Coldline' | 'Standard Cold' | 'Purge Immediately'\n\nexport interface RetentionPolicy {\n  id: string\n  tableName: string\n  database: string\n  engine: EngineType\n  partitionColumn: string\n  retentionPeriod: string\n  lifecycleAction: string\n  archiveTier: ArchiveTierType\n  complianceReason: string\n  totalSize: string\n  coldSize: string\n  estimatedMonthlySavings: string\n  enabled: boolean\n  lastRun: string\n  nextRun: string\n  rowCount?: string\n}\n\nexport interface StorageRetentionStats {\n  totalManagedData: string\n  totalManagedSubtitle?: string\n  coldArchivedData: string\n  archivedPercentage: number\n  archivedSubtitle?: string\n  projectedMonthlySavings: string\n  savingsSubtitle?: string\n  purged30d: string\n  purgedSubtitle?: string\n}\n\nexport const defaultPolicies: RetentionPolicy[] = [\n  {\n    id: 'pol-1',\n    tableName: 'audit_logs.events',\n    database: 'SNOWFLAKE_PROD_DWH',\n    engine: 'Snowflake',\n    partitionColumn: 'event_timestamp (DAY)',\n    retentionPeriod: '90 Days Active',\n    lifecycleAction: 'Transition to Cold Glacier at 90d -> Hard Purge at 365d',\n    archiveTier: 'Glacier Deep',\n    complianceReason: 'SOX Compliance',\n    totalSize: '4.2 TB',\n    coldSize: '3.1 TB',\n    estimatedMonthlySavings: '$420.00 / mo',\n    enabled: true,\n    lastRun: '1 hour ago',\n    nextRun: 'Today at 02:00 UTC',\n    rowCount: '1.4B rows',\n  },\n  {\n    id: 'pol-2',\n    tableName: 'telemetry.raw_pings',\n    database: 'BIGQUERY_IOT_STREAM',\n    engine: 'BigQuery',\n    partitionColumn: 'received_at (HOUR)',\n    retentionPeriod: '30 Days TTL',\n    lifecycleAction: 'Direct Partition Drop at 30d TTL -> Zero Archive',\n    archiveTier: 'Purge Immediately',\n    complianceReason: 'Storage Optimization',\n    totalSize: '5.6 TB',\n    coldSize: '0.0 TB',\n    estimatedMonthlySavings: '$560.00 / mo',\n    enabled: true,\n    lastRun: '10 min ago',\n    nextRun: 'Continuous partition sweep',\n    rowCount: '8.9B rows',\n  },\n  {\n    id: 'pol-3',\n    tableName: 'billing.invoices_archive',\n    database: 'SNOWFLAKE_FINANCE',\n    engine: 'Snowflake',\n    partitionColumn: 'invoice_date (MONTH)',\n    retentionPeriod: '7 Years Compliance',\n    lifecycleAction: 'Hot 1 Year -> Glacier Vault Lock Tier 7 Years',\n    archiveTier: 'Glacier Deep',\n    complianceReason: 'SOX Compliance',\n    totalSize: '2.4 TB',\n    coldSize: '2.1 TB',\n    estimatedMonthlySavings: '$210.00 / mo',\n    enabled: true,\n    lastRun: 'Yesterday',\n    nextRun: 'Sep 01 at 00:00 UTC',\n    rowCount: '180M rows',\n  },\n  {\n    id: 'pol-4',\n    tableName: 'analytics.staging_events',\n    database: 'BIGQUERY_INGEST',\n    engine: 'BigQuery',\n    partitionColumn: 'ingest_time (DAY)',\n    retentionPeriod: '14 Days TTL',\n    lifecycleAction: 'Truncate partition > 14d -> Permanent Delete',\n    archiveTier: 'Purge Immediately',\n    complianceReason: 'Storage Optimization',\n    totalSize: '1.5 TB',\n    coldSize: '0.0 TB',\n    estimatedMonthlySavings: '$150.00 / mo',\n    enabled: false,\n    lastRun: '3 days ago',\n    nextRun: 'Paused',\n    rowCount: '420M rows',\n  },\n  {\n    id: 'pol-5',\n    tableName: 'customer_pii.user_sessions',\n    database: 'SNOWFLAKE_CUSTOMER360',\n    engine: 'Snowflake',\n    partitionColumn: 'session_start (DAY)',\n    retentionPeriod: '180 Days Active',\n    lifecycleAction: 'Anonymize at 90d -> Cold Glacier -> Hard Purge at 180d',\n    archiveTier: 'Standard Cold',\n    complianceReason: 'GDPR Art. 17',\n    totalSize: '1.1 TB',\n    coldSize: '0.9 TB',\n    estimatedMonthlySavings: '$80.00 / mo',\n    enabled: true,\n    lastRun: '6 hours ago',\n    nextRun: 'Tomorrow at 04:00 UTC',\n    rowCount: '290M rows',\n  },\n]\n\nexport const defaultStats: StorageRetentionStats = {\n  totalManagedData: '14.8 TB',\n  totalManagedSubtitle: 'Across 48 partitioned tables',\n  coldArchivedData: '9.2 TB',\n  archivedPercentage: 62,\n  archivedSubtitle: '62% archived to Glacier / Cold Tier',\n  projectedMonthlySavings: '$1,420.00 / mo saved',\n  savingsSubtitle: '68% cost drop vs active NVMe',\n  purged30d: '1.8 TB',\n  purgedSubtitle: 'Expired TTL partitions purged',\n}\n\nexport interface DataRetentionPolicyManagerProps {\n  initialPolicies?: RetentionPolicy[]\n  initialStats?: StorageRetentionStats\n  className?: string\n}\n\nexport function DataRetentionPolicyManager({\n  initialPolicies,\n  initialStats,\n  className,\n}: DataRetentionPolicyManagerProps) {\n  const [policies, setPolicies] = React.useState<RetentionPolicy[]>(initialPolicies ?? defaultPolicies)\n  const stats = initialStats ?? defaultStats\n\n  const [searchQuery, setSearchQuery] = React.useState('')\n  const [statusFilter, setStatusFilter] = React.useState<string>('all')\n  const [complianceFilter, setComplianceFilter] = React.useState<string>('all')\n  const [bannerMessage, setBannerMessage] = React.useState<{ type: 'success' | 'info'; text: string } | null>(null)\n  const [copiedTable, setCopiedTable] = React.useState<string | null>(null)\n\n  // Policy Dialog state\n  const [isPolicyModalOpen, setIsPolicyModalOpen] = React.useState(false)\n  const [editingPolicy, setEditingPolicy] = React.useState<RetentionPolicy | null>(null)\n  const [formTableName, setFormTableName] = React.useState('')\n  const [formDatabase, setFormDatabase] = React.useState('')\n  const [formEngine, setFormEngine] = React.useState<EngineType>('Snowflake')\n  const [formPartitionCol, setFormPartitionCol] = React.useState('')\n  const [formRetentionPeriod, setFormRetentionPeriod] = React.useState('90 Days Active')\n  const [formLifecycleAction, setFormLifecycleAction] = React.useState(\n    'Transition to Cold Glacier at 90d -> Hard Purge at 365d',\n  )\n  const [formArchiveTier, setFormArchiveTier] = React.useState<ArchiveTierType>('Glacier Deep')\n  const [formComplianceReason, setFormComplianceReason] = React.useState('Storage Optimization')\n\n  // Instant Archive Modal state\n  const [isArchiveModalOpen, setIsArchiveModalOpen] = React.useState(false)\n  const [selectedPolicyForArchive, setSelectedPolicyForArchive] = React.useState<RetentionPolicy | null>(null)\n  const [isArchiving, setIsArchiving] = React.useState(false)\n\n  const filteredPolicies = React.useMemo(() => {\n    const q = searchQuery.trim().toLowerCase()\n    return policies.filter((policy) => {\n      if (statusFilter === 'enabled' && !policy.enabled) return false\n      if (statusFilter === 'disabled' && policy.enabled) return false\n\n      if (complianceFilter !== 'all' && policy.complianceReason !== complianceFilter) {\n        return false\n      }\n\n      if (!q) return true\n      const matchTable = policy.tableName.toLowerCase().includes(q)\n      const matchDb = policy.database.toLowerCase().includes(q)\n      const matchReason = policy.complianceReason.toLowerCase().includes(q)\n      const matchAction = policy.lifecycleAction.toLowerCase().includes(q)\n      const matchEngine = policy.engine.toLowerCase().includes(q)\n      return matchTable || matchDb || matchReason || matchAction || matchEngine\n    })\n  }, [policies, searchQuery, statusFilter, complianceFilter])\n\n  const togglePolicyStatus = (id: string) => {\n    setPolicies((prev) =>\n      prev.map((policy) => {\n        if (policy.id === id) {\n          const nextState = !policy.enabled\n          setBannerMessage({\n            type: 'info',\n            text: `Retention policy for table \"${policy.tableName}\" has been ${nextState ? 'activated' : 'paused'}.`,\n          })\n          return { ...policy, enabled: nextState }\n        }\n        return policy\n      }),\n    )\n  }\n\n  const deletePolicy = (id: string) => {\n    const target = policies.find((p) => p.id === id)\n    setPolicies((prev) => prev.filter((p) => p.id !== id))\n    if (target) {\n      setBannerMessage({\n        type: 'info',\n        text: `Deleted retention policy for \"${target.tableName}\".`,\n      })\n    }\n  }\n\n  const copyTableName = (name: string) => {\n    if (typeof navigator !== 'undefined' && navigator.clipboard) {\n      navigator.clipboard.writeText(name)\n      setCopiedTable(name)\n      setTimeout(() => {\n        setCopiedTable((curr) => (curr === name ? null : curr))\n      }, 2000)\n    }\n  }\n\n  const openAddPolicyModal = () => {\n    setEditingPolicy(null)\n    setFormTableName('')\n    setFormDatabase('SNOWFLAKE_PROD_DWH')\n    setFormEngine('Snowflake')\n    setFormPartitionCol('created_at (DAY)')\n    setFormRetentionPeriod('90 Days Active')\n    setFormLifecycleAction('Transition to Cold Glacier at 90d -> Hard Purge at 365d')\n    setFormArchiveTier('Glacier Deep')\n    setFormComplianceReason('Storage Optimization')\n    setIsPolicyModalOpen(true)\n  }\n\n  const openEditPolicyModal = (policy: RetentionPolicy) => {\n    setEditingPolicy(policy)\n    setFormTableName(policy.tableName)\n    setFormDatabase(policy.database)\n    setFormEngine(policy.engine)\n    setFormPartitionCol(policy.partitionColumn)\n    setFormRetentionPeriod(policy.retentionPeriod)\n    setFormLifecycleAction(policy.lifecycleAction)\n    setFormArchiveTier(policy.archiveTier)\n    setFormComplianceReason(policy.complianceReason)\n    setIsPolicyModalOpen(true)\n  }\n\n  const savePolicy = () => {\n    if (!formTableName.trim()) return\n\n    if (editingPolicy) {\n      setPolicies((prev) =>\n        prev.map((p) =>\n          p.id === editingPolicy.id\n            ? {\n                ...p,\n                tableName: formTableName.trim(),\n                database: formDatabase.trim() || 'SNOWFLAKE_PROD_DWH',\n                engine: formEngine,\n                partitionColumn: formPartitionCol.trim() || 'event_timestamp',\n                retentionPeriod: formRetentionPeriod,\n                lifecycleAction: formLifecycleAction,\n                archiveTier: formArchiveTier,\n                complianceReason: formComplianceReason,\n              }\n            : p,\n        ),\n      )\n      setBannerMessage({\n        type: 'success',\n        text: `Updated retention policy for \"${formTableName}\".`,\n      })\n    } else {\n      const newPolicy: RetentionPolicy = {\n        id: `pol-${Date.now()}`,\n        tableName: formTableName.trim(),\n        database: formDatabase.trim() || 'SNOWFLAKE_PROD_DWH',\n        engine: formEngine,\n        partitionColumn: formPartitionCol.trim() || 'created_at (DAY)',\n        retentionPeriod: formRetentionPeriod,\n        lifecycleAction: formLifecycleAction,\n        archiveTier: formArchiveTier,\n        complianceReason: formComplianceReason,\n        totalSize: '1.2 TB',\n        coldSize: '0.8 TB',\n        estimatedMonthlySavings: '$110.00 / mo',\n        enabled: true,\n        lastRun: 'Pending First Run',\n        nextRun: 'Tonight at 00:00 UTC',\n        rowCount: '150M rows',\n      }\n      setPolicies((prev) => [newPolicy, ...prev])\n      setBannerMessage({\n        type: 'success',\n        text: `Created new automated retention policy for \"${newPolicy.tableName}\".`,\n      })\n    }\n    setIsPolicyModalOpen(false)\n  }\n\n  const openRunArchiveModal = (policy: RetentionPolicy) => {\n    setSelectedPolicyForArchive(policy)\n    setIsArchiveModalOpen(true)\n  }\n\n  const executeArchiveRun = () => {\n    if (!selectedPolicyForArchive) return\n    setIsArchiving(true)\n\n    setTimeout(() => {\n      setIsArchiving(false)\n      setIsArchiveModalOpen(false)\n      const target = selectedPolicyForArchive\n      setPolicies((prev) => prev.map((p) => (p.id === target.id ? { ...p, lastRun: 'Just now' } : p)))\n      setBannerMessage({\n        type: 'success',\n        text: `Archive partition sweep successfully completed for \"${target.tableName}\". Cold tier storage synchronized.`,\n      })\n    }, 1200)\n  }\n\n  const getRetentionBadgeVariant = (\n    period: string,\n  ): 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' => {\n    if (period.includes('7 Years') || period.includes('Compliance')) return 'success'\n    if (period.includes('TTL') || period.includes('14 Days') || period.includes('30 Days')) return 'warning'\n    if (period.includes('90 Days') || period.includes('180 Days')) return 'info'\n    return 'secondary'\n  }\n\n  const getComplianceBadgeVariant = (\n    reason: string,\n  ): 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' => {\n    if (reason.includes('GDPR') || reason.includes('CCPA')) return 'info'\n    if (reason.includes('SOX') || reason.includes('HIPAA')) return 'success'\n    if (reason.includes('Storage') || reason.includes('Optimization')) return 'secondary'\n    if (reason.includes('PCI')) return 'warning'\n    return 'outline'\n  }\n\n  return (\n    <div data-slot=\"data-retention-policy-manager\" className={cn('w-full space-y-6', className)}>\n      {/* Header Section */}\n      <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div className=\"space-y-1\">\n          <div className=\"flex items-center gap-2\">\n            <div className=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n              <Archive className=\"size-4.5\" />\n            </div>\n            <h1 className=\"text-foreground text-2xl font-bold tracking-tight\">\n              Data Retention & Cold Storage Lifecycle\n            </h1>\n          </div>\n          <p className=\"text-muted-foreground text-sm\">\n            Configure automated table partition expiration, cold storage tiering, and compliance retention periods.\n          </p>\n        </div>\n\n        <div className=\"flex items-center gap-2\">\n          <Button className=\"gap-1.5\" onClick={openAddPolicyModal}>\n            <Plus className=\"size-4\" />\n            Add Retention Policy\n          </Button>\n        </div>\n      </div>\n\n      {/* Notification / Action banner */}\n      {bannerMessage && (\n        <div className=\"border-border bg-card flex items-center justify-between gap-3 rounded-lg border p-3 shadow-xs\">\n          <div className=\"flex items-center gap-2.5 text-sm\">\n            {bannerMessage.type === 'success' ? (\n              <CheckCircle2 className=\"text-success size-4 shrink-0\" />\n            ) : (\n              <Info className=\"text-primary size-4 shrink-0\" />\n            )}\n            <span className=\"text-foreground text-xs font-medium sm:text-sm\">{bannerMessage.text}</span>\n          </div>\n          <Button variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={() => setBannerMessage(null)}>\n            <X className=\"size-3.5\" />\n            <span className=\"sr-only\">Dismiss</span>\n          </Button>\n        </div>\n      )}\n\n      {/* 4 Storage & Cost Impact Cards */}\n      <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        {/* Total Managed Data */}\n        <Card className=\"shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Total Managed Data</CardTitle>\n            <div className=\"bg-primary/10 text-primary rounded-lg p-2\">\n              <Database className=\"size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"text-foreground text-2xl font-bold tracking-tight\">{stats.totalManagedData}</div>\n            <p className=\"text-muted-foreground text-xs\">{stats.totalManagedSubtitle}</p>\n          </CardContent>\n        </Card>\n\n        {/* Auto-Archived to Glacier / Cold Tier */}\n        <Card className=\"shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">\n              Auto-Archived to Glacier / Cold Tier\n            </CardTitle>\n            <div className=\"bg-success/10 text-success rounded-lg p-2\">\n              <HardDriveDownload className=\"size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2\">\n            <div className=\"flex items-center justify-between gap-x-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight\">{stats.coldArchivedData}</span>\n              <Badge variant=\"info\" className=\"text-xs\">\n                {stats.archivedPercentage}% archived\n              </Badge>\n            </div>\n            <Progress value={stats.archivedPercentage} className=\"h-1.5\" />\n            <p className=\"text-muted-foreground text-xs\">{stats.archivedSubtitle}</p>\n          </CardContent>\n        </Card>\n\n        {/* Projected Monthly Storage Savings */}\n        <Card className=\"shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Projected Monthly Savings</CardTitle>\n            <div className=\"bg-success/10 text-success rounded-lg p-2\">\n              <DollarSign className=\"size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight\">{stats.projectedMonthlySavings}</span>\n              <Badge variant=\"success\" className=\"text-xs\">\n                Active\n              </Badge>\n            </div>\n            <p className=\"text-muted-foreground text-xs\">{stats.savingsSubtitle}</p>\n          </CardContent>\n        </Card>\n\n        {/* Expired Data Purged in 30d */}\n        <Card className=\"shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Expired Data Purged (30d)</CardTitle>\n            <div className=\"bg-warning/10 text-warning rounded-lg p-2\">\n              <Trash2 className=\"size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight\">{stats.purged30d}</span>\n              <Badge variant=\"outline\" className=\"text-xs\">\n                TTL Drops\n              </Badge>\n            </div>\n            <p className=\"text-muted-foreground text-xs\">{stats.purgedSubtitle}</p>\n          </CardContent>\n        </Card>\n      </div>\n\n      {/* Retention Policies Table Card */}\n      <Card className=\"shadow-xs\">\n        <CardHeader className=\"pb-3\">\n          <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <CardTitle className=\"text-lg font-semibold\">Table Retention Policies & Partition TTL</CardTitle>\n              <CardDescription className=\"text-xs\">\n                Automated lifecycle transition rules, cold tiering, and compliance audit locks across databases.\n              </CardDescription>\n            </div>\n\n            {/* Filter Toolbar */}\n            <div className=\"flex flex-wrap items-center gap-2\">\n              <div className=\"relative w-full sm:w-64\">\n                <Search className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n                <Input\n                  value={searchQuery}\n                  onChange={(e) => setSearchQuery(e.target.value)}\n                  placeholder=\"Search table, database, or compliance...\"\n                  className=\"h-8 pl-9 text-xs\"\n                />\n              </div>\n\n              <Select value={statusFilter} onValueChange={setStatusFilter}>\n                <SelectTrigger className=\"h-8 w-32 text-xs\">\n                  <SelectValue placeholder=\"All Status\" />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"all\">All Status</SelectItem>\n                  <SelectItem value=\"enabled\">Active</SelectItem>\n                  <SelectItem value=\"disabled\">Disabled</SelectItem>\n                </SelectContent>\n              </Select>\n\n              <Select value={complianceFilter} onValueChange={setComplianceFilter}>\n                <SelectTrigger className=\"h-8 w-38 text-xs\">\n                  <SelectValue placeholder=\"All Compliance\" />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"all\">All Compliance</SelectItem>\n                  <SelectItem value=\"SOX Compliance\">SOX Compliance</SelectItem>\n                  <SelectItem value=\"GDPR Art. 17\">GDPR Art. 17</SelectItem>\n                  <SelectItem value=\"Storage Optimization\">Storage Optimization</SelectItem>\n                </SelectContent>\n              </Select>\n            </div>\n          </div>\n        </CardHeader>\n\n        <CardContent className=\"p-0\">\n          <div className=\"overflow-x-auto\">\n            <Table>\n              <TableHeader>\n                <TableRow className=\"hover:bg-transparent\">\n                  <TableHead className=\"min-w-[240px]\">Table Name & Database</TableHead>\n                  <TableHead className=\"min-w-[150px]\">Retention Period</TableHead>\n                  <TableHead className=\"min-w-[280px]\">Lifecycle Action & Tiering</TableHead>\n                  <TableHead className=\"min-w-[150px]\">Compliance Reason</TableHead>\n                  <TableHead className=\"min-w-[120px]\">Status</TableHead>\n                  <TableHead className=\"w-16 text-right\">Actions</TableHead>\n                </TableRow>\n              </TableHeader>\n              <TableBody>\n                {filteredPolicies.map((policy) => (\n                  <TableRow\n                    key={policy.id}\n                    className={cn('group transition-colors', !policy.enabled && 'opacity-70 dark:opacity-65')}\n                  >\n                    {/* Table Name & Database */}\n                    <TableCell className=\"py-3.5 align-top\">\n                      <div className=\"space-y-1\">\n                        <div className=\"flex items-center gap-1.5\">\n                          <span className=\"text-foreground font-mono text-xs font-semibold\">{policy.tableName}</span>\n                          <button\n                            type=\"button\"\n                            className=\"text-muted-foreground hover:text-foreground inline-flex size-4 shrink-0 items-center justify-center transition-colors\"\n                            title={copiedTable === policy.tableName ? 'Copied!' : 'Copy table name'}\n                            onClick={() => copyTableName(policy.tableName)}\n                          >\n                            {copiedTable === policy.tableName ? (\n                              <Check className=\"text-success size-3\" />\n                            ) : (\n                              <Copy className=\"size-3\" />\n                            )}\n                          </button>\n                        </div>\n                        <div className=\"flex flex-wrap items-center gap-1.5 text-xs\">\n                          <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                            {\n                              {\n                                Snowflake: 'Snowflake',\n                                BigQuery: 'BigQuery',\n                                Databricks: 'Databricks',\n                                Postgres: 'Postgres',\n                              }[policy.engine]\n                            }\n                          </Badge>\n                          <span className=\"text-muted-foreground font-mono text-xs\">{policy.database}</span>\n                        </div>\n                        {policy.rowCount && (\n                          <div className=\"text-muted-foreground text-xs\">\n                            {policy.rowCount} · {policy.totalSize}\n                          </div>\n                        )}\n                      </div>\n                    </TableCell>\n\n                    {/* Retention Period Badge */}\n                    <TableCell className=\"py-3.5 align-top\">\n                      <div className=\"space-y-1\">\n                        <Badge variant={getRetentionBadgeVariant(policy.retentionPeriod)} className=\"gap-1 text-xs\">\n                          <Clock className=\"size-3\" />\n                          {policy.retentionPeriod}\n                        </Badge>\n                        <p className=\"text-muted-foreground font-mono text-xs\">Col: {policy.partitionColumn}</p>\n                      </div>\n                    </TableCell>\n\n                    {/* Lifecycle Action & Tiering */}\n                    <TableCell className=\"py-3.5 align-top\">\n                      <div className=\"space-y-1\">\n                        <div className=\"text-foreground flex items-center gap-1.5 text-xs font-medium\">\n                          <Archive className=\"text-muted-foreground size-3.5 shrink-0\" />\n                          <span>{policy.lifecycleAction}</span>\n                        </div>\n                        <div className=\"text-muted-foreground flex flex-wrap items-center gap-2 text-xs\">\n                          <span>\n                            Tier: <strong className=\"text-foreground font-normal\">{policy.archiveTier}</strong>\n                          </span>\n                          <span>·</span>\n                          <span>\n                            Savings:{' '}\n                            <span className=\"text-success font-semibold\">{policy.estimatedMonthlySavings}</span>\n                          </span>\n                        </div>\n                      </div>\n                    </TableCell>\n\n                    {/* Compliance Reason */}\n                    <TableCell className=\"py-3.5 align-top\">\n                      <div className=\"space-y-1\">\n                        <Badge variant={getComplianceBadgeVariant(policy.complianceReason)} className=\"gap-1 text-xs\">\n                          {policy.complianceReason.includes('SOX') || policy.complianceReason.includes('GDPR') ? (\n                            <ShieldCheck className=\"size-3\" />\n                          ) : (\n                            <FileText className=\"size-3\" />\n                          )}\n                          {policy.complianceReason}\n                        </Badge>\n                        <p className=\"text-muted-foreground text-xs\">Next: {policy.nextRun}</p>\n                      </div>\n                    </TableCell>\n\n                    {/* Status Switch */}\n                    <TableCell className=\"py-3.5 align-middle\">\n                      <div className=\"flex items-center gap-2\">\n                        <Switch\n                          checked={policy.enabled}\n                          aria-label={`Toggle retention policy for ${policy.tableName}`}\n                          onCheckedChange={() => togglePolicyStatus(policy.id)}\n                        />\n                        <span\n                          className={cn(\n                            'text-xs font-medium',\n                            policy.enabled ? 'text-success' : 'text-muted-foreground',\n                          )}\n                        >\n                          {policy.enabled ? 'Enabled' : 'Disabled'}\n                        </span>\n                      </div>\n                    </TableCell>\n\n                    {/* Action Menu */}\n                    <TableCell className=\"py-3.5 text-right align-middle\">\n                      <DropdownMenu>\n                        <DropdownMenuTrigger asChild>\n                          <Button variant=\"ghost\" size=\"icon\" className=\"size-8\">\n                            <MoreHorizontal className=\"size-4\" />\n                            <span className=\"sr-only\">Open actions for {policy.tableName}</span>\n                          </Button>\n                        </DropdownMenuTrigger>\n                        <DropdownMenuContent align=\"end\" className=\"w-52\">\n                          <DropdownMenuLabel className=\"text-xs\">Policy Controls</DropdownMenuLabel>\n                          <DropdownMenuSeparator />\n                          <DropdownMenuItem className=\"cursor-pointer\" onClick={() => openRunArchiveModal(policy)}>\n                            <Play className=\"text-success mr-2 size-4\" />\n                            <span>Run Archive Now</span>\n                          </DropdownMenuItem>\n                          <DropdownMenuItem className=\"cursor-pointer\" onClick={() => openEditPolicyModal(policy)}>\n                            <Pencil className=\"mr-2 size-4\" />\n                            <span>Edit Policy</span>\n                          </DropdownMenuItem>\n                          <DropdownMenuItem className=\"cursor-pointer\" onClick={() => copyTableName(policy.tableName)}>\n                            <Copy className=\"mr-2 size-4\" />\n                            <span>Copy Table Name</span>\n                          </DropdownMenuItem>\n                          <DropdownMenuSeparator />\n                          <DropdownMenuItem\n                            className=\"text-destructive focus:text-destructive cursor-pointer\"\n                            onClick={() => deletePolicy(policy.id)}\n                          >\n                            <Trash2 className=\"mr-2 size-4\" />\n                            <span>Delete Policy</span>\n                          </DropdownMenuItem>\n                        </DropdownMenuContent>\n                      </DropdownMenu>\n                    </TableCell>\n                  </TableRow>\n                ))}\n\n                {filteredPolicies.length === 0 && (\n                  <TableRow>\n                    <TableCell colSpan={6} className=\"text-muted-foreground h-32 text-center text-sm\">\n                      <div className=\"flex flex-col items-center justify-center space-y-1\">\n                        <Search className=\"text-muted-foreground/40 size-6\" />\n                        <p className=\"text-foreground text-sm font-medium\">No retention policies found</p>\n                        <p className=\"text-muted-foreground text-xs\">\n                          Try adjusting your search query or filter settings.\n                        </p>\n                      </div>\n                    </TableCell>\n                  </TableRow>\n                )}\n              </TableBody>\n            </Table>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Add / Edit Policy Dialog */}\n      <Dialog open={isPolicyModalOpen} onOpenChange={setIsPolicyModalOpen}>\n        <DialogContent className=\"sm:max-w-lg\">\n          <DialogHeader>\n            <DialogTitle>{editingPolicy ? 'Edit Retention Policy' : 'Add Retention Policy'}</DialogTitle>\n            <DialogDescription className=\"text-xs\">\n              Configure partition expiration time-to-live, cold tier transitions, and legal retention mandates.\n            </DialogDescription>\n          </DialogHeader>\n\n          <div className=\"space-y-3.5 py-2\">\n            <div className=\"space-y-1\">\n              <label htmlFor=\"policy-table-name\" className=\"text-foreground text-xs font-medium\">\n                Target Table (schema.table)\n              </label>\n              <Input\n                id=\"policy-table-name\"\n                value={formTableName}\n                onChange={(e) => setFormTableName(e.target.value)}\n                placeholder=\"e.g. telemetry.clickstream_raw\"\n                className=\"font-mono text-xs\"\n              />\n            </div>\n\n            <div className=\"grid grid-cols-2 gap-3\">\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-engine\" className=\"text-foreground text-xs font-medium\">\n                  Engine\n                </label>\n                <Select value={formEngine} onValueChange={(v) => setFormEngine(v as EngineType)}>\n                  <SelectTrigger id=\"policy-engine\" className=\"text-xs\">\n                    <SelectValue placeholder=\"Engine\" />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"Snowflake\">Snowflake</SelectItem>\n                    <SelectItem value=\"BigQuery\">BigQuery</SelectItem>\n                    <SelectItem value=\"Databricks\">Databricks</SelectItem>\n                    <SelectItem value=\"Postgres\">Postgres</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-database\" className=\"text-foreground text-xs font-medium\">\n                  Database / Cluster\n                </label>\n                <Input\n                  id=\"policy-database\"\n                  value={formDatabase}\n                  onChange={(e) => setFormDatabase(e.target.value)}\n                  placeholder=\"e.g. SNOWFLAKE_PROD_DWH\"\n                  className=\"font-mono text-xs\"\n                />\n              </div>\n            </div>\n\n            <div className=\"grid grid-cols-2 gap-3\">\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-partition-col\" className=\"text-foreground text-xs font-medium\">\n                  Partition Column\n                </label>\n                <Input\n                  id=\"policy-partition-col\"\n                  value={formPartitionCol}\n                  onChange={(e) => setFormPartitionCol(e.target.value)}\n                  placeholder=\"e.g. event_timestamp (DAY)\"\n                  className=\"font-mono text-xs\"\n                />\n              </div>\n\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-retention-period\" className=\"text-foreground text-xs font-medium\">\n                  Retention Period\n                </label>\n                <Select value={formRetentionPeriod} onValueChange={setFormRetentionPeriod}>\n                  <SelectTrigger id=\"policy-retention-period\" className=\"text-xs\">\n                    <SelectValue placeholder=\"Period\" />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"14 Days TTL\">14 Days TTL</SelectItem>\n                    <SelectItem value=\"30 Days TTL\">30 Days TTL</SelectItem>\n                    <SelectItem value=\"90 Days Active\">90 Days Active</SelectItem>\n                    <SelectItem value=\"180 Days Active\">180 Days Active</SelectItem>\n                    <SelectItem value=\"365 Days Active\">365 Days Active</SelectItem>\n                    <SelectItem value=\"7 Years Compliance\">7 Years Compliance</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n            </div>\n\n            <div className=\"space-y-1\">\n              <label htmlFor=\"policy-lifecycle-action\" className=\"text-foreground text-xs font-medium\">\n                Lifecycle Transition Action\n              </label>\n              <Input\n                id=\"policy-lifecycle-action\"\n                value={formLifecycleAction}\n                onChange={(e) => setFormLifecycleAction(e.target.value)}\n                placeholder=\"e.g. Transition to Cold Glacier at 90d -> Hard Purge at 365d\"\n                className=\"text-xs\"\n              />\n            </div>\n\n            <div className=\"grid grid-cols-2 gap-3\">\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-archive-tier\" className=\"text-foreground text-xs font-medium\">\n                  Cold Storage Tier\n                </label>\n                <Select value={formArchiveTier} onValueChange={(v) => setFormArchiveTier(v as ArchiveTierType)}>\n                  <SelectTrigger id=\"policy-archive-tier\" className=\"text-xs\">\n                    <SelectValue placeholder=\"Tier\" />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"Glacier Deep\">Glacier Deep Archive</SelectItem>\n                    <SelectItem value=\"Coldline\">BigQuery Coldline</SelectItem>\n                    <SelectItem value=\"Standard Cold\">Standard Cold</SelectItem>\n                    <SelectItem value=\"Purge Immediately\">Purge Immediately</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n\n              <div className=\"space-y-1\">\n                <label htmlFor=\"policy-compliance\" className=\"text-foreground text-xs font-medium\">\n                  Compliance Framework\n                </label>\n                <Select value={formComplianceReason} onValueChange={setFormComplianceReason}>\n                  <SelectTrigger id=\"policy-compliance\" className=\"text-xs\">\n                    <SelectValue placeholder=\"Compliance\" />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"SOX Compliance\">SOX Compliance</SelectItem>\n                    <SelectItem value=\"GDPR Art. 17\">GDPR Art. 17</SelectItem>\n                    <SelectItem value=\"Storage Optimization\">Storage Optimization</SelectItem>\n                    <SelectItem value=\"PCI-DSS v4.0\">PCI-DSS v4.0</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n            </div>\n          </div>\n\n          <DialogFooter>\n            <Button variant=\"outline\" onClick={() => setIsPolicyModalOpen(false)}>\n              Cancel\n            </Button>\n            <Button disabled={!formTableName.trim()} onClick={savePolicy}>\n              {editingPolicy ? 'Save Policy Changes' : 'Create Retention Policy'}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n\n      {/* Run Archive Dry-Run & Execution Modal */}\n      <Dialog open={isArchiveModalOpen} onOpenChange={setIsArchiveModalOpen}>\n        <DialogContent className=\"sm:max-w-md\">\n          <DialogHeader>\n            <div className=\"flex items-center gap-2\">\n              <div className=\"bg-primary/10 text-primary rounded-lg p-2\">\n                <HardDriveDownload className=\"size-5\" />\n              </div>\n              <div>\n                <DialogTitle>Run Archive Partition Sweep</DialogTitle>\n                <DialogDescription className=\"text-xs\">\n                  Trigger manual partition evaluation and transition expired partitions to cold storage.\n                </DialogDescription>\n              </div>\n            </div>\n          </DialogHeader>\n\n          <div className=\"space-y-3 py-2 text-xs\">\n            <div className=\"border-border bg-muted/40 space-y-2 rounded-lg border p-3\">\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <span className=\"text-muted-foreground\">Target Table:</span>\n                <span className=\"text-foreground font-mono font-semibold\">{selectedPolicyForArchive?.tableName}</span>\n              </div>\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <span className=\"text-muted-foreground\">Database Engine:</span>\n                <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                  {selectedPolicyForArchive?.engine}\n                </Badge>\n              </div>\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <span className=\"text-muted-foreground\">Lifecycle Action:</span>\n                <span className=\"text-foreground font-medium\">{selectedPolicyForArchive?.lifecycleAction}</span>\n              </div>\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <span className=\"text-muted-foreground\">Est. Savings:</span>\n                <span className=\"text-success font-semibold\">{selectedPolicyForArchive?.estimatedMonthlySavings}</span>\n              </div>\n            </div>\n\n            <div className=\"border-border bg-card text-muted-foreground space-y-1 rounded-lg border p-3\">\n              <div className=\"text-foreground flex items-center gap-1.5 font-medium\">\n                <ShieldCheck className=\"text-success size-4\" />\n                <span>Dry-Run Check Passed</span>\n              </div>\n              <p className=\"text-xs\">\n                Partitions older than configured threshold will be compressed, archived into cold tier, and purged from\n                active storage without table locks.\n              </p>\n            </div>\n          </div>\n\n          <DialogFooter>\n            <Button variant=\"outline\" disabled={isArchiving} onClick={() => setIsArchiveModalOpen(false)}>\n              Cancel\n            </Button>\n            <Button disabled={isArchiving} className=\"gap-1.5\" onClick={executeArchiveRun}>\n              {isArchiving ? (\n                <>\n                  <RefreshCw className=\"size-4 animate-spin\" />\n                  Archiving Partitions...\n                </>\n              ) : (\n                <>\n                  <Play className=\"size-4\" />\n                  Run Archive Sweep Now\n                </>\n              )}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    </div>\n  )\n}\n\nexport default DataRetentionPolicyManager\n",
      "type": "registry:block",
      "target": "~/components/blocks/DataRetentionPolicyManager.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/dialog.json",
    "https://uipkge.dev/r/react/dropdown-menu.json",
    "https://uipkge.dev/r/react/input.json",
    "https://uipkge.dev/r/react/progress.json",
    "https://uipkge.dev/r/react/select.json",
    "https://uipkge.dev/r/react/switch.json",
    "https://uipkge.dev/r/react/table.json"
  ],
  "description": "Snowflake and BigQuery style automated data retention policy manager, partition TTL scheduler, and cold storage archive tiering with cost impact metrics, lifecycle action execution, and compliance tracking.",
  "categories": [
    "devops",
    "dashboard",
    "app",
    "data"
  ]
}