{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "warehouse-inventory-grid",
  "title": "Warehouse Inventory Grid",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/warehouse-inventory-grid/warehouse-inventory-grid.component.ts",
      "content": "// WMS warehouse inventory and bin locator grid: facility selector, 4 summary metric\n// cards, searchable inventory table with multi-rack bin badges, on-hand/allocated/ATP\n// counts, barcode scanning support, and a slide-over bin relocation/receiving drawer.\n// Port of the React block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core'\nimport {\n  AlertTriangle,\n  ArrowDownToLine,\n  ArrowRightLeft,\n  ArrowUpRight,\n  Barcode,\n  Boxes,\n  Building2,\n  Check,\n  CheckCircle2,\n  ClipboardCheck,\n  LucideAngularModule,\n  MoreHorizontal,\n  Package,\n  PackagePlus,\n  Printer,\n  QrCode,\n  Search,\n  Tag,\n  Truck,\n  Warehouse,\n  X,\n} from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport {\n  UiDropdownMenuComponent,\n  UiDropdownMenuContentComponent,\n  UiDropdownMenuItemComponent,\n  UiDropdownMenuLabelComponent,\n  UiDropdownMenuSeparatorComponent,\n  UiDropdownMenuTriggerComponent,\n} from '@/ui/dropdown-menu/dropdown-menu.component'\nimport { UiInputComponent } from '@/ui/input/input.component'\nimport { UiProgressComponent } from '@/ui/progress/progress.component'\nimport {\n  UiSelectComponent,\n  UiSelectContentComponent,\n  UiSelectItemComponent,\n  UiSelectTriggerComponent,\n  UiSelectValueComponent,\n} from '@/ui/select/select.component'\nimport { UiSeparatorComponent } from '@/ui/separator/separator.component'\nimport {\n  UiSheetCloseComponent,\n  UiSheetComponent,\n  UiSheetContentComponent,\n  UiSheetDescriptionComponent,\n  UiSheetFooterComponent,\n  UiSheetHeaderComponent,\n  UiSheetTitleComponent,\n} from '@/ui/sheet/sheet.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport type StockStatus = 'in_stock' | 'low_stock'\n\nexport interface WarehouseItem {\n  id: string\n  sku: string\n  barcode: string\n  name: string\n  category: string\n  palletId: string\n  zone: string\n  binLocation: string\n  aisle: string\n  rack: string\n  shelf: string\n  onHand: number\n  allocated: number\n  available: number\n  reorderThreshold: number\n  unitVolume: string\n  status: StockStatus\n  lastCycleCount: string\n}\n\nconst warehouseItems: WarehouseItem[] = [\n  {\n    id: 'wh-1',\n    sku: '#SKU-84920',\n    barcode: 'UPC-018249',\n    name: 'Aero Runner 10.5 Matte Black',\n    category: 'Footwear & Apparel',\n    palletId: 'PLT-84920-04',\n    zone: 'Zone A-West (High-Velocity)',\n    binLocation: 'Aisle 04 · Rack B · Shelf 02',\n    aisle: 'Aisle 04',\n    rack: 'Rack B',\n    shelf: 'Shelf 02',\n    onHand: 450,\n    allocated: 85,\n    available: 365,\n    reorderThreshold: 100,\n    unitVolume: '0.04 m³',\n    status: 'in_stock',\n    lastCycleCount: '2 days ago',\n  },\n  {\n    id: 'wh-2',\n    sku: '#SKU-84921',\n    barcode: 'UPC-029481',\n    name: 'Technical Shell Jacket L',\n    category: 'Outerwear',\n    palletId: 'PLT-84921-02',\n    zone: 'Zone A-North (Apparel Pick)',\n    binLocation: 'Aisle 02 · Rack D · Shelf 01',\n    aisle: 'Aisle 02',\n    rack: 'Rack D',\n    shelf: 'Shelf 01',\n    onHand: 38,\n    allocated: 30,\n    available: 8,\n    reorderThreshold: 50,\n    unitVolume: '0.02 m³',\n    status: 'low_stock',\n    lastCycleCount: 'Yesterday',\n  },\n  {\n    id: 'wh-3',\n    sku: '#SKU-77210',\n    barcode: 'UPC-093812',\n    name: 'Heavy Duty Pallet Straps (50m)',\n    category: 'Packaging & Materials',\n    palletId: 'PLT-77210-09',\n    zone: 'Zone B-Bulk (Industrial)',\n    binLocation: 'Aisle 07 · Rack A · Shelf 04',\n    aisle: 'Aisle 07',\n    rack: 'Rack A',\n    shelf: 'Shelf 04',\n    onHand: 820,\n    allocated: 140,\n    available: 680,\n    reorderThreshold: 200,\n    unitVolume: '0.08 m³',\n    status: 'in_stock',\n    lastCycleCount: '5 days ago',\n  },\n  {\n    id: 'wh-4',\n    sku: '#SKU-99341',\n    barcode: 'UPC-048201',\n    name: 'Thermal Packaging Liner 24x24',\n    category: 'Cold Chain Supplies',\n    palletId: 'PLT-99341-01',\n    zone: 'Zone C-Cold (Temp Controlled)',\n    binLocation: 'Aisle 01 · Rack C · Shelf 03',\n    aisle: 'Aisle 01',\n    rack: 'Rack C',\n    shelf: 'Shelf 03',\n    onHand: 24,\n    allocated: 18,\n    available: 6,\n    reorderThreshold: 60,\n    unitVolume: '0.05 m³',\n    status: 'low_stock',\n    lastCycleCount: 'Today',\n  },\n  {\n    id: 'wh-5',\n    sku: '#SKU-65239',\n    barcode: 'UPC-067194',\n    name: 'Industrial Barcode Scanner BT',\n    category: 'WMS Equipment',\n    palletId: 'PLT-65239-03',\n    zone: 'Zone D-Secure (High-Value)',\n    binLocation: 'Aisle 09 · Rack A · Shelf 01',\n    aisle: 'Aisle 09',\n    rack: 'Rack A',\n    shelf: 'Shelf 01',\n    onHand: 115,\n    allocated: 15,\n    available: 100,\n    reorderThreshold: 30,\n    unitVolume: '0.01 m³',\n    status: 'in_stock',\n    lastCycleCount: '3 days ago',\n  },\n  {\n    id: 'wh-6',\n    sku: '#SKU-54018',\n    barcode: 'UPC-081924',\n    name: 'Anti-Static Bubble Wrap Roll',\n    category: 'Packaging & Materials',\n    palletId: 'PLT-54018-05',\n    zone: 'Zone B-Bulk (Packaging Bay)',\n    binLocation: 'Aisle 06 · Rack E · Shelf 02',\n    aisle: 'Aisle 06',\n    rack: 'Rack E',\n    shelf: 'Shelf 02',\n    onHand: 190,\n    allocated: 45,\n    available: 145,\n    reorderThreshold: 75,\n    unitVolume: '0.12 m³',\n    status: 'in_stock',\n    lastCycleCount: '1 week ago',\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-warehouse-inventory-grid, [ui-warehouse-inventory-grid]',\n  standalone: true,\n  // React renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiDropdownMenuComponent,\n    UiDropdownMenuContentComponent,\n    UiDropdownMenuItemComponent,\n    UiDropdownMenuLabelComponent,\n    UiDropdownMenuSeparatorComponent,\n    UiDropdownMenuTriggerComponent,\n    UiInputComponent,\n    UiProgressComponent,\n    UiSelectComponent,\n    UiSelectContentComponent,\n    UiSelectItemComponent,\n    UiSelectTriggerComponent,\n    UiSelectValueComponent,\n    UiSeparatorComponent,\n    UiSheetCloseComponent,\n    UiSheetComponent,\n    UiSheetContentComponent,\n    UiSheetDescriptionComponent,\n    UiSheetFooterComponent,\n    UiSheetHeaderComponent,\n    UiSheetTitleComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <div data-slot=\"warehouse-inventory-grid\" [class]=\"rootClass\">\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\">\n          <div class=\"flex flex-wrap items-center gap-2.5\">\n            <div class=\"bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-lg\">\n              <lucide-icon [img]=\"Warehouse\" class=\"size-4.5 shrink-0\" />\n            </div>\n            <h1 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n              Warehouse Inventory & Bin Locations\n            </h1>\n            <span ui-badge variant=\"outline\" class=\"border-success/30 bg-success/10 text-success gap-1.5\">\n              <span class=\"bg-success size-1.5 shrink-0 animate-pulse rounded-full\"></span>\n              WMS Live\n            </span>\n          </div>\n          <p class=\"text-muted-foreground text-xs sm:text-sm\">\n            Real-time multi-bin locator, safety stock reorder thresholds, and pallet relocation manifests.\n          </p>\n        </div>\n\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <!-- Warehouse Facility Select -->\n          <ui-select [value]=\"facility()\" (valueChange)=\"facility.set($event)\">\n            <button ui-select-trigger class=\"w-full sm:w-[320px]\">\n              <lucide-icon [img]=\"Building2\" class=\"text-muted-foreground size-4 shrink-0\" />\n              <ui-select-value placeholder=\"Select warehouse facility\" class=\"min-w-0 truncate\" />\n            </button>\n            <ui-select-content>\n              <ui-select-item value=\"bay-area\">Bay Area Fulfillment Center #04 · Aisle A-D</ui-select-item>\n              <ui-select-item value=\"seattle\">Seattle Logistics Hub #02 · High-Bay B</ui-select-item>\n              <ui-select-item value=\"dallas\">Dallas Central Depot #01 · Mezzanine C</ui-select-item>\n              <ui-select-item value=\"newark\">Newark Cold Chain #03 · Zone Free-01</ui-select-item>\n            </ui-select-content>\n          </ui-select>\n\n          <button ui-button variant=\"outline\" class=\"gap-1.5\" (click)=\"openTransferDrawer()\">\n            <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-4 shrink-0\" />\n            Relocate Bin\n          </button>\n\n          <button ui-button class=\"gap-1.5 shadow-xs\" (click)=\"openReceiveDrawer()\">\n            <lucide-icon [img]=\"PackagePlus\" class=\"size-4 shrink-0\" />\n            Receive Inventory\n          </button>\n        </div>\n      </div>\n\n      <!-- Notification / Action Feedback Banner -->\n      @if (actionFeedback()) {\n        <div\n          class=\"border-primary/20 bg-primary/5 text-foreground flex items-center justify-between rounded-lg border px-4 py-3 text-sm shadow-xs transition-colors\"\n        >\n          <div class=\"flex items-center gap-2.5\">\n            <lucide-icon [img]=\"CheckCircle2\" class=\"text-success size-4 shrink-0\" />\n            <span class=\"text-xs font-medium sm:text-sm\">{{ actionFeedback() }}</span>\n          </div>\n          <button\n            ui-button\n            variant=\"ghost\"\n            size=\"xs\"\n            class=\"h-6 w-6 shrink-0 p-0\"\n            aria-label=\"Dismiss notification\"\n            (click)=\"actionFeedback.set(null)\"\n          >\n            <lucide-icon [img]=\"X\" class=\"size-3.5 shrink-0\" />\n          </button>\n        </div>\n      }\n\n      <!-- 4 WMS Inventory Metric Cards -->\n      <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        <!-- Metric 1: Total SKUs -->\n        <div ui-card class=\"shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n              Total SKUs in Stock\n            </h3>\n            <div class=\"bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"Package\" class=\"size-4 shrink-0\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-1\">\n            <div class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">\n              1,842 <span class=\"text-muted-foreground text-sm font-normal\">SKUs</span>\n            </div>\n            <p class=\"text-muted-foreground flex items-center gap-1.5 pt-1 text-xs\">\n              <span class=\"text-success flex items-center font-medium\">\n                <lucide-icon [img]=\"ArrowUpRight\" class=\"mr-0.5 inline size-3 shrink-0\" />+48 SKUs\n              </span>\n              <span>· 99.4% count accuracy</span>\n            </p>\n          </div>\n        </div>\n\n        <!-- Metric 2: Warehouse Capacity -->\n        <div ui-card class=\"shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n              Warehouse Capacity\n            </h3>\n            <div class=\"bg-info/10 text-info flex size-8 shrink-0 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"Boxes\" class=\"size-4 shrink-0\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">84.5%</div>\n              <span class=\"text-muted-foreground text-xs tabular-nums\">12,400 / 14,800 pallets</span>\n            </div>\n            <div ui-progress [value]=\"84.5\" class=\"h-1.5\"></div>\n            <p class=\"text-muted-foreground text-xs\">2,400 available slots in High-Bay & Bulk</p>\n          </div>\n        </div>\n\n        <!-- Metric 3: Low Stock Alerts -->\n        <div ui-card class=\"shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n              Low Stock Alerts\n            </h3>\n            <div class=\"bg-warning/10 text-warning flex size-8 shrink-0 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"AlertTriangle\" class=\"size-4 shrink-0\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-1\">\n            <div class=\"flex items-center gap-2\">\n              <div class=\"text-warning text-2xl font-bold tracking-tight tabular-nums\">12</div>\n              <span ui-badge variant=\"warning\" class=\"text-xs font-normal\"> Action required </span>\n            </div>\n            <p class=\"text-muted-foreground pt-1 text-xs\">Below safety stock threshold · 4 POs in transit</p>\n          </div>\n        </div>\n\n        <!-- Metric 4: Inbound Shipments Today -->\n        <div ui-card class=\"shadow-xs\">\n          <div ui-card-header class=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n            <h3 ui-card-title class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n              Inbound Shipments Today\n            </h3>\n            <div class=\"bg-success/10 text-success flex size-8 shrink-0 items-center justify-center rounded-md\">\n              <lucide-icon [img]=\"Truck\" class=\"size-4 shrink-0\" />\n            </div>\n          </div>\n          <div ui-card-content class=\"space-y-1\">\n            <div class=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">\n              4 <span class=\"text-muted-foreground text-sm font-normal\">POs arriving</span>\n            </div>\n            <p class=\"text-muted-foreground pt-1 text-xs\">2,450 units expected by 16:00 · Bay 02 & 05</p>\n          </div>\n        </div>\n      </div>\n\n      <!-- Inventory Filter & Search Toolbar -->\n      <div ui-card class=\"shadow-xs\">\n        <div ui-card-header class=\"border-border border-b pb-3\">\n          <div class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n            <div class=\"flex flex-1 flex-wrap items-center gap-2\">\n              <div class=\"relative w-full min-w-0 md:max-w-sm\">\n                <lucide-icon\n                  [img]=\"Search\"\n                  class=\"text-muted-foreground absolute top-1/2 left-3 size-4 shrink-0 -translate-y-1/2\"\n                />\n                <ui-input\n                  [value]=\"searchQuery()\"\n                  (valueChange)=\"searchQuery.set($event)\"\n                  placeholder=\"Search SKU or product\"\n                  class=\"h-9 pl-9 text-xs sm:text-sm\"\n                />\n              </div>\n\n              <!-- Category Filter -->\n              <ui-select [value]=\"categoryFilter()\" (valueChange)=\"categoryFilter.set($event)\">\n                <button ui-select-trigger class=\"h-9 w-[160px] text-xs\">\n                  <ui-select-value placeholder=\"All Categories\" />\n                </button>\n                <ui-select-content>\n                  <ui-select-item value=\"all\">All Categories</ui-select-item>\n                  <ui-select-item value=\"Footwear & Apparel\">Footwear & Apparel</ui-select-item>\n                  <ui-select-item value=\"Outerwear\">Outerwear</ui-select-item>\n                  <ui-select-item value=\"Packaging & Materials\">Packaging & Materials</ui-select-item>\n                  <ui-select-item value=\"Cold Chain Supplies\">Cold Chain Supplies</ui-select-item>\n                  <ui-select-item value=\"WMS Equipment\">WMS Equipment</ui-select-item>\n                </ui-select-content>\n              </ui-select>\n\n              <!-- Status Filter -->\n              <ui-select [value]=\"statusFilter()\" (valueChange)=\"statusFilter.set($event)\">\n                <button ui-select-trigger class=\"h-9 w-[140px] text-xs\">\n                  <ui-select-value placeholder=\"All Stock Status\" />\n                </button>\n                <ui-select-content>\n                  <ui-select-item value=\"all\">All Statuses</ui-select-item>\n                  <ui-select-item value=\"in_stock\">In Stock</ui-select-item>\n                  <ui-select-item value=\"low_stock\">Low Stock (Reorder)</ui-select-item>\n                </ui-select-content>\n              </ui-select>\n            </div>\n\n            <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n              <span\n                >Showing <strong class=\"text-foreground tabular-nums\">{{ filteredItems().length }}</strong> of\n                {{ itemCount }} inventory items</span\n              >\n            </div>\n          </div>\n        </div>\n\n        <div ui-card-content class=\"p-0\">\n          <!-- Inventory Table -->\n          <div class=\"overflow-x-auto\">\n            <table ui-table>\n              <thead ui-table-header>\n                <tr ui-table-row class=\"hover:bg-transparent\">\n                  <th ui-table-head class=\"w-[180px] text-xs font-semibold\">SKU & Barcode</th>\n                  <th ui-table-head class=\"min-w-[220px] text-xs font-semibold\">Item & Category</th>\n                  <th ui-table-head class=\"min-w-[210px] text-xs font-semibold\">Bin / Rack Location</th>\n                  <th ui-table-head class=\"text-right text-xs font-semibold\">On Hand</th>\n                  <th ui-table-head class=\"text-right text-xs font-semibold\">Allocated</th>\n                  <th ui-table-head class=\"text-right text-xs font-semibold\">Available (ATP)</th>\n                  <th ui-table-head class=\"min-w-[160px] text-xs font-semibold\">Reorder & Status</th>\n                  <th ui-table-head class=\"w-[60px] text-right text-xs font-semibold\">Actions</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (item of filteredItems(); track item.id) {\n                  <tr ui-table-row class=\"hover:bg-muted/40 transition-colors\">\n                    <!-- SKU & Barcode -->\n                    <td ui-table-cell class=\"py-3\">\n                      <div class=\"space-y-0.5\">\n                        <div class=\"text-foreground font-mono text-xs font-semibold\">\n                          {{ item.sku }}\n                        </div>\n                        <div class=\"text-muted-foreground flex items-center gap-1 font-mono text-xs\">\n                          <lucide-icon [img]=\"Barcode\" class=\"text-muted-foreground/70 size-3 shrink-0\" />\n                          <span>{{ item.barcode }}</span>\n                        </div>\n                      </div>\n                    </td>\n\n                    <!-- Item Name & Category -->\n                    <td ui-table-cell class=\"py-3\">\n                      <div class=\"space-y-0.5\">\n                        <div class=\"text-foreground text-sm font-medium\">\n                          {{ item.name }}\n                        </div>\n                        <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n                          <span>{{ item.category }}</span>\n                          <span>·</span>\n                          <span class=\"font-mono text-xs\">{{ item.palletId }}</span>\n                        </div>\n                      </div>\n                    </td>\n\n                    <!-- Bin / Rack Location Badge -->\n                    <td ui-table-cell class=\"py-3\">\n                      <div class=\"space-y-1\">\n                        <span ui-badge variant=\"outline\" class=\"bg-muted/30 gap-1.5 font-mono text-xs font-medium\">\n                          <lucide-icon [img]=\"Tag\" class=\"text-primary size-3 shrink-0\" />\n                          {{ item.binLocation }}\n                        </span>\n                        <div class=\"text-muted-foreground text-xs\">\n                          {{ item.zone }}\n                        </div>\n                      </div>\n                    </td>\n\n                    <!-- On Hand -->\n                    <td ui-table-cell class=\"py-3 text-right\">\n                      <div class=\"text-foreground text-sm font-semibold tabular-nums\">\n                        {{ item.onHand.toLocaleString() }}\n                        <span class=\"text-muted-foreground text-xs font-normal\">units</span>\n                      </div>\n                      <div class=\"text-muted-foreground text-xs tabular-nums\">\n                        {{ item.unitVolume }}\n                      </div>\n                    </td>\n\n                    <!-- Allocated -->\n                    <td ui-table-cell class=\"py-3 text-right\">\n                      <div class=\"text-muted-foreground text-sm font-medium tabular-nums\">\n                        {{ item.allocated.toLocaleString() }}\n                        <span class=\"text-muted-foreground text-xs font-normal\">units</span>\n                      </div>\n                      <div class=\"text-muted-foreground text-xs tabular-nums\">{{ reservedPct(item) }}% reserved</div>\n                    </td>\n\n                    <!-- Available (ATP) -->\n                    <td ui-table-cell class=\"py-3 text-right\">\n                      <div class=\"text-foreground text-sm font-bold tabular-nums\">\n                        {{ item.available.toLocaleString() }}\n                        <span class=\"text-muted-foreground text-xs font-normal\">units</span>\n                      </div>\n                      <div class=\"text-success text-xs font-medium\">Ready to pick</div>\n                    </td>\n\n                    <!-- Reorder Threshold & Status -->\n                    <td ui-table-cell class=\"py-3\">\n                      <div class=\"space-y-1\">\n                        @if (item.status === 'in_stock') {\n                          <span ui-badge variant=\"success\" class=\"gap-1 text-xs whitespace-normal\">\n                            <lucide-icon [img]=\"CheckCircle2\" class=\"size-3 shrink-0\" />\n                            In Stock\n                          </span>\n                        } @else {\n                          <span ui-badge variant=\"warning\" class=\"gap-1 text-xs\">\n                            <lucide-icon [img]=\"AlertTriangle\" class=\"size-3 shrink-0\" />\n                            Low Stock - Reorder\n                          </span>\n                        }\n                        <div class=\"text-muted-foreground text-xs tabular-nums\">\n                          Min safety: {{ item.reorderThreshold }} units\n                        </div>\n                      </div>\n                    </td>\n\n                    <!-- Actions Menu -->\n                    <td ui-table-cell class=\"py-3 text-right\">\n                      <ui-dropdown-menu>\n                        <button\n                          ui-button\n                          ui-dropdown-menu-trigger\n                          variant=\"ghost\"\n                          size=\"icon-sm\"\n                          class=\"size-8 shrink-0\"\n                        >\n                          <lucide-icon [img]=\"MoreHorizontal\" class=\"size-4 shrink-0\" />\n                          <span class=\"sr-only\">Open menu</span>\n                        </button>\n                        <ui-dropdown-menu-content align=\"end\" class=\"w-48\">\n                          <ui-dropdown-menu-label class=\"text-muted-foreground text-xs\"\n                            >Bin Actions</ui-dropdown-menu-label\n                          >\n                          <ui-dropdown-menu-item class=\"cursor-pointer gap-2\" (select)=\"openTransferDrawer(item)\">\n                            <lucide-icon [img]=\"ArrowRightLeft\" class=\"text-muted-foreground size-4 shrink-0\" />\n                            Transfer / Relocate Bin\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-item class=\"cursor-pointer gap-2\" (select)=\"handlePrintBarcode(item)\">\n                            <lucide-icon [img]=\"Printer\" class=\"text-muted-foreground size-4 shrink-0\" />\n                            Print Barcode Label\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-item class=\"cursor-pointer gap-2\" (select)=\"handleCycleCount(item)\">\n                            <lucide-icon [img]=\"ClipboardCheck\" class=\"text-muted-foreground size-4 shrink-0\" />\n                            Log Cycle Count\n                          </ui-dropdown-menu-item>\n                          <ui-dropdown-menu-separator />\n                          <ui-dropdown-menu-item\n                            class=\"text-warning cursor-pointer gap-2\"\n                            (select)=\"openReceiveDrawer()\"\n                          >\n                            <lucide-icon [img]=\"PackagePlus\" class=\"size-4 shrink-0\" />\n                            Receive Restock Batch\n                          </ui-dropdown-menu-item>\n                        </ui-dropdown-menu-content>\n                      </ui-dropdown-menu>\n                    </td>\n                  </tr>\n                }\n\n                @if (filteredItems().length === 0) {\n                  <tr ui-table-row>\n                    <td ui-table-cell [attr.colspan]=\"8\" class=\"text-muted-foreground h-32 text-center text-sm\">\n                      No warehouse inventory items found matching your criteria.\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n\n      <!-- Quick Transfer / Relocate Bin Drawer (Sheet) -->\n      <div ui-sheet [open]=\"drawerOpen()\" (openChange)=\"drawerOpen.set($event)\">\n        <div ui-sheet-content side=\"right\" class=\"w-full space-y-6 overflow-y-auto p-6 sm:max-w-md\">\n          <!-- Drawer Header -->\n          <div ui-sheet-header class=\"space-y-1 text-left\">\n            <div class=\"flex items-center gap-2\">\n              <div class=\"bg-primary/10 text-primary flex size-8 shrink-0 items-center justify-center rounded-md\">\n                @if (drawerMode() === 'transfer') {\n                  <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-4 shrink-0\" />\n                } @else {\n                  <lucide-icon [img]=\"PackagePlus\" class=\"size-4 shrink-0\" />\n                }\n              </div>\n              <h2 ui-sheet-title class=\"text-lg font-bold\">\n                {{ drawerMode() === 'transfer' ? 'Relocate Bin / Pallet Transfer' : 'Receive Inventory Inbound' }}\n              </h2>\n            </div>\n            <p ui-sheet-description class=\"text-muted-foreground text-xs\">\n              {{\n                drawerMode() === 'transfer'\n                  ? 'Relocate inventory pallets between rack coordinates and generate WMS transfer manifests.'\n                  : 'Process inbound freight shipments, inspect UPC barcodes, and assign initial staging bins.'\n              }}\n            </p>\n          </div>\n\n          <!-- Mode: Transfer Bin -->\n          @if (drawerMode() === 'transfer') {\n            @if (selectedItem(); as item) {\n              <!-- Item Card Summary -->\n              <div class=\"border-border bg-muted/20 space-y-3 rounded-lg border p-4\">\n                <div class=\"flex items-start justify-between gap-2\">\n                  <div>\n                    <div class=\"text-primary font-mono text-xs font-semibold\">{{ item.sku }}</div>\n                    <div class=\"text-foreground text-sm font-medium\">{{ item.name }}</div>\n                    <div class=\"text-muted-foreground text-xs\">{{ item.category }}</div>\n                  </div>\n                  <span ui-badge variant=\"outline\" class=\"font-mono text-xs\">{{ item.palletId }}</span>\n                </div>\n\n                <ui-separator />\n\n                <div class=\"grid grid-cols-1 gap-2 text-xs sm:grid-cols-2\">\n                  <div>\n                    <span class=\"text-muted-foreground\">Current Bin:</span>\n                    <p class=\"text-foreground mt-0.5 font-mono text-xs font-medium\">{{ item.binLocation }}</p>\n                  </div>\n                  <div>\n                    <span class=\"text-muted-foreground\">Available to Move:</span>\n                    <p class=\"text-success mt-0.5 font-bold tabular-nums\">{{ item.available }} units</p>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Transfer Form Fields -->\n              <div class=\"space-y-4\">\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-medium\">Destination Rack / Bin Location</label>\n                  <ui-select [value]=\"transferDestination()\" (valueChange)=\"transferDestination.set($event)\">\n                    <button ui-select-trigger class=\"w-full text-xs\">\n                      <ui-select-value placeholder=\"Select target bin location\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"bin-dest-1\"\n                        >Aisle 01 · Rack A · Shelf 03 (Zone A-North · Standard Rack)</ui-select-item\n                      >\n                      <ui-select-item value=\"bin-dest-2\"\n                        >Aisle 03 · Rack B · Shelf 01 (Zone A-West · Fast-Pick)</ui-select-item\n                      >\n                      <ui-select-item value=\"bin-dest-3\"\n                        >Aisle 08 · Rack C · Shelf 04 (Zone B-Bulk · High-Bay)</ui-select-item\n                      >\n                      <ui-select-item value=\"bin-dest-4\"\n                        >Aisle 05 · Rack D · Shelf 02 (Zone C-Cold · Cold Bay)</ui-select-item\n                      >\n                    </ui-select-content>\n                  </ui-select>\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <div class=\"flex items-center justify-between\">\n                    <label class=\"text-foreground text-xs font-medium\">Transfer Quantity (Units)</label>\n                    <span class=\"text-muted-foreground text-xs tabular-nums\">Max: {{ item.available }} units</span>\n                  </div>\n                  <ui-input\n                    [value]=\"transferQty()\"\n                    (valueChange)=\"setTransferQty($event)\"\n                    type=\"number\"\n                    [min]=\"1\"\n                    [max]=\"item.available\"\n                    class=\"text-xs tabular-nums sm:text-sm\"\n                  />\n                  <div class=\"flex gap-1.5 pt-1\">\n                    <button\n                      type=\"button\"\n                      ui-button\n                      variant=\"outline\"\n                      size=\"xs\"\n                      class=\"flex-1 text-xs\"\n                      (click)=\"setQuickQty(25)\"\n                    >\n                      25\n                    </button>\n                    <button\n                      type=\"button\"\n                      ui-button\n                      variant=\"outline\"\n                      size=\"xs\"\n                      class=\"flex-1 text-xs\"\n                      (click)=\"setQuickQty(50)\"\n                    >\n                      50\n                    </button>\n                    <button\n                      type=\"button\"\n                      ui-button\n                      variant=\"outline\"\n                      size=\"xs\"\n                      class=\"flex-1 text-xs\"\n                      (click)=\"setQuickQty(100)\"\n                    >\n                      100\n                    </button>\n                    <button\n                      type=\"button\"\n                      ui-button\n                      variant=\"outline\"\n                      size=\"xs\"\n                      class=\"flex-1 text-xs\"\n                      (click)=\"setQuickQty(item.available)\"\n                    >\n                      All ({{ item.available }})\n                    </button>\n                  </div>\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-medium\">Pallet ID / Batch Lot</label>\n                  <ui-input\n                    [value]=\"transferPalletId()\"\n                    (valueChange)=\"transferPalletId.set($event)\"\n                    class=\"font-mono text-xs\"\n                  />\n                </div>\n\n                <div class=\"space-y-1.5\">\n                  <label class=\"text-foreground text-xs font-medium\">Transfer Reason</label>\n                  <ui-select [value]=\"transferReason()\" (valueChange)=\"transferReason.set($event)\">\n                    <button ui-select-trigger class=\"w-full text-xs\">\n                      <ui-select-value placeholder=\"Select transfer reason\" />\n                    </button>\n                    <ui-select-content>\n                      <ui-select-item value=\"reslotting\">Zone Re-slotting (Velocity Optimization)</ui-select-item>\n                      <ui-select-item value=\"consolidation\">Consolidation & Space Reclamation</ui-select-item>\n                      <ui-select-item value=\"staging\">Fast-Pick Outbound Wave Staging</ui-select-item>\n                      <ui-select-item value=\"rack-repair\">Damaged Rack Maintenance Relocation</ui-select-item>\n                      <ui-select-item value=\"quarantine\">Quarantine & Quality Audit Transfer</ui-select-item>\n                    </ui-select-content>\n                  </ui-select>\n                </div>\n\n                <!-- Verified Scanner / Operator Badge -->\n                <div class=\"border-border bg-muted/40 space-y-1 rounded-md border p-3 text-xs\">\n                  <div class=\"text-muted-foreground flex items-center justify-between\">\n                    <span class=\"flex items-center gap-1.5\">\n                      <lucide-icon [img]=\"QrCode\" class=\"text-primary size-3.5 shrink-0\" />\n                      WMS Scanner Terminal\n                    </span>\n                    <span class=\"text-foreground font-mono font-medium\">TC57-OP44</span>\n                  </div>\n                  <p class=\"text-muted-foreground\">Operator: Marcus Vance (Badge #OP-921)</p>\n                </div>\n              </div>\n            }\n          } @else {\n            <!-- Mode: Receive Inbound PO -->\n            <div class=\"space-y-4\">\n              <div class=\"space-y-1.5\">\n                <label class=\"text-foreground text-xs font-medium\">Inbound Purchase Order</label>\n                <ui-select [value]=\"receivePo()\" (valueChange)=\"receivePo.set($event)\">\n                  <button ui-select-trigger class=\"w-full text-xs\">\n                    <ui-select-value placeholder=\"Select purchase order\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"po-8910\">PO-2026-8910 · Acme Footwear Corp (500 units)</ui-select-item>\n                    <ui-select-item value=\"po-8914\">PO-2026-8914 · Pacific Packaging Ltd (1,200 units)</ui-select-item>\n                    <ui-select-item value=\"po-8919\">PO-2026-8919 · Thermal Supply Chain Co (750 units)</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label class=\"text-foreground text-xs font-medium\">Target SKU / Barcode</label>\n                <ui-input\n                  [value]=\"receiveSku()\"\n                  (valueChange)=\"receiveSku.set($event)\"\n                  placeholder=\"#SKU-84920 or UPC code\"\n                  class=\"font-mono text-xs\"\n                />\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label class=\"text-foreground text-xs font-medium\">Received Quantity (Units)</label>\n                <ui-input\n                  [value]=\"receiveQty()\"\n                  (valueChange)=\"setReceiveQty($event)\"\n                  type=\"number\"\n                  class=\"text-xs tabular-nums\"\n                />\n              </div>\n\n              <div class=\"space-y-1.5\">\n                <label class=\"text-foreground text-xs font-medium\">Assigned Inbound Staging Bay</label>\n                <ui-select [value]=\"receiveBin()\" (valueChange)=\"receiveBin.set($event)\">\n                  <button ui-select-trigger class=\"w-full text-xs\">\n                    <ui-select-value placeholder=\"Select staging bin\" />\n                  </button>\n                  <ui-select-content>\n                    <ui-select-item value=\"bay-02\">Staging Bay Inbound-02 (Aisle 00 · Cross-Dock)</ui-select-item>\n                    <ui-select-item value=\"bay-05\">Staging Bay Inbound-05 (Cold Holding)</ui-select-item>\n                    <ui-select-item value=\"bay-08\">Bulk Floor Staging Area B</ui-select-item>\n                  </ui-select-content>\n                </ui-select>\n              </div>\n\n              <div class=\"text-foreground border-success/20 bg-success/5 space-y-1 rounded-md border p-3 text-xs\">\n                <div class=\"text-success flex items-center gap-1.5 font-medium\">\n                  <lucide-icon [img]=\"Check\" class=\"size-3.5 shrink-0\" />\n                  Inbound Freight Scan Ready\n                </div>\n                <p class=\"text-muted-foreground\">\n                  Pallet tags will be generated and printed automatically upon receipt confirmation.\n                </p>\n              </div>\n            </div>\n          }\n\n          <!-- Drawer Footer -->\n          <div\n            ui-sheet-footer\n            class=\"border-border flex flex-col-reverse gap-2 border-t pt-4 sm:flex-row sm:justify-end\"\n          >\n            <div ui-sheet-close>\n              <button ui-button variant=\"outline\" class=\"w-full sm:w-auto\">Cancel</button>\n            </div>\n            @if (drawerMode() === 'transfer') {\n              <button ui-button class=\"w-full gap-1.5 sm:w-auto\" (click)=\"handleConfirmTransfer()\">\n                <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-4 shrink-0\" />\n                Confirm Bin Transfer\n              </button>\n            } @else {\n              <button ui-button class=\"w-full gap-1.5 sm:w-auto\" (click)=\"handleConfirmReceive()\">\n                <lucide-icon [img]=\"ArrowDownToLine\" class=\"size-4 shrink-0\" />\n                Confirm Receipt\n              </button>\n            }\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class UiWarehouseInventoryGridComponent {\n  protected readonly AlertTriangle = AlertTriangle\n  protected readonly ArrowDownToLine = ArrowDownToLine\n  protected readonly ArrowRightLeft = ArrowRightLeft\n  protected readonly ArrowUpRight = ArrowUpRight\n  protected readonly Barcode = Barcode\n  protected readonly Boxes = Boxes\n  protected readonly Building2 = Building2\n  protected readonly Check = Check\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly ClipboardCheck = ClipboardCheck\n  protected readonly MoreHorizontal = MoreHorizontal\n  protected readonly Package = Package\n  protected readonly PackagePlus = PackagePlus\n  protected readonly Printer = Printer\n  protected readonly QrCode = QrCode\n  protected readonly Search = Search\n  protected readonly Tag = Tag\n  protected readonly Truck = Truck\n  protected readonly Warehouse = Warehouse\n  protected readonly X = X\n\n  @Input('class') className?: string\n\n  readonly facility = signal('bay-area')\n  readonly searchQuery = signal('')\n  readonly categoryFilter = signal('all')\n  readonly statusFilter = signal('all')\n  readonly zoneFilter = signal('all')\n\n  readonly drawerOpen = signal(false)\n  readonly drawerMode = signal<'transfer' | 'receive'>('transfer')\n  readonly selectedItem = signal<WarehouseItem | null>(null)\n\n  readonly transferDestination = signal('bin-dest-1')\n  readonly transferQty = signal(50)\n  readonly transferPalletId = signal('PLT-84920-04')\n  readonly transferReason = signal('reslotting')\n\n  readonly receivePo = signal('po-8910')\n  readonly receiveSku = signal('SKU-84920')\n  readonly receiveQty = signal(250)\n  readonly receiveBin = signal('bay-02')\n\n  readonly actionFeedback = signal<string | null>(null)\n  private feedbackTimer: ReturnType<typeof setTimeout> | undefined\n\n  readonly itemCount = warehouseItems.length\n\n  readonly filteredItems = computed(() => {\n    const q = this.searchQuery().trim().toLowerCase()\n    const category = this.categoryFilter()\n    const status = this.statusFilter()\n    const zone = this.zoneFilter()\n    return warehouseItems.filter((item) => {\n      const matchesSearch =\n        !q ||\n        item.name.toLowerCase().includes(q) ||\n        item.sku.toLowerCase().includes(q) ||\n        item.barcode.toLowerCase().includes(q) ||\n        item.binLocation.toLowerCase().includes(q) ||\n        item.category.toLowerCase().includes(q)\n      const matchesCategory = category === 'all' || item.category === category\n      const matchesStatus = status === 'all' || item.status === status\n      const matchesZone = zone === 'all' || item.zone.toLowerCase().includes(zone.toLowerCase())\n      return matchesSearch && matchesCategory && matchesStatus && matchesZone\n    })\n  })\n\n  get rootClass(): string {\n    return cn('w-full space-y-6', this.className)\n  }\n\n  reservedPct(item: WarehouseItem): number {\n    return Math.round((item.allocated / item.onHand) * 100)\n  }\n\n  setTransferQty(v: string): void {\n    const n = Number(v)\n    this.transferQty.set(Number.isFinite(n) ? n : 0)\n  }\n\n  setReceiveQty(v: string): void {\n    const n = Number(v)\n    this.receiveQty.set(Number.isFinite(n) ? n : 0)\n  }\n\n  setQuickQty(qty: number): void {\n    const item = this.selectedItem()\n    this.transferQty.set(item ? Math.min(qty, item.available) : qty)\n  }\n\n  openTransferDrawer(item?: WarehouseItem): void {\n    const target = item ?? warehouseItems[0]!\n    this.selectedItem.set(target)\n    this.transferPalletId.set(target.palletId)\n    this.transferQty.set(Math.min(50, target.available))\n    this.drawerMode.set('transfer')\n    this.drawerOpen.set(true)\n  }\n\n  openReceiveDrawer(): void {\n    this.drawerMode.set('receive')\n    this.drawerOpen.set(true)\n  }\n\n  private flashFeedback(message: string, ms: number): void {\n    this.actionFeedback.set(message)\n    clearTimeout(this.feedbackTimer)\n    this.feedbackTimer = setTimeout(() => this.actionFeedback.set(null), ms)\n  }\n\n  handleConfirmTransfer(): void {\n    const item = this.selectedItem()\n    if (!item) return\n    this.flashFeedback(`Successfully relocated ${this.transferQty()} units of ${item.sku} to destination bin.`, 4000)\n    this.drawerOpen.set(false)\n  }\n\n  handleConfirmReceive(): void {\n    this.flashFeedback(\n      `Received ${this.receiveQty()} units for ${this.receivePo().toUpperCase()} staged into Bay 02.`,\n      4000,\n    )\n    this.drawerOpen.set(false)\n  }\n\n  handlePrintBarcode(item: WarehouseItem): void {\n    this.flashFeedback(`Barcode label queued for ${item.sku} (${item.barcode}) on Zebra Printer #2.`, 3500)\n  }\n\n  handleCycleCount(item: WarehouseItem): void {\n    this.flashFeedback(`Cycle count logged and verified for bin ${item.binLocation}.`, 3500)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/warehouse-inventory-grid/warehouse-inventory-grid.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/warehouse-inventory-grid/index.ts",
      "content": "export {\n  UiWarehouseInventoryGridComponent,\n  type StockStatus,\n  type WarehouseItem,\n} from './warehouse-inventory-grid.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/warehouse-inventory-grid/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/dropdown-menu.json",
    "https://uipkge.dev/r/angular/input.json",
    "https://uipkge.dev/r/angular/progress.json",
    "https://uipkge.dev/r/angular/select.json",
    "https://uipkge.dev/r/angular/separator.json",
    "https://uipkge.dev/r/angular/sheet.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "WMS warehouse inventory and bin locator grid: facility selector, 4 summary metric cards for SKUs, capacity, low-stock triggers, and inbound shipments, searchable inventory table with multi-rack bin badges, on-hand/allocated/ATP counts, barcode scanning support, and slide-over bin relocation and receiving drawer.",
  "categories": [
    "logistics",
    "app",
    "ecommerce",
    "dashboard"
  ]
}