{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "pricing-tier-comparison-matrix",
  "title": "Pricing Tier Comparison Matrix",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/pricing-tier-comparison-matrix/pricing-tier-comparison-matrix.component.ts",
      "content": "// Comprehensive pricing tier comparison matrix with billing cycle discount toggles,\n// prominent recommended plan, and granular capability matrix table.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core'\nimport { ArrowRight, Check, LucideAngularModule, Minus, 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 } from '@/ui/card/card.component'\nimport type { ButtonVariant } from '@/ui/button/button.component'\n\nexport type BillingCycle = 'monthly' | 'annual'\n\nexport interface PricingTierPlan {\n  id: string\n  name: string\n  description: string\n  monthlyPrice: number\n  annualPrice: number\n  highlight: boolean\n  badge?: string\n  ctaText: string\n  ctaVariant: ButtonVariant\n}\n\nconst plans: PricingTierPlan[] = [\n  {\n    id: 'community',\n    name: 'Community OSS',\n    description: 'For indie hackers and developers building open source products.',\n    monthlyPrice: 0,\n    annualPrice: 0,\n    highlight: false,\n    ctaText: 'Start Building Free',\n    ctaVariant: 'outline',\n  },\n  {\n    id: 'pro',\n    name: 'Pro Team',\n    description: 'For growing startup engineering teams that require high velocity.',\n    monthlyPrice: 29,\n    annualPrice: 24,\n    highlight: true,\n    badge: 'Most Popular',\n    ctaText: 'Claim Pro License',\n    ctaVariant: 'default',\n  },\n  {\n    id: 'enterprise',\n    name: 'Enterprise Scale',\n    description: 'Dedicated registry syncing, SSO, SOC2 compliance audits, and SLA.',\n    monthlyPrice: 119,\n    annualPrice: 99,\n    highlight: false,\n    ctaText: 'Talk to Sales',\n    ctaVariant: 'outline',\n  },\n]\n\nexport interface TierFeatureCell {\n  name: string\n  tooltip: string\n  community: boolean | string\n  pro: boolean | string\n  enterprise: boolean | string\n}\n\nexport interface TierComparisonSection {\n  category: string\n  features: TierFeatureCell[]\n}\n\nconst comparisonData: TierComparisonSection[] = [\n  {\n    category: 'Registry & Core Primitives',\n    features: [\n      {\n        name: 'Full AST Component Source Access',\n        tooltip: 'Raw SFC and TSX source files copied directly into your repository.',\n        community: true,\n        pro: true,\n        enterprise: true,\n      },\n      {\n        name: 'Dual-Framework Parity (Vue + React)',\n        tooltip: 'Identical DOM semantics and CVA tokens across both ecosystems.',\n        community: true,\n        pro: true,\n        enterprise: true,\n      },\n      {\n        name: 'Curated Marketing & SaaS Blocks',\n        tooltip: 'Access to 450+ production-grade unbundled layout blocks.',\n        community: '100+ Blocks',\n        pro: 'All 450+ Blocks',\n        enterprise: 'All Blocks + Custom',\n      },\n      {\n        name: 'Tailwind CSS v4 OKLCH Token System',\n        tooltip: 'Hardware-calibrated color spaces and spring curves.',\n        community: true,\n        pro: true,\n        enterprise: true,\n      },\n    ],\n  },\n  {\n    category: 'Enterprise & Security Compliance',\n    features: [\n      {\n        name: 'Private Registry Mirroring',\n        tooltip: 'Host your organization’s customized internal registry behind a firewall.',\n        community: false,\n        pro: '1 Private Repo',\n        enterprise: 'Unlimited Private Hubs',\n      },\n      {\n        name: 'SOC2 & ISO 27001 Audit Packs',\n        tooltip: 'Pre-certified security documentation and architecture proofs.',\n        community: false,\n        pro: false,\n        enterprise: true,\n      },\n      {\n        name: 'Guaranteed 99.99% Registry CDN SLA',\n        tooltip: 'Global multi-region edge distribution uptime guarantee.',\n        community: false,\n        pro: '99.9% SLA',\n        enterprise: '99.99% High Availability',\n      },\n      {\n        name: 'Dedicated Design Engineering Support',\n        tooltip: 'Direct Slack / Discord channel with core design system maintainers.',\n        community: false,\n        pro: 'Priority Email',\n        enterprise: 'Dedicated Slack Channel',\n      },\n    ],\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-pricing-tier-comparison-matrix, [ui-pricing-tier-comparison-matrix]',\n  standalone: true,\n  // React renders the root <section> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [LucideAngularModule, UiBadgeComponent, UiButtonComponent, UiCardComponent],\n  template: `\n    <section data-slot=\"pricing-tier-comparison-matrix\" [class]=\"rootClass\">\n      <div class=\"mx-auto max-w-7xl space-y-16\">\n        <!-- Header -->\n        <div class=\"mx-auto max-w-3xl space-y-4 text-center\">\n          <span ui-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n            <lucide-icon [img]=\"ShieldCheck\" class=\"text-primary size-3.5\" />\n            Predictable Pricing\n          </span>\n          <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">\n            Zero seat taxes. Own your source code forever.\n          </h2>\n          <p class=\"text-muted-foreground text-base\">\n            Choose the tier that fits your engineering team's delivery scale and compliance needs.\n          </p>\n\n          <!-- Billing Toggle -->\n          <div class=\"flex items-center justify-center gap-3 pt-4\">\n            <span class=\"font-mono text-xs\" [class]=\"cycleLabelClass('monthly')\">Monthly</span>\n            <div class=\"border-border bg-card relative flex items-center rounded-full border p-1\">\n              <button type=\"button\" [class]=\"toggleButtonClass('monthly')\" (click)=\"setBilling('monthly')\">\n                Monthly\n              </button>\n              <button type=\"button\" [class]=\"toggleButtonClass('annual')\" (click)=\"setBilling('annual')\">\n                <span>Annual</span>\n                <span class=\"bg-success rounded-full px-1.5 py-0.5 text-xs font-bold text-white\">Save 20%</span>\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <!-- Pricing Plan Cards Grid (3 Columns) -->\n        <div class=\"grid grid-cols-1 items-stretch gap-6 md:grid-cols-3\">\n          @for (plan of plans; track plan.id) {\n            <div ui-card [class]=\"planCardClass(plan)\">\n              <!-- Top Badge -->\n              @if (plan.badge) {\n                <div class=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n                  <span ui-badge class=\"px-3 py-0.5 font-mono text-xs tracking-wider uppercase shadow-md\">\n                    {{ plan.badge }}\n                  </span>\n                </div>\n              }\n\n              <div class=\"space-y-4\">\n                <div>\n                  <h3 class=\"text-foreground font-mono text-xl font-bold\">{{ plan.name }}</h3>\n                  <p class=\"text-muted-foreground mt-1 min-h-[36px] text-xs\">{{ plan.description }}</p>\n                </div>\n\n                <!-- Price display -->\n                <div class=\"flex items-baseline gap-1.5 font-mono\">\n                  <span class=\"text-foreground text-4xl font-bold\">{{ priceLabel(plan) }}</span>\n                  <span class=\"text-muted-foreground text-xs\">/ month</span>\n                </div>\n                <p class=\"text-muted-foreground font-mono text-xs\">{{ billedNote(plan) }}</p>\n              </div>\n\n              <button ui-button [variant]=\"plan.ctaVariant\" class=\"h-10 w-full gap-1.5 font-mono text-xs shadow-xs\">\n                <span>{{ plan.ctaText }}</span>\n                <lucide-icon [img]=\"ArrowRight\" class=\"size-3.5\" />\n              </button>\n            </div>\n          }\n        </div>\n\n        <!-- Deep Feature Comparison Matrix Table -->\n        <div class=\"space-y-6\">\n          <div class=\"text-center\">\n            <h3 class=\"text-foreground font-mono text-xl font-bold\">Detailed Feature Comparison</h3>\n            <p class=\"text-muted-foreground mt-1 text-xs\">Full granular matrix of capabilities and entitlements.</p>\n          </div>\n\n          <div ui-card class=\"border-border bg-card overflow-hidden rounded-2xl text-left shadow-sm\">\n            <div class=\"overflow-x-auto\">\n              <table class=\"w-full border-collapse text-left text-xs\">\n                <thead>\n                  <tr class=\"border-border bg-muted/40 text-muted-foreground border-b font-mono\">\n                    <th class=\"w-1/2 p-4 font-semibold\">Capability</th>\n                    <th class=\"p-4 text-center font-semibold\">Community</th>\n                    <th class=\"text-primary p-4 text-center font-bold font-semibold\">Pro Team</th>\n                    <th class=\"p-4 text-center font-semibold\">Enterprise</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  @for (section of comparisonData; track section.category) {\n                    <tr class=\"bg-muted/20 border-border/80 border-b\">\n                      <td\n                        colspan=\"4\"\n                        class=\"text-muted-foreground p-3 px-4 font-mono text-xs font-bold tracking-wider uppercase\"\n                      >\n                        {{ section.category }}\n                      </td>\n                    </tr>\n                    @for (row of section.features; track row.name) {\n                      <tr class=\"border-border/60 hover:bg-muted/10 border-b transition-colors\">\n                        <td class=\"p-4\">\n                          <div class=\"text-foreground font-medium\">{{ row.name }}</div>\n                          <div class=\"text-muted-foreground mt-0.5 text-xs\">{{ row.tooltip }}</div>\n                        </td>\n                        <td class=\"p-4 text-center font-mono\">\n                          @if (row.community === true) {\n                            <lucide-icon [img]=\"Check\" class=\"text-success mx-auto size-4\" />\n                          } @else if (row.community === false) {\n                            <lucide-icon [img]=\"Minus\" class=\"text-muted-foreground/40 mx-auto size-4\" />\n                          } @else {\n                            <span class=\"text-muted-foreground\">{{ row.community }}</span>\n                          }\n                        </td>\n                        <td class=\"p-4 text-center font-mono font-semibold\">\n                          @if (row.pro === true) {\n                            <lucide-icon [img]=\"Check\" class=\"text-success mx-auto size-4\" />\n                          } @else if (row.pro === false) {\n                            <lucide-icon [img]=\"Minus\" class=\"text-muted-foreground/40 mx-auto size-4\" />\n                          } @else {\n                            <span class=\"text-primary\">{{ row.pro }}</span>\n                          }\n                        </td>\n                        <td class=\"p-4 text-center font-mono\">\n                          @if (row.enterprise === true) {\n                            <lucide-icon [img]=\"Check\" class=\"text-success mx-auto size-4\" />\n                          } @else if (row.enterprise === false) {\n                            <lucide-icon [img]=\"Minus\" class=\"text-muted-foreground/40 mx-auto size-4\" />\n                          } @else {\n                            <span class=\"text-foreground font-semibold\">{{ row.enterprise }}</span>\n                          }\n                        </td>\n                      </tr>\n                    }\n                  }\n                </tbody>\n              </table>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n})\nexport class UiPricingTierComparisonMatrixComponent {\n  protected readonly ArrowRight = ArrowRight\n  protected readonly Check = Check\n  protected readonly Minus = Minus\n  protected readonly ShieldCheck = ShieldCheck\n\n  readonly plans = plans\n  readonly comparisonData = comparisonData\n\n  @Input() set defaultBilling(v: BillingCycle | undefined) {\n    if (v) this.billing.set(v)\n  }\n  @Input('class') className?: string\n\n  readonly billing = signal<BillingCycle>('annual')\n\n  get rootClass(): string {\n    return cn('bg-background relative overflow-hidden px-4 py-16 sm:px-6 sm:py-24 lg:px-8', this.className)\n  }\n\n  cycleLabelClass(cycle: BillingCycle): string {\n    return cn(this.billing() === cycle ? 'text-foreground font-bold' : 'text-muted-foreground')\n  }\n\n  toggleButtonClass(cycle: BillingCycle): string {\n    return cn(\n      'relative z-10 rounded-full px-3 py-1 font-mono text-xs transition-colors',\n      cycle === 'annual' && 'flex items-center gap-1.5',\n      this.billing() === cycle ? 'bg-primary text-primary-foreground font-semibold shadow-xs' : 'text-muted-foreground',\n    )\n  }\n\n  planCardClass(plan: PricingTierPlan): string {\n    return cn(\n      'border-border bg-card relative flex flex-col justify-between space-y-6 rounded-2xl p-6 text-left shadow-xl transition-colors sm:p-8',\n      plan.highlight ? 'border-primary/80 ring-primary/20 scale-[1.02] shadow-sm ring-2' : 'hover:border-border/80',\n    )\n  }\n\n  billedNote(plan: PricingTierPlan): string {\n    if (this.billing() === 'annual' && plan.annualPrice > 0) return `Billed annually ($${plan.annualPrice * 12}/yr)`\n    return 'Billed monthly'\n  }\n\n  priceLabel(plan: PricingTierPlan): string {\n    return `$${this.billing() === 'annual' ? plan.annualPrice : plan.monthlyPrice}`\n  }\n\n  setBilling(cycle: BillingCycle): void {\n    this.billing.set(cycle)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/pricing-tier-comparison-matrix/pricing-tier-comparison-matrix.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/pricing-tier-comparison-matrix/index.ts",
      "content": "export {\n  UiPricingTierComparisonMatrixComponent,\n  type BillingCycle,\n  type PricingTierPlan,\n  type TierComparisonSection,\n  type TierFeatureCell,\n} from './pricing-tier-comparison-matrix.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/pricing-tier-comparison-matrix/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": "Comprehensive pricing tier comparison matrix with billing cycle discount toggles, prominent recommended plan, and granular capability matrix table.",
  "categories": [
    "marketing"
  ],
  "deprecated": true,
  "replacedBy": "pricing"
}