Menu

Change language

GitHub repo

Board Resolution Signoff

blocklegal

Corporate board meeting minutes and unanimous written consent resolution with director voting tallies, legal recitals, and digital signature signoff execution.

Installation

$npx uipkge-ng@latest add board-resolution-signoff
Manifest:https://uipkge.dev/r/angular/board-resolution-signoff.jsonInstalls to:src/app/components/blocks/board-resolution-signoff/

Variants

Loading interactive previews…

Schema

Type aliases exported from this item's source. Use these to shape the data you pass in.

Director
interface Director {
  name: string
  title: string
  initials: string
  avatar: string
  signature: string
  signedDate: string
  authMethod: string
  certId: string
  vote: string
}

Files installed (2)

  • src/app/components/blocks/board-resolution-signoff/board-resolution-signoff.component.ts34.5 kB
    // Corporate board meeting minutes and unanimous written consent resolution featuring
    // voting quorum certification, option pool expansion, enterprise cloud commitments,
    // independent counsel engagement, and authenticated director digital signatures.
    // Port of the React block 1:1.
    import { ChangeDetectionStrategy, Component, DestroyRef, Input, inject, signal } from '@angular/core'
    import {
      Building2,
      Calendar,
      Check,
      CheckCircle2,
      Copy,
      Download,
      Lock,
      LucideAngularModule,
      Printer,
      Scale,
      Share2,
      ShieldCheck,
    } from 'lucide-angular'
    import { cn } from '@/lib/utils'
    import { UiAvatarFallbackComponent, UiAvatarImageComponent, UiAvatarComponent } from '@/ui/avatar/avatar.component'
    import { UiBadgeComponent } from '@/ui/badge/badge.component'
    import { UiButtonComponent } from '@/ui/button/button.component'
    import {
      UiCardComponent,
      UiCardContentComponent,
      UiCardDescriptionComponent,
      UiCardHeaderComponent,
      UiCardTitleComponent,
    } from '@/ui/card/card.component'
    import { UiSeparatorComponent } from '@/ui/separator/separator.component'
    
    interface Director {
      name: string
      title: string
      initials: string
      avatar: string
      signature: string
      signedDate: string
      authMethod: string
      certId: string
      vote: string
    }
    
    export type DownloadStatus = 'idle' | 'generating' | 'downloaded'
    
    const resolutionRef = 'BOD-RES-2026-08'
    const companyName = 'UIPKGE Technologies Inc.'
    const corporateEntity = 'Delaware C-Corp • Entity File #7849201'
    const sha256Digest = 'd4e9a83f120c9103ba88e721a998c0b291ab8e0172bf42e01a88c34f9810b492'
    
    const directors: Director[] = [
      {
        name: 'Elena Rostova',
        title: 'Director & Chief Executive Officer',
        initials: 'ER',
        avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&auto=format&fit=crop&q=80',
        signature: 'Elena Rostova',
        signedDate: 'Aug 21, 2026 · 14:32 PST',
        authMethod: 'Hardware FIDO2 Security Key',
        certId: 'SIG-BOD-2026-ER01',
        vote: 'AYE (In Favor)',
      },
      {
        name: 'Marcus Vance',
        title: 'Director & Chief Technology Officer',
        initials: 'MV',
        avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&auto=format&fit=crop&q=80',
        signature: 'Marcus Vance',
        signedDate: 'Aug 21, 2026 · 14:28 PST',
        authMethod: 'Passkey Biometric (Touch ID / PKI)',
        certId: 'SIG-BOD-2026-MV02',
        vote: 'AYE (In Favor)',
      },
      {
        name: 'Sarah Jenkins, J.D.',
        title: 'Independent Director & Audit Chair',
        initials: 'SJ',
        avatar: 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?w=150&auto=format&fit=crop&q=80',
        signature: 'Sarah Jenkins',
        signedDate: 'Aug 21, 2026 · 14:15 PST',
        authMethod: 'Enterprise SSO + FIDO2 2FA',
        certId: 'SIG-BOD-2026-SJ03',
        vote: 'AYE (In Favor)',
      },
    ]
    
    @Component({
      changeDetection: ChangeDetectionStrategy.Eager,
      selector: 'ui-board-resolution-signoff, [ui-board-resolution-signoff]',
      standalone: true,
      // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.
      host: { '[attr.class]': '"contents"' },
      imports: [
        LucideAngularModule,
        UiAvatarComponent,
        UiAvatarFallbackComponent,
        UiAvatarImageComponent,
        UiBadgeComponent,
        UiButtonComponent,
        UiCardComponent,
        UiCardContentComponent,
        UiCardDescriptionComponent,
        UiCardHeaderComponent,
        UiCardTitleComponent,
        UiSeparatorComponent,
      ],
      template: `
        <div data-slot="board-resolution-signoff" [class]="rootClass">
          <!-- Header Section -->
          <header class="border-border bg-card rounded-xl border p-5 shadow-xs sm:p-6">
            <div class="flex flex-col gap-5 lg:flex-row lg:items-center lg:justify-between">
              <div class="space-y-2">
                <div class="flex flex-wrap items-center gap-2">
                  <span ui-badge wrap variant="outline" class="font-mono text-xs font-semibold">
                    #{{ resolutionRef }}
                  </span>
    
                  <button
                    type="button"
                    class="border-border hover:bg-muted focus-visible:ring-ring bg-muted/40 text-muted-foreground hover:text-foreground inline-flex min-h-6 items-center gap-1 rounded border px-2 py-0.5 font-mono text-xs transition-colors focus-visible:ring-2 focus-visible:outline-hidden"
                    title="Copy Resolution Reference ID"
                    (click)="handleCopyRef()"
                  >
                    @if (copiedRef()) {
                      <lucide-icon [img]="Check" class="text-success size-3" />
                    } @else {
                      <lucide-icon [img]="Copy" class="size-3" />
                    }
                    <span>{{ copiedRef() ? 'Copied' : 'Copy Ref' }}</span>
                  </button>
    
                  <span ui-badge wrap class="border-success/30 bg-success/10 text-success gap-1.5 text-xs font-medium">
                    <lucide-icon [img]="ShieldCheck" class="size-3.5 shrink-0" />
                    <span>3 of 3 Directors Signed · Unanimously Approved</span>
                  </span>
    
                  <span ui-badge wrap variant="secondary" class="font-mono text-xs">DGCL § 141(f)</span>
                </div>
    
                <div>
                  <h1 class="text-foreground text-xl font-bold tracking-tight sm:text-2xl lg:text-3xl">
                    Unanimous Written Consent of the Board of Directors
                  </h1>
                  <div class="text-muted-foreground mt-1 flex flex-wrap items-center gap-2 text-xs sm:text-sm">
                    <span class="text-foreground flex items-center gap-1.5 font-semibold">
                      <lucide-icon [img]="Building2" class="text-primary size-4 shrink-0" />
                      {{ companyName }}
                    </span>
                    <span>{{ corporateEntity }}</span>
                    <span class="flex items-center gap-1">
                      <lucide-icon [img]="Calendar" class="size-3.5 shrink-0" />
                      Action Date: August 21, 2026
                    </span>
                  </div>
                </div>
              </div>
    
              <div class="flex flex-wrap items-center gap-2.5">
                <button ui-button variant="outline" size="sm" class="gap-1.5 text-xs shadow-xs" (click)="handlePrint()">
                  <lucide-icon [img]="Printer" class="size-3.5" />
                  <span>Print Minutes</span>
                </button>
    
                <button ui-button variant="outline" size="sm" class="gap-1.5 text-xs shadow-xs" (click)="handleShare()">
                  <lucide-icon [img]="Share2" class="size-3.5" />
                  <span>{{ sharedStatus() ? 'Link Copied!' : 'Share Vault' }}</span>
                </button>
    
                <button
                  ui-button
                  aria-label="Download attachment"
                  variant="default"
                  size="sm"
                  class="gap-2 text-xs font-semibold shadow-xs"
                  [disabled]="downloadStatus() === 'generating'"
                  (click)="handleDownloadPdf()"
                >
                  <lucide-icon [img]="Download" class="size-4" />
                  @if (downloadStatus() === 'generating') {
                    <span>Generating Certified PDF...</span>
                  } @else if (downloadStatus() === 'downloaded') {
                    <span>Certified Minutes Downloaded!</span>
                  } @else {
                    <span>Download Certified Minutes PDF</span>
                  }
                </button>
              </div>
            </div>
          </header>
    
          <!-- Quorum & Voting Summary Card -->
          <div ui-card class="border-border bg-card shadow-xs">
            <div ui-card-header class="p-5 pb-3 sm:p-6 sm:pb-4">
              <div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                <div class="flex items-center gap-2.5">
                  <div class="bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg">
                    <lucide-icon [img]="Scale" class="size-4" />
                  </div>
                  <div>
                    <h3 ui-card-title class="text-base font-bold sm:text-lg">Quorum &amp; Voting Certification</h3>
                    <p ui-card-description class="text-xs">
                      Official vote tally and statutory governance determination under Delaware General Corporation Law
                    </p>
                  </div>
                </div>
    
                <span
                  ui-badge
                  wrap
                  variant="outline"
                  class="border-success/40 bg-success/10 text-success text-success self-start font-mono text-xs sm:self-auto"
                >
                  <lucide-icon [img]="CheckCircle2" class="mr-1 size-3" />
                  Statutory Threshold Satisfied
                </span>
              </div>
            </div>
    
            <div ui-card-content class="space-y-5 p-5 pt-0 sm:p-6 sm:pt-0">
              <div class="grid grid-cols-2 gap-3 sm:grid-cols-4">
                <div class="border-border/70 bg-muted/20 rounded-lg border p-3.5">
                  <p class="text-muted-foreground text-xs font-medium">Board Quorum</p>
                  <p class="text-foreground text-success text-success mt-1 font-mono text-lg font-bold tabular-nums">
                    100% Achieved
                  </p>
                  <p class="text-muted-foreground mt-0.5 text-xs">3 of 3 Voting Directors Present</p>
                </div>
    
                <div class="border-border/70 bg-muted/20 rounded-lg border p-3.5">
                  <p class="text-muted-foreground text-xs font-medium">Voting Tally</p>
                  <p class="text-foreground mt-1 font-mono text-lg font-bold tabular-nums">3 In Favor · 0 Opposed</p>
                  <p class="text-muted-foreground mt-0.5 text-xs">3 Ayes, 0 Nays, 0 Abstentions</p>
                </div>
    
                <div class="border-border/70 bg-muted/20 rounded-lg border p-3.5">
                  <p class="text-muted-foreground text-xs font-medium">Action Structure</p>
                  <p class="text-foreground mt-1 text-xs font-bold sm:text-sm">Unanimous Written Consent</p>
                  <p class="text-muted-foreground mt-0.5 text-xs">In Lieu of Special Meeting</p>
                </div>
    
                <div class="border-border/70 bg-muted/20 rounded-lg border p-3.5">
                  <p class="text-muted-foreground text-xs font-medium">Effective Timestamp</p>
                  <p class="text-foreground mt-1 font-mono text-xs font-bold tabular-nums sm:text-sm">
                    Aug 21, 2026 · 14:32 PST
                  </p>
                  <p class="text-muted-foreground mt-0.5 text-xs">RFC 3161 Certified Vault</p>
                </div>
              </div>
    
              <div class="space-y-1.5">
                <div class="flex items-center justify-between text-xs">
                  <span class="text-foreground flex items-center gap-1.5 font-medium">
                    <lucide-icon [img]="CheckCircle2" class="text-success size-3" />
                    Unanimous Board Approval Level (3/3)
                  </span>
                  <span class="text-success font-mono font-semibold">100% Unanimous</span>
                </div>
                <div class="bg-muted h-2 w-full overflow-hidden rounded-full">
                  <div class="bg-success h-full w-full rounded-full"></div>
                </div>
              </div>
    
              <div class="border-border/60 bg-muted/10 grid grid-cols-1 gap-2.5 rounded-lg border p-3 sm:grid-cols-3">
                @for (director of directorsList; track director.name) {
                  <div
                    class="border-border/50 bg-card flex items-center justify-between rounded-md border px-3 py-2 text-xs"
                  >
                    <div class="flex min-w-0 items-center gap-2">
                      <ui-avatar class="size-6 shrink-0">
                        <ui-avatar-image [src]="director.avatar" [alt]="director.name" />
                        <ui-avatar-fallback class="text-xs">{{ director.initials }}</ui-avatar-fallback>
                      </ui-avatar>
                      <div class="truncate">
                        <p class="text-foreground truncate font-medium">{{ director.name }}</p>
                        <p class="text-muted-foreground truncate text-xs">{{ shortTitle(director.title) }}</p>
                      </div>
                    </div>
                    <span ui-badge wrap class="border-success/30 bg-success/10 text-success shrink-0 font-mono text-xs">
                      {{ director.vote.split(' ')[0] }}
                    </span>
                  </div>
                }
              </div>
            </div>
          </div>
    
          <!-- Structured Resolution Document Body -->
          <article class="border-border bg-card space-y-8 rounded-xl border p-6 shadow-xs sm:p-8">
            <div class="border-border space-y-2 border-b pb-6 text-center">
              <span ui-badge wrap variant="outline" class="font-mono text-xs tracking-widest uppercase">
                Official Corporate Governance Record
              </span>
              <h2 class="text-foreground text-lg font-bold tracking-tight uppercase sm:text-xl md:text-2xl">
                Action by Unanimous Written Consent of the Board of Directors of {{ companyName }}
              </h2>
              <p class="text-muted-foreground mx-auto max-w-2xl text-xs">
                Pursuant to Section 141(f) of the General Corporation Law of the State of Delaware and the Amended and
                Restated Bylaws of the Corporation
              </p>
            </div>
    
            <div
              class="border-border/80 bg-muted/20 text-muted-foreground rounded-lg border p-4 text-xs leading-relaxed sm:p-5 sm:text-sm"
            >
              <p>
                <strong class="text-foreground">THE UNDERSIGNED</strong>, constituting all the active members of the Board
                of Directors of <strong class="text-foreground">{{ companyName }}</strong
                >, a corporation duly organized and existing under the laws of the State of Delaware (the
                &ldquo;Corporation&rdquo;), do hereby consent to the adoption of the following resolutions and direct that
                this Unanimous Written Consent be filed with the minutes of the proceedings of the Board of Directors:
              </p>
            </div>
    
            <!-- Resolution 1: Equity Incentive Option Pool Expansion -->
            <section class="space-y-4">
              <div class="flex flex-wrap items-center justify-between gap-2">
                <div class="flex items-center gap-2">
                  <span class="bg-primary/10 text-primary rounded px-2 py-0.5 font-mono text-xs font-bold">01</span>
                  <h3 class="text-foreground text-base font-bold sm:text-lg">
                    Authorization and Adoption of the 2026 Equity Incentive Option Pool Expansion
                  </h3>
                </div>
                <span ui-badge wrap variant="secondary" class="font-mono text-xs">Capitalization &amp; Equity</span>
              </div>
    
              <div class="text-muted-foreground space-y-3 text-xs leading-relaxed sm:text-sm">
                <p class="italic">
                  <strong class="text-foreground font-semibold not-italic">WHEREAS</strong>, the Board of Directors deems it
                  to be in the best interests of the Corporation and its stockholders to expand the number of shares
                  reserved under the 2026 Equity Incentive Plan in order to recruit, motivate, and retain vital engineering,
                  product, and leadership talent;
                </p>
                <p>
                  <strong class="text-foreground font-semibold">NOW, THEREFORE, BE IT RESOLVED</strong>, that the
                  Corporation&rsquo;s 2026 Equity Incentive Plan be, and it hereby is, amended to increase the aggregate
                  number of authorized shares of Common Stock reserved for issuance thereunder by an additional
                  <strong class="text-foreground font-mono font-semibold">1,500,000 shares</strong> (increasing the overall
                  unallocated option reserve from 10.0% to 15.0% of the Corporation&rsquo;s fully-diluted capitalization),
                  effective as of the date hereof; and
                </p>
                <p>
                  <strong class="text-foreground font-semibold">RESOLVED FURTHER</strong>, that the Compensation Committee
                  of the Board of Directors and the executive officers of the Corporation are hereby authorized and
                  empowered to grant options, stock appreciation rights, and restricted stock awards from said expanded pool
                  in conformity with standard four-year vesting schedules (subject to a one-year cliff).
                </p>
              </div>
    
              <div
                class="border-border/60 bg-muted/15 grid grid-cols-2 gap-3 rounded-lg border p-3.5 text-xs sm:grid-cols-4"
              >
                <div>
                  <span class="text-muted-foreground font-medium">Pool Addition</span>
                  <p class="text-foreground mt-0.5 font-mono font-bold tabular-nums">1,500,000 Common Shares</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Reserve Ratio</span>
                  <p class="text-foreground mt-0.5 font-mono font-bold tabular-nums">10.0% → 15.0% FD</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Vesting Baseline</span>
                  <p class="text-foreground mt-0.5 font-bold">4-Year / 1-Year Cliff</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Committee Scope</span>
                  <p class="text-foreground mt-0.5 font-bold">Full Delegation</p>
                </div>
              </div>
            </section>
    
            <ui-separator />
    
            <!-- Resolution 2: Cloudflare Pages Infrastructure Agreement -->
            <section class="space-y-4">
              <div class="flex flex-wrap items-center justify-between gap-2">
                <div class="flex items-center gap-2">
                  <span class="bg-primary/10 text-primary rounded px-2 py-0.5 font-mono text-xs font-bold">02</span>
                  <h3 class="text-foreground text-base font-bold sm:text-lg">
                    Approval of Cloudflare Pages Infrastructure Enterprise Agreement
                  </h3>
                </div>
                <span ui-badge wrap variant="secondary" class="font-mono text-xs">Infrastructure &amp; Hosting</span>
              </div>
    
              <div class="text-muted-foreground space-y-3 text-xs leading-relaxed sm:text-sm">
                <p class="italic">
                  <strong class="text-foreground font-semibold not-italic">WHEREAS</strong>, the Corporation operates a
                  mission-critical global UI registry distributed across multi-region edge nodes requiring continuous uptime
                  SLAs, global caching, DDoS mitigation, and sub-10ms distribution latency;
                </p>
                <p>
                  <strong class="text-foreground font-semibold">NOW, THEREFORE, BE IT RESOLVED</strong>, that the 3-Year
                  Enterprise Master Services Agreement with Cloudflare, Inc. for Pages Enterprise Infrastructure, Global
                  Edge Caching, and Advanced Threat Defense, with an annualized commitment not to exceed
                  <strong class="text-foreground font-mono font-semibold">$180,000.00 USD</strong>, be, and it hereby is,
                  ratified, confirmed, and approved in all respects; and
                </p>
                <p>
                  <strong class="text-foreground font-semibold">RESOLVED FURTHER</strong>, that the Chief Executive Officer
                  and Chief Technology Officer be, and each of them individually hereby is, authorized, directed, and
                  empowered to finalize, execute, and deliver said Enterprise Agreement on behalf of the Corporation.
                </p>
              </div>
    
              <div
                class="border-border/60 bg-muted/15 grid grid-cols-2 gap-3 rounded-lg border p-3.5 text-xs sm:grid-cols-4"
              >
                <div>
                  <span class="text-muted-foreground font-medium">Service Provider</span>
                  <p class="text-foreground mt-0.5 font-bold">Cloudflare, Inc.</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Contract Duration</span>
                  <p class="text-foreground mt-0.5 font-bold">36 Months (3 Years)</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Annual Commitment Cap</span>
                  <p class="text-foreground mt-0.5 font-mono font-bold tabular-nums">$180,000.00 USD / yr</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Uptime Guarantee</span>
                  <p class="text-foreground mt-0.5 font-mono font-bold tabular-nums">99.99% Enterprise SLA</p>
                </div>
              </div>
            </section>
    
            <ui-separator />
    
            <!-- Resolution 3: Appointment of Independent Legal Counsel -->
            <section class="space-y-4">
              <div class="flex flex-wrap items-center justify-between gap-2">
                <div class="flex items-center gap-2">
                  <span class="bg-primary/10 text-primary rounded px-2 py-0.5 font-mono text-xs font-bold">03</span>
                  <h3 class="text-foreground text-base font-bold sm:text-lg">Appointment of Independent Legal Counsel</h3>
                </div>
                <span ui-badge wrap variant="secondary" class="font-mono text-xs">Corporate Governance &amp; Counsel</span>
              </div>
    
              <div class="text-muted-foreground space-y-3 text-xs leading-relaxed sm:text-sm">
                <p class="italic">
                  <strong class="text-foreground font-semibold not-italic">WHEREAS</strong>, the Corporation requires
                  distinguished outside corporate and securities counsel for intellectual property licensing, SOC 2 Type II
                  compliance oversight, and upcoming institutional growth financing rounds;
                </p>
                <p>
                  <strong class="text-foreground font-semibold">NOW, THEREFORE, BE IT RESOLVED</strong>, that the engagement
                  of <strong class="text-foreground">Wilson Sonsini Goodrich &amp; Rosati P.C.</strong> as Independent Legal
                  Counsel to the Corporation be, and it hereby is, approved and ratified; and
                </p>
                <p>
                  <strong class="text-foreground font-semibold">RESOLVED FURTHER</strong>, that the executive officers of
                  the Corporation be, and each of them hereby is, authorized to execute customary engagement documentation
                  and approve standard retainer fee schedules.
                </p>
              </div>
    
              <div
                class="border-border/60 bg-muted/15 grid grid-cols-2 gap-3 rounded-lg border p-3.5 text-xs sm:grid-cols-4"
              >
                <div>
                  <span class="text-muted-foreground font-medium">Appointed Firm</span>
                  <p class="text-foreground mt-0.5 truncate font-bold">Wilson Sonsini Goodrich &amp; Rosati</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Primary Focus</span>
                  <p class="text-foreground mt-0.5 font-bold">Corp Governance &amp; IP</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Billing Model</span>
                  <p class="text-foreground mt-0.5 font-bold">Standard Hourly + Retainer</p>
                </div>
                <div>
                  <span class="text-muted-foreground font-medium">Jurisdictional Scope</span>
                  <p class="text-foreground mt-0.5 font-bold">Delaware / Federal Tech</p>
                </div>
              </div>
            </section>
    
            <ui-separator />
    
            <!-- Omnibus General Authorization Clause -->
            <section class="space-y-3">
              <div class="flex items-center gap-2">
                <span class="bg-primary/10 text-primary rounded px-2 py-0.5 font-mono text-xs font-bold">04</span>
                <h3 class="text-foreground text-base font-bold sm:text-lg">
                  Omnibus Authorization and Ratification of Prior Actions
                </h3>
              </div>
    
              <div class="text-muted-foreground space-y-3 text-xs leading-relaxed sm:text-sm">
                <p>
                  <strong class="text-foreground font-semibold">RESOLVED</strong>, that the officers of the Corporation be,
                  and each of them hereby is, authorized, directed, and empowered, in the name and on behalf of the
                  Corporation, to take all such further actions, pay all fees, and execute and deliver all such further
                  agreements, certificates, notices, and instruments as may be necessary, proper, or advisable to carry out
                  the full purpose and intent of the foregoing resolutions; and
                </p>
                <p>
                  <strong class="text-foreground font-semibold">RESOLVED FURTHER</strong>, that all actions heretofore taken
                  by any officer or director of the Corporation in connection with any matter referred to in the foregoing
                  resolutions are hereby ratified, confirmed, and approved in all respects as the authorized act and deed of
                  the Corporation.
                </p>
              </div>
            </section>
          </article>
    
          <!-- Director Signature Execution Blocks -->
          <section class="space-y-4">
            <div class="flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between">
              <div>
                <h2 class="text-foreground text-base font-bold sm:text-lg">
                  Director Signature Execution &amp; Electronic Certification
                </h2>
                <p class="text-muted-foreground text-xs">
                  Executed by all directors of the Corporation pursuant to Section 141(f) of the Delaware General
                  Corporation Law
                </p>
              </div>
              <span
                ui-badge
                wrap
                class="border-success/30 bg-success/10 text-success text-success self-start font-mono text-xs sm:self-auto"
              >
                <lucide-icon [img]="CheckCircle2" class="mr-1 size-3" />
                3 of 3 Signatures Authenticated
              </span>
            </div>
    
            <div class="grid grid-cols-1 gap-4 md:grid-cols-3">
              @for (director of directorsList; track director.name) {
                <div ui-card class="border-border/80 bg-card hover:border-border shadow-xs transition-colors">
                  <div ui-card-header class="p-4 pb-2">
                    <div class="flex items-center justify-between gap-2">
                      <div class="flex min-w-0 items-center gap-2.5">
                        <ui-avatar class="border-border size-10 shrink-0 border">
                          <ui-avatar-image [src]="director.avatar" [alt]="director.name" />
                          <ui-avatar-fallback class="text-xs font-bold">{{ director.initials }}</ui-avatar-fallback>
                        </ui-avatar>
                        <div class="min-w-0">
                          <h3 ui-card-title class="truncate text-sm font-semibold">{{ director.name }}</h3>
                          <p ui-card-description class="truncate text-xs">{{ director.title }}</p>
                        </div>
                      </div>
                    </div>
                  </div>
    
                  <div ui-card-content class="space-y-3 p-4 pt-2 text-xs">
                    <div class="border-success/30 bg-success/5 dark:bg-success/10 rounded-lg border p-3 text-center">
                      <div class="text-muted-foreground mb-1 flex items-center justify-between text-xs">
                        <span class="font-mono text-xs">Digital Signature</span>
                        <span
                          ui-badge
                          wrap
                          variant="outline"
                          class="border-success/40 bg-success/10 text-success font-mono text-xs"
                        >
                          <lucide-icon [img]="Check" class="mr-1 size-2.5" /> Verified
                        </span>
                      </div>
    
                      <div class="my-1.5 flex h-12 items-center justify-center">
                        <span class="text-success text-success text-xl font-medium tracking-wide italic">
                          {{ director.signature }}
                        </span>
                      </div>
    
                      <div
                        class="text-muted-foreground border-success/20 flex items-center justify-center gap-1 border-t pt-1 font-mono text-xs"
                      >
                        <lucide-icon [img]="ShieldCheck" class="text-success size-3" />
                        <span>e-Signed via FIDO2 / PKI Ledger</span>
                      </div>
                    </div>
    
                    <div class="text-muted-foreground space-y-1.5 font-mono text-xs">
                      <div class="flex items-center justify-between">
                        <span>Executed:</span>
                        <span class="text-foreground font-semibold tabular-nums">{{ director.signedDate }}</span>
                      </div>
                      <div class="flex items-center justify-between">
                        <span>Auth Protocol:</span>
                        <span class="text-foreground max-w-[170px] truncate text-right font-semibold">{{
                          director.authMethod
                        }}</span>
                      </div>
                      <div class="flex items-center justify-between">
                        <span>Certificate Hash:</span>
                        <span class="text-foreground font-semibold">{{ director.certId }}</span>
                      </div>
                    </div>
                  </div>
                </div>
              }
            </div>
          </section>
    
          <!-- Corporate Seal & Cryptographic Certificate Audit Strip -->
          <div ui-card class="border-border bg-muted/20 border shadow-xs">
            <div ui-card-content class="flex flex-col gap-4 p-5 text-xs lg:flex-row lg:items-center lg:justify-between">
              <div class="flex items-center gap-3">
                <div
                  class="bg-card border-warning/40 relative flex size-12 shrink-0 items-center justify-center rounded-full border p-1 shadow-xs"
                >
                  <svg class="text-warning size-full" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <circle cx="50" cy="50" r="46" stroke="currentColor" stroke-width="2" stroke-dasharray="3 2" />
                    <circle cx="50" cy="50" r="40" stroke="currentColor" stroke-width="1.5" />
                    <path
                      d="M50 18 L60 38 L82 38 L64 52 L70 74 L50 60 L30 74 L36 52 L18 38 L40 38 Z"
                      stroke="currentColor"
                      stroke-width="1.5"
                      fill="currentColor"
                      fill-opacity="0.1"
                    />
                    <circle cx="50" cy="50" r="10" stroke="currentColor" stroke-width="1" />
                  </svg>
                </div>
    
                <div>
                  <div class="flex items-center gap-2">
                    <span class="text-foreground font-bold">Official Corporate Seal &amp; Immutable Minutes Vault</span>
                    <span ui-badge wrap variant="outline" class="border-success/30 text-success font-mono text-xs">
                      Tamper-Proof
                    </span>
                  </div>
                  <p class="text-muted-foreground mt-0.5">
                    State of Delaware Division of Corporations • Entity File #7849201 • RFC 3161 Qualified Timestamping
                  </p>
                </div>
              </div>
    
              <div class="flex flex-wrap items-center gap-3">
                <div class="flex items-center gap-1.5 font-mono">
                  <span class="text-muted-foreground">SHA-256 Digest:</span>
                  <button
                    type="button"
                    class="hover:bg-muted focus-visible:ring-ring border-border bg-card 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"
                    title="Copy SHA-256 Cryptographic Digest"
                    (click)="handleCopyDigest()"
                  >
                    <span class="tabular-nums">d4e9a8...810b492</span>
                    @if (copiedDigest()) {
                      <lucide-icon [img]="Check" class="text-success size-3" />
                    } @else {
                      <lucide-icon [img]="Copy" class="text-muted-foreground size-3" />
                    }
                  </button>
                </div>
    
                <span ui-badge wrap variant="secondary" class="gap-1 font-mono text-xs">
                  <lucide-icon [img]="Lock" class="text-success size-3" />
                  <span>256-Bit Vault Sealed</span>
                </span>
              </div>
            </div>
          </div>
        </div>
      `,
    })
    export class UiBoardResolutionSignoffComponent {
      protected readonly Building2 = Building2
      protected readonly Calendar = Calendar
      protected readonly Check = Check
      protected readonly CheckCircle2 = CheckCircle2
      protected readonly Copy = Copy
      protected readonly Download = Download
      protected readonly Lock = Lock
      protected readonly Printer = Printer
      protected readonly Scale = Scale
      protected readonly Share2 = Share2
      protected readonly ShieldCheck = ShieldCheck
    
      protected readonly resolutionRef = resolutionRef
      protected readonly companyName = companyName
      protected readonly corporateEntity = corporateEntity
      protected readonly directorsList = directors
    
      @Input('class') className?: string
    
      readonly copiedRef = signal(false)
      readonly copiedDigest = signal(false)
      readonly downloadStatus = signal<DownloadStatus>('idle')
      readonly sharedStatus = signal(false)
      private copyTimer: ReturnType<typeof setTimeout> | undefined
      private downloadTimer: ReturnType<typeof setTimeout> | undefined
      private downloadResetTimer: ReturnType<typeof setTimeout> | undefined
      private shareTimer: ReturnType<typeof setTimeout> | undefined
    
      constructor() {
        const destroyRef = inject(DestroyRef)
        destroyRef.onDestroy(() => {
          clearTimeout(this.copyTimer)
          clearTimeout(this.downloadTimer)
          clearTimeout(this.downloadResetTimer)
          clearTimeout(this.shareTimer)
        })
      }
    
      get rootClass(): string {
        return cn('bg-background text-foreground w-full space-y-6', this.className)
      }
    
      /** 'Director & Chief Executive Officer' -> 'Director' (matches the Vue quick-roster trim). */
      shortTitle(title: string): string {
        return title.split('&')[0]!.trim()
      }
    
      handleCopyRef(): void {
        if (typeof navigator !== 'undefined' && navigator.clipboard) {
          void navigator.clipboard.writeText(`#${resolutionRef}`)
          this.copiedRef.set(true)
          clearTimeout(this.copyTimer)
          this.copyTimer = setTimeout(() => this.copiedRef.set(false), 2000)
        }
      }
    
      handleCopyDigest(): void {
        if (typeof navigator !== 'undefined' && navigator.clipboard) {
          void navigator.clipboard.writeText(sha256Digest)
          this.copiedDigest.set(true)
          clearTimeout(this.copyTimer)
          this.copyTimer = setTimeout(() => this.copiedDigest.set(false), 2000)
        }
      }
    
      handleDownloadPdf(): void {
        this.downloadStatus.set('generating')
        clearTimeout(this.downloadTimer)
        clearTimeout(this.downloadResetTimer)
        this.downloadTimer = setTimeout(() => {
          this.downloadStatus.set('downloaded')
          this.downloadResetTimer = setTimeout(() => this.downloadStatus.set('idle'), 3000)
        }, 1600)
      }
    
      handlePrint(): void {
        if (typeof window !== 'undefined') window.print()
      }
    
      handleShare(): void {
        this.sharedStatus.set(true)
        clearTimeout(this.shareTimer)
        this.shareTimer = setTimeout(() => this.sharedStatus.set(false), 2500)
      }
    }
    
  • src/app/components/blocks/board-resolution-signoff/index.ts0.1 kB

Raw manifest:https://uipkge.dev/r/angular/board-resolution-signoff.json