{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "email-template-previewer",
  "title": "Email Template Previewer",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/email-template-previewer/EmailTemplatePreviewer.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  ArrowRight,\n  Check,\n  CheckCircle2,\n  Code2,\n  Copy,\n  FileCode,\n  Flame,\n  Inbox,\n  Layers,\n  Lock,\n  Mail,\n  Monitor,\n  Palette,\n  Send,\n  ShieldCheck,\n  Smartphone,\n  Terminal,\n  Zap,\n} from 'lucide-react'\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  DialogTrigger,\n} from '@/components/ui/dialog'\nimport { Input } from '@/components/ui/input'\nimport { Separator } from '@/components/ui/separator'\nimport { cn } from '@/lib/utils'\n\nexport interface EmailTemplatePreviewerProps {\n  className?: string\n}\n\ntype ViewportMode = 'desktop' | 'mobile' | 'raw'\ntype ClientOption = 'all' | 'gmail' | 'apple' | 'outlook'\n\nexport function EmailTemplatePreviewer({ className }: EmailTemplatePreviewerProps) {\n  const [viewport, setViewport] = React.useState<ViewportMode>('desktop')\n  const [subject, setSubject] = React.useState('🚀 Introducing UIPKGE 2.0: The unbundled UI registry')\n  const [previewText, setPreviewText] = React.useState(\n    'Explore 300+ production components with zero npm dependencies. Native Vue 3 & React code.',\n  )\n  const senderName = 'UIPKGE Team'\n  const senderEmail = 'updates@uipkge.dev'\n  const recipientEmail = 'subscriber@example.com'\n\n  // Test email dialog state\n  const [isTestModalOpen, setIsTestModalOpen] = React.useState(false)\n  const [testTargetEmail, setTestTargetEmail] = React.useState('alex.developer@company.com')\n  const [selectedClient, setSelectedClient] = React.useState<ClientOption>('all')\n  const [isSendingTest, setIsSendingTest] = React.useState(false)\n  const [testSentSuccess, setTestSentSuccess] = React.useState(false)\n\n  // Export copy feedback\n  const [isCopied, setIsCopied] = React.useState(false)\n\n  const subjectCharCount = subject.length\n  const preheaderCharCount = previewText.length\n\n  const emojiCount = React.useMemo(() => {\n    const matches = subject.match(/\\p{Extended_Pictographic}/gu)\n    return matches ? matches.length : 0\n  }, [subject])\n\n  const subjectStatus = React.useMemo(() => {\n    if (subjectCharCount >= 30 && subjectCharCount <= 60) {\n      return { label: 'Optimal length', variant: 'success' as const }\n    }\n    if (subjectCharCount < 30) {\n      return { label: 'Short subject', variant: 'info' as const }\n    }\n    return { label: 'Long subject (may truncate)', variant: 'warning' as const }\n  }, [subjectCharCount])\n\n  const rawHtmlOutput = React.useMemo(() => {\n    return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <title>${subject.replace(/\"/g, '&quot;')}</title>\n  <!--[if mso]>\n  <noscript>\n    <xml>\n      <o:OfficeDocumentSettings>\n        <o:PixelsPerInch>96</o:PixelsPerInch>\n      </o:OfficeDocumentSettings>\n    </xml>\n  </noscript>\n  <![endif]-->\n  <style>\n    body { margin:0; padding:0; background-color:#09090b; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif; color:#fafafa; }\n    table { border-collapse:collapse; }\n    .email-container { max-width:600px; margin:0 auto; background-color:#18181b; border:1px solid #27272a; border-radius:12px; overflow:hidden; }\n    .cta-btn { display:inline-block; background-color:#ffffff; color:#09090b; font-weight:600; padding:12px 28px; border-radius:8px; text-decoration:none; }\n  </style>\n</head>\n<body style=\"margin:0; padding:0; background-color:#09090b; color:#fafafa;\">\n  <!-- Preheader text snippet -->\n  <div style=\"display:none; max-height:0px; overflow:hidden; font-size:1px; line-height:1px; color:#fff; opacity:0;\">\n    ${previewText.replace(/\"/g, '&quot;')}\n  </div>\n\n  <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background-color:#09090b;\">\n    <tr>\n      <td align=\"center\" style=\"padding:40px 16px;\">\n        <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"max-width:600px; background-color:#18181b; border:1px solid #27272a; border-radius:12px; overflow:hidden;\">\n          <!-- Header Logo Banner -->\n          <tr>\n            <td style=\"padding:24px 32px; border-bottom:1px solid #27272a;\">\n              <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                <tr>\n                  <td align=\"left\" style=\"font-weight:700; font-size:18px; color:#ffffff; letter-spacing:-0.02em;\">\n                    ⚡ UIPKGE\n                  </td>\n                  <td align=\"right\" style=\"font-size:12px; color:#a1a1aa;\">\n                    Changelog #24\n                  </td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <!-- Hero Section -->\n          <tr>\n            <td style=\"padding:36px 32px 20px 32px;\">\n              <span style=\"display:inline-block; padding:4px 10px; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:0.05em; background-color:rgba(255,255,255,0.08); color:#a1a1aa; border-radius:9999px; margin-bottom:16px;\">\n                Major Release\n              </span>\n              <h1 style=\"margin:0 0 16px 0; font-size:26px; font-weight:700; line-height:1.25; color:#ffffff; letter-spacing:-0.03em;\">\n                Ship polished UIs in minutes\n              </h1>\n              <p style=\"margin:0 0 24px 0; font-size:15px; line-height:1.6; color:#a1a1aa;\">\n                We completely rebuilt the registry engine. Zero npm dependencies, 100% code ownership, and full native support for Vue 3 and React with modern OKLCH tokens.\n              </p>\n            </td>\n          </tr>\n\n          <!-- Code Snippet Card -->\n          <tr>\n            <td style=\"padding:0 32px 24px 32px;\">\n              <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background-color:#09090b; border:1px solid #27272a; border-radius:8px;\">\n                <tr>\n                  <td style=\"padding:10px 16px; border-bottom:1px solid #27272a; font-family:monospace; font-size:11px; color:#71717a;\">\n                    Terminal &bull; Quick Install\n                  </td>\n                </tr>\n                <tr>\n                  <td style=\"padding:14px 16px; font-family:monospace; font-size:13px; color:#38bdf8;\">\n                    npx shadcn-vue add @uipkge/button\n                  </td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <!-- Primary CTA Button -->\n          <tr>\n            <td align=\"center\" style=\"padding:12px 32px 32px 32px;\">\n              <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n                <tr>\n                  <td align=\"center\" style=\"border-radius:8px; background-color:#ffffff;\">\n                    <a href=\"https://uipkge.dev\" target=\"_blank\" style=\"font-size:14px; font-weight:600; color:#09090b; text-decoration:none; padding:12px 32px; display:inline-block; border-radius:8px;\">\n                      Explore Components &rarr;\n                    </a>\n                  </td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <!-- Highlights List -->\n          <tr>\n            <td style=\"padding:24px 32px; border-top:1px solid #27272a; background-color:rgba(255,255,255,0.02);\">\n              <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n                <tr>\n                  <td style=\"padding:8px 0;\">\n                    <strong style=\"color:#ffffff; font-size:14px;\">⚡ Zero Dependency Footprint:</strong>\n                    <span style=\"color:#a1a1aa; font-size:14px;\"> Components live directly in your code.</span>\n                  </td>\n                </tr>\n                <tr>\n                  <td style=\"padding:8px 0;\">\n                    <strong style=\"color:#ffffff; font-size:14px;\">🎨 OKLCH Dark Mode Tokens:</strong>\n                    <span style=\"color:#a1a1aa; font-size:14px;\"> Fluid WCAG AA contrast calibrated for all themes.</span>\n                  </td>\n                </tr>\n                <tr>\n                  <td style=\"padding:8px 0;\">\n                    <strong style=\"color:#ffffff; font-size:14px;\">🧩 Dual-Framework Registry:</strong>\n                    <span style=\"color:#a1a1aa; font-size:14px;\"> Full TypeScript parity for Vue 3 and React.</span>\n                  </td>\n                </tr>\n              </table>\n            </td>\n          </tr>\n\n          <!-- Footer -->\n          <tr>\n            <td style=\"padding:28px 32px; border-top:1px solid #27272a; text-align:center;\">\n              <p style=\"margin:0 0 10px 0; font-size:12px; color:#71717a;\">\n                UIPKGE Inc. &bull; 548 Market St, Suite 29314, San Francisco, CA 94104\n              </p>\n              <p style=\"margin:0; font-size:12px; color:#71717a;\">\n                <a href=\"https://uipkge.dev\" style=\"color:#a1a1aa; text-decoration:underline;\">Docs</a> &bull;\n                <a href=\"https://github.com/uipkge\" style=\"color:#a1a1aa; text-decoration:underline;\">GitHub</a> &bull;\n                <a href=\"#unsubscribe\" style=\"color:#a1a1aa; text-decoration:underline;\">Unsubscribe</a>\n              </p>\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n</body>\n</html>`\n  }, [subject, previewText])\n\n  const copyHtmlToClipboard = async () => {\n    try {\n      await navigator.clipboard.writeText(rawHtmlOutput)\n      setIsCopied(true)\n      setTimeout(() => {\n        setIsCopied(false)\n      }, 2000)\n    } catch (err) {\n      console.error('Failed to copy HTML: ', err)\n    }\n  }\n\n  const handleSendTest = () => {\n    if (!testTargetEmail) return\n    setIsSendingTest(true)\n    setTestSentSuccess(false)\n\n    setTimeout(() => {\n      setIsSendingTest(false)\n      setTestSentSuccess(true)\n      setTimeout(() => {\n        setTestSentSuccess(false)\n        setIsTestModalOpen(false)\n      }, 2000)\n    }, 700)\n  }\n\n  return (\n    <div data-slot=\"email-template-previewer\" className={cn('w-full space-y-6', className)}>\n      {/* Top Toolbar Card */}\n      <Card className=\"border-border bg-card shadow-xs\">\n        <CardHeader className=\"pb-4\">\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                <CardTitle className=\"text-lg font-semibold tracking-tight\">Marketing Email Designer</CardTitle>\n                <Badge variant=\"outline\" className=\"text-muted-foreground gap-1 border-dashed\">\n                  <Send className=\"text-primary size-3\" />\n                  Resend Engine\n                </Badge>\n              </div>\n              <CardDescription className=\"text-xs\">\n                Live viewport rendering, deliverability telemetry, and RFC-compliant HTML generator.\n              </CardDescription>\n            </div>\n\n            {/* Viewport Switcher & Primary Actions */}\n            <div className=\"flex flex-wrap items-center gap-2\">\n              {/* Viewport Switcher */}\n              <div className=\"bg-muted/80 border-border inline-flex max-w-full items-center overflow-x-auto rounded-lg border p-1 shadow-xs\">\n                <Button\n                  type=\"button\"\n                  size=\"xs\"\n                  variant={viewport === 'desktop' ? 'default' : 'ghost'}\n                  className=\"gap-1.5 text-xs font-medium\"\n                  onClick={() => setViewport('desktop')}\n                >\n                  <Monitor className=\"size-3.5\" />\n                  <span>Desktop 600px</span>\n                </Button>\n                <Button\n                  type=\"button\"\n                  size=\"xs\"\n                  variant={viewport === 'mobile' ? 'default' : 'ghost'}\n                  className=\"gap-1.5 text-xs font-medium\"\n                  onClick={() => setViewport('mobile')}\n                >\n                  <Smartphone className=\"size-3.5\" />\n                  <span>Mobile 375px</span>\n                </Button>\n                <Button\n                  type=\"button\"\n                  size=\"xs\"\n                  variant={viewport === 'raw' ? 'default' : 'ghost'}\n                  className=\"gap-1.5 text-xs font-medium\"\n                  onClick={() => setViewport('raw')}\n                >\n                  <Code2 className=\"size-3.5\" />\n                  <span>Raw HTML</span>\n                </Button>\n              </div>\n\n              {/* Send Test Dialog Modal */}\n              <Dialog open={isTestModalOpen} onOpenChange={setIsTestModalOpen}>\n                <DialogTrigger asChild>\n                  <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5 text-xs\">\n                    <Send className=\"text-primary size-3.5\" />\n                    <span>Send Test Email</span>\n                  </Button>\n                </DialogTrigger>\n                <DialogContent className=\"sm:max-w-md\">\n                  <DialogHeader>\n                    <DialogTitle className=\"flex items-center gap-2 text-base\">\n                      <Mail className=\"text-primary size-4\" />\n                      Dispatch Test Preview\n                    </DialogTitle>\n                    <DialogDescription className=\"text-xs\">\n                      Send a live test message to your inbox to inspect rendering across email clients.\n                    </DialogDescription>\n                  </DialogHeader>\n\n                  <div className=\"space-y-4 py-2\">\n                    <div className=\"space-y-1.5\">\n                      <label className=\"text-muted-foreground text-xs font-medium\">Recipient Address</label>\n                      <Input\n                        value={testTargetEmail}\n                        onChange={(e) => setTestTargetEmail(e.target.value)}\n                        type=\"email\"\n                        placeholder=\"you@company.com\"\n                        className=\"text-xs\"\n                        disabled={isSendingTest}\n                      />\n                    </div>\n\n                    <div className=\"space-y-1.5\">\n                      <label className=\"text-muted-foreground text-xs font-medium\">Target Preview Profile</label>\n                      <div className=\"grid grid-cols-2 gap-2\">\n                        <Button\n                          type=\"button\"\n                          size=\"xs\"\n                          variant={selectedClient === 'all' ? 'default' : 'outline'}\n                          className=\"justify-start text-xs\"\n                          onClick={() => setSelectedClient('all')}\n                        >\n                          🌐 All Clients\n                        </Button>\n                        <Button\n                          type=\"button\"\n                          size=\"xs\"\n                          variant={selectedClient === 'gmail' ? 'default' : 'outline'}\n                          className=\"justify-start text-xs\"\n                          onClick={() => setSelectedClient('gmail')}\n                        >\n                          ✉️ Gmail (Web)\n                        </Button>\n                        <Button\n                          type=\"button\"\n                          size=\"xs\"\n                          variant={selectedClient === 'apple' ? 'default' : 'outline'}\n                          className=\"justify-start text-xs\"\n                          onClick={() => setSelectedClient('apple')}\n                        >\n                          🍏 Apple Mail (iOS)\n                        </Button>\n                        <Button\n                          type=\"button\"\n                          size=\"xs\"\n                          variant={selectedClient === 'outlook' ? 'default' : 'outline'}\n                          className=\"justify-start text-xs\"\n                          onClick={() => setSelectedClient('outlook')}\n                        >\n                          💼 Outlook 365\n                        </Button>\n                      </div>\n                    </div>\n\n                    {testSentSuccess && (\n                      <div className=\"border-success/30 bg-success/10 text-success flex items-center gap-2 rounded-md border p-2.5 text-xs font-medium\">\n                        <CheckCircle2 className=\"size-4 shrink-0\" />\n                        <span>Test email dispatched to {testTargetEmail}!</span>\n                      </div>\n                    )}\n                  </div>\n\n                  <DialogFooter className=\"gap-2 sm:gap-0\">\n                    <Button\n                      variant=\"outline\"\n                      size=\"sm\"\n                      disabled={isSendingTest}\n                      onClick={() => setIsTestModalOpen(false)}\n                    >\n                      Cancel\n                    </Button>\n                    <Button size=\"sm\" className=\"gap-1.5\" disabled={isSendingTest} onClick={handleSendTest}>\n                      <Send className=\"size-3.5\" />\n                      <span>{isSendingTest ? 'Sending...' : 'Send Test'}</span>\n                    </Button>\n                  </DialogFooter>\n                </DialogContent>\n              </Dialog>\n\n              {/* Export HTML Button */}\n              <Button variant=\"default\" size=\"sm\" className=\"gap-1.5 text-xs\" onClick={copyHtmlToClipboard}>\n                {isCopied ? <Check className=\"text-success size-3.5\" /> : <Copy className=\"size-3.5\" />}\n                <span>{isCopied ? 'Copied HTML!' : 'Export HTML'}</span>\n              </Button>\n            </div>\n          </div>\n        </CardHeader>\n\n        <Separator />\n\n        {/* Subject & Preheader Inputs with Character & Emoji Analyzers */}\n        <CardContent className=\"pt-4\">\n          <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n            {/* Subject Line Section */}\n            <div className=\"space-y-1.5\">\n              <div className=\"flex items-center justify-between text-xs\">\n                <label className=\"text-foreground font-medium\">Subject Line</label>\n                <div className=\"flex items-center gap-1.5\">\n                  <Badge variant={subjectStatus.variant} className=\"h-5 px-1.5 text-xs font-normal\">\n                    {subjectCharCount}/60 chars\n                  </Badge>\n                  <Badge variant=\"outline\" className=\"text-muted-foreground h-5 gap-1 px-1.5 text-xs font-normal\">\n                    <Flame className=\"text-warning size-3\" />\n                    <span>{emojiCount} emoji</span>\n                  </Badge>\n                </div>\n              </div>\n              <Input\n                value={subject}\n                onChange={(e) => setSubject(e.target.value)}\n                className=\"text-xs\"\n                placeholder=\"Enter campaign subject line...\"\n              />\n            </div>\n\n            {/* Preheader Section */}\n            <div className=\"space-y-1.5\">\n              <div className=\"flex items-center justify-between text-xs\">\n                <label className=\"text-foreground font-medium\">Preview Text / Preheader</label>\n                <Badge variant=\"secondary\" className=\"text-muted-foreground h-5 px-1.5 text-xs font-normal\">\n                  {preheaderCharCount}/90 chars\n                </Badge>\n              </div>\n              <Input\n                value={previewText}\n                onChange={(e) => setPreviewText(e.target.value)}\n                className=\"text-xs\"\n                placeholder=\"Secondary snippet shown in mail list...\"\n              />\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* 2-Column Preview Workspace */}\n      <div className=\"grid grid-cols-1 items-start gap-6 lg:grid-cols-12\">\n        {/* Left Column: Email Canvas Container */}\n        <div className=\"flex flex-col items-center lg:col-span-8\">\n          <div className=\"border-border bg-muted/30 relative flex min-h-[720px] w-full flex-col items-center justify-start overflow-hidden rounded-xl border p-4 sm:p-6\">\n            {/* RAW HTML VIEW */}\n            {viewport === 'raw' ? (\n              <div className=\"w-full space-y-3\">\n                <div className=\"flex items-center justify-between\">\n                  <div className=\"flex items-center gap-2\">\n                    <FileCode className=\"text-muted-foreground size-4\" />\n                    <span className=\"text-foreground font-mono text-xs font-semibold\">template.compiled.html</span>\n                    <Badge variant=\"secondary\" className=\"h-4.5 text-xs\">\n                      14.2 KB\n                    </Badge>\n                  </div>\n                  <Button variant=\"outline\" size=\"xs\" className=\"gap-1 text-xs\" onClick={copyHtmlToClipboard}>\n                    {isCopied ? <Check className=\"text-success size-3\" /> : <Copy className=\"size-3\" />}\n                    <span>{isCopied ? 'Copied' : 'Copy Source'}</span>\n                  </Button>\n                </div>\n                <pre className=\"border-border bg-muted/70 text-foreground max-h-[640px] overflow-auto rounded-lg border p-4 font-mono text-xs leading-relaxed\">\n                  <code>{rawHtmlOutput}</code>\n                </pre>\n              </div>\n            ) : (\n              /* DESKTOP / MOBILE EMAIL PREVIEW CANVAS */\n              <div\n                className={cn(\n                  'w-full transition-[max-width] duration-300 ease-in-out',\n                  viewport === 'desktop' ? 'max-w-[600px]' : 'max-w-[375px]',\n                )}\n              >\n                {/* Email Window Envelope Frame */}\n                <div className=\"border-border bg-card overflow-hidden rounded-xl border shadow-sm\">\n                  {/* Window Chrome Bar */}\n                  <div className=\"border-border bg-muted/50 flex items-center justify-between border-b px-4 py-2.5\">\n                    <div className=\"flex items-center gap-1.5\">\n                      <div className=\"bg-destructive/80 size-2.5 rounded-full\" />\n                      <div className=\"bg-warning/80 size-2.5 rounded-full\" />\n                      <div className=\"bg-success/80 size-2.5 rounded-full\" />\n                    </div>\n                    <div className=\"text-muted-foreground flex items-center gap-1.5 font-mono text-xs\">\n                      <Inbox className=\"size-3\" />\n                      <span>UIPKGE Inbox Preview · {viewport === 'desktop' ? '600px' : '375px'}</span>\n                    </div>\n                    <Badge\n                      variant=\"outline\"\n                      className=\"border-border text-muted-foreground h-4.5 gap-1 px-1.5 text-xs font-normal\"\n                    >\n                      <Lock className=\"text-success size-2.5\" />\n                      TLS 1.3\n                    </Badge>\n                  </div>\n\n                  {/* Envelope Metadata Readout */}\n                  <div className=\"border-border bg-card/60 space-y-2 border-b p-4 text-xs\">\n                    <div className=\"flex items-center justify-between\">\n                      <div className=\"flex items-center gap-2\">\n                        <div className=\"bg-primary text-primary-foreground flex size-7 items-center justify-center rounded-full font-bold\">\n                          U\n                        </div>\n                        <div>\n                          <div className=\"flex items-center gap-1.5\">\n                            <span className=\"text-foreground font-semibold\">{senderName}</span>\n                            <span className=\"text-muted-foreground\">&lt;{senderEmail}&gt;</span>\n                          </div>\n                          <div className=\"text-muted-foreground text-xs\">To: {recipientEmail}</div>\n                        </div>\n                      </div>\n                      <span className=\"text-muted-foreground text-xs\">Aug 21, 2026, 10:00 AM</span>\n                    </div>\n\n                    <div className=\"pt-1\">\n                      <div className=\"text-foreground text-sm font-semibold tracking-tight\">{subject}</div>\n                      <div className=\"text-muted-foreground line-clamp-1 text-xs\">{previewText}</div>\n                    </div>\n                  </div>\n\n                  {/* Rendered Email Body */}\n                  <div className=\"bg-card space-y-6 p-6 sm:p-8\">\n                    {/* Header Logo Banner */}\n                    <div className=\"border-border flex items-center justify-between border-b pb-4\">\n                      <div className=\"flex items-center gap-2\">\n                        <div className=\"bg-primary text-primary-foreground flex size-6 items-center justify-center rounded-md\">\n                          <Zap className=\"size-3.5 fill-current\" />\n                        </div>\n                        <span className=\"text-foreground text-sm font-bold tracking-tight\">UIPKGE</span>\n                      </div>\n                      <Badge variant=\"secondary\" className=\"text-xs font-medium\">\n                        Changelog #24\n                      </Badge>\n                    </div>\n\n                    {/* Hero Section */}\n                    <div className=\"space-y-3\">\n                      <Badge\n                        variant=\"outline\"\n                        className=\"text-primary border-primary/30 text-xs font-semibold tracking-wider uppercase\"\n                      >\n                        Major Release\n                      </Badge>\n                      <h1 className=\"text-foreground text-2xl leading-tight font-bold tracking-tight sm:text-3xl\">\n                        Ship polished UIs in minutes\n                      </h1>\n                      <p className=\"text-muted-foreground text-sm leading-relaxed\">\n                        We completely rebuilt the registry engine. Zero npm dependencies, 100% code ownership, and full\n                        native support for Vue 3 and React with modern OKLCH tokens.\n                      </p>\n                    </div>\n\n                    {/* Featured Screenshot / Product Mock Card */}\n                    <div className=\"border-border bg-muted/40 overflow-hidden rounded-lg border\">\n                      <div className=\"border-border bg-muted/60 flex items-center justify-between gap-2 border-b px-3.5 py-2\">\n                        <div className=\"text-muted-foreground flex min-w-0 items-center gap-1.5 font-mono text-xs\">\n                          <Terminal className=\"text-primary size-3 shrink-0\" />\n                          <span className=\"truncate\">components/ui/button.tsx</span>\n                        </div>\n                        <span className=\"text-success shrink-0 font-mono text-xs font-medium\">TypeScript</span>\n                      </div>\n                      <div className=\"space-y-3 p-4\">\n                        <div className=\"border-border bg-background text-muted-foreground rounded-md border p-2.5 font-mono text-xs\">\n                          <span className=\"text-primary font-semibold\">$</span> npx shadcn add @uipkge/button\n                        </div>\n\n                        {/* Mini UI Preview inside email */}\n                        <div className=\"bg-card border-border flex flex-wrap items-center justify-center gap-2 rounded-md border p-3\">\n                          <Button size=\"xs\" variant=\"default\">\n                            Primary\n                          </Button>\n                          <Button size=\"xs\" variant=\"secondary\">\n                            Secondary\n                          </Button>\n                          <Button size=\"xs\" variant=\"outline\">\n                            Outline\n                          </Button>\n                          <Button size=\"xs\" variant=\"destructive\">\n                            Delete\n                          </Button>\n                        </div>\n                      </div>\n                    </div>\n\n                    {/* Primary CTA Button */}\n                    <div className=\"flex flex-col items-center justify-center space-y-2 pt-2 text-center\">\n                      <Button size=\"lg\" className=\"w-full px-8 font-semibold shadow-xs sm:w-auto\">\n                        <span>Explore Components</span>\n                        <ArrowRight className=\"size-4\" />\n                      </Button>\n                      <p className=\"text-muted-foreground text-xs\">\n                        Free & open source · MIT License · 300+ Primitives & Blocks\n                      </p>\n                    </div>\n\n                    <Separator />\n\n                    {/* 3 Highlight Bullet Points with Icons */}\n                    <div className=\"space-y-3.5\">\n                      <div className=\"flex items-start gap-3\">\n                        <div className=\"bg-primary/10 text-primary mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full\">\n                          <Zap className=\"size-3.5\" />\n                        </div>\n                        <div className=\"space-y-0.5\">\n                          <h4 className=\"text-foreground text-xs font-semibold\">Zero Dependency Footprint</h4>\n                          <p className=\"text-muted-foreground text-xs leading-relaxed\">\n                            Every component lives directly in your codebase. No semver conflicts or registry lock-in.\n                          </p>\n                        </div>\n                      </div>\n\n                      <div className=\"flex items-start gap-3\">\n                        <div className=\"bg-primary/10 text-primary mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full\">\n                          <Palette className=\"size-3.5\" />\n                        </div>\n                        <div className=\"space-y-0.5\">\n                          <h4 className=\"text-foreground text-xs font-semibold\">OKLCH Dark Mode Tokens</h4>\n                          <p className=\"text-muted-foreground text-xs leading-relaxed\">\n                            Calibrated light & dark surfaces with verified WCAG AA contrast and fluid spring physics.\n                          </p>\n                        </div>\n                      </div>\n\n                      <div className=\"flex items-start gap-3\">\n                        <div className=\"bg-primary/10 text-primary mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full\">\n                          <Layers className=\"size-3.5\" />\n                        </div>\n                        <div className=\"space-y-0.5\">\n                          <h4 className=\"text-foreground text-xs font-semibold\">Dual-Framework Registry</h4>\n                          <p className=\"text-muted-foreground text-xs leading-relaxed\">\n                            First-class TypeScript support for both Vue 3 (Reka UI) and React (Radix UI).\n                          </p>\n                        </div>\n                      </div>\n                    </div>\n\n                    <Separator />\n\n                    {/* Email Footer */}\n                    <div className=\"text-muted-foreground space-y-3 pt-2 text-center text-xs\">\n                      <div className=\"flex flex-wrap items-center justify-center gap-3 font-medium\">\n                        <span className=\"hover:text-foreground cursor-pointer transition-colors\">Documentation</span>\n                        <span>·</span>\n                        <span className=\"hover:text-foreground cursor-pointer transition-colors\">GitHub</span>\n                        <span>·</span>\n                        <span className=\"hover:text-foreground cursor-pointer transition-colors\">Discord</span>\n                        <span>·</span>\n                        <span className=\"hover:text-foreground cursor-pointer transition-colors\">Preferences</span>\n                      </div>\n                      <p className=\"text-xs\">UIPKGE Inc. · 548 Market St, Suite 29314, San Francisco, CA 94104</p>\n                      <p className=\"text-xs\">\n                        You received this email because you subscribed to UIPKGE updates.{' '}\n                        <span className=\"hover:text-foreground cursor-pointer underline\">Unsubscribe anytime</span>.\n                      </p>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            )}\n          </div>\n        </div>\n\n        {/* Right Column: Quality & Deliverability Inspector (w-72 / col-span-4) */}\n        <div className=\"space-y-4 lg:col-span-4\">\n          {/* Card 1: Spam Score Analyzer */}\n          <Card className=\"border-border bg-card shadow-xs\">\n            <CardHeader className=\"pb-3\">\n              <div className=\"flex items-center justify-between\">\n                <CardTitle className=\"text-sm font-semibold tracking-tight\">Spam Score Analyzer</CardTitle>\n                <ShieldCheck className=\"text-success size-4\" />\n              </div>\n              <CardDescription className=\"text-xs\">\n                Predictive inbox delivery rating based on content heuristics.\n              </CardDescription>\n            </CardHeader>\n            <CardContent className=\"space-y-3.5\">\n              {/* Score Meter Display */}\n              <div className=\"border-success/20 bg-success/10 rounded-lg border p-3\">\n                <div className=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n                  <span className=\"text-success text-2xl font-bold tracking-tight\">0.4</span>\n                  <span className=\"text-muted-foreground text-xs font-medium\">/ 10.0 scale</span>\n                </div>\n                <div className=\"text-success mt-1.5 flex items-center gap-1.5 text-xs font-medium\">\n                  <CheckCircle2 className=\"size-3.5\" />\n                  <span>Excellent inbox probability</span>\n                </div>\n                {/* Gauge Meter Bar */}\n                <div className=\"bg-muted mt-2.5 h-1.5 w-full overflow-hidden rounded-full\">\n                  <div className=\"bg-success h-full w-[96%] rounded-full\" />\n                </div>\n              </div>\n\n              {/* Checklist checks */}\n              <div className=\"space-y-2 text-xs\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-muted-foreground flex items-center gap-1.5\">\n                    <Check className=\"text-success size-3.5\" />\n                    Spam trigger words\n                  </span>\n                  <span className=\"text-foreground font-medium\">0 detected</span>\n                </div>\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-muted-foreground flex items-center gap-1.5\">\n                    <Check className=\"text-success size-3.5\" />\n                    Text-to-image ratio\n                  </span>\n                  <span className=\"text-foreground font-medium\">92% text (Safe)</span>\n                </div>\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-muted-foreground flex items-center gap-1.5\">\n                    <Check className=\"text-success size-3.5\" />\n                    RFC 8058 Unsubscribe\n                  </span>\n                  <span className=\"text-foreground font-medium\">Included</span>\n                </div>\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-muted-foreground flex items-center gap-1.5\">\n                    <Check className=\"text-success size-3.5\" />\n                    Valid HTTPS links\n                  </span>\n                  <span className=\"text-foreground font-medium\">6 links checked</span>\n                </div>\n              </div>\n            </CardContent>\n          </Card>\n\n          {/* Card 2: Domain Authentication Badges */}\n          <Card className=\"border-border bg-card shadow-xs\">\n            <CardHeader className=\"pb-3\">\n              <CardTitle className=\"text-sm font-semibold tracking-tight\">Domain Authentication</CardTitle>\n              <CardDescription className=\"text-xs\">Security headers verified against DNS records.</CardDescription>\n            </CardHeader>\n            <CardContent className=\"space-y-2.5\">\n              <div className=\"flex items-center justify-between text-xs\">\n                <span className=\"text-muted-foreground\">SPF Record</span>\n                <Badge variant=\"success\" className=\"h-5 px-2 text-xs\">\n                  Pass\n                </Badge>\n              </div>\n              <div className=\"flex items-center justify-between text-xs\">\n                <span className=\"text-muted-foreground\">DKIM Signature</span>\n                <Badge variant=\"success\" className=\"h-5 px-2 text-xs\">\n                  Pass (2048-bit)\n                </Badge>\n              </div>\n              <div className=\"flex items-center justify-between text-xs\">\n                <span className=\"text-muted-foreground\">DMARC Policy</span>\n                <Badge variant=\"success\" className=\"h-5 px-2 text-xs\">\n                  Pass (p=reject)\n                </Badge>\n              </div>\n              <div className=\"flex items-center justify-between text-xs\">\n                <span className=\"text-muted-foreground\">TLS Handshake</span>\n                <Badge variant=\"outline\" className=\"text-foreground h-5 px-2 text-xs\">\n                  TLS 1.3 Active\n                </Badge>\n              </div>\n            </CardContent>\n          </Card>\n\n          {/* Card 3: Dark Mode & Accessibility */}\n          <Card className=\"border-border bg-card shadow-xs\">\n            <CardHeader className=\"pb-3\">\n              <CardTitle className=\"text-sm font-semibold tracking-tight\">Contrast & Dark Mode</CardTitle>\n              <CardDescription className=\"text-xs\">Client dark mode and WCAG contrast conformance.</CardDescription>\n            </CardHeader>\n            <CardContent className=\"space-y-2.5 text-xs\">\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Dark Mode Contrast</span>\n                <Badge variant=\"success\" className=\"h-5 px-2 text-xs\">\n                  100% WCAG AA\n                </Badge>\n              </div>\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Text Contrast Ratio</span>\n                <span className=\"text-foreground font-semibold\">14.8:1 (AAA)</span>\n              </div>\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Plaintext Fallback</span>\n                <span className=\"text-foreground font-medium\">Auto-generated</span>\n              </div>\n            </CardContent>\n          </Card>\n\n          {/* Card 4: Email Telemetry */}\n          <Card className=\"border-border bg-card shadow-xs\">\n            <CardHeader className=\"pb-3\">\n              <CardTitle className=\"text-sm font-semibold tracking-tight\">Email Telemetry</CardTitle>\n              <CardDescription className=\"text-xs\">Reading metrics and payload optimization.</CardDescription>\n            </CardHeader>\n            <CardContent className=\"space-y-2.5 text-xs\">\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Estimated Reading Time</span>\n                <span className=\"text-foreground font-medium\">45 sec · 185 words</span>\n              </div>\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Payload Size</span>\n                <span className=\"text-foreground font-medium\">14.2 KB (102 KB safe)</span>\n              </div>\n              <div className=\"flex items-center justify-between\">\n                <span className=\"text-muted-foreground\">Inline Assets</span>\n                <span className=\"text-foreground font-medium\">1 Vector SVG</span>\n              </div>\n            </CardContent>\n          </Card>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport default EmailTemplatePreviewer\n",
      "type": "registry:block",
      "target": "~/components/blocks/EmailTemplatePreviewer.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/input.json",
    "https://uipkge.dev/r/react/separator.json"
  ],
  "description": "Resend and Klaviyo style marketing email designer preview with viewport switcher, subject line tester, deliverability & spam score analyzer, and live test dispatch modal.",
  "categories": [
    "marketing",
    "preview",
    "app"
  ]
}