{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "stock-transfer-manager",
  "title": "Stock Transfer Manager",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-vue/blocks/stock-transfer-manager/StockTransferManager.vue",
      "content": "<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { ArrowRight, Barcode, CheckCircle2, Plus, QrCode, Trash2, Truck, Warehouse } from 'lucide-vue-next'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Badge } from '@/components/ui/badge'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\n\nexport interface TransferItem {\n  id: string\n  sku: string\n  name: string\n  barcode: string\n  lotNumber: string\n  sourceBin: string\n  targetBin: string\n  availableQty: number\n  transferQty: number\n  unit: string\n  condition: 'sellable' | 'quarantine' | 'damaged'\n}\n\nexport interface StockTransferProps {\n  transferId?: string\n  initialStatus?: 'draft' | 'staged' | 'in_transit' | 'received'\n}\n\nconst props = withDefaults(defineProps<StockTransferProps>(), {\n  transferId: 'TRF-2026-8841',\n  initialStatus: 'staged',\n})\n\nconst status = ref(props.initialStatus)\nconst sourceWarehouse = ref('wh-east-01')\nconst targetWarehouse = ref('wh-central-02')\nconst transportType = ref('pallet_freight')\nconst barcodeQuery = ref('')\n\nconst items = ref<TransferItem[]>([\n  {\n    id: 'itm-1',\n    sku: 'SKU-LOGI-884',\n    name: 'Industrial Barcode Scanner IP65',\n    barcode: '079357318921',\n    lotNumber: 'LOT-2026-A1',\n    sourceBin: 'A-04-R2-B12',\n    targetBin: 'C-01-R1-B03',\n    availableQty: 140,\n    transferQty: 25,\n    unit: 'pcs',\n    condition: 'sellable',\n  },\n  {\n    id: 'itm-2',\n    sku: 'SKU-PWR-331',\n    name: 'Lithium Iron Battery Pack 48V',\n    barcode: '079357318945',\n    lotNumber: 'LOT-2025-X9',\n    sourceBin: 'B-12-R4-B01',\n    targetBin: 'D-08-R2-B09',\n    availableQty: 48,\n    transferQty: 12,\n    unit: 'units',\n    condition: 'sellable',\n  },\n  {\n    id: 'itm-3',\n    sku: 'SKU-SENS-102',\n    name: 'Optical Proximity Sensor M18',\n    barcode: '079357318988',\n    lotNumber: 'LOT-2026-C4',\n    sourceBin: 'A-02-R1-B06',\n    targetBin: 'A-09-R3-B02',\n    availableQty: 320,\n    transferQty: 80,\n    unit: 'pcs',\n    condition: 'sellable',\n  },\n])\n\nconst totalUnits = computed(() => items.value.reduce((sum, item) => sum + Number(item.transferQty || 0), 0))\nconst totalLineItems = computed(() => items.value.length)\n\nfunction addItem() {\n  items.value.push({\n    id: `itm-${Date.now()}`,\n    sku: 'SKU-GEN-001',\n    name: 'Standard Packing Material Kit',\n    barcode: '079357399999',\n    lotNumber: 'LOT-UNASSIGNED',\n    sourceBin: 'A-01-R1-B01',\n    targetBin: 'B-01-R1-B01',\n    availableQty: 100,\n    transferQty: 10,\n    unit: 'kits',\n    condition: 'sellable',\n  })\n}\n\nfunction removeItem(id: string) {\n  items.value = items.value.filter((i) => i.id !== id)\n}\n\nfunction handleScan() {\n  if (!barcodeQuery.value) return\n  const found = items.value.find((i) => i.barcode === barcodeQuery.value || i.sku === barcodeQuery.value)\n  if (found) {\n    found.transferQty += 1\n  }\n  barcodeQuery.value = ''\n}\n</script>\n\n<template>\n  <div data-slot=\"stock-transfer-manager\" class=\"w-full space-y-6\">\n    <!-- Header Summary Card -->\n    <Card>\n      <CardHeader class=\"flex flex-col gap-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            <span class=\"text-muted-foreground font-mono text-sm font-medium\">{{ transferId }}</span>\n            <Badge\n              :variant=\"\n                status === 'received'\n                  ? 'default'\n                  : status === 'in_transit'\n                    ? 'secondary'\n                    : status === 'staged'\n                      ? 'outline'\n                      : 'outline'\n              \"\n              class=\"capitalize\"\n            >\n              {{ status.replace('_', ' ') }}\n            </Badge>\n          </div>\n          <CardTitle class=\"text-xl\">Inter-Warehouse Stock Transfer</CardTitle>\n          <CardDescription>\n            Transfer goods between fulfillment hubs with bin-level tracking and scan verification.\n          </CardDescription>\n        </div>\n        <div class=\"flex items-center gap-2\">\n          <Button v-if=\"status === 'staged'\" variant=\"default\" class=\"gap-2\" @click=\"status = 'in_transit'\">\n            <Truck class=\"size-4\" />\n            Dispatch Transfer\n          </Button>\n          <Button v-else-if=\"status === 'in_transit'\" variant=\"default\" class=\"gap-2\" @click=\"status = 'received'\">\n            <CheckCircle2 class=\"size-4\" />\n            Confirm Receipt\n          </Button>\n          <Button v-else-if=\"status === 'received'\" variant=\"outline\" class=\"gap-2\" @click=\"status = 'staged'\">\n            Reset Transfer\n          </Button>\n        </div>\n      </CardHeader>\n\n      <CardContent class=\"border-border grid grid-cols-1 gap-4 border-t pt-4 sm:grid-cols-3\">\n        <!-- Source Hub -->\n        <div class=\"border-border space-y-2 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-medium\">\n            <Warehouse class=\"size-3.5\" />\n            <span>ORIGIN FACILITY</span>\n          </div>\n          <Select v-model=\"sourceWarehouse\" :disabled=\"status !== 'draft' && status !== 'staged'\">\n            <SelectTrigger class=\"w-full\">\n              <SelectValue placeholder=\"Select origin warehouse\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"wh-east-01\">East Coast Fulfillment (NJ-01)</SelectItem>\n              <SelectItem value=\"wh-west-02\">West Coast Distribution (CA-04)</SelectItem>\n              <SelectItem value=\"wh-midwest-03\">Midwest Logistics Hub (IL-02)</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n\n        <!-- Destination Hub -->\n        <div class=\"border-border space-y-2 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-medium\">\n            <ArrowRight class=\"size-3.5\" />\n            <span>DESTINATION FACILITY</span>\n          </div>\n          <Select v-model=\"targetWarehouse\" :disabled=\"status !== 'draft' && status !== 'staged'\">\n            <SelectTrigger class=\"w-full\">\n              <SelectValue placeholder=\"Select target warehouse\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"wh-central-02\">Central Distribution Center (TX-01)</SelectItem>\n              <SelectItem value=\"wh-north-01\">Northern Sorting Facility (WA-02)</SelectItem>\n              <SelectItem value=\"wh-south-03\">Southeast Regional Hub (GA-03)</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n\n        <!-- Carrier / Transport -->\n        <div class=\"border-border space-y-2 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-medium\">\n            <Truck class=\"size-3.5\" />\n            <span>SHIPPING METHOD</span>\n          </div>\n          <Select v-model=\"transportType\" :disabled=\"status !== 'draft' && status !== 'staged'\">\n            <SelectTrigger class=\"w-full\">\n              <SelectValue placeholder=\"Select transit mode\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"pallet_freight\">Dedicated LTL Freight (Palletized)</SelectItem>\n              <SelectItem value=\"express_courier\">Priority Courier (Same Day Air)</SelectItem>\n              <SelectItem value=\"internal_fleet\">Internal Fleet Transfer (Route 09)</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n      </CardContent>\n    </Card>\n\n    <!-- Line Items Table Card -->\n    <Card>\n      <CardHeader class=\"flex flex-col gap-3 pb-3 sm:flex-row sm:items-center sm:justify-between\">\n        <div>\n          <CardTitle class=\"text-base font-semibold\">Manifest Line Items</CardTitle>\n          <CardDescription>\n            {{ totalLineItems }} unique SKUs · {{ totalUnits }} total units staged for transfer\n          </CardDescription>\n        </div>\n\n        <!-- Quick Scan / SKU lookup bar -->\n        <div class=\"flex items-center gap-2\">\n          <div class=\"relative w-64\">\n            <Barcode class=\"text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 size-4\" />\n            <Input\n              v-model=\"barcodeQuery\"\n              placeholder=\"Scan barcode or SKU...\"\n              class=\"pl-8\"\n              @keydown.enter.prevent=\"handleScan\"\n            />\n          </div>\n          <Button variant=\"secondary\" size=\"icon\" title=\"Scan Barcode\" @click=\"handleScan\">\n            <QrCode class=\"size-4\" />\n          </Button>\n          <Button variant=\"outline\" size=\"sm\" class=\"gap-1\" @click=\"addItem\">\n            <Plus class=\"size-3.5\" />\n            Add Item\n          </Button>\n        </div>\n      </CardHeader>\n\n      <CardContent class=\"p-0\">\n        <Table>\n          <TableHeader>\n            <TableRow>\n              <TableHead class=\"w-[280px]\">Product / SKU</TableHead>\n              <TableHead>Lot / Batch</TableHead>\n              <TableHead>Source Bin</TableHead>\n              <TableHead>Target Bin</TableHead>\n              <TableHead class=\"text-right\">Available</TableHead>\n              <TableHead class=\"w-[120px] text-right\">Transfer Qty</TableHead>\n              <TableHead>Condition</TableHead>\n              <TableHead class=\"w-[50px]\"></TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            <TableRow v-for=\"item in items\" :key=\"item.id\">\n              <!-- SKU + Name -->\n              <TableCell>\n                <div class=\"font-medium\">{{ item.name }}</div>\n                <div class=\"text-muted-foreground flex items-center gap-2 font-mono text-xs\">\n                  <span>{{ item.sku }}</span>\n                  <span>·</span>\n                  <span>{{ item.barcode }}</span>\n                </div>\n              </TableCell>\n\n              <!-- Lot Number -->\n              <TableCell>\n                <span class=\"font-mono text-xs\">{{ item.lotNumber }}</span>\n              </TableCell>\n\n              <!-- Source Bin -->\n              <TableCell>\n                <span class=\"bg-muted text-foreground rounded px-1.5 py-0.5 font-mono text-xs font-medium\">\n                  {{ item.sourceBin }}\n                </span>\n              </TableCell>\n\n              <!-- Target Bin -->\n              <TableCell>\n                <span class=\"border-border text-foreground rounded border px-1.5 py-0.5 font-mono text-xs font-medium\">\n                  {{ item.targetBin }}\n                </span>\n              </TableCell>\n\n              <!-- Available Qty -->\n              <TableCell class=\"text-muted-foreground text-right font-mono text-xs\">\n                {{ item.availableQty }} {{ item.unit }}\n              </TableCell>\n\n              <!-- Transfer Qty Input -->\n              <TableCell class=\"text-right\">\n                <Input\n                  v-model.number=\"item.transferQty\"\n                  type=\"number\"\n                  min=\"1\"\n                  :max=\"item.availableQty\"\n                  class=\"h-8 text-right font-mono\"\n                  :disabled=\"status === 'received'\"\n                />\n              </TableCell>\n\n              <!-- Condition -->\n              <TableCell>\n                <Select v-model=\"item.condition\" :disabled=\"status === 'received'\">\n                  <SelectTrigger class=\"h-8 w-[110px] text-xs capitalize\">\n                    <SelectValue />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"sellable\">Sellable</SelectItem>\n                    <SelectItem value=\"quarantine\">Quarantine</SelectItem>\n                    <SelectItem value=\"damaged\">Damaged</SelectItem>\n                  </SelectContent>\n                </Select>\n              </TableCell>\n\n              <!-- Remove Action -->\n              <TableCell>\n                <Button\n                  variant=\"ghost\"\n                  size=\"icon\"\n                  class=\"text-muted-foreground hover:text-destructive size-8\"\n                  :disabled=\"status === 'received'\"\n                  @click=\"removeItem(item.id)\"\n                >\n                  <Trash2 class=\"size-4\" />\n                </Button>\n              </TableCell>\n            </TableRow>\n          </TableBody>\n        </Table>\n      </CardContent>\n\n      <CardFooter class=\"border-border text-muted-foreground flex items-center justify-between border-t py-3 text-xs\">\n        <div>All inventory movements are recorded in immutable ledger log #LOG-9402.</div>\n        <div class=\"text-foreground font-medium\">\n          Total: <span class=\"font-mono\">{{ totalUnits }}</span> items across\n          <span class=\"font-mono\">{{ totalLineItems }}</span> positions\n        </div>\n      </CardFooter>\n    </Card>\n  </div>\n</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/stock-transfer-manager/StockTransferManager.vue"
    },
    {
      "path": "packages/registry-vue/blocks/stock-transfer-manager/index.ts",
      "content": "export { default as StockTransferManager } from './StockTransferManager.vue'\nexport type { TransferItem, StockTransferProps } from './StockTransferManager.vue'\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/stock-transfer-manager/index.ts"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/card.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/input.json",
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/select.json",
    "https://uipkge.dev/r/vue/table.json"
  ],
  "description": "Inter-facility inventory transfer console with bin-level routing, barcode lookup, and condition classification.",
  "categories": [
    "dashboard",
    "data-display"
  ]
}