{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "ab-test-variant-results",
  "title": "Ab Test Variant Results",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/ab-test-variant-results/ab-test-variant-results.component.ts",
      "content": "import { Component, Input, signal, ChangeDetectionStrategy } from '@angular/core'\nimport {\n  Activity,\n  CheckCheck,\n  CheckCircle2,\n  Clock,\n  CreditCard,\n  DollarSign,\n  LucideAngularModule,\n  Pause,\n  Play,\n  ShieldCheck,\n  ShoppingCart,\n  TrendingUp,\n  Trophy,\n  Truck,\n  Users,\n  Zap,\n  type LucideIconData,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent, type BadgeVariant } 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  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport interface AbTestPrimaryMetric {\n  id: string\n  label: string\n  value: string\n  unit: string\n  badge: string\n  badgeVariant: BadgeVariant\n  badgeIcon: LucideIconData\n  description: string\n  highlight: boolean\n}\n\nexport interface AbTestVariant {\n  id: string\n  code: string\n  type: string\n  title: string\n  description: string\n  split: string\n  visitors: string\n  conversions: string\n  conversionLabel: string\n  conversionRate: string\n  rateBadge: string\n  rateBadgeVariant: BadgeVariant\n  revenuePerVisitor: string\n  revenueDelta?: string\n  totalRevenue: string\n  verdict: string\n  verdictVariant: BadgeVariant\n  isWinner: boolean\n}\n\nexport interface AbTestFunnelArm {\n  count: string\n  rate: string\n  progress: number\n  retention: string\n}\n\nexport interface AbTestFunnelStep {\n  id: string\n  stepNumber: string\n  name: string\n  description: string\n  icon: LucideIconData\n  control: AbTestFunnelArm\n  challenger: AbTestFunnelArm\n  delta: string\n  isPositive: boolean | null\n  insight: string\n}\n\nexport interface AbTestGuardrail {\n  id: string\n  title: string\n  status: string\n  badgeVariant: BadgeVariant\n  value: string\n  description: string\n  icon: LucideIconData\n}\n\nconst primaryMetrics: AbTestPrimaryMetric[] = [\n  {\n    id: 'conversion-lift',\n    label: 'Overall Conversion Lift',\n    value: '+24.8%',\n    unit: 'relative',\n    badge: '+1.27% Absolute',\n    badgeVariant: 'success',\n    badgeIcon: TrendingUp,\n    description: 'Challenger (6.41%) vs Baseline Control (5.14%)',\n    highlight: true,\n  },\n  {\n    id: 'sample-size',\n    label: 'Total Sample Size',\n    value: '48,290',\n    unit: 'unique visitors',\n    badge: '50 / 50 Split',\n    badgeVariant: 'secondary',\n    badgeIcon: Users,\n    description: '24,145 unique visitors per variant group',\n    highlight: false,\n  },\n  {\n    id: 'statistical-confidence',\n    label: 'Statistical Confidence',\n    value: '99.2%',\n    unit: 'confidence',\n    badge: 'p = 0.008',\n    badgeVariant: 'outline',\n    badgeIcon: Activity,\n    description: 'Exceeds 95.0% significance threshold (α = 0.05)',\n    highlight: false,\n  },\n  {\n    id: 'revenue-impact',\n    label: 'Est. Annual Revenue Impact',\n    value: '+$142,000',\n    unit: 'ARR',\n    badge: '+$1.08 / visitor',\n    badgeVariant: 'success',\n    badgeIcon: DollarSign,\n    description: 'Based on 131,500 annual checkouts ($5.28 vs $4.20 RPV)',\n    highlight: true,\n  },\n]\n\nconst variants: AbTestVariant[] = [\n  {\n    id: 'variant-a',\n    code: 'Variant A',\n    type: 'Control',\n    title: 'Multi-Step Wizard',\n    description: '3-step segmented checkout flow with separate shipping, billing, and review steps.',\n    split: '50%',\n    visitors: '24,145',\n    conversions: '1,240',\n    conversionLabel: '1,240 checkouts',\n    conversionRate: '5.14%',\n    rateBadge: 'Baseline',\n    rateBadgeVariant: 'secondary',\n    revenuePerVisitor: '$4.20',\n    totalRevenue: '$101,409.00',\n    verdict: 'Baseline Control Group',\n    verdictVariant: 'outline',\n    isWinner: false,\n  },\n  {\n    id: 'variant-b',\n    code: 'Variant B',\n    type: 'Challenger',\n    title: 'Single-Page with Accordion',\n    description: 'Unified single-page layout with collapsible accordion sections and sticky order summary.',\n    split: '50%',\n    visitors: '24,145',\n    conversions: '1,548',\n    conversionLabel: '1,548 checkouts (+308)',\n    conversionRate: '6.41%',\n    rateBadge: '+24.8% relative lift',\n    rateBadgeVariant: 'success',\n    revenuePerVisitor: '$5.28',\n    revenueDelta: '+$1.08 / visitor',\n    totalRevenue: '$127,485.60',\n    verdict: 'Winner · 99.2% probability to beat control',\n    verdictVariant: 'success',\n    isWinner: true,\n  },\n]\n\nconst funnelSteps: AbTestFunnelStep[] = [\n  {\n    id: 'step-1',\n    stepNumber: '01',\n    name: 'Cart Review',\n    description: 'Initial checkout landing and cart items validation',\n    icon: ShoppingCart,\n    control: {\n      count: '24,145',\n      rate: '100.0%',\n      progress: 100,\n      retention: '100% of traffic',\n    },\n    challenger: {\n      count: '24,145',\n      rate: '100.0%',\n      progress: 100,\n      retention: '100% of traffic',\n    },\n    delta: '0.0%',\n    isPositive: null,\n    insight: 'Uniform 50/50 randomized traffic partition without sample ratio bias.',\n  },\n  {\n    id: 'step-2',\n    stepNumber: '02',\n    name: 'Shipping Address',\n    description: 'Delivery destination selection & shipping method',\n    icon: Truck,\n    control: {\n      count: '18,350',\n      rate: '76.0%',\n      progress: 76,\n      retention: '76.0% retained',\n    },\n    challenger: {\n      count: '20,523',\n      rate: '85.0%',\n      progress: 85,\n      retention: '85.0% retained',\n    },\n    delta: '+11.8% stage lift',\n    isPositive: true,\n    insight: 'Auto-fill and inline address validation lowered initial drop-off by 9.0 percentage points.',\n  },\n  {\n    id: 'step-3',\n    stepNumber: '03',\n    name: 'Payment Details',\n    description: 'Credit card input, digital wallet, or invoice terms',\n    icon: CreditCard,\n    control: {\n      count: '8,450',\n      rate: '35.0%',\n      progress: 35,\n      retention: '46.0% retained',\n    },\n    challenger: {\n      count: '11,831',\n      rate: '49.0%',\n      progress: 49,\n      retention: '57.6% retained',\n    },\n    delta: '+40.0% stage lift',\n    isPositive: true,\n    insight: 'Accordion structure preserved visible cart totals, reducing payment abandonment substantially.',\n  },\n  {\n    id: 'step-4',\n    stepNumber: '04',\n    name: 'Checkout Completed',\n    description: 'Payment authorized & order confirmation rendered',\n    icon: CheckCheck,\n    control: {\n      count: '1,240',\n      rate: '5.14%',\n      progress: 5.14,\n      retention: '14.7% of payment step',\n    },\n    challenger: {\n      count: '1,548',\n      rate: '6.41%',\n      progress: 6.41,\n      retention: '13.1% of payment step',\n    },\n    delta: '+24.8% final lift',\n    isPositive: true,\n    insight: 'Yielded 308 net incremental checkouts with statistical significance (p = 0.008).',\n  },\n]\n\nconst guardrails: AbTestGuardrail[] = [\n  {\n    id: 'srm',\n    title: 'Sample Ratio Mismatch (SRM)',\n    status: 'Passed',\n    badgeVariant: 'success',\n    value: 'p = 0.982',\n    description: 'Chi-square goodness of fit verifies balanced 50.0% / 50.0% traffic delivery.',\n    icon: ShieldCheck,\n  },\n  {\n    id: 'mde',\n    title: 'Minimum Detectable Effect',\n    status: 'Achieved',\n    badgeVariant: 'success',\n    value: 'Observed +24.8% vs MDE 5.0%',\n    description: 'Statistical power exceeds 99% for primary conversion rate metric.',\n    icon: Zap,\n  },\n  {\n    id: 'perf',\n    title: 'Performance Guardrail',\n    status: 'Healthy',\n    badgeVariant: 'secondary',\n    value: '1.1s vs 1.3s LCP',\n    description: 'Single-page architecture improved largest contentful paint by 180ms.',\n    icon: Clock,\n  },\n]\n\n/**\n * AbTestVariantResults -- the React block, 1:1: an A/B experiment scorecard with a status\n * header (pause / declare winner), four primary metric cards, a variants comparison table,\n * a per-step funnel drop-off comparison and a guardrails footer. Pass `title`,\n * `experimentId` and `duration` to relabel it; edit the data arrays above to change the rest.\n */\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-ab-test-variant-results, [ui-ab-test-variant-results]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout, `class` goes to the root\n  // and the `title` input never becomes a native tooltip on the host.\n  host: { '[attr.class]': '\"contents\"', '[attr.title]': 'null' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiCardDescriptionComponent,\n    UiCardContentComponent,\n    UiTableComponent,\n    UiTableHeaderComponent,\n    UiTableBodyComponent,\n    UiTableRowComponent,\n    UiTableHeadComponent,\n    UiTableCellComponent,\n  ],\n  template: `\n    <div data-uipkge=\"\" data-slot=\"ab-test-variant-results\" [class]=\"rootClass\">\n      <!-- Winner Rollout Banner (if declared) -->\n      @if (isWinnerDeclared()) {\n        <div\n          class=\"border-success/30 bg-success/10 text-foreground dark:text-foreground flex flex-col items-start justify-between gap-3 rounded-lg border p-4 shadow-xs sm:flex-row sm:items-center\"\n        >\n          <div class=\"flex items-center gap-3\">\n            <div class=\"bg-success flex size-9 shrink-0 items-center justify-center rounded-md text-white shadow-xs\">\n              <lucide-icon [img]=\"Trophy\" class=\"size-4\" aria-hidden=\"true\" />\n            </div>\n            <div class=\"space-y-0.5\">\n              <p class=\"text-foreground text-sm font-semibold\">Variant B (Single-Page Accordion) Declared Winner</p>\n              <p class=\"text-muted-foreground text-xs\">\n                100% traffic rollout initiated. Estimated annual revenue increase of +$142,000 ARR in effect.\n              </p>\n            </div>\n          </div>\n          <span ui-badge variant=\"success\" class=\"font-semibold\">100% Traffic Live</span>\n        </div>\n      }\n\n      <!-- Header Section -->\n      <div class=\"flex flex-col gap-4 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.5\">\n            <h2 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">{{ title }}</h2>\n            <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">{{ experimentId }}</span>\n            <span ui-badge variant=\"success\" class=\"border-success/20 bg-success/10 text-success gap-1.5 font-medium\">\n              <lucide-icon [img]=\"CheckCircle2\" class=\"size-3\" aria-hidden=\"true\" />\n              <span>Statistically Significant · 99.2% Confidence</span>\n            </span>\n            @if (isPaused()) {\n              <span ui-badge variant=\"secondary\" class=\"gap-1 font-medium\">\n                <lucide-icon [img]=\"Pause\" class=\"size-3\" aria-hidden=\"true\" />\n                <span>Paused</span>\n              </span>\n            }\n          </div>\n          <p class=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">\n            {{ duration }} · Primary Goal: <span class=\"text-foreground font-medium\">Completed Checkout Rate</span>\n          </p>\n        </div>\n\n        <!-- Action Buttons -->\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <button ui-button size=\"sm\" variant=\"outline\" class=\"gap-1.5 shadow-xs\" (click)=\"togglePause()\">\n            <lucide-icon [img]=\"isPaused() ? Play : Pause\" class=\"size-3.5\" aria-hidden=\"true\" />\n            <span>{{ isPaused() ? 'Resume Test' : 'Pause Test' }}</span>\n          </button>\n          <button\n            ui-button\n            size=\"sm\"\n            variant=\"default\"\n            [disabled]=\"isWinnerDeclared()\"\n            class=\"gap-1.5 shadow-xs\"\n            (click)=\"handleDeclareWinner()\"\n          >\n            <lucide-icon [img]=\"Trophy\" class=\"size-3.5\" aria-hidden=\"true\" />\n            <span>{{ isWinnerDeclared() ? 'Winner Rolled Out 100%' : 'Declare Winner & Roll Out 100%' }}</span>\n          </button>\n        </div>\n      </div>\n\n      <!-- 4 Primary Experiment Metrics Cards -->\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        @for (metric of primaryMetrics; track metric.id) {\n          <div ui-card [class]=\"metricCardClass(metric)\">\n            <div ui-card-header class=\"pb-2\">\n              <div class=\"flex items-center justify-between gap-2\">\n                <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n                  {{ metric.label }}\n                </h3>\n                <span ui-badge [variant]=\"metric.badgeVariant\" class=\"gap-1 font-medium tabular-nums\">\n                  <lucide-icon [img]=\"metric.badgeIcon\" class=\"size-3\" aria-hidden=\"true\" />\n                  <span>{{ metric.badge }}</span>\n                </span>\n              </div>\n            </div>\n            <div ui-card-content class=\"space-y-1.5 pb-4\">\n              <div class=\"flex items-baseline gap-1.5\">\n                <span [class]=\"metricValueClass(metric)\">{{ metric.value }}</span>\n                @if (metric.unit) {\n                  <span class=\"text-muted-foreground text-xs font-normal\">{{ metric.unit }}</span>\n                }\n              </div>\n              <p class=\"text-muted-foreground text-xs leading-relaxed\">{{ metric.description }}</p>\n            </div>\n          </div>\n        }\n      </div>\n\n      <!-- Variants Comparison Table Card -->\n      <div ui-card class=\"border-border bg-card shadow-xs\">\n        <div ui-card-header class=\"pb-3\">\n          <div class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <div class=\"flex items-center gap-2\">\n                <h3 ui-card-title class=\"text-foreground text-base font-semibold\">\n                  Variants Comparison &amp; Statistical Significance\n                </h3>\n                <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Statsig / Optimizely Model</span>\n              </div>\n              <p ui-card-description class=\"mt-1 text-xs\">\n                Frequentist two-tailed Z-test with continuous monitoring and sample ratio correction.\n              </p>\n            </div>\n            <div\n              class=\"border-border/80 bg-muted/30 flex items-center gap-2 self-start rounded-lg border px-3 py-1.5 text-xs sm:self-auto\"\n            >\n              <span class=\"text-muted-foreground\">Significance Alpha:</span>\n              <span class=\"text-foreground font-mono font-semibold tabular-nums\">α = 0.05</span>\n            </div>\n          </div>\n        </div>\n        <div ui-card-content class=\"p-0\">\n          <div class=\"overflow-x-auto\">\n            <div ui-table>\n              <thead ui-table-header class=\"bg-muted/40\">\n                <tr ui-table-row class=\"border-border hover:bg-transparent\">\n                  <th ui-table-head class=\"text-foreground text-xs font-semibold\">Variant &amp; Layout</th>\n                  <th ui-table-head class=\"text-foreground text-xs font-semibold\">Traffic Split</th>\n                  <th ui-table-head class=\"text-foreground text-right text-xs font-semibold\">Conversions</th>\n                  <th ui-table-head class=\"text-foreground text-right text-xs font-semibold\">Conversion Rate</th>\n                  <th ui-table-head class=\"text-foreground text-right text-xs font-semibold\">Revenue / Visitor</th>\n                  <th ui-table-head class=\"text-foreground text-right text-xs font-semibold\">Statistical Verdict</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (variant of variants; track variant.id) {\n                  <tr ui-table-row [class]=\"variantRowClass(variant)\">\n                    <!-- Variant Name & Description -->\n                    <td ui-table-cell class=\"py-4\">\n                      <div class=\"flex items-start gap-2.5\">\n                        <div [class]=\"variantMarkClass(variant)\">{{ variant.code === 'Variant A' ? 'A' : 'B' }}</div>\n                        <div class=\"space-y-0.5\">\n                          <div class=\"flex items-center gap-1.5\">\n                            <span class=\"text-foreground text-sm font-semibold\">{{ variant.code }}</span>\n                            <span\n                              ui-badge\n                              [variant]=\"variant.isWinner ? 'success' : 'secondary'\"\n                              class=\"text-xs font-medium\"\n                            >\n                              {{ variant.type }}\n                            </span>\n                          </div>\n                          <p class=\"text-foreground text-xs font-medium\">{{ variant.title }}</p>\n                          <p class=\"text-muted-foreground text-xs\">{{ variant.description }}</p>\n                        </div>\n                      </div>\n                    </td>\n\n                    <!-- Traffic Split -->\n                    <td ui-table-cell class=\"py-4 align-middle\">\n                      <div class=\"space-y-1\">\n                        <div class=\"flex items-center gap-1.5\">\n                          <span class=\"text-foreground text-sm font-semibold tabular-nums\">{{ variant.split }}</span>\n                          <span class=\"text-muted-foreground text-xs\">allocation</span>\n                        </div>\n                        <p class=\"text-muted-foreground text-xs tabular-nums\">{{ variant.visitors }} visitors</p>\n                      </div>\n                    </td>\n\n                    <!-- Conversions -->\n                    <td ui-table-cell class=\"py-4 text-right align-middle\">\n                      <div class=\"space-y-0.5\">\n                        <span class=\"text-foreground text-sm font-bold tabular-nums\">{{ variant.conversions }}</span>\n                        <p class=\"text-muted-foreground text-xs\">completed checkouts</p>\n                      </div>\n                    </td>\n\n                    <!-- Conversion Rate -->\n                    <td ui-table-cell class=\"py-4 text-right align-middle\">\n                      <div class=\"flex flex-col items-end gap-1\">\n                        <span [class]=\"conversionRateClass(variant)\">{{ variant.conversionRate }}</span>\n                        <span\n                          ui-badge\n                          [variant]=\"variant.rateBadgeVariant\"\n                          class=\"gap-1 text-xs font-medium tabular-nums\"\n                        >\n                          @if (variant.isWinner) {\n                            <lucide-icon [img]=\"TrendingUp\" class=\"size-3\" aria-hidden=\"true\" />\n                          }\n                          <span>{{ variant.rateBadge }}</span>\n                        </span>\n                      </div>\n                    </td>\n\n                    <!-- Revenue per Visitor -->\n                    <td ui-table-cell class=\"py-4 text-right align-middle\">\n                      <div class=\"space-y-0.5\">\n                        <span [class]=\"revenueClass(variant)\">{{ variant.revenuePerVisitor }}</span>\n                        @if (variant.revenueDelta) {\n                          <p class=\"text-success text-success text-xs font-semibold tabular-nums\">\n                            {{ variant.revenueDelta }}\n                          </p>\n                        } @else {\n                          <p class=\"text-muted-foreground text-xs tabular-nums\">{{ variant.totalRevenue }}</p>\n                        }\n                      </div>\n                    </td>\n\n                    <!-- Statistical Verdict -->\n                    <td ui-table-cell class=\"py-4 text-right align-middle\">\n                      <div class=\"flex flex-col items-end gap-1\">\n                        <span ui-badge [variant]=\"variant.verdictVariant\" [class]=\"verdictBadgeClass(variant)\">\n                          @if (variant.isWinner) {\n                            <lucide-icon [img]=\"Trophy\" class=\"text-success size-3.5\" aria-hidden=\"true\" />\n                          } @else {\n                            <lucide-icon\n                              [img]=\"CheckCircle2\"\n                              class=\"text-muted-foreground size-3.5\"\n                              aria-hidden=\"true\"\n                            />\n                          }\n                          <span>{{ variant.verdict }}</span>\n                        </span>\n                      </div>\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Conversion Funnel Step Drop-off Comparison Card -->\n      <div ui-card class=\"border-border bg-card shadow-xs\">\n        <div ui-card-header class=\"pb-4\">\n          <div class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <div class=\"flex items-center gap-2\">\n                <h3 ui-card-title class=\"text-foreground text-base font-semibold\">\n                  Conversion Funnel Step Drop-off Comparison\n                </h3>\n                <span ui-badge variant=\"secondary\" class=\"text-xs\">4-Stage Funnel</span>\n              </div>\n              <p ui-card-description class=\"mt-1 text-xs\">\n                Direct comparison of drop-off, progression, and conversion retention between Control and Challenger at\n                each step.\n              </p>\n            </div>\n\n            <!-- Legend -->\n            <div class=\"flex flex-wrap items-center gap-4 text-xs\">\n              <div class=\"flex items-center gap-1.5\">\n                <span class=\"border-border bg-muted-foreground/30 size-3 rounded-xs border\"></span>\n                <span class=\"text-muted-foreground\">Variant A (Control)</span>\n              </div>\n              <div class=\"flex items-center gap-1.5\">\n                <span class=\"bg-success size-3 rounded-xs\"></span>\n                <span class=\"text-foreground font-medium\">Variant B (Challenger)</span>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div ui-card-content class=\"space-y-6\">\n          <div class=\"grid grid-cols-1 gap-4\">\n            @for (step of funnelSteps; track step.id) {\n              <div class=\"border-border bg-card/60 hover:bg-muted/10 rounded-lg border p-4 shadow-xs transition-colors\">\n                <div class=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n                  <!-- Step Meta -->\n                  <div class=\"flex items-start gap-3 lg:w-1/3\">\n                    <div\n                      class=\"border-border bg-muted/50 text-foreground flex size-9 shrink-0 items-center justify-center rounded-md border shadow-xs\"\n                    >\n                      <lucide-icon [img]=\"step.icon\" class=\"size-4\" aria-hidden=\"true\" />\n                    </div>\n                    <div class=\"space-y-0.5\">\n                      <div class=\"flex items-center gap-2\">\n                        <span class=\"text-muted-foreground font-mono text-xs font-bold\"\n                          >STEP {{ step.stepNumber }}</span\n                        >\n                        <span class=\"text-foreground text-sm font-semibold\">{{ step.name }}</span>\n                      </div>\n                      <p class=\"text-muted-foreground text-xs\">{{ step.description }}</p>\n                    </div>\n                  </div>\n\n                  <!-- Comparative Bars -->\n                  <div class=\"space-y-2 lg:w-1/2\">\n                    <!-- Variant A (Control) Bar -->\n                    <div class=\"space-y-1\">\n                      <div class=\"text-muted-foreground flex items-center justify-between text-xs\">\n                        <span class=\"flex items-center gap-1.5\">\n                          <span class=\"text-foreground font-medium\">Control:</span>\n                          <span class=\"tabular-nums\">{{ step.control.count }} visitors</span>\n                        </span>\n                        <span class=\"font-mono font-medium tabular-nums\">{{ step.control.rate }}</span>\n                      </div>\n                      <div class=\"bg-muted h-2 w-full overflow-hidden rounded-full\">\n                        <div\n                          class=\"bg-muted-foreground/40 h-full rounded-full transition-[width] duration-300\"\n                          [style.width.%]=\"step.control.progress\"\n                        ></div>\n                      </div>\n                    </div>\n\n                    <!-- Variant B (Challenger) Bar -->\n                    <div class=\"space-y-1\">\n                      <div class=\"flex items-center justify-between text-xs\">\n                        <span class=\"flex items-center gap-1.5\">\n                          <span class=\"text-foreground font-medium\">Challenger:</span>\n                          <span class=\"text-foreground font-semibold tabular-nums\"\n                            >{{ step.challenger.count }} visitors</span\n                          >\n                        </span>\n                        <span class=\"text-success text-success font-mono font-bold tabular-nums\">\n                          {{ step.challenger.rate }}\n                        </span>\n                      </div>\n                      <div class=\"bg-muted h-2 w-full overflow-hidden rounded-full\">\n                        <div\n                          class=\"bg-success h-full rounded-full transition-[width] duration-300\"\n                          [style.width.%]=\"step.challenger.progress\"\n                        ></div>\n                      </div>\n                    </div>\n                  </div>\n\n                  <!-- Step Lift Badge & Insight -->\n                  <div class=\"flex flex-col items-start gap-1 lg:w-1/6 lg:items-end\">\n                    <span ui-badge [variant]=\"step.isPositive ? 'success' : 'secondary'\" [class]=\"stepDeltaClass(step)\">\n                      @if (step.isPositive) {\n                        <lucide-icon [img]=\"TrendingUp\" class=\"size-3\" aria-hidden=\"true\" />\n                      }\n                      <span>{{ step.delta }}</span>\n                    </span>\n                    <span class=\"text-muted-foreground text-left text-xs tabular-nums lg:text-right\">\n                      {{ step.challenger.retention }}\n                    </span>\n                  </div>\n                </div>\n\n                <!-- Bottom micro insight -->\n                <div\n                  class=\"border-border/60 bg-muted/20 text-muted-foreground mt-3 flex items-center gap-2 rounded-md border px-3 py-1.5 text-xs\"\n                >\n                  <span class=\"text-foreground shrink-0 font-medium\">Stage Note:</span>\n                  <span class=\"leading-relaxed\">{{ step.insight }}</span>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n\n      <!-- Guardrails & Quality Verification Footer -->\n      <div ui-card class=\"border-border bg-card shadow-xs\">\n        <div ui-card-header class=\"pb-3\">\n          <div class=\"flex items-center gap-2\">\n            <h3 ui-card-title class=\"text-foreground text-base font-semibold\">\n              Statistical Guardrails &amp; Health Checks\n            </h3>\n            <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">Integrity Verified</span>\n          </div>\n          <p ui-card-description class=\"text-xs\">\n            Automatic telemetry assertions verifying sample validity, statistical power, and site performance.\n          </p>\n        </div>\n        <div ui-card-content>\n          <div class=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n            @for (guard of guardrails; track guard.id) {\n              <div\n                class=\"border-border bg-card/60 hover:bg-muted/10 flex flex-col justify-between rounded-lg border p-4 shadow-xs transition-colors\"\n              >\n                <div class=\"space-y-2.5\">\n                  <div class=\"flex items-center justify-between\">\n                    <div\n                      class=\"border-border bg-muted/50 text-foreground flex size-8 items-center justify-center rounded-md border shadow-xs\"\n                    >\n                      <lucide-icon [img]=\"guard.icon\" class=\"size-4\" aria-hidden=\"true\" />\n                    </div>\n                    <span ui-badge [variant]=\"guard.badgeVariant\" class=\"text-xs font-medium\">{{ guard.status }}</span>\n                  </div>\n                  <div class=\"space-y-1\">\n                    <h4 class=\"text-foreground text-sm font-semibold\">{{ guard.title }}</h4>\n                    <p class=\"text-success text-success font-mono text-xs font-semibold tabular-nums\">\n                      {{ guard.value }}\n                    </p>\n                    <p class=\"text-muted-foreground text-xs leading-relaxed\">{{ guard.description }}</p>\n                  </div>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiAbTestVariantResultsComponent {\n  @Input() title = 'Checkout Flow: Multi-Step vs Single-Page'\n  @Input() experimentId = 'EXP-1082'\n  @Input() duration = 'Running for 14 days · 48,290 visitors'\n  @Input('class') className?: string\n\n  readonly isPaused = signal(false)\n  readonly isWinnerDeclared = signal(false)\n\n  protected readonly primaryMetrics = primaryMetrics\n  protected readonly variants = variants\n  protected readonly funnelSteps = funnelSteps\n  protected readonly guardrails = guardrails\n\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Pause = Pause\n  protected readonly Play = Play\n  protected readonly TrendingUp = TrendingUp\n  protected readonly Trophy = Trophy\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  handleDeclareWinner(): void {\n    this.isWinnerDeclared.set(true)\n    this.isPaused.set(true)\n  }\n\n  togglePause(): void {\n    this.isPaused.update((prev) => !prev)\n  }\n\n  protected metricCardClass(metric: AbTestPrimaryMetric): string {\n    return cn(\n      'border-border bg-card hover:border-border/80 shadow-xs transition-colors',\n      metric.highlight && 'border-success/30 bg-success/[0.02] dark:bg-success/10]',\n    )\n  }\n\n  protected metricValueClass(metric: AbTestPrimaryMetric): string {\n    return cn(\n      'text-2xl font-bold tracking-tight tabular-nums sm:text-3xl',\n      metric.highlight ? 'text-success' : 'text-foreground',\n    )\n  }\n\n  protected variantRowClass(variant: AbTestVariant): string {\n    return cn(\n      'border-border transition-colors',\n      variant.isWinner ? 'bg-success/[0.04] hover:bg-success/[0.08] bg-success/[0.07]' : 'hover:bg-muted/30',\n    )\n  }\n\n  protected variantMarkClass(variant: AbTestVariant): string {\n    return cn(\n      'flex size-7 shrink-0 items-center justify-center rounded-md text-xs font-bold shadow-xs',\n      variant.isWinner ? 'bg-success text-white' : 'border-border bg-muted text-muted-foreground border',\n    )\n  }\n\n  protected conversionRateClass(variant: AbTestVariant): string {\n    return cn('text-sm font-bold tabular-nums', variant.isWinner ? 'text-success text-base' : 'text-foreground')\n  }\n\n  protected revenueClass(variant: AbTestVariant): string {\n    return cn('text-sm font-bold tabular-nums', variant.isWinner ? 'text-success' : 'text-foreground')\n  }\n\n  protected verdictBadgeClass(variant: AbTestVariant): string {\n    return cn(\n      'gap-1.5 py-1 text-xs font-semibold tabular-nums',\n      variant.isWinner && 'border-success/30 bg-success/15 text-success',\n    )\n  }\n\n  protected stepDeltaClass(step: AbTestFunnelStep): string {\n    return cn(\n      'gap-1 text-xs font-semibold tabular-nums',\n      step.isPositive && 'border-success/30 bg-success/15 text-success',\n    )\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/ab-test-variant-results/ab-test-variant-results.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/ab-test-variant-results/index.ts",
      "content": "export {\n  UiAbTestVariantResultsComponent,\n  type AbTestPrimaryMetric,\n  type AbTestVariant,\n  type AbTestFunnelArm,\n  type AbTestFunnelStep,\n  type AbTestGuardrail,\n} from './ab-test-variant-results.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/ab-test-variant-results/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/table.json"
  ],
  "description": "Optimizely and Statsig style A/B test statistical significance scorecard and conversion delta comparison. Features experiment status header, 4 primary experiment metrics cards, variants comparison table with statistical verdicts, and conversion funnel step drop-off comparison.",
  "categories": [
    "analytics",
    "marketing",
    "dashboard"
  ]
}