{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "trademark-patent-portfolio",
  "title": "Trademark Patent Portfolio",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/trademark-patent-portfolio/trademark-patent-portfolio.component.ts",
      "content": "// USPTO and WIPO intellectual property asset portfolio tracker: patent grant status,\n// jurisdiction coverage, and maintenance fee timeline with docket action workflow.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  Award,\n  BadgeCheck,\n  Building2,\n  Calendar,\n  Check,\n  CheckCircle2,\n  ChevronDown,\n  Clock,\n  Copy,\n  Download,\n  ExternalLink,\n  FileText,\n  Filter,\n  LucideAngularModule,\n  MoreHorizontal,\n  Plus,\n  Scale,\n  Search,\n  UserCheck,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport {\n  UiDropdownMenuComponent,\n  UiDropdownMenuContentComponent,\n  UiDropdownMenuItemComponent,\n  UiDropdownMenuLabelComponent,\n  UiDropdownMenuSeparatorComponent,\n  UiDropdownMenuTriggerComponent,\n} from '@/ui/dropdown-menu/dropdown-menu.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport type AssetType = 'Utility Patent' | 'Trademark' | 'PCT International'\nexport type FilingStatus = 'Granted / Registered' | 'Published / Under Exam'\n\nexport interface IpAsset {\n  id: string\n  identifier: string\n  officialNumber: string\n  title: string\n  type: AssetType\n  jurisdictionCode: string\n  jurisdictionName: string\n  jurisdictionFlag: string\n  patentOffice: string\n  applicationDate: string\n  grantDate: string\n  status: FilingStatus\n  nextDeadline: string\n  deadlineNumber: string\n  deadlineNote: string\n  ipcClass: string\n  attorney: string\n  gazetteUrl: string\n  gazetteLabel: string\n}\n\nconst ipAssets: IpAsset[] = [\n  {\n    id: 'ip-1',\n    identifier: 'US Patent #11,849,201',\n    officialNumber: 'US 11,849,201 B2',\n    title: 'Zero-Dependency Dual-Framework AST Generation',\n    type: 'Utility Patent',\n    jurisdictionCode: 'US',\n    jurisdictionName: 'United States',\n    jurisdictionFlag: '🇺🇸',\n    patentOffice: 'USPTO',\n    applicationDate: '2023-04-12',\n    grantDate: '2024-06-18',\n    status: 'Granted / Registered',\n    nextDeadline: 'Dec 2026',\n    deadlineNumber: '2026-12-15',\n    deadlineNote: 'USPTO 3.5-Year Maintenance Window',\n    ipcClass: 'CPC G06F 8/41 · Abstract Syntax Trees',\n    attorney: 'Vance & Morrison LLP',\n    gazetteUrl: 'https://patents.google.com/patent/US11849201B2/en',\n    gazetteLabel: 'View USPTO Gazette',\n  },\n  {\n    id: 'ip-2',\n    identifier: 'US Patent #11,420,184',\n    officialNumber: 'US 11,420,184 B1',\n    title: 'Perceptually Uniform OKLCH Dark Mode Algorithm',\n    type: 'Utility Patent',\n    jurisdictionCode: 'US',\n    jurisdictionName: 'United States',\n    jurisdictionFlag: '🇺🇸',\n    patentOffice: 'USPTO',\n    applicationDate: '2022-09-14',\n    grantDate: '2023-08-22',\n    status: 'Granted / Registered',\n    nextDeadline: 'Feb 2027',\n    deadlineNumber: '2027-02-22',\n    deadlineNote: 'USPTO 3.5-Year Maintenance Window',\n    ipcClass: 'CPC G06T 11/00 · Perceptual Colorimetry',\n    attorney: 'Vance & Morrison LLP',\n    gazetteUrl: 'https://patents.google.com/patent/US11420184B1/en',\n    gazetteLabel: 'View USPTO Gazette',\n  },\n  {\n    id: 'ip-3',\n    identifier: 'US Trademark #98421042',\n    officialNumber: 'Reg. #7,294,810 (SN 98421042)',\n    title: 'UIPKGE™ (Class 09, 42)',\n    type: 'Trademark',\n    jurisdictionCode: 'US',\n    jurisdictionName: 'United States',\n    jurisdictionFlag: '🇺🇸',\n    patentOffice: 'USPTO',\n    applicationDate: '2023-02-10',\n    grantDate: '2023-11-14',\n    status: 'Granted / Registered',\n    nextDeadline: 'Nov 2029',\n    deadlineNumber: '2029-11-14',\n    deadlineNote: 'Section 8 & 15 Affidavit of Use',\n    ipcClass: 'IC 009, 042 · Computer Software & SaaS',\n    attorney: 'Kilpatrick Townsend & Stockton',\n    gazetteUrl: 'https://tsdr.uspto.gov/',\n    gazetteLabel: 'View USPTO TSDR',\n  },\n  {\n    id: 'ip-4',\n    identifier: 'WIPO PCT/US2026/018249',\n    officialNumber: 'WO 2026/148201 A1',\n    title: 'Headless Component State Serialization',\n    type: 'PCT International',\n    jurisdictionCode: 'WIPO',\n    jurisdictionName: 'WIPO International',\n    jurisdictionFlag: '🌍',\n    patentOffice: 'WIPO IB',\n    applicationDate: '2026-01-15',\n    grantDate: 'Pending',\n    status: 'Published / Under Exam',\n    nextDeadline: 'Jul 2027',\n    deadlineNumber: '2027-07-15',\n    deadlineNote: '30-Mo National Phase Entry Deadline',\n    ipcClass: 'IPC G06F 9/44 · Component State Transfer',\n    attorney: 'Vance & Morrison LLP',\n    gazetteUrl: 'https://patentscope.wipo.int/',\n    gazetteLabel: 'View WIPO Patentscope',\n  },\n  {\n    id: 'ip-5',\n    identifier: 'EP Patent #3,948,102',\n    officialNumber: 'EP 3,948,102 A1',\n    title: 'Reactive Virtual DOM Diffing Engine for Web Components',\n    type: 'Utility Patent',\n    jurisdictionCode: 'EU',\n    jurisdictionName: 'European Union',\n    jurisdictionFlag: '🇪🇺',\n    patentOffice: 'EPO',\n    applicationDate: '2024-03-02',\n    grantDate: 'Pending',\n    status: 'Published / Under Exam',\n    nextDeadline: 'Mar 2027',\n    deadlineNumber: '2027-03-31',\n    deadlineNote: 'EPO 3rd Year Annuity Maintenance Fee',\n    ipcClass: 'CPC G06F 9/455 · Virtualized DOM Execution',\n    attorney: 'Bardehle Pagenberg Partnerschaft',\n    gazetteUrl: 'https://worldwide.espacenet.com/',\n    gazetteLabel: 'View EPO Espacenet',\n  },\n  {\n    id: 'ip-6',\n    identifier: 'EU Trademark #018942001',\n    officialNumber: 'Reg. #018942001',\n    title: 'UIPKGE DESIGN SYSTEM™ (Class 09, 35, 42)',\n    type: 'Trademark',\n    jurisdictionCode: 'EU',\n    jurisdictionName: 'European Union',\n    jurisdictionFlag: '🇪🇺',\n    patentOffice: 'EUIPO',\n    applicationDate: '2023-08-05',\n    grantDate: '2024-01-19',\n    status: 'Granted / Registered',\n    nextDeadline: 'May 2030',\n    deadlineNumber: '2030-05-08',\n    deadlineNote: 'EUIPO 10-Year Trademark Renewal',\n    ipcClass: 'IC 009, 035, 042 · Design Systems & Tooling',\n    attorney: 'Bardehle Pagenberg Partnerschaft',\n    gazetteUrl: 'https://euipo.europa.eu/eSearch/',\n    gazetteLabel: 'View EUIPO eSearch',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-trademark-patent-portfolio, [ui-trademark-patent-portfolio]',\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    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiDropdownMenuComponent,\n    UiDropdownMenuContentComponent,\n    UiDropdownMenuItemComponent,\n    UiDropdownMenuLabelComponent,\n    UiDropdownMenuSeparatorComponent,\n    UiDropdownMenuTriggerComponent,\n    UiInputComponent,\n    UiTableComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"trademark-patent-portfolio\" [class]=\"rootClass\">\n      <!-- Header Section -->\n      <div ui-card class=\"border-border shadow-xs\">\n        <div ui-card-header class=\"flex flex-col gap-4 pb-6 lg:flex-row lg:items-center lg:justify-between\">\n          <div class=\"space-y-1.5\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <span ui-badge variant=\"outline\" class=\"gap-1.5 font-medium\">\n                <lucide-icon [img]=\"Building2\" class=\"text-muted-foreground size-3.5\" />\n                <span>UIPKGE Technologies Inc.</span>\n              </span>\n              <span ui-badge wrap variant=\"secondary\" class=\"gap-1 font-mono text-xs\">\n                <lucide-icon [img]=\"Scale\" class=\"text-primary size-3\" />\n                <span>12 Patents · 6 Registered Trademarks</span>\n              </span>\n            </div>\n            <h2 ui-card-title class=\"text-xl font-bold tracking-tight sm:text-2xl\">\n              Intellectual Property &amp; Patent Portfolio\n            </h2>\n            <p ui-card-description class=\"text-xs sm:text-sm\">\n              USPTO, EPO, and WIPO asset docket, grant prosecution tracker, and statutory maintenance timeline.\n            </p>\n          </div>\n\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            <button\n              ui-button\n              aria-label=\"Download attachment\"\n              variant=\"outline\"\n              class=\"gap-2 shadow-xs\"\n              (click)=\"handleExport()\"\n            >\n              <lucide-icon [img]=\"Download\" class=\"size-4\" />\n              <span>Export Portfolio Report</span>\n            </button>\n            <button ui-button variant=\"default\" class=\"gap-2 shadow-xs\" (click)=\"handleFileNewAsset()\">\n              <lucide-icon [img]=\"Plus\" class=\"size-4\" />\n              <span>File New IP Asset</span>\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Feedback Notification Toast/Banner if active -->\n      @if (feedbackMessage()) {\n        <div\n          class=\"border-primary/30 bg-primary/10 text-primary flex items-center justify-between rounded-lg border px-4 py-2.5 text-xs font-medium shadow-xs transition-colors\"\n        >\n          <div class=\"flex items-center gap-2\">\n            <lucide-icon [img]=\"CheckCircle2\" class=\"size-4 shrink-0\" />\n            <span>{{ feedbackMessage() }}</span>\n          </div>\n          <button\n            type=\"button\"\n            (click)=\"feedbackMessage.set(null)\"\n            class=\"text-primary/70 hover:text-primary rounded text-xs underline underline-offset-2\"\n          >\n            Dismiss\n          </button>\n        </div>\n      }\n\n      <!-- 4 IP Portfolio KPI Cards Grid -->\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"p-5\">\n            <div class=\"flex items-center justify-between\">\n              <span class=\"text-muted-foreground text-xs font-medium\">Granted Patents</span>\n              <div class=\"bg-success/10 text-success flex size-8 items-center justify-center rounded-md\">\n                <lucide-icon [img]=\"Award\" class=\"size-4\" />\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <div class=\"text-success text-2xl font-bold tracking-tight tabular-nums\">8 Patents Granted</div>\n              <p class=\"text-muted-foreground mt-1 text-xs\">6 USPTO · 2 EPO · 100% Enforceable</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"p-5\">\n            <div class=\"flex items-center justify-between\">\n              <span class=\"text-muted-foreground text-xs font-medium\">Pending Examination</span>\n              <div class=\"bg-warning/10 text-warning flex size-8 items-center justify-center rounded-md\">\n                <lucide-icon [img]=\"Clock\" class=\"size-4\" />\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <div class=\"text-warning text-2xl font-bold tracking-tight tabular-nums\">4 Under Examination · USPTO</div>\n              <p class=\"text-muted-foreground mt-1 text-xs\">2 PCT International · 1 USPTO · 1 EPO</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"p-5\">\n            <div class=\"flex items-center justify-between\">\n              <span class=\"text-muted-foreground text-xs font-medium\">Registered Trademarks</span>\n              <div class=\"bg-info/10 text-info flex size-8 items-center justify-center rounded-md\">\n                <lucide-icon [img]=\"BadgeCheck\" class=\"size-4\" />\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <div class=\"text-info text-2xl font-bold tracking-tight tabular-nums\">6 Trademarks Active</div>\n              <p class=\"text-muted-foreground mt-1 text-xs\">Classes 09, 35, 42 · Global Protection</p>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card class=\"border-border shadow-xs\">\n          <div ui-card-content class=\"p-5\">\n            <div class=\"flex items-center justify-between\">\n              <span class=\"text-muted-foreground text-xs font-medium\">Next Maintenance Fee</span>\n              <div class=\"bg-destructive/10 text-destructive flex size-8 items-center justify-center rounded-md\">\n                <lucide-icon [img]=\"Calendar\" class=\"size-4\" />\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <div class=\"text-destructive text-2xl font-bold tracking-tight tabular-nums\">\n                Due Dec 15, 2026 · USPTO 3.5-Year Window\n              </div>\n              <p class=\"text-muted-foreground mt-1 text-xs\">Est. fee $2,000 · Surcharge window opens</p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Filters & Table Container Card -->\n      <div ui-card class=\"border-border shadow-xs\">\n        <div ui-card-header class=\"border-border border-b pb-4\">\n          <div class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <h3 ui-card-title class=\"text-base font-semibold\">Registered Intellectual Property Assets</h3>\n              <p ui-card-description class=\"text-xs\">\n                Showing {{ filteredAssets().length }} of {{ allAssets.length }} assets across USPTO, EUIPO, and WIPO\n              </p>\n            </div>\n\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <div class=\"relative min-w-[200px] flex-1 sm:w-64\">\n                <lucide-icon\n                  [img]=\"Search\"\n                  class=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2\"\n                />\n                <ui-input\n                  [value]=\"searchQuery()\"\n                  (valueChange)=\"searchQuery.set($event)\"\n                  type=\"text\"\n                  placeholder=\"Search patent #, title, class...\"\n                  class=\"h-8 pl-8 text-xs\"\n                />\n              </div>\n\n              <ui-dropdown-menu>\n                <button ui-button ui-dropdown-menu-trigger variant=\"outline\" size=\"sm\" class=\"h-8 gap-1.5 text-xs\">\n                  <lucide-icon [img]=\"Filter\" class=\"size-3.5 opacity-70\" />\n                  <span>{{ selectedType() === 'all' ? 'Type: All' : selectedType() }}</span>\n                  <lucide-icon [img]=\"ChevronDown\" class=\"size-3 opacity-50\" />\n                </button>\n                <ui-dropdown-menu-content align=\"end\" class=\"w-48\">\n                  <ui-dropdown-menu-label class=\"text-xs\">Filter by Type</ui-dropdown-menu-label>\n                  <ui-dropdown-menu-separator />\n                  <ui-dropdown-menu-item (select)=\"selectedType.set('all')\">All Types</ui-dropdown-menu-item>\n                  <ui-dropdown-menu-item (select)=\"selectedType.set('Utility Patent')\"\n                    >Utility Patent</ui-dropdown-menu-item\n                  >\n                  <ui-dropdown-menu-item (select)=\"selectedType.set('Trademark')\">Trademark</ui-dropdown-menu-item>\n                  <ui-dropdown-menu-item (select)=\"selectedType.set('PCT International')\"\n                    >PCT International</ui-dropdown-menu-item\n                  >\n                </ui-dropdown-menu-content>\n              </ui-dropdown-menu>\n\n              <ui-dropdown-menu>\n                <button ui-button ui-dropdown-menu-trigger variant=\"outline\" size=\"sm\" class=\"h-8 gap-1.5 text-xs\">\n                  <span>{{ selectedStatus() === 'all' ? 'Status: All' : selectedStatus() }}</span>\n                  <lucide-icon [img]=\"ChevronDown\" class=\"size-3 opacity-50\" />\n                </button>\n                <ui-dropdown-menu-content align=\"end\" class=\"w-52\">\n                  <ui-dropdown-menu-label class=\"text-xs\">Filter by Status</ui-dropdown-menu-label>\n                  <ui-dropdown-menu-separator />\n                  <ui-dropdown-menu-item (select)=\"selectedStatus.set('all')\">All Statuses</ui-dropdown-menu-item>\n                  <ui-dropdown-menu-item (select)=\"selectedStatus.set('Granted / Registered')\">\n                    Granted / Registered\n                  </ui-dropdown-menu-item>\n                  <ui-dropdown-menu-item (select)=\"selectedStatus.set('Published / Under Exam')\">\n                    Published / Under Exam\n                  </ui-dropdown-menu-item>\n                </ui-dropdown-menu-content>\n              </ui-dropdown-menu>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card-content class=\"p-0\">\n          <div class=\"overflow-x-auto\">\n            <table ui-table>\n              <thead ui-table-header class=\"bg-muted/40\">\n                <tr ui-table-row>\n                  <th ui-table-head class=\"min-w-[280px]\">Asset Identifier &amp; Title</th>\n                  <th ui-table-head class=\"w-[140px]\">Type</th>\n                  <th ui-table-head class=\"w-[160px]\">Jurisdiction</th>\n                  <th ui-table-head class=\"w-[160px]\">App / Grant Date</th>\n                  <th ui-table-head class=\"w-[170px]\">Filing Status</th>\n                  <th ui-table-head class=\"w-[180px]\">Next Renewal / Deadline</th>\n                  <th ui-table-head class=\"w-[70px] text-right\"><span class=\"sr-only\">Actions</span></th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (asset of filteredAssets(); track asset.id) {\n                  <tr ui-table-row class=\"hover:bg-muted/40 transition-colors\">\n                    <td ui-table-cell class=\"py-3.5 align-top\">\n                      <div class=\"space-y-1\">\n                        <div class=\"flex flex-wrap items-center gap-1.5\">\n                          <span class=\"text-foreground font-mono text-xs font-bold tracking-tight\">\n                            {{ asset.identifier }}\n                          </span>\n                          <button\n                            type=\"button\"\n                            (click)=\"copyText(asset.id, asset.officialNumber)\"\n                            class=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring inline-flex items-center gap-1 rounded p-0.5 transition-colors focus-visible:ring-2 focus-visible:outline-hidden\"\n                            [attr.title]=\"'Copy ' + asset.officialNumber\"\n                          >\n                            @if (copiedId() === asset.id) {\n                              <lucide-icon [img]=\"Check\" class=\"text-success size-3\" />\n                            } @else {\n                              <lucide-icon [img]=\"Copy\" class=\"size-3\" />\n                            }\n                          </button>\n                        </div>\n                        <div class=\"text-foreground text-xs font-medium\">{{ asset.title }}</div>\n                        <div class=\"text-muted-foreground flex flex-wrap items-center gap-2 text-xs\">\n                          <span>{{ asset.ipcClass }}</span>\n                          <span>•</span>\n                          <span>Counsel: {{ asset.attorney }}</span>\n                        </div>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell class=\"align-top\">\n                      <span ui-badge variant=\"outline\" [class]=\"typeBadgeClass(asset.type)\">\n                        {{ asset.type }}\n                      </span>\n                    </td>\n\n                    <td ui-table-cell class=\"align-top\">\n                      <div class=\"flex items-center gap-2\">\n                        <span class=\"text-base leading-none\" [attr.aria-label]=\"asset.jurisdictionName\">\n                          {{ asset.jurisdictionFlag }}\n                        </span>\n                        <div>\n                          <div class=\"text-foreground text-xs font-medium\">{{ asset.jurisdictionName }}</div>\n                          <div class=\"text-muted-foreground font-mono text-xs\">{{ asset.patentOffice }}</div>\n                        </div>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell class=\"align-top\">\n                      <div class=\"space-y-0.5 font-mono text-xs tabular-nums\">\n                        <div class=\"text-muted-foreground flex items-center gap-1.5\">\n                          <span class=\"text-muted-foreground/70\">Filing:</span>\n                          <span class=\"text-foreground font-medium\">{{ asset.applicationDate }}</span>\n                        </div>\n                        <div class=\"text-muted-foreground flex items-center gap-1.5\">\n                          <span class=\"text-muted-foreground/70\">Grant:</span>\n                          <span\n                            [class]=\"\n                              asset.grantDate === 'Pending' ? 'text-warning font-medium' : 'text-foreground font-medium'\n                            \"\n                          >\n                            {{ asset.grantDate }}\n                          </span>\n                        </div>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell class=\"align-top\">\n                      @if (asset.status === 'Granted / Registered') {\n                        <div\n                          class=\"border-success/30 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                          <span>Granted / Registered</span>\n                        </div>\n                      } @else {\n                        <div\n                          class=\"border-warning/30 bg-warning/10 text-warning inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium\"\n                        >\n                          <lucide-icon [img]=\"Clock\" class=\"text-warning size-3\" />\n                          <span>Published / Under Exam</span>\n                        </div>\n                      }\n                    </td>\n\n                    <td ui-table-cell class=\"align-top\">\n                      <div class=\"space-y-0.5\">\n                        <div\n                          class=\"text-foreground flex items-center gap-1.5 font-mono text-xs font-semibold tabular-nums\"\n                        >\n                          <lucide-icon [img]=\"Calendar\" class=\"text-muted-foreground size-3.5\" />\n                          <span>{{ asset.nextDeadline }}</span>\n                        </div>\n                        <p class=\"text-muted-foreground text-xs leading-tight\">{{ asset.deadlineNote }}</p>\n                      </div>\n                    </td>\n\n                    <td ui-table-cell class=\"py-3.5 text-right align-top\">\n                      <ui-dropdown-menu>\n                        <button\n                          ui-button\n                          ui-dropdown-menu-trigger\n                          variant=\"ghost\"\n                          size=\"icon-sm\"\n                          class=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring\"\n                        >\n                          <lucide-icon [img]=\"MoreHorizontal\" class=\"size-4\" />\n                          <span class=\"sr-only\">Open actions for {{ asset.identifier }}</span>\n                        </button>\n                        <ui-dropdown-menu-content align=\"end\" class=\"w-56\">\n                          <ui-dropdown-menu-label class=\"text-xs\">Asset Operations</ui-dropdown-menu-label>\n                          <ui-dropdown-menu-separator />\n                          <ui-dropdown-menu-item (select)=\"handleAction(asset.gazetteLabel, asset)\">\n                            <lucide-icon [img]=\"ExternalLink\" class=\"mr-2 size-4\" />\n                            <span>{{ asset.gazetteLabel }}</span>\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-item (select)=\"handleAction('Download Grant Certificate', asset)\">\n                            <lucide-icon [img]=\"Download\" class=\"mr-2 size-4\" />\n                            <span>Download Grant Certificate</span>\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-item (select)=\"handleAction('Assign Counsel', asset)\">\n                            <lucide-icon [img]=\"UserCheck\" class=\"mr-2 size-4\" />\n                            <span>Assign Counsel</span>\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-separator />\n                          <ui-dropdown-menu-item (select)=\"copyText(asset.id, asset.officialNumber)\">\n                            <lucide-icon [img]=\"Copy\" class=\"mr-2 size-4\" />\n                            <span>Copy Docket Number</span>\n                          </ui-dropdown-menu-item>\n                        </ui-dropdown-menu-content>\n                      </ui-dropdown-menu>\n                    </td>\n                  </tr>\n                }\n\n                @if (filteredAssets().length === 0) {\n                  <tr ui-table-row>\n                    <td ui-table-cell [attr.colspan]=\"7\" class=\"text-muted-foreground py-10 text-center text-xs\">\n                      <div class=\"flex flex-col items-center justify-center gap-2\">\n                        <lucide-icon [img]=\"FileText\" class=\"text-muted-foreground/60 size-8\" />\n                        <p class=\"font-medium\">No intellectual property assets match your search filters.</p>\n                        <button ui-button variant=\"outline\" size=\"sm\" class=\"mt-1 text-xs\" (click)=\"resetFilters()\">\n                          Reset Filters\n                        </button>\n                      </div>\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiTrademarkPatentPortfolioComponent {\n  protected readonly Award = Award\n  protected readonly BadgeCheck = BadgeCheck\n  protected readonly Building2 = Building2\n  protected readonly Calendar = Calendar\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly ChevronDown = ChevronDown\n  protected readonly Clock = Clock\n  protected readonly Copy = Copy\n  protected readonly Download = Download\n  protected readonly ExternalLink = ExternalLink\n  protected readonly FileText = FileText\n  protected readonly Filter = Filter\n  protected readonly MoreHorizontal = MoreHorizontal\n  protected readonly Plus = Plus\n  protected readonly Scale = Scale\n  protected readonly Search = Search\n  protected readonly UserCheck = UserCheck\n\n  protected readonly allAssets = ipAssets\n\n  @Input('class') className?: string\n\n  readonly searchQuery = signal('')\n  readonly selectedType = signal<'all' | AssetType>('all')\n  readonly selectedStatus = signal<'all' | FilingStatus>('all')\n  readonly copiedId = signal<string | null>(null)\n  readonly feedbackMessage = signal<string | null>(null)\n\n  private copyTimer: ReturnType<typeof setTimeout> | undefined\n  private feedbackTimer: ReturnType<typeof setTimeout> | undefined\n\n  readonly filteredAssets = computed(() => {\n    const query = this.searchQuery().trim().toLowerCase()\n    return ipAssets.filter((asset) => {\n      const matchesType = this.selectedType() === 'all' || asset.type === this.selectedType()\n      const matchesStatus = this.selectedStatus() === 'all' || asset.status === this.selectedStatus()\n      const matchesSearch =\n        !query ||\n        asset.identifier.toLowerCase().includes(query) ||\n        asset.officialNumber.toLowerCase().includes(query) ||\n        asset.title.toLowerCase().includes(query) ||\n        asset.jurisdictionName.toLowerCase().includes(query) ||\n        asset.patentOffice.toLowerCase().includes(query) ||\n        asset.ipcClass.toLowerCase().includes(query)\n      return matchesType && matchesStatus && matchesSearch\n    })\n  })\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  typeBadgeClass(type: AssetType): string {\n    return cn('font-mono text-xs font-medium', {\n      'border-chart-1/30 bg-chart-1/10 text-chart-1': type === 'Utility Patent',\n      'border-info/30 bg-info/10 text-info': type === 'Trademark',\n      'border-warning/30 bg-warning/10 text-warning': type === 'PCT International',\n    })\n  }\n\n  resetFilters(): void {\n    this.searchQuery.set('')\n    this.selectedType.set('all')\n    this.selectedStatus.set('all')\n  }\n\n  copyText(id: string, text: string): void {\n    try {\n      void navigator.clipboard?.writeText(text)\n    } catch {\n      // Clipboard unavailable (e.g. jsdom without permissions) — still show feedback.\n    }\n    this.copiedId.set(id)\n    clearTimeout(this.copyTimer)\n    this.copyTimer = setTimeout(() => this.copiedId.set(null), 2000)\n  }\n\n  private flashFeedback(message: string): void {\n    this.feedbackMessage.set(message)\n    clearTimeout(this.feedbackTimer)\n    this.feedbackTimer = setTimeout(() => this.feedbackMessage.set(null), 3000)\n  }\n\n  handleExport(): void {\n    this.flashFeedback('Exporting IP Portfolio summary (CSV / PDF)...')\n  }\n\n  handleFileNewAsset(): void {\n    this.flashFeedback('Opening USPTO / WIPO EFS-Web filing wizard...')\n  }\n\n  handleAction(action: string, asset: IpAsset): void {\n    this.flashFeedback(`${action}: ${asset.identifier}`)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/trademark-patent-portfolio/trademark-patent-portfolio.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/trademark-patent-portfolio/index.ts",
      "content": "export {\n  UiTrademarkPatentPortfolioComponent,\n  type AssetType,\n  type FilingStatus,\n  type IpAsset,\n} from './trademark-patent-portfolio.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/trademark-patent-portfolio/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",
    "https://uipkge.dev/r/angular/dropdown-menu.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "USPTO and WIPO intellectual property asset portfolio tracker, patent grant status, jurisdiction coverage, and maintenance fee timeline with docket action workflow.",
  "categories": [
    "legal",
    "app",
    "table",
    "dashboard"
  ]
}