{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "privacy-data-export-portal",
  "title": "Privacy Data Export Portal",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/privacy-data-export-portal/PrivacyDataExportPortal.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Activity,\n  Archive,\n  Calendar,\n  Check,\n  CheckCircle2,\n  Clock,\n  CreditCard,\n  Download,\n  FileSpreadsheet,\n  FileText,\n  FolderArchive,\n  HardDrive,\n  Info,\n  Loader2,\n  Lock,\n  RefreshCw,\n  ShieldCheck,\n  User,\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 { Checkbox } from '@/components/ui/checkbox'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Separator } from '@/components/ui/separator'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\n\nexport type ExportFormat = 'zip' | 'json' | 'csv'\nexport type ArchiveStatus = 'ready' | 'processing' | 'expired'\n\nexport interface DataCategory {\n  id: string\n  name: string\n  description: string\n  sizeMb: number\n  recordCount: string\n  icon: React.ComponentType<{ className?: string }>\n}\n\nexport interface ArchiveRecord {\n  id: string\n  name: string\n  format: ExportFormat\n  requestedAt: string\n  expiresAt: string\n  expiresInDays: number\n  sizeMb: number\n  categories: string[]\n  status: ArchiveStatus\n}\n\nexport interface PrivacyDataExportPortalProps {\n  initialCategories?: string[]\n  initialFormat?: ExportFormat\n  className?: string\n}\n\nconst categories: DataCategory[] = [\n  {\n    id: 'profile',\n    name: 'Profile & Identity',\n    description: 'Account details, email history, avatar, and authentication security credentials.',\n    sizeMb: 1.4,\n    recordCount: '12 records',\n    icon: User,\n  },\n  {\n    id: 'activity',\n    name: 'Activity & Audit Logs',\n    description: 'Login history, device sessions, security events, and API access traces.',\n    sizeMb: 8.6,\n    recordCount: '1,420 events',\n    icon: Activity,\n  },\n  {\n    id: 'financial',\n    name: 'Financial & Transactions',\n    description: 'Invoices, payment receipts, subscription history, and billing ledger entries.',\n    sizeMb: 3.2,\n    recordCount: '48 entries',\n    icon: CreditCard,\n  },\n  {\n    id: 'workspace',\n    name: 'Workspace Content & Projects',\n    description: 'Created blocks, saved templates, comments, custom presets, and file uploads.',\n    sizeMb: 35.0,\n    recordCount: '312 objects',\n    icon: FolderArchive,\n  },\n]\n\nconst initialArchives: ArchiveRecord[] = [\n  {\n    id: 'DPA-2026-0814',\n    name: 'DPA-2026-0814.zip',\n    format: 'zip',\n    requestedAt: 'Aug 14, 2026 · 09:24 UTC',\n    expiresAt: 'Aug 25, 2026',\n    expiresInDays: 4,\n    sizeMb: 42.1,\n    categories: ['Profile', 'Logs', 'Workspace', 'Billing'],\n    status: 'ready',\n  },\n  {\n    id: 'DPA-2026-0820',\n    name: 'DPA-2026-0820.json',\n    format: 'json',\n    requestedAt: 'Aug 20, 2026 · 14:15 UTC',\n    expiresAt: 'Aug 27, 2026',\n    expiresInDays: 7,\n    sizeMb: 8.6,\n    categories: ['Activity & Audit Logs'],\n    status: 'processing',\n  },\n  {\n    id: 'DPA-2026-0201',\n    name: 'DPA-2026-0201.zip',\n    format: 'zip',\n    requestedAt: 'Feb 01, 2026 · 11:02 UTC',\n    expiresAt: 'Feb 08, 2026',\n    expiresInDays: 0,\n    sizeMb: 38.4,\n    categories: ['Full Account Archive'],\n    status: 'expired',\n  },\n]\n\nexport function PrivacyDataExportPortal({\n  initialCategories = ['profile', 'activity', 'financial', 'workspace'],\n  initialFormat = 'zip',\n  className,\n}: PrivacyDataExportPortalProps) {\n  const [selectedCategories, setSelectedCategories] = React.useState<string[]>(initialCategories)\n  const [selectedFormat, setSelectedFormat] = React.useState<ExportFormat>(initialFormat)\n  const [archives, setArchives] = React.useState<ArchiveRecord[]>(initialArchives)\n  const [isGenerating, setIsGenerating] = React.useState(false)\n  const [notification, setNotification] = React.useState<{\n    title: string\n    message: string\n    type: 'success' | 'info'\n  } | null>(null)\n\n  const totalSelectedSize = React.useMemo(() => {\n    const sum = categories.filter((c) => selectedCategories.includes(c.id)).reduce((acc, c) => acc + c.sizeMb, 0)\n    return sum.toFixed(1)\n  }, [selectedCategories])\n\n  const isAllSelected = selectedCategories.length === categories.length\n\n  const toggleCategory = (categoryId: string) => {\n    setSelectedCategories((prev) =>\n      prev.includes(categoryId) ? prev.filter((id) => id !== categoryId) : [...prev, categoryId],\n    )\n  }\n\n  const toggleAll = () => {\n    if (isAllSelected) {\n      setSelectedCategories([])\n    } else {\n      setSelectedCategories(categories.map((c) => c.id))\n    }\n  }\n\n  const triggerExport = (label = 'Custom Data Export', formatToUse = selectedFormat) => {\n    if (selectedCategories.length === 0) return\n\n    setIsGenerating(true)\n    setNotification({\n      title: 'Archive Request Queued',\n      message: `${label} requested. Compiling ${selectedCategories.length} categories (${totalSelectedSize} MB) with AES-256 encryption.`,\n      type: 'info',\n    })\n\n    setTimeout(() => {\n      const newId = `DPA-${new Date().toISOString().slice(0, 10).replace(/-/g, '')}-${Math.floor(100 + Math.random() * 900)}`\n      const catNames = categories.filter((c) => selectedCategories.includes(c.id)).map((c) => c.name.split(' ')[0])\n\n      const newRecord: ArchiveRecord = {\n        id: newId,\n        name: `${newId}.${formatToUse}`,\n        format: formatToUse,\n        requestedAt: 'Just now',\n        expiresAt: '7 days from now',\n        expiresInDays: 7,\n        sizeMb: parseFloat(totalSelectedSize),\n        categories: catNames,\n        status: 'ready',\n      }\n\n      setArchives((prev) => [newRecord, ...prev])\n      setIsGenerating(false)\n      setNotification({\n        title: 'Archive Ready',\n        message: `Export package ${newRecord.name} (${newRecord.sizeMb} MB) has been generated and is ready for download.`,\n        type: 'success',\n      })\n    }, 1200)\n  }\n\n  const requestFullExport = () => {\n    setSelectedCategories(categories.map((c) => c.id))\n    setSelectedFormat('zip')\n    triggerExport('Full Data Export', 'zip')\n  }\n\n  const handleDownload = (archive: ArchiveRecord) => {\n    setNotification({\n      title: 'Download Initiated',\n      message: `Securely downloading ${archive.name} (${archive.sizeMb} MB). SHA-256 checksum verified.`,\n      type: 'success',\n    })\n  }\n\n  const handleReRequest = (archive: ArchiveRecord) => {\n    setNotification({\n      title: 'Archive Re-generation Requested',\n      message: `Re-generating expired archive for ${archive.categories.join(', ')}.`,\n      type: 'info',\n    })\n  }\n\n  return (\n    <div data-slot=\"privacy-data-export-portal\" className={cn('w-full space-y-6', className)}>\n      {/* Header Bar */}\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            <h1 className=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">\n              Data Privacy & Personal Data Export\n            </h1>\n            <Badge\n              variant=\"outline\"\n              className=\"border-primary/20 bg-primary/5 text-primary hidden items-center gap-1 text-xs font-medium sm:inline-flex\"\n            >\n              <Lock className=\"size-3\" />\n              GDPR Art. 15\n            </Badge>\n          </div>\n          <p className=\"text-muted-foreground text-sm\">\n            Request, generate, and download your complete personal data archives under GDPR Article 15.\n          </p>\n        </div>\n        <div className=\"flex items-center gap-2.5\">\n          <Button\n            type=\"button\"\n            size=\"default\"\n            className=\"gap-2 shadow-xs\"\n            disabled={isGenerating}\n            onClick={requestFullExport}\n          >\n            <Download className=\"size-4\" />\n            Request Full Data Export\n          </Button>\n        </div>\n      </div>\n\n      {/* Notification Banner */}\n      {notification && (\n        <div\n          className={cn(\n            'flex items-start gap-3 rounded-lg border p-4 text-sm transition-colors',\n            notification.type === 'success'\n              ? 'border-success/30 bg-success/10 text-success'\n              : 'border-info/30 bg-info/10 text-info',\n          )}\n        >\n          {notification.type === 'success' ? (\n            <CheckCircle2 className=\"text-success mt-0.5 size-5 shrink-0\" />\n          ) : (\n            <Info className=\"text-info mt-0.5 size-5 shrink-0\" />\n          )}\n          <div className=\"flex-1 space-y-0.5\">\n            <p className=\"font-medium\">{notification.title}</p>\n            <p className=\"text-xs opacity-90\">{notification.message}</p>\n          </div>\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            className=\"h-7 px-2 text-xs hover:bg-transparent\"\n            onClick={() => setNotification(null)}\n          >\n            Dismiss\n          </Button>\n        </div>\n      )}\n\n      {/* 4 Privacy & Governance Stat Cards */}\n      <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        {/* Stat 1: Account Creation Date */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Account Creation Date</CardTitle>\n            <div className=\"border-border bg-muted/50 text-foreground flex size-8 items-center justify-center rounded-md border\">\n              <Calendar className=\"text-muted-foreground size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"text-foreground text-xl font-bold tracking-tight tabular-nums\">Nov 12, 2024</div>\n            <p className=\"text-muted-foreground text-xs\">\n              <span className=\"text-foreground font-medium tabular-nums\">1.8 years</span> active account age\n            </p>\n          </CardContent>\n        </Card>\n\n        {/* Stat 2: Total Data Footprint */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Total Data Footprint</CardTitle>\n            <div className=\"border-border bg-muted/50 text-foreground flex size-8 items-center justify-center rounded-md border\">\n              <HardDrive className=\"text-muted-foreground size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"text-foreground text-xl font-bold tracking-tight tabular-nums\">48.2 MB</div>\n            <p className=\"text-muted-foreground text-xs\">Across 6 storage domains</p>\n          </CardContent>\n        </Card>\n\n        {/* Stat 3: Active Data Retention Policy */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Data Retention Policy</CardTitle>\n            <div className=\"border-border bg-muted/50 text-foreground flex size-8 items-center justify-center rounded-md border\">\n              <Clock className=\"text-muted-foreground size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"text-foreground text-xl font-bold tracking-tight tabular-nums\">30-Day Policy</div>\n            <p className=\"text-muted-foreground text-xs\">Automated purge of activity logs</p>\n          </CardContent>\n        </Card>\n\n        {/* Stat 4: Consent Status */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <CardTitle className=\"text-muted-foreground text-sm font-medium\">Consent Status</CardTitle>\n            <div className=\"border-success/20 bg-success/10 text-success flex size-8 items-center justify-center rounded-md border\">\n              <ShieldCheck className=\"size-4\" />\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-1\">\n            <div className=\"text-foreground text-xl font-bold tracking-tight tabular-nums\">3 / 3 Active</div>\n            <p className=\"text-success text-xs font-medium\">Required Consents Active</p>\n          </CardContent>\n        </Card>\n      </div>\n\n      {/* Select Data Categories for Export */}\n      <Card className=\"border-border shadow-xs\">\n        <CardHeader className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n          <div className=\"space-y-1\">\n            <CardTitle className=\"text-foreground text-lg font-semibold\">Select Data Categories for Export</CardTitle>\n            <CardDescription>\n              Choose specific data domains to compile into your encrypted archive package.\n            </CardDescription>\n          </div>\n          <Button variant=\"outline\" size=\"sm\" className=\"h-8 self-start text-xs sm:self-auto\" onClick={toggleAll}>\n            {isAllSelected ? 'Deselect All' : 'Select All Categories'}\n          </Button>\n        </CardHeader>\n        <CardContent className=\"space-y-6\">\n          {/* Checkbox Grid of 4 Categories */}\n          <div className=\"grid grid-cols-1 gap-3.5 md:grid-cols-2\">\n            {categories.map((cat) => {\n              const Icon = cat.icon\n              const isChecked = selectedCategories.includes(cat.id)\n              return (\n                <div\n                  key={cat.id}\n                  className={cn(\n                    'group flex cursor-pointer items-start gap-3.5 rounded-lg border p-4 transition-colors',\n                    isChecked\n                      ? 'border-primary/50 bg-primary/5 dark:bg-primary/10 shadow-xs'\n                      : 'border-border bg-card hover:bg-muted/40',\n                  )}\n                  onClick={() => toggleCategory(cat.id)}\n                >\n                  <Checkbox\n                    id={`category-${cat.id}`}\n                    checked={isChecked}\n                    className=\"mt-1\"\n                    onCheckedChange={() => toggleCategory(cat.id)}\n                    onClick={(e) => e.stopPropagation()}\n                  />\n                  <div className=\"min-w-0 flex-1 space-y-1.5\">\n                    <div className=\"flex items-center justify-between gap-2\">\n                      <div className=\"flex items-center gap-2\">\n                        <Icon className=\"text-muted-foreground size-4\" />\n                        <label\n                          htmlFor={`category-${cat.id}`}\n                          className=\"text-foreground cursor-pointer text-sm leading-none font-medium\"\n                          onClick={(e) => {\n                            e.stopPropagation()\n                            toggleCategory(cat.id)\n                          }}\n                        >\n                          {cat.name}\n                        </label>\n                      </div>\n                      <Badge variant=\"secondary\" className=\"shrink-0 font-mono text-xs tabular-nums\">\n                        {cat.sizeMb} MB\n                      </Badge>\n                    </div>\n                    <p className=\"text-muted-foreground text-xs leading-relaxed\">{cat.description}</p>\n                    <div className=\"text-muted-foreground/80 text-xs tabular-nums\">\n                      Estimated footprint: <span className=\"text-foreground font-medium\">{cat.recordCount}</span>\n                    </div>\n                  </div>\n                </div>\n              )\n            })}\n          </div>\n\n          <Separator />\n\n          {/* Format selector and generation action bar */}\n          <div className=\"flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between\">\n            <div className=\"flex flex-col gap-1.5 sm:flex-row sm:items-center sm:gap-3\">\n              <label className=\"text-foreground text-sm font-medium whitespace-nowrap\">Export Format:</label>\n              <Select value={selectedFormat} onValueChange={(val: ExportFormat) => setSelectedFormat(val)}>\n                <SelectTrigger className=\"bg-background w-full sm:w-[260px]\">\n                  <SelectValue placeholder=\"Select export format\" />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"zip\">\n                    <div className=\"flex items-center gap-2\">\n                      <Archive className=\"text-muted-foreground size-3.5\" />\n                      <span>Complete ZIP Bundle (.zip)</span>\n                    </div>\n                  </SelectItem>\n                  <SelectItem value=\"json\">\n                    <div className=\"flex items-center gap-2\">\n                      <FileText className=\"text-muted-foreground size-3.5\" />\n                      <span>JSON Archive (.json)</span>\n                    </div>\n                  </SelectItem>\n                  <SelectItem value=\"csv\">\n                    <div className=\"flex items-center gap-2\">\n                      <FileSpreadsheet className=\"text-muted-foreground size-3.5\" />\n                      <span>CSV Spreadsheet (.csv)</span>\n                    </div>\n                  </SelectItem>\n                </SelectContent>\n              </Select>\n            </div>\n\n            <div className=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\">\n              <div className=\"text-muted-foreground text-xs sm:text-right\">\n                Selected:{' '}\n                <span className=\"text-foreground font-semibold tabular-nums\">\n                  {selectedCategories.length} of {categories.length} categories\n                </span>\n                <span className=\"text-foreground font-semibold tabular-nums\">~{totalSelectedSize} MB</span>\n              </div>\n              <Button\n                type=\"button\"\n                className=\"gap-2 shadow-xs\"\n                disabled={selectedCategories.length === 0 || isGenerating}\n                onClick={() => triggerExport('Custom Data Export')}\n              >\n                {isGenerating ? <Loader2 className=\"size-4 animate-spin\" /> : <Archive className=\"size-4\" />}\n                {isGenerating ? 'Compiling Archive...' : 'Generate Data Archive'}\n              </Button>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Legal Compliance Notice Box */}\n      <div className=\"border-border bg-muted/40 text-muted-foreground flex items-start gap-3 rounded-lg border p-4 text-xs shadow-xs\">\n        <Lock className=\"text-muted-foreground mt-0.5 size-4 shrink-0\" />\n        <p className=\"leading-relaxed\">\n          Under <span className=\"text-foreground font-medium\">GDPR Article 15</span> (Right of Access) and{' '}\n          <span className=\"text-foreground font-medium\">CCPA §1798.100</span>, you are entitled to request and receive\n          all personal data processed by this service. Export packages are generated on-demand, encrypted with AES-256,\n          and available for download for 7 days before automated deletion.\n        </p>\n      </div>\n\n      {/* Export Archive History Table */}\n      <Card className=\"border-border shadow-xs\">\n        <CardHeader>\n          <div className=\"flex items-center justify-between\">\n            <div className=\"space-y-1\">\n              <CardTitle className=\"text-foreground text-lg font-semibold\">Export Archive History</CardTitle>\n              <CardDescription>\n                Previous data archive requests and generation status. Downloads remain available for 7 days.\n              </CardDescription>\n            </div>\n            <Badge variant=\"outline\" className=\"font-mono text-xs tabular-nums\">\n              {archives.length} archives\n            </Badge>\n          </div>\n        </CardHeader>\n        <CardContent className=\"p-0\">\n          <div className=\"overflow-x-auto\">\n            <Table>\n              <TableHeader>\n                <TableRow>\n                  <TableHead className=\"min-w-[220px]\">Archive ID & Format</TableHead>\n                  <TableHead className=\"min-w-[170px]\">Request Date</TableHead>\n                  <TableHead className=\"min-w-[140px]\">Expiration</TableHead>\n                  <TableHead className=\"min-w-[100px] text-right\">File Size</TableHead>\n                  <TableHead className=\"min-w-[150px]\">Status</TableHead>\n                  <TableHead className=\"min-w-[140px] text-right\">Action</TableHead>\n                </TableRow>\n              </TableHeader>\n              <TableBody>\n                {archives.map((arc) => (\n                  <TableRow key={arc.id} className=\"hover:bg-muted/40\">\n                    <TableCell>\n                      <div className=\"space-y-1\">\n                        <div className=\"flex items-center gap-2\">\n                          <span className=\"text-foreground font-mono text-xs font-semibold\">{arc.name}</span>\n                          <Badge variant=\"outline\" className=\"px-1.5 py-0 font-mono text-xs uppercase\">\n                            {arc.format}\n                          </Badge>\n                        </div>\n                        <p className=\"text-muted-foreground text-xs\">{arc.categories.join(', ')}</p>\n                      </div>\n                    </TableCell>\n                    <TableCell className=\"text-muted-foreground text-xs tabular-nums\">{arc.requestedAt}</TableCell>\n                    <TableCell>\n                      <div className=\"space-y-0.5\">\n                        <span\n                          className={cn(\n                            'text-xs font-medium tabular-nums',\n                            arc.status === 'expired'\n                              ? 'text-muted-foreground line-through'\n                              : arc.expiresInDays <= 4\n                                ? 'text-warning'\n                                : 'text-muted-foreground',\n                          )}\n                        >\n                          {arc.status === 'expired' ? 'Expired' : `Expires in ${arc.expiresInDays} days`}\n                        </span>\n                        <p className=\"text-muted-foreground/70 text-xs tabular-nums\">{arc.expiresAt}</p>\n                      </div>\n                    </TableCell>\n                    <TableCell className=\"text-foreground text-right font-mono text-xs font-medium tabular-nums\">\n                      {arc.sizeMb.toFixed(1)} MB\n                    </TableCell>\n                    <TableCell>\n                      {arc.status === 'ready' && (\n                        <Badge\n                          variant=\"outline\"\n                          className=\"border-success/30 bg-success/10 text-success items-center gap-1.5 text-xs font-medium\"\n                        >\n                          <Check className=\"size-3\" />\n                          Ready for Download\n                        </Badge>\n                      )}\n                      {arc.status === 'processing' && (\n                        <Badge\n                          variant=\"outline\"\n                          className=\"border-warning/30 bg-warning/10 text-warning items-center gap-1.5 text-xs font-medium\"\n                        >\n                          <Loader2 className=\"size-3 animate-spin\" />\n                          Processing Archive\n                        </Badge>\n                      )}\n                      {arc.status === 'expired' && (\n                        <Badge variant=\"secondary\" className=\"text-muted-foreground text-xs\">\n                          Expired\n                        </Badge>\n                      )}\n                    </TableCell>\n                    <TableCell className=\"text-right\">\n                      {arc.status === 'ready' && (\n                        <Button\n                          aria-label=\"Download attachment\"\n                          size=\"sm\"\n                          className=\"h-8 gap-1.5 text-xs shadow-xs\"\n                          onClick={() => handleDownload(arc)}\n                        >\n                          <Download className=\"size-3.5\" />\n                          Download ZIP\n                        </Button>\n                      )}\n                      {arc.status === 'processing' && (\n                        <Button size=\"sm\" variant=\"secondary\" disabled className=\"h-8 gap-1.5 text-xs opacity-75\">\n                          <Loader2 className=\"size-3.5 animate-spin\" />\n                          Processing...\n                        </Button>\n                      )}\n                      {arc.status === 'expired' && (\n                        <Button\n                          size=\"sm\"\n                          variant=\"outline\"\n                          className=\"h-8 gap-1.5 text-xs\"\n                          onClick={() => handleReRequest(arc)}\n                        >\n                          <RefreshCw className=\"size-3.5\" />\n                          Re-request\n                        </Button>\n                      )}\n                    </TableCell>\n                  </TableRow>\n                ))}\n              </TableBody>\n            </Table>\n          </div>\n        </CardContent>\n      </Card>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/PrivacyDataExportPortal.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/checkbox.json",
    "https://uipkge.dev/r/react/select.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/table.json"
  ],
  "description": "GDPR Article 15 and CCPA personal data export portal with privacy governance stat cards, granular category export selector, format chooser, and export archive history table.",
  "categories": [
    "legal",
    "security",
    "app"
  ]
}