{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "order-confirmation",
  "title": "Order Confirmation",
  "type": "registry:block",
  "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"
  ],
  "files": [
    {
      "path": "packages/elements-lit/src/blocks/order-confirmation/order-confirmation.ts",
      "content": "import { LitElement, css, html } from 'lit'\nimport {\n  Check,\n  CheckCircle2,\n  CreditCard,\n  Download,\n  ExternalLink,\n  HelpCircle,\n  Mail,\n  MapPin,\n  MessageSquare,\n  Package,\n  Truck,\n} from 'lucide'\nimport { cn } from '../../lib/utils'\nimport { tailwind } from '../../lib/styles'\nimport { ThemeController } from '../../lib/theme'\nimport { icon } from '../../lib/icon'\n// Side-effect imports: register the composed elements for standalone use\n// (consumers who install only this block still get working primitives).\nimport '../../components/badge/badge'\nimport '../../components/button/button'\nimport '../../components/card/card'\nimport '../../components/separator/separator'\n\ninterface OrderItem {\n  id: string\n  name: string\n  variant: string\n  quantity: number\n  price: string\n  image: string\n}\n\ninterface 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/**\n * <uip-order-confirmation> — the registry OrderConfirmation block as a web component.\n *\n * Class strings and sample data are React's verbatim. The block is fully\n * static (React holds no state): success banner, desktop + mobile tracking\n * stepper, itemized summary with cost breakdown, and shipping / payment /\n * help cards. No props, no events.\n */\nexport class UipOrderConfirmation extends LitElement {\n  static shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true }\n  // :host display can't be a utility class (the host has no template of its own).\n  static styles = [tailwind, css`:host { display: block; }`]\n\n  constructor() {\n    super()\n    new ThemeController(this)\n  }\n\n  connectedCallback() {\n    super.connectedCallback()\n    this.setAttribute('data-uipkge', '')\n    this.setAttribute('data-slot', 'order-confirmation')\n  }\n\n  render() {\n    return html`\n      <div data-slot=\"order-confirmation\" class=\"w-full space-y-6\">\n        <uip-card class=\"border shadow-xs\">\n          <uip-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 text-success relative flex size-16 items-center justify-center rounded-full ring-8 sm:size-20\"\n            >\n              ${icon(CheckCircle2, 'circle-check', 'size-8 sm:size-10')}\n            </div>\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&apos;ve received your order <span class=\"text-foreground font-mono font-semibold\">#ORD-92841</span> and\n                sent a confirmation email to <span class=\"text-foreground font-medium\">customer@example.com</span>.\n              </p>\n            </div>\n            <div class=\"mt-8 flex flex-wrap items-center justify-center gap-3\">\n              <uip-button class=\"gap-2 shadow-xs\">\n                ${icon(ExternalLink, 'external-link', 'size-4')} Track Shipment\n              </uip-button>\n              <uip-button aria-label=\"Download attachment\" variant=\"outline\" class=\"gap-2 shadow-xs\">\n                ${icon(Download, 'download', 'size-4')} Download Receipt\n              </uip-button>\n              <uip-button variant=\"ghost\" class=\"text-muted-foreground hover:text-foreground\">Continue Shopping</uip-button>\n            </div>\n          </uip-card-content>\n        </uip-card>\n\n        <uip-card class=\"border shadow-xs\">\n          <uip-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                ${icon(Truck, 'truck', 'text-primary size-4')}\n                <uip-card-title class=\"text-base font-semibold\">Shipment Progress</uip-card-title>\n                <uip-badge variant=\"secondary\" class=\"bg-primary/10 text-primary text-xs font-medium\">In Transit</uip-badge>\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          </uip-card-header>\n          <uip-card-content class=\"pt-4\">\n            <div class=\"hidden md:block\">\n              <div class=\"grid grid-cols-4 gap-4\">\n                ${trackingSteps.map(\n                  (step, idx) => html`<div class=\"relative flex flex-col\">\n                    <div class=\"relative flex items-center\">\n                      ${idx > 0\n                        ? html`<div\n                            class=${cn(\n                              'absolute top-1/2 right-1/2 -z-0 h-0.5 w-full -translate-y-1/2',\n                              step.status === 'upcoming' ? 'bg-muted' : 'bg-primary',\n                            )}\n                          ></div>`\n                        : html``}\n                      ${idx < trackingSteps.length - 1\n                        ? html`<div\n                            class=${cn(\n                              'absolute top-1/2 left-1/2 -z-0 h-0.5 w-full -translate-y-1/2',\n                              trackingSteps[idx + 1]?.status === 'upcoming' ? 'bg-muted' : 'bg-primary',\n                            )}\n                          ></div>`\n                        : html``}\n                      <div class=\"relative z-10 mx-auto flex items-center justify-center\">\n                        ${step.status === 'completed'\n                          ? html`<div\n                              class=\"bg-primary text-primary-foreground ring-background flex size-8 items-center justify-center rounded-full ring-4\"\n                            >\n                              ${icon(Check, 'check', 'size-4')}\n                            </div>`\n                          : step.status === 'current'\n                            ? html`<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                            : html`<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                                ${icon(Package, 'package', 'size-3.5')}\n                              </div>`}\n                      </div>\n                    </div>\n                    <div class=\"mt-3 text-center\">\n                      <p class=${cn('text-sm font-semibold', step.status === 'upcoming' ? 'text-muted-foreground' : 'text-foreground')}>\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            <div class=\"space-y-4 md:hidden\">\n              ${trackingSteps.map(\n                (step, idx) => html`<div class=\"flex items-start gap-3\">\n                  <div class=\"flex flex-col items-center\">\n                    ${step.status === 'completed'\n                      ? html`<div class=\"bg-primary text-primary-foreground flex size-7 shrink-0 items-center justify-center rounded-full\">\n                          ${icon(Check, 'check', 'size-3.5')}\n                        </div>`\n                      : step.status === 'current'\n                        ? html`<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                        : html`<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                            ${icon(Package, 'package', 'size-3')}\n                          </div>`}\n                    ${idx < trackingSteps.length - 1\n                      ? html`<div\n                          class=${cn(\n                            'mt-1 h-8 w-0.5',\n                            trackingSteps[idx + 1]?.status === 'upcoming' ? 'bg-muted' : 'bg-primary',\n                          )}\n                        ></div>`\n                      : html``}\n                  </div>\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 class=${cn('text-sm font-semibold', step.status === 'upcoming' ? 'text-muted-foreground' : 'text-foreground')}>\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          </uip-card-content>\n        </uip-card>\n\n        <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n          <div class=\"lg:col-span-7\">\n            <uip-card class=\"border shadow-xs\">\n              <uip-card-header class=\"pb-4\">\n                <uip-card-title class=\"text-base font-semibold\">Order Summary</uip-card-title>\n                <uip-card-description>3 items in shipment</uip-card-description>\n              </uip-card-header>\n              <uip-card-content class=\"space-y-6\">\n                <div class=\"space-y-4\">\n                  ${orderItems.map(\n                    (item) => html`<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                <uip-separator></uip-separator>\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 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                <uip-separator></uip-separator>\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              </uip-card-content>\n            </uip-card>\n          </div>\n\n          <div class=\"space-y-6 lg:col-span-5\">\n            <uip-card class=\"border shadow-xs\">\n              <uip-card-header class=\"pb-3\">\n                <div class=\"flex items-center gap-2\">\n                  ${icon(MapPin, 'map-pin', 'text-muted-foreground size-4')}\n                  <uip-card-title class=\"text-base font-semibold\">Shipping Address</uip-card-title>\n                </div>\n              </uip-card-header>\n              <uip-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              </uip-card-content>\n            </uip-card>\n\n            <uip-card class=\"border shadow-xs\">\n              <uip-card-header class=\"pb-3\">\n                <div class=\"flex items-center gap-2\">\n                  ${icon(CreditCard, 'credit-card', 'text-muted-foreground size-4')}\n                  <uip-card-title class=\"text-base font-semibold\">Payment Method</uip-card-title>\n                </div>\n              </uip-card-header>\n              <uip-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 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                      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                  <uip-badge variant=\"secondary\" class=\"bg-success/10 text-success\">Paid</uip-badge>\n                </div>\n                <p class=\"text-muted-foreground text-xs\">Billing address matches shipping address</p>\n              </uip-card-content>\n            </uip-card>\n\n            <uip-card class=\"border shadow-xs\">\n              <uip-card-header class=\"pb-3\">\n                <div class=\"flex items-center gap-2\">\n                  ${icon(HelpCircle, 'circle-help', 'text-muted-foreground size-4')}\n                  <uip-card-title class=\"text-base font-semibold\">Need Help?</uip-card-title>\n                </div>\n              </uip-card-header>\n              <uip-card-content class=\"space-y-3 text-sm\">\n                <p class=\"text-muted-foreground text-xs\">Questions about your order? Chat with support or email support@example.com.</p>\n                <div class=\"space-y-2 pt-1\">\n                  <uip-button variant=\"outline\" size=\"sm\" class=\"w-full justify-start gap-2 text-xs shadow-xs\">\n                    ${icon(MessageSquare, 'message-square', 'size-3.5')} Chat with Support\n                  </uip-button>\n                  <uip-button variant=\"ghost\" size=\"sm\" class=\"text-muted-foreground hover:text-foreground w-full justify-start gap-2 text-xs\">\n                    ${icon(Mail, 'mail', 'size-3.5')} support@example.com\n                  </uip-button>\n                </div>\n              </uip-card-content>\n            </uip-card>\n          </div>\n        </div>\n      </div>\n    `\n  }\n}\n\ncustomElements.get('uip-order-confirmation') || customElements.define('uip-order-confirmation', UipOrderConfirmation)\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'uip-order-confirmation': UipOrderConfirmation\n  }\n}\n",
      "type": "registry:file",
      "target": "src/uip/blocks/order-confirmation/order-confirmation.ts"
    }
  ],
  "dependencies": [
    "lit",
    "lucide"
  ],
  "registryDependencies": [
    "https://uipkge.dev/r/lit/badge.json",
    "https://uipkge.dev/r/lit/button.json",
    "https://uipkge.dev/r/lit/card.json",
    "https://uipkge.dev/r/lit/lit-core.json",
    "https://uipkge.dev/r/lit/separator.json"
  ]
}
