{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "order-confirmation",
  "title": "Order Confirmation",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/order-confirmation/order-confirmation.component.ts",
      "content": "// Post-purchase order confirmation & tracking page: success banner, 4-step shipment\n// stepper (grid on md+, vertical list below), itemized summary, and delivery / payment /\n// help cards. The order data lives in the constants below -- edit them in place.\nimport { Component, Input, ChangeDetectionStrategy } from '@angular/core'\nimport {\n  Check,\n  CheckCircle2,\n  CreditCard,\n  Download,\n  ExternalLink,\n  HelpCircle,\n  LucideAngularModule,\n  Mail,\n  MapPin,\n  MessageSquare,\n  Package,\n  Truck,\n} from 'lucide-angular'\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 { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport { cn } from '@/lib/utils'\n\nexport interface OrderItem {\n  id: string\n  name: string\n  variant: string\n  quantity: number\n  price: string\n  image: string\n}\n\nexport interface TrackingStep {\n  id: string\n  title: string\n  date: string\n  status: 'completed' | 'current' | 'upcoming'\n  description: string\n}\n\nconst orderItems: OrderItem[] = [\n  {\n    id: 'item-1',\n    name: 'Studio Wireless Noise-Canceling Headphones',\n    variant: 'Space Gray • Over-Ear',\n    quantity: 1,\n    price: '$179.00',\n    image: 'https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=160&auto=format&fit=crop&q=80',\n  },\n  {\n    id: 'item-2',\n    name: 'Braided USB-C Fast Charging Cable (2m)',\n    variant: 'Midnight Black • 100W PD',\n    quantity: 2,\n    price: '$38.00',\n    image: 'https://images.unsplash.com/photo-1546868871-7041f2a55e12?w=160&auto=format&fit=crop&q=80',\n  },\n  {\n    id: 'item-3',\n    name: 'Magnetic Aluminum Desk Stand',\n    variant: 'Silver • Anodized Aluminum',\n    quantity: 1,\n    price: '$35.00',\n    image: 'https://images.unsplash.com/photo-1586105251261-72a756497a11?w=160&auto=format&fit=crop&q=80',\n  },\n]\n\nconst trackingSteps: TrackingStep[] = [\n  {\n    id: 'step-1',\n    title: 'Order Placed',\n    date: 'Aug 21, 2026 • 10:42 AM',\n    status: 'completed',\n    description: 'Payment authorized & order confirmed',\n  },\n  {\n    id: 'step-2',\n    title: 'Processing',\n    date: 'Aug 22, 2026 • 02:15 PM',\n    status: 'completed',\n    description: 'Item picked & packed at warehouse',\n  },\n  {\n    id: 'step-3',\n    title: 'Shipped',\n    date: 'Aug 23, 2026 • 09:30 AM',\n    status: 'current',\n    description: 'In transit via FedEx Priority • Chicago, IL',\n  },\n  {\n    id: 'step-4',\n    title: 'Delivered',\n    date: 'Est. Aug 27, 2026',\n    status: 'upcoming',\n    description: 'Estimated delivery to front door',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-order-confirmation, [ui-order-confirmation]',\n  standalone: true,\n  host: {\n    'data-slot': 'order-confirmation',\n    '[class]': 'hostClass',\n  },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiCardDescriptionComponent,\n    UiCardContentComponent,\n    UiSeparatorComponent,\n  ],\n  template: `\n    <!-- Success Banner Card -->\n    <div ui-card class=\"border shadow-xs\">\n      <div ui-card-content class=\"flex flex-col items-center p-6 text-center sm:p-10\">\n        <div\n          class=\"bg-success/10 text-success ring-success/10 relative flex size-16 items-center justify-center rounded-full ring-8 sm:size-20\"\n        >\n          <lucide-icon [img]=\"CheckCircle2\" class=\"size-8 sm:size-10\" aria-hidden=\"true\" />\n        </div>\n\n        <div class=\"mt-6 max-w-xl space-y-2\">\n          <div\n            class=\"border-success/20 bg-success/10 text-success inline-flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-medium\"\n          >\n            <span class=\"bg-success size-1.5 rounded-full\"></span>\n            Order Confirmed\n          </div>\n          <h1 class=\"text-foreground text-2xl font-bold tracking-tight sm:text-3xl\">Thank you for your order!</h1>\n          <p class=\"text-muted-foreground text-sm sm:text-base\">\n            We've received your order <span class=\"text-foreground font-mono font-semibold\">#ORD-92841</span> and sent a\n            confirmation email to <span class=\"text-foreground font-medium\">customer&#64;example.com</span>.\n          </p>\n        </div>\n\n        <div class=\"mt-8 flex flex-wrap items-center justify-center gap-3\">\n          <button ui-button class=\"gap-2 shadow-xs\">\n            <lucide-icon [img]=\"ExternalLink\" class=\"size-4\" aria-hidden=\"true\" />\n            Track Shipment\n          </button>\n          <button ui-button aria-label=\"Download attachment\" variant=\"outline\" class=\"gap-2 shadow-xs\">\n            <lucide-icon [img]=\"Download\" class=\"size-4\" aria-hidden=\"true\" />\n            Download Receipt\n          </button>\n          <button ui-button variant=\"ghost\" class=\"text-muted-foreground hover:text-foreground\">\n            Continue Shopping\n          </button>\n        </div>\n      </div>\n    </div>\n\n    <!-- Tracking Stepper Card -->\n    <div ui-card class=\"border shadow-xs\">\n      <div ui-card-header class=\"flex flex-col gap-3 pb-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex items-center gap-2\">\n            <lucide-icon [img]=\"Truck\" class=\"text-primary size-4\" aria-hidden=\"true\" />\n            <h3 ui-card-title class=\"text-base font-semibold\">Shipment Progress</h3>\n            <span ui-badge variant=\"secondary\" class=\"bg-primary/10 text-primary text-xs font-medium\">In Transit</span>\n          </div>\n          <p class=\"text-muted-foreground text-xs\">\n            Carrier: <span class=\"text-foreground font-medium\">FedEx Priority</span> • Tracking:\n            <span class=\"text-foreground font-mono font-medium\">#FX-9821734910</span>\n          </p>\n        </div>\n        <div class=\"border-border/80 bg-muted/40 rounded-lg border px-3 py-1.5 text-xs\">\n          <span class=\"text-muted-foreground\">Estimated Delivery:</span>\n          <span class=\"text-foreground ml-1 font-semibold\">Thursday, Aug 27, 2026</span>\n        </div>\n      </div>\n      <div ui-card-content class=\"pt-4\">\n        <!-- Desktop Stepper (md+) -->\n        <div class=\"hidden md:block\">\n          <div class=\"grid grid-cols-4 gap-4\">\n            @for (step of trackingSteps; track step.id; let idx = $index, last = $last) {\n              <div class=\"relative flex flex-col\">\n                <div class=\"relative flex items-center\">\n                  <!-- Connecting Line before current step -->\n                  @if (idx > 0) {\n                    <div\n                      class=\"absolute top-1/2 right-1/2 -z-0 h-0.5 w-full -translate-y-1/2\"\n                      [class.bg-muted]=\"step.status === 'upcoming'\"\n                      [class.bg-primary]=\"step.status !== 'upcoming'\"\n                    ></div>\n                  }\n\n                  <!-- Connecting Line after current step -->\n                  @if (!last) {\n                    <div\n                      class=\"absolute top-1/2 left-1/2 -z-0 h-0.5 w-full -translate-y-1/2\"\n                      [class.bg-muted]=\"nextIsUpcoming(idx)\"\n                      [class.bg-primary]=\"!nextIsUpcoming(idx)\"\n                    ></div>\n                  }\n\n                  <!-- Step Indicator Circle -->\n                  <div class=\"relative z-10 mx-auto flex items-center justify-center\">\n                    @switch (step.status) {\n                      @case ('completed') {\n                        <div\n                          class=\"bg-primary text-primary-foreground ring-background flex size-8 items-center justify-center rounded-full ring-4\"\n                        >\n                          <lucide-icon [img]=\"Check\" class=\"size-4\" aria-hidden=\"true\" />\n                        </div>\n                      }\n                      @case ('current') {\n                        <div\n                          class=\"border-primary bg-background text-primary ring-background flex size-8 items-center justify-center rounded-full border-2 ring-4\"\n                        >\n                          <span class=\"relative flex size-2.5\">\n                            <span class=\"bg-primary absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                            <span class=\"bg-primary relative inline-flex size-2.5 rounded-full\"></span>\n                          </span>\n                        </div>\n                      }\n                      @default {\n                        <div\n                          class=\"border-muted-foreground/30 bg-muted/40 text-muted-foreground ring-background flex size-8 items-center justify-center rounded-full border-2 ring-4\"\n                        >\n                          <lucide-icon [img]=\"Package\" class=\"size-3.5\" aria-hidden=\"true\" />\n                        </div>\n                      }\n                    }\n                  </div>\n                </div>\n\n                <!-- Step Info -->\n                <div class=\"mt-3 text-center\">\n                  <p\n                    class=\"text-sm font-semibold\"\n                    [class.text-muted-foreground]=\"step.status === 'upcoming'\"\n                    [class.text-foreground]=\"step.status !== 'upcoming'\"\n                  >\n                    {{ step.title }}\n                  </p>\n                  <p class=\"text-muted-foreground mt-0.5 text-xs tabular-nums\">{{ step.date }}</p>\n                  <p class=\"text-muted-foreground/80 mt-0.5 text-xs\">{{ step.description }}</p>\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n\n        <!-- Mobile Stepper (< md) -->\n        <div class=\"space-y-4 md:hidden\">\n          @for (step of trackingSteps; track step.id; let idx = $index, last = $last) {\n            <div class=\"flex items-start gap-3\">\n              <div class=\"flex flex-col items-center\">\n                @switch (step.status) {\n                  @case ('completed') {\n                    <div\n                      class=\"bg-primary text-primary-foreground flex size-7 shrink-0 items-center justify-center rounded-full\"\n                    >\n                      <lucide-icon [img]=\"Check\" class=\"size-3.5\" aria-hidden=\"true\" />\n                    </div>\n                  }\n                  @case ('current') {\n                    <div\n                      class=\"border-primary bg-background text-primary flex size-7 shrink-0 items-center justify-center rounded-full border-2\"\n                    >\n                      <span class=\"relative flex size-2\">\n                        <span class=\"bg-primary absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                        <span class=\"bg-primary relative inline-flex size-2 rounded-full\"></span>\n                      </span>\n                    </div>\n                  }\n                  @default {\n                    <div\n                      class=\"border-muted-foreground/30 bg-muted/40 text-muted-foreground flex size-7 shrink-0 items-center justify-center rounded-full border-2\"\n                    >\n                      <lucide-icon [img]=\"Package\" class=\"size-3\" aria-hidden=\"true\" />\n                    </div>\n                  }\n                }\n\n                @if (!last) {\n                  <div\n                    class=\"mt-1 h-8 w-0.5\"\n                    [class.bg-muted]=\"nextIsUpcoming(idx)\"\n                    [class.bg-primary]=\"!nextIsUpcoming(idx)\"\n                  ></div>\n                }\n              </div>\n\n              <div class=\"min-w-0 flex-1 pt-0.5 pb-2\">\n                <div class=\"flex items-center justify-between gap-2\">\n                  <p\n                    class=\"text-sm font-semibold\"\n                    [class.text-muted-foreground]=\"step.status === 'upcoming'\"\n                    [class.text-foreground]=\"step.status !== 'upcoming'\"\n                  >\n                    {{ step.title }}\n                  </p>\n                  <span class=\"text-muted-foreground text-xs tabular-nums\">{{ step.date }}</span>\n                </div>\n                <p class=\"text-muted-foreground mt-0.5 text-xs\">{{ step.description }}</p>\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    </div>\n\n    <!-- 2-Column Details Grid -->\n    <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n      <!-- Left Column: Itemized Order Summary -->\n      <div class=\"lg:col-span-7\">\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-4\">\n            <h3 ui-card-title class=\"text-base font-semibold\">Order Summary</h3>\n            <p ui-card-description>3 items in shipment</p>\n          </div>\n          <div ui-card-content class=\"space-y-6\">\n            <!-- Items list -->\n            <div class=\"space-y-4\">\n              @for (item of orderItems; track item.id) {\n                <div class=\"flex items-center gap-4\">\n                  <div class=\"border-border bg-muted/40 relative size-16 shrink-0 overflow-hidden rounded-lg border\">\n                    <img [src]=\"item.image\" [alt]=\"item.name\" class=\"h-full w-full object-cover\" />\n                  </div>\n                  <div class=\"min-w-0 flex-1\">\n                    <p class=\"text-foreground truncate text-sm font-medium\">{{ item.name }}</p>\n                    <p class=\"text-muted-foreground text-xs\">{{ item.variant }}</p>\n                    <p class=\"text-muted-foreground mt-1 text-xs\">Qty: {{ item.quantity }}</p>\n                  </div>\n                  <div class=\"text-right\">\n                    <p class=\"text-foreground text-sm font-semibold tabular-nums\">{{ item.price }}</p>\n                  </div>\n                </div>\n              }\n            </div>\n\n            <div ui-separator></div>\n\n            <!-- Cost breakdown -->\n            <div class=\"space-y-2 text-sm\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Subtotal</span>\n                <span class=\"text-foreground font-medium tabular-nums\">$252.00</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Shipping (FedEx Priority)</span>\n                <span class=\"text-success font-medium tabular-nums\">Free</span>\n              </div>\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-muted-foreground\">Estimated Tax</span>\n                <span class=\"text-foreground font-medium tabular-nums\">$12.50</span>\n              </div>\n            </div>\n\n            <div ui-separator></div>\n\n            <!-- Total -->\n            <div class=\"flex items-center justify-between\">\n              <span class=\"text-foreground text-base font-semibold\">Total</span>\n              <span class=\"text-foreground text-xl font-bold tabular-nums sm:text-2xl\">$264.50</span>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Right Column: Customer & Delivery Details -->\n      <div class=\"space-y-6 lg:col-span-5\">\n        <!-- Shipping Address Card -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center gap-2\">\n              <lucide-icon [img]=\"MapPin\" class=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n              <h3 ui-card-title class=\"text-base font-semibold\">Shipping Address</h3>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 text-sm\">\n            <div class=\"space-y-0.5\">\n              <p class=\"text-foreground font-medium\">Alex Morgan</p>\n              <p class=\"text-muted-foreground\">742 Evergreen Terrace, Suite 4B</p>\n              <p class=\"text-muted-foreground\">Springfield, OR 97477</p>\n              <p class=\"text-muted-foreground\">United States</p>\n              <p class=\"text-muted-foreground mt-1 text-xs\">+1 (555) 234-5678</p>\n            </div>\n            <div class=\"border-border bg-muted/30 rounded-md border p-2.5 text-xs\">\n              <span class=\"text-muted-foreground\">Delivery Method:</span>\n              <span class=\"text-foreground ml-1 font-medium\">FedEx Priority Express</span>\n            </div>\n          </div>\n        </div>\n\n        <!-- Payment Method Card -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center gap-2\">\n              <lucide-icon [img]=\"CreditCard\" class=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n              <h3 ui-card-title class=\"text-base font-semibold\">Payment Method</h3>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 text-sm\">\n            <div class=\"flex items-center justify-between\">\n              <div class=\"flex items-center gap-2.5\">\n                <div\n                  class=\"border-border bg-muted/40 text-foreground flex h-7 w-11 items-center justify-center rounded border font-mono text-xs font-bold\"\n                >\n                  VISA\n                </div>\n                <div>\n                  <p class=\"text-foreground text-sm font-medium\">Visa ending in 4242</p>\n                  <p class=\"text-muted-foreground text-xs\">Expires 08/29</p>\n                </div>\n              </div>\n              <span ui-badge variant=\"secondary\" class=\"bg-success/10 text-success\">Paid</span>\n            </div>\n            <p class=\"text-muted-foreground text-xs\">Billing address matches shipping address</p>\n          </div>\n        </div>\n\n        <!-- Need Help Card -->\n        <div ui-card class=\"border shadow-xs\">\n          <div ui-card-header class=\"pb-3\">\n            <div class=\"flex items-center gap-2\">\n              <lucide-icon [img]=\"HelpCircle\" class=\"text-muted-foreground size-4\" aria-hidden=\"true\" />\n              <h3 ui-card-title class=\"text-base font-semibold\">Need Help?</h3>\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-3 text-sm\">\n            <p class=\"text-muted-foreground text-xs\">\n              Questions about your order? Chat with support or email support&#64;example.com.\n            </p>\n            <div class=\"space-y-2 pt-1\">\n              <button ui-button variant=\"outline\" size=\"sm\" class=\"w-full justify-start gap-2 text-xs shadow-xs\">\n                <lucide-icon [img]=\"MessageSquare\" class=\"size-3.5\" aria-hidden=\"true\" />\n                Chat with Support\n              </button>\n              <button\n                ui-button\n                variant=\"ghost\"\n                size=\"sm\"\n                class=\"text-muted-foreground hover:text-foreground w-full justify-start gap-2 text-xs\"\n              >\n                <lucide-icon [img]=\"Mail\" class=\"size-3.5\" aria-hidden=\"true\" />\n                support&#64;example.com\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiOrderConfirmationComponent {\n  @Input('class') className?: string\n\n  protected readonly orderItems = orderItems\n  protected readonly trackingSteps = trackingSteps\n\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly CreditCard = CreditCard\n  protected readonly Download = Download\n  protected readonly ExternalLink = ExternalLink\n  protected readonly HelpCircle = HelpCircle\n  protected readonly Mail = Mail\n  protected readonly MapPin = MapPin\n  protected readonly MessageSquare = MessageSquare\n  protected readonly Package = Package\n  protected readonly Truck = Truck\n\n  get hostClass(): string {\n    return cn('block w-full space-y-6', this.className)\n  }\n\n  /** The connector into step `idx + 1` is muted while that step is still upcoming. */\n  protected nextIsUpcoming(idx: number): boolean {\n    return trackingSteps[idx + 1]?.status === 'upcoming'\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/order-confirmation/order-confirmation.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/order-confirmation/index.ts",
      "content": "export { UiOrderConfirmationComponent, type OrderItem, type TrackingStep } from './order-confirmation.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/order-confirmation/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/separator.json"
  ],
  "description": "Post-purchase order confirmation & tracking page featuring a success banner with emerald checkmark halo, 4-step shipment progress bar with pulsing active state, itemized order breakdown, and customer delivery & payment cards.",
  "categories": [
    "commerce",
    "ecommerce"
  ]
}