{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "certificate-credential-card",
  "title": "Certificate Credential Card",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/certificate-credential-card/certificate-credential-card.component.ts",
      "content": "// Digital diploma and verified credential card: ornamental certificate container,\n// cryptographic seal with QR verification, honors distinction, validated skill pills,\n// instructor signatures, and social sharing. Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, DestroyRef, Input, inject, signal } from '@angular/core'\nimport { Award, Check, Copy, Download, ExternalLink, LucideAngularModule, Share2, ShieldCheck } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport { UiCardComponent, UiCardContentComponent, UiCardHeaderComponent } from '@/ui/card/card.component'\n\nconst credentialData = {\n  certId: 'CERT-2026-984210',\n  institution: 'UIPKGE Engineering Academy',\n  motto: 'EXCELLENTIA IN ARCHITECTURA',\n  type: 'Professional Certificate of Mastery in Full-Stack UI Engineering',\n  recipientName: 'Elena Rostova',\n  achievementDescription:\n    'For demonstrating advanced mastery in headless component architecture, OKLCH token systems, accessibility compliance, and dual-framework engineering.',\n  issueDate: 'August 21, 2026',\n  expiration: 'No Expiration · Lifetime Validity',\n  skills: ['Vue 3.5', 'React 19', 'TypeScript', 'Tailwind v4', 'Reka UI', 'WCAG AA A11y'],\n  leadInstructor: {\n    name: 'Dr. Marcus Vance',\n    title: 'Lead Instructor & Distinguished Architect',\n  },\n  academicDean: {\n    name: 'Sarah Jenkins, Ph.D.',\n    title: 'Academic Dean of Engineering',\n  },\n  sha256Digest: '7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069',\n  verifyUrl: 'https://uipkge.dev/verify/CERT-2026-984210',\n  blockLedger: 'Block #19,482,019 (OpenAttestation v3)',\n}\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-certificate-credential-card, [ui-certificate-credential-card]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardHeaderComponent,\n  ],\n  template: `\n    <div data-slot=\"certificate-credential-card\" [class]=\"rootClass\">\n      <!-- Header Card -->\n      <div ui-card class=\"border shadow-xs\">\n        <div ui-card-header class=\"flex flex-col gap-4 pb-6 sm:flex-row sm:items-start sm:justify-between\">\n          <div class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <span ui-badge wrap variant=\"outline\" class=\"gap-1.5 font-mono text-xs\">\n                <lucide-icon [img]=\"Award\" class=\"text-warning size-3.5\" aria-hidden=\"true\" />\n                Verified Credential\n              </span>\n              <div\n                class=\"border-success/20 bg-success/10 text-success inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium\"\n              >\n                <span class=\"relative flex size-1.5\">\n                  <span class=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                  <span class=\"bg-success relative inline-flex size-1.5 rounded-full\"></span>\n                </span>\n                Authentic · Cryptographically Signed\n              </div>\n            </div>\n\n            <div>\n              <h1 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n                Verified Credential &amp; Certificate of Mastery\n              </h1>\n              <div class=\"text-muted-foreground mt-1 flex flex-wrap items-center gap-2 text-xs sm:text-sm\">\n                <span>Credential ID:</span>\n                <button\n                  type=\"button\"\n                  (click)=\"copyCertId()\"\n                  class=\"hover:bg-muted focus-visible:ring-ring border-border bg-muted/40 text-foreground inline-flex min-h-6 items-center gap-1.5 rounded border px-2 py-0.5 font-mono text-xs font-semibold transition-colors focus-visible:ring-2 focus-visible:outline-hidden\"\n                  title=\"Click to copy credential ID\"\n                >\n                  #{{ data.certId }}\n                  @if (copiedCertId()) {\n                    <lucide-icon [img]=\"Check\" class=\"text-success size-3\" aria-hidden=\"true\" />\n                  } @else {\n                    <lucide-icon [img]=\"Copy\" class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                  }\n                </button>\n                <span class=\"text-muted-foreground tabular-nums\">Issued {{ data.issueDate }}</span>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"flex flex-wrap items-center gap-2.5 pt-1\">\n            <button ui-button variant=\"default\" (click)=\"handleLinkedInShare()\" class=\"gap-2 shadow-xs\">\n              <lucide-icon [img]=\"Share2\" class=\"size-4\" aria-hidden=\"true\" />\n              {{ sharedLinkedIn() ? 'Shared!' : 'Share on LinkedIn' }}\n            </button>\n            <button\n              ui-button\n              aria-label=\"Download attachment\"\n              variant=\"outline\"\n              (click)=\"handleDownloadPdf()\"\n              class=\"gap-2 shadow-xs\"\n            >\n              <lucide-icon [img]=\"Download\" class=\"size-4\" aria-hidden=\"true\" />\n              {{ downloadingPdf() ? 'Generating PDF...' : 'Download High-Res PDF' }}\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Certificate Visual Diploma Frame -->\n      <div\n        ui-card\n        class=\"border-border from-card via-card/95 to-card/90 relative overflow-hidden rounded-2xl border bg-gradient-to-b shadow-sm\"\n      >\n        <!-- Watermark Background Graphic -->\n        <div\n          class=\"pointer-events-none absolute inset-0 flex items-center justify-center overflow-hidden opacity-[0.03] select-none dark:opacity-[0.05]\"\n          aria-hidden=\"true\"\n        >\n          <svg\n            class=\"h-[680px] w-full max-w-[680px]\"\n            viewBox=\"0 0 500 500\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <circle cx=\"250\" cy=\"250\" r=\"230\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-dasharray=\"4 4\" />\n            <circle cx=\"250\" cy=\"250\" r=\"210\" stroke=\"currentColor\" stroke-width=\"2\" />\n            <circle cx=\"250\" cy=\"250\" r=\"185\" stroke=\"currentColor\" stroke-width=\"1\" stroke-dasharray=\"2 2\" />\n            <circle cx=\"250\" cy=\"250\" r=\"150\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n            <circle cx=\"250\" cy=\"250\" r=\"120\" stroke=\"currentColor\" stroke-width=\"1\" />\n            <circle cx=\"250\" cy=\"250\" r=\"90\" stroke=\"currentColor\" stroke-width=\"2\" stroke-dasharray=\"6 3\" />\n            <circle cx=\"250\" cy=\"250\" r=\"60\" stroke=\"currentColor\" stroke-width=\"1\" />\n            <g stroke=\"currentColor\" stroke-width=\"0.75\" opacity=\"0.6\">\n              <line x1=\"250\" y1=\"20\" x2=\"250\" y2=\"480\" />\n              <line x1=\"20\" y1=\"250\" x2=\"480\" y2=\"250\" />\n              <line x1=\"87\" y1=\"87\" x2=\"413\" y2=\"413\" />\n              <line x1=\"87\" y1=\"413\" x2=\"413\" y2=\"87\" />\n              <line x1=\"135\" y1=\"51\" x2=\"365\" y2=\"449\" />\n              <line x1=\"365\" y1=\"51\" x2=\"135\" y2=\"449\" />\n              <line x1=\"51\" y1=\"135\" x2=\"449\" y2=\"365\" />\n              <line x1=\"51\" y1=\"365\" x2=\"449\" y2=\"135\" />\n            </g>\n            <polygon\n              points=\"250,170 275,220 330,225 290,265 300,320 250,290 200,320 210,265 170,225 225,220\"\n              stroke=\"currentColor\"\n              stroke-width=\"1.5\"\n              fill=\"none\"\n            />\n          </svg>\n        </div>\n\n        <div ui-card-content class=\"relative z-10 p-6 sm:p-10 lg:p-12\">\n          <div\n            class=\"border-border/80 bg-background/50 relative rounded-xl border p-6 backdrop-blur-xs sm:p-10 lg:p-12\"\n          >\n            <div\n              class=\"border-border/70 pointer-events-none absolute inset-3 rounded-lg border border-dashed sm:inset-4\"\n            >\n              <div class=\"text-warning/70 absolute -top-2.5 -left-2.5 flex size-5 items-center justify-center\">\n                <svg class=\"size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M12 2v20M2 12h20M5 5l14 14M5 19L19 5\" />\n                </svg>\n              </div>\n              <div class=\"text-warning/70 absolute -top-2.5 -right-2.5 flex size-5 items-center justify-center\">\n                <svg class=\"size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M12 2v20M2 12h20M5 5l14 14M5 19L19 5\" />\n                </svg>\n              </div>\n              <div class=\"text-warning/70 absolute -bottom-2.5 -left-2.5 flex size-5 items-center justify-center\">\n                <svg class=\"size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M12 2v20M2 12h20M5 5l14 14M5 19L19 5\" />\n                </svg>\n              </div>\n              <div class=\"text-warning/70 absolute -right-2.5 -bottom-2.5 flex size-5 items-center justify-center\">\n                <svg class=\"size-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M12 2v20M2 12h20M5 5l14 14M5 19L19 5\" />\n                </svg>\n              </div>\n            </div>\n\n            <div class=\"relative space-y-8 text-center sm:space-y-10\">\n              <div class=\"flex flex-col items-center space-y-3\">\n                <div class=\"relative flex size-20 items-center justify-center sm:size-24\">\n                  <div\n                    class=\"to-primary/20 absolute inset-0 rounded-full bg-gradient-to-tr from-amber-500/20 via-emerald-500/20 blur-md\"\n                  ></div>\n                  <div\n                    class=\"bg-card border-warning/40 relative flex size-18 items-center justify-center rounded-full border-2 p-3 shadow-md sm:size-20\"\n                  >\n                    <svg\n                      class=\"text-foreground size-full\"\n                      viewBox=\"0 0 100 100\"\n                      fill=\"none\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                      aria-label=\"UIPKGE Engineering Academy Crest\"\n                    >\n                      <path\n                        d=\"M50 8 L84 20 V50 C84 72 50 92 50 92 C50 92 16 72 16 50 V20 Z\"\n                        fill=\"currentColor\"\n                        fill-opacity=\"0.06\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"3\"\n                        stroke-linejoin=\"round\"\n                      />\n                      <path\n                        d=\"M50 16 L76 26 V48 C76 66 50 82 50 82 C50 82 24 66 24 48 V26 Z\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"1.5\"\n                        stroke-dasharray=\"3 2\"\n                      />\n                      <ellipse\n                        cx=\"50\"\n                        cy=\"48\"\n                        rx=\"20\"\n                        ry=\"8\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"1.5\"\n                        transform=\"rotate(-30 50 48)\"\n                      />\n                      <ellipse\n                        cx=\"50\"\n                        cy=\"48\"\n                        rx=\"20\"\n                        ry=\"8\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"1.5\"\n                        transform=\"rotate(30 50 48)\"\n                      />\n                      <circle cx=\"50\" cy=\"48\" r=\"4\" fill=\"currentColor\" />\n                      <polygon\n                        points=\"50,30 54,38 63,39 56,45 58,54 50,49 42,54 44,45 37,39 46,38\"\n                        fill=\"currentColor\"\n                        fill-opacity=\"0.8\"\n                      />\n                    </svg>\n                  </div>\n                </div>\n\n                <div class=\"space-y-1\">\n                  <p class=\"text-muted-foreground text-xs font-bold tracking-[0.25em] uppercase\">\n                    {{ data.institution }}\n                  </p>\n                  <p class=\"text-success font-mono text-xs font-semibold tracking-widest\">{{ data.motto }}</p>\n                </div>\n\n                <div class=\"text-muted-foreground/60 flex items-center justify-center gap-3 pt-1\">\n                  <span class=\"bg-border h-px w-12 sm:w-20\"></span>\n                  <lucide-icon [img]=\"Award\" class=\"text-warning/80 size-3.5\" aria-hidden=\"true\" />\n                  <span class=\"font-mono text-xs tracking-wider uppercase\">Accredited Diploma</span>\n                  <lucide-icon [img]=\"Award\" class=\"text-warning/80 size-3.5\" aria-hidden=\"true\" />\n                  <span class=\"bg-border h-px w-12 sm:w-20\"></span>\n                </div>\n              </div>\n\n              <div class=\"space-y-4\">\n                <p class=\"text-muted-foreground text-xs font-medium tracking-[0.2em] uppercase\">\n                  This is to certify that\n                </p>\n                <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-5xl lg:text-6xl\">\n                  {{ data.recipientName }}\n                </h2>\n                <p class=\"text-muted-foreground text-xs italic sm:text-sm\">\n                  has successfully fulfilled all rigorous requirements and demonstrated distinguished mastery in\n                </p>\n                <div class=\"border-primary/20 bg-primary/5 mx-auto max-w-2xl rounded-lg border px-4 py-3 sm:px-6\">\n                  <h3 class=\"text-foreground text-base font-semibold tracking-tight sm:text-xl md:text-2xl\">\n                    {{ data.type }}\n                  </h3>\n                </div>\n                <p class=\"text-muted-foreground mx-auto max-w-2xl text-xs leading-relaxed sm:text-sm\">\n                  {{ data.achievementDescription }}\n                </p>\n                <div\n                  class=\"border-warning/30 bg-warning/10 text-warning inline-flex items-center gap-2 rounded-full border px-3.5 py-1 text-xs font-medium\"\n                >\n                  <lucide-icon [img]=\"Award\" class=\"size-3.5\" aria-hidden=\"true\" />\n                  <span>Conferred with Highest Distinction · Top 1% Cohort · 480 CEU Hours</span>\n                </div>\n              </div>\n\n              <div class=\"space-y-3 pt-2\">\n                <p class=\"text-muted-foreground text-xs font-medium\">\n                  Validated Competencies &amp; Technical Proficiencies\n                </p>\n                <div class=\"flex flex-wrap items-center justify-center gap-2\">\n                  @for (skill of data.skills; track skill) {\n                    <span\n                      ui-badge\n                      wrap\n                      variant=\"secondary\"\n                      class=\"border-border/80 bg-muted/60 hover:bg-muted gap-1.5 border px-3 py-1 text-xs font-medium transition-colors\"\n                    >\n                      <span class=\"bg-success size-1.5 rounded-full\"></span>\n                      {{ skill }}\n                    </span>\n                  }\n                </div>\n              </div>\n\n              <div\n                class=\"border-border/60 bg-muted/20 mx-auto grid max-w-xl grid-cols-1 gap-3 rounded-lg border p-3 text-xs sm:grid-cols-3\"\n              >\n                <div>\n                  <span class=\"text-muted-foreground\">Issue Date</span>\n                  <p class=\"text-foreground mt-0.5 font-semibold\">{{ data.issueDate }}</p>\n                </div>\n                <div class=\"border-border/60 border-t pt-2 sm:border-t-0 sm:border-l sm:pt-0 sm:pl-3\">\n                  <span class=\"text-muted-foreground\">Validity</span>\n                  <p class=\"text-success mt-0.5 font-semibold\">{{ data.expiration }}</p>\n                </div>\n                <div class=\"border-border/60 border-t pt-2 sm:border-t-0 sm:border-l sm:pt-0 sm:pl-3\">\n                  <span class=\"text-muted-foreground\">Credential Status</span>\n                  <p class=\"text-foreground mt-0.5 font-mono font-semibold\">Active · Verified</p>\n                </div>\n              </div>\n\n              <div class=\"grid grid-cols-1 items-end gap-8 pt-4 sm:grid-cols-3 sm:gap-6\">\n                <div class=\"flex flex-col items-center space-y-2 text-center\">\n                  <div class=\"flex h-14 w-44 items-center justify-center\">\n                    <svg\n                      class=\"text-foreground h-full w-full opacity-90\"\n                      viewBox=\"0 0 200 60\"\n                      fill=\"none\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                      aria-label=\"Signature of Dr. Marcus Vance\"\n                    >\n                      <path\n                        d=\"M 15,45 C 18,20 28,12 36,25 C 44,38 48,15 56,22 C 64,29 68,48 76,42 C 84,36 92,30 102,32 C 114,34 122,46 134,36 C 144,28 152,18 162,26 C 172,34 180,42 188,40\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"2.2\"\n                        stroke-linecap=\"round\"\n                        stroke-linejoin=\"round\"\n                      />\n                      <path\n                        d=\"M 30,52 C 70,50 140,53 180,48\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"1.2\"\n                        stroke-linecap=\"round\"\n                        stroke-dasharray=\"4 2\"\n                        opacity=\"0.6\"\n                      />\n                    </svg>\n                  </div>\n                  <div class=\"border-border w-full max-w-[200px] border-t pt-1.5\">\n                    <p class=\"text-foreground text-xs font-bold\">{{ data.leadInstructor.name }}</p>\n                    <p class=\"text-muted-foreground text-xs\">{{ data.leadInstructor.title }}</p>\n                  </div>\n                </div>\n\n                <div class=\"flex flex-col items-center space-y-3\">\n                  <div class=\"relative flex flex-col items-center\">\n                    <div\n                      class=\"via-background border-warning/60 relative flex size-28 flex-col items-center justify-center rounded-full border-2 bg-gradient-to-br from-amber-500/10 to-emerald-500/10 p-2 shadow-md\"\n                    >\n                      <svg\n                        class=\"text-foreground size-16\"\n                        viewBox=\"0 0 21 21\"\n                        fill=\"currentColor\"\n                        xmlns=\"http://www.w3.org/2000/svg\"\n                        aria-label=\"QR code for online credential verification\"\n                      >\n                        <rect x=\"0\" y=\"0\" width=\"7\" height=\"7\" rx=\"0.5\" />\n                        <rect x=\"1\" y=\"1\" width=\"5\" height=\"5\" fill=\"var(--color-card, #fff)\" />\n                        <rect x=\"2\" y=\"2\" width=\"3\" height=\"3\" />\n                        <rect x=\"14\" y=\"0\" width=\"7\" height=\"7\" rx=\"0.5\" />\n                        <rect x=\"15\" y=\"1\" width=\"5\" height=\"5\" fill=\"var(--color-card, #fff)\" />\n                        <rect x=\"16\" y=\"2\" width=\"3\" height=\"3\" />\n                        <rect x=\"0\" y=\"14\" width=\"7\" height=\"7\" rx=\"0.5\" />\n                        <rect x=\"1\" y=\"15\" width=\"5\" height=\"5\" fill=\"var(--color-card, #fff)\" />\n                        <rect x=\"2\" y=\"16\" width=\"3\" height=\"3\" />\n                        <rect x=\"8\" y=\"6\" width=\"1\" height=\"1\" />\n                        <rect x=\"10\" y=\"6\" width=\"1\" height=\"1\" />\n                        <rect x=\"12\" y=\"6\" width=\"1\" height=\"1\" />\n                        <rect x=\"6\" y=\"8\" width=\"1\" height=\"1\" />\n                        <rect x=\"6\" y=\"10\" width=\"1\" height=\"1\" />\n                        <rect x=\"6\" y=\"12\" width=\"1\" height=\"1\" />\n                        <rect x=\"8\" y=\"8\" width=\"2\" height=\"2\" />\n                        <rect x=\"11\" y=\"8\" width=\"1\" height=\"1\" />\n                        <rect x=\"13\" y=\"9\" width=\"2\" height=\"1\" />\n                        <rect x=\"8\" y=\"11\" width=\"1\" height=\"2\" />\n                        <rect x=\"10\" y=\"11\" width=\"2\" height=\"1\" />\n                        <rect x=\"13\" y=\"12\" width=\"1\" height=\"1\" />\n                        <rect x=\"14\" y=\"8\" width=\"1\" height=\"1\" />\n                        <rect x=\"16\" y=\"9\" width=\"1\" height=\"1\" />\n                        <rect x=\"19\" y=\"10\" width=\"1\" height=\"1\" />\n                        <rect x=\"15\" y=\"11\" width=\"2\" height=\"1\" />\n                        <rect x=\"18\" y=\"12\" width=\"1\" height=\"1\" />\n                        <rect x=\"8\" y=\"14\" width=\"1\" height=\"1\" />\n                        <rect x=\"10\" y=\"15\" width=\"2\" height=\"1\" />\n                        <rect x=\"8\" y=\"17\" width=\"1\" height=\"2\" />\n                        <rect x=\"10\" y=\"18\" width=\"1\" height=\"1\" />\n                        <rect x=\"12\" y=\"16\" width=\"1\" height=\"2\" />\n                        <rect x=\"12\" y=\"19\" width=\"1\" height=\"1\" />\n                        <rect x=\"14\" y=\"14\" width=\"2\" height=\"1\" />\n                        <rect x=\"17\" y=\"15\" width=\"1\" height=\"1\" />\n                        <rect x=\"19\" y=\"14\" width=\"2\" height=\"1\" />\n                        <rect x=\"15\" y=\"17\" width=\"1\" height=\"2\" />\n                        <rect x=\"17\" y=\"18\" width=\"2\" height=\"1\" />\n                        <rect x=\"20\" y=\"19\" width=\"1\" height=\"1\" />\n                      </svg>\n                      <div class=\"text-success mt-1 flex items-center gap-1\">\n                        <lucide-icon [img]=\"ShieldCheck\" class=\"size-3\" aria-hidden=\"true\" />\n                        <span class=\"font-mono text-xs font-semibold\">VERIFIED</span>\n                      </div>\n                    </div>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs font-medium\">Scan to Verify Authenticity</p>\n                </div>\n\n                <div class=\"flex flex-col items-center space-y-2 text-center\">\n                  <div class=\"flex h-14 w-44 items-center justify-center\">\n                    <svg\n                      class=\"text-foreground h-full w-full opacity-90\"\n                      viewBox=\"0 0 200 60\"\n                      fill=\"none\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                      aria-label=\"Signature of Dr. Sarah Jenkins\"\n                    >\n                      <path\n                        d=\"M 20,25 C 24,14 34,12 40,20 C 46,28 32,48 42,48 C 52,48 60,30 70,30 C 80,30 84,42 94,40 C 104,38 112,24 122,24 C 132,24 136,44 148,42 C 158,40 166,28 176,32 C 182,35 186,40 190,38\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"2.2\"\n                        stroke-linecap=\"round\"\n                        stroke-linejoin=\"round\"\n                      />\n                      <path\n                        d=\"M 25,54 C 65,52 130,50 175,48\"\n                        stroke=\"currentColor\"\n                        stroke-width=\"1.2\"\n                        stroke-linecap=\"round\"\n                        stroke-dasharray=\"4 2\"\n                        opacity=\"0.6\"\n                      />\n                    </svg>\n                  </div>\n                  <div class=\"border-border w-full max-w-[200px] border-t pt-1.5\">\n                    <p class=\"text-foreground text-xs font-bold\">{{ data.academicDean.name }}</p>\n                    <p class=\"text-muted-foreground text-xs\">{{ data.academicDean.title }}</p>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Cryptographic Verification & Blockchain Ledger Audit Strip -->\n      <div ui-card class=\"border-border bg-muted/20 border shadow-xs\">\n        <div ui-card-content class=\"flex flex-col gap-4 p-4 text-xs lg:flex-row lg:items-center lg:justify-between\">\n          <div class=\"text-muted-foreground flex items-center gap-2.5\">\n            <lucide-icon [img]=\"ShieldCheck\" class=\"text-success size-4 shrink-0\" aria-hidden=\"true\" />\n            <span>\n              Tamper-Proof Credential · W3C Verifiable Credentials &amp;\n              <span class=\"text-foreground font-mono font-medium\">{{ data.blockLedger }}</span>\n            </span>\n          </div>\n\n          <div class=\"flex flex-wrap items-center gap-3\">\n            <div class=\"flex items-center gap-1.5 font-mono\">\n              <span class=\"text-muted-foreground\">SHA-256:</span>\n              <button\n                type=\"button\"\n                (click)=\"copyDigest()\"\n                class=\"hover:bg-muted focus-visible:ring-ring border-border bg-muted/60 text-foreground inline-flex min-h-6 items-center gap-1 rounded border px-2 py-0.5 transition-colors focus-visible:ring-2 focus-visible:outline-hidden\"\n                title=\"Click to copy SHA-256 cryptographic digest\"\n              >\n                <span class=\"tabular-nums\">7f83b1...126d9069</span>\n                @if (copiedDigest()) {\n                  <lucide-icon [img]=\"Check\" class=\"text-success size-3\" aria-hidden=\"true\" />\n                } @else {\n                  <lucide-icon [img]=\"Copy\" class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                }\n              </button>\n            </div>\n\n            <button\n              type=\"button\"\n              (click)=\"copyVerifyUrl()\"\n              class=\"hover:bg-muted focus-visible:ring-ring text-primary hover:text-primary/80 inline-flex min-h-6 items-center gap-1 rounded px-1.5 py-0.5 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-hidden\"\n              title=\"Click to copy public verification URL\"\n            >\n              <span>{{ copiedVerifyUrl() ? 'URL Copied' : 'Copy Verification URL' }}</span>\n              @if (copiedVerifyUrl()) {\n                <lucide-icon [img]=\"Check\" class=\"text-success size-3\" aria-hidden=\"true\" />\n              } @else {\n                <lucide-icon [img]=\"ExternalLink\" class=\"size-3\" aria-hidden=\"true\" />\n              }\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiCertificateCredentialCardComponent {\n  protected readonly Award = Award\n  protected readonly Check = Check\n  protected readonly Copy = Copy\n  protected readonly Download = Download\n  protected readonly ExternalLink = ExternalLink\n  protected readonly Share2 = Share2\n  protected readonly ShieldCheck = ShieldCheck\n\n  protected readonly data = credentialData\n\n  @Input('class') className?: string\n\n  readonly copiedCertId = signal(false)\n  readonly copiedVerifyUrl = signal(false)\n  readonly copiedDigest = signal(false)\n  readonly sharedLinkedIn = signal(false)\n  readonly downloadingPdf = signal(false)\n\n  private timers: ReturnType<typeof setTimeout>[] = []\n\n  constructor() {\n    inject(DestroyRef).onDestroy(() => this.timers.forEach((t) => clearTimeout(t)))\n  }\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  private flash(flag: ReturnType<typeof signal<boolean>>, ms: number): void {\n    flag.set(true)\n    this.timers.push(setTimeout(() => flag.set(false), ms))\n  }\n\n  copyCertId(): void {\n    try {\n      void navigator.clipboard?.writeText(credentialData.certId)\n    } catch {\n      // Clipboard unavailable in some contexts; the check icon still confirms the intent.\n    }\n    this.flash(this.copiedCertId, 2000)\n  }\n\n  copyVerifyUrl(): void {\n    try {\n      void navigator.clipboard?.writeText(credentialData.verifyUrl)\n    } catch {\n      // ignore\n    }\n    this.flash(this.copiedVerifyUrl, 2000)\n  }\n\n  copyDigest(): void {\n    try {\n      void navigator.clipboard?.writeText(credentialData.sha256Digest)\n    } catch {\n      // ignore\n    }\n    this.flash(this.copiedDigest, 2000)\n  }\n\n  handleLinkedInShare(): void {\n    const url = `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(credentialData.verifyUrl)}`\n    try {\n      window.open(url, '_blank', 'noopener,noreferrer')\n    } catch {\n      // ignore\n    }\n    this.flash(this.sharedLinkedIn, 2500)\n  }\n\n  handleDownloadPdf(): void {\n    this.flash(this.downloadingPdf, 2000)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/certificate-credential-card/certificate-credential-card.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/certificate-credential-card/index.ts",
      "content": "export { UiCertificateCredentialCardComponent } from './certificate-credential-card.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/certificate-credential-card/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json"
  ],
  "description": "Digital diploma and verified credential card featuring ornamental certificate container, cryptographic seal with QR code verification, recipient honors, validated skill pills, instructor signatures, and social sharing.",
  "categories": [
    "education",
    "app",
    "card"
  ]
}