{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "field-inspection-manager",
  "title": "Field Inspection Manager",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/FieldInspectionManager.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  AlertCircle,\n  AlertTriangle,\n  Building2,\n  Calendar,\n  Camera,\n  Check,\n  CheckCircle2,\n  ClipboardCheck,\n  Clock,\n  Copy,\n  Download,\n  Eye,\n  MapPin,\n  MoreHorizontal,\n  Plus,\n  Search,\n  ShieldAlert,\n  ShieldCheck,\n  Wrench,\n} from 'lucide-react'\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader } from '@/components/ui/card'\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport { cn } from '@/lib/utils'\nimport { PhotoLightboxDialog } from './PhotoLightboxDialog'\nimport { AuditReportDialog } from './AuditReportDialog'\nimport { NewAuditDialog } from './NewAuditDialog'\nimport { InspectionMetrics } from './InspectionMetrics'\nimport { InspectionThumbnail } from './InspectionThumbnail'\nimport { INITIAL_INSPECTION_RECORDS } from './field-inspection-data'\nimport type { InspectionStatus, PhotoEvidence, ChecklistItem, InspectionRecord } from './field-inspection-types'\n\nexport type { InspectionStatus, PhotoEvidence, ChecklistItem, InspectionRecord }\n\nexport interface FieldInspectionManagerProps {\n  initialFilter?: 'all' | 'passed' | 'critical' | 'minor'\n  className?: string\n}\n\nexport function FieldInspectionManager({ initialFilter = 'all', className }: FieldInspectionManagerProps) {\n  // Active UI states\n  const [activeFilter, setActiveFilter] = React.useState<'all' | 'passed' | 'critical' | 'minor'>(initialFilter)\n  const [searchQuery, setSearchQuery] = React.useState('')\n  const [selectedFacility, setSelectedFacility] = React.useState('all')\n  const [copiedGpsId, setCopiedGpsId] = React.useState<string | null>(null)\n  const [toastMessage, setToastMessage] = React.useState<string | null>(null)\n\n  // Dialog Modals\n  const [previewPhoto, setPreviewPhoto] = React.useState<{ photo: PhotoEvidence; record: InspectionRecord } | null>(\n    null,\n  )\n  const [selectedAudit, setSelectedAudit] = React.useState<InspectionRecord | null>(null)\n  const [isNewAuditOpen, setIsNewAuditOpen] = React.useState(false)\n\n  // Inspection Records Data\n  const [inspectionRecords] = React.useState<InspectionRecord[]>(INITIAL_INSPECTION_RECORDS)\n\n  // Filtered Records\n  const filteredRecords = React.useMemo(() => {\n    return inspectionRecords.filter((record) => {\n      // Status Filter\n      if (activeFilter === 'passed' && record.status !== 'passed') return false\n      if (activeFilter === 'critical' && record.status !== 'critical') return false\n      if (activeFilter === 'minor' && record.status !== 'minor') return false\n\n      // Facility Filter\n      if (selectedFacility !== 'all' && !record.facility.includes(selectedFacility)) return false\n\n      // Search Query\n      if (searchQuery.trim() !== '') {\n        const q = searchQuery.toLowerCase()\n        const matchesText =\n          record.assetName.toLowerCase().includes(q) ||\n          record.assetId.toLowerCase().includes(q) ||\n          record.facility.toLowerCase().includes(q) ||\n          record.category.toLowerCase().includes(q)\n        if (!matchesText) return false\n      }\n\n      return true\n    })\n  }, [inspectionRecords, activeFilter, selectedFacility, searchQuery])\n\n  const copyGps = (gps: string, recordId: string) => {\n    navigator.clipboard?.writeText(gps)\n    setCopiedGpsId(recordId)\n    showToast(`GPS Coordinates ${gps} copied to clipboard`)\n    setTimeout(() => {\n      setCopiedGpsId((curr) => (curr === recordId ? null : curr))\n    }, 2200)\n  }\n\n  const showToast = (msg: string) => {\n    setToastMessage(msg)\n    setTimeout(() => {\n      setToastMessage((curr) => (curr === msg ? null : curr))\n    }, 3000)\n  }\n\n  const handleOpenPhoto = (photo: PhotoEvidence, record: InspectionRecord) => {\n    setPreviewPhoto({ photo, record })\n  }\n\n  const handleViewReport = (record: InspectionRecord) => {\n    setSelectedAudit(record)\n  }\n\n  const handleDownloadPdf = (record: InspectionRecord) => {\n    showToast(`Downloading certified PDF audit report for ${record.assetId}...`)\n  }\n\n  const handleCreateWorkOrder = (record: InspectionRecord) => {\n    showToast(`Work Order generated for ${record.assetName} (Assigned to Facilities Ops)`)\n  }\n\n  return (\n    <div data-slot=\"field-inspection-manager\" className={cn('text-foreground w-full space-y-6', className)}>\n      {/* Toast Banner */}\n      {toastMessage && (\n        <div className=\"border-primary/30 bg-primary/10 text-foreground fixed top-4 right-4 z-50 flex items-center gap-2 rounded-lg border px-4 py-2.5 text-xs font-medium shadow-lg backdrop-blur-md\">\n          <CheckCircle2 className=\"text-primary size-4 shrink-0\" />\n          <span>{toastMessage}</span>\n        </div>\n      )}\n\n      {/* Main Header */}\n      <Card className=\"border-border shadow-xs\">\n        <CardHeader className=\"flex flex-col gap-4 pb-6 lg:flex-row lg:items-start lg:justify-between\">\n          <div className=\"space-y-2\">\n            <div className=\"flex flex-wrap items-center gap-2\">\n              <Badge variant=\"outline\" className=\"gap-1.5 font-mono text-xs\">\n                <ClipboardCheck className=\"text-primary size-3.5\" aria-hidden=\"true\" />\n                ISO-55001 & OSHA Audit Matrix\n              </Badge>\n\n              <div className=\"border-success/20 bg-success/10 text-success inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium\">\n                <span className=\"relative flex size-1.5\">\n                  <span className=\"bg-success absolute inline-flex h-full w-full rounded-full opacity-75\"></span>\n                  <span className=\"bg-success relative inline-flex size-1.5 rounded-full\"></span>\n                </span>\n                8 Audits Completed Today · 100% On-Time\n              </div>\n            </div>\n\n            <div>\n              <h1 className=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n                Site & Asset Inspection Audits\n              </h1>\n              <div className=\"text-muted-foreground mt-1 flex flex-wrap items-center gap-2 text-xs sm:text-sm\">\n                <div className=\"text-foreground flex items-center gap-1.5 font-medium\">\n                  <Avatar className=\"border-border size-5 border\">\n                    <AvatarFallback className=\"bg-primary/10 text-primary text-xs font-bold\">MV</AvatarFallback>\n                  </Avatar>\n                  <span>Marcus Vance</span>\n                </div>\n                <span className=\"text-muted-foreground\">Senior Field Engineer (PE #84920-CA)</span>\n                <span className=\"text-muted-foreground font-mono\">Terminal: Apex Facility West</span>\n              </div>\n            </div>\n          </div>\n\n          <div className=\"flex flex-wrap items-center gap-2.5 pt-1\">\n            <Button\n              aria-label=\"Download attachment\"\n              variant=\"outline\"\n              size=\"sm\"\n              className=\"gap-1.5 text-xs font-medium shadow-xs\"\n              onClick={() => showToast('Exporting complete site inspection audit summary CSV...')}\n            >\n              <Download className=\"size-3.5\" aria-hidden=\"true\" />\n              Export Audits CSV\n            </Button>\n\n            <Button size=\"sm\" className=\"gap-1.5 text-xs font-medium shadow-xs\" onClick={() => setIsNewAuditOpen(true)}>\n              <Plus className=\"size-3.5\" aria-hidden=\"true\" />\n              Start New Inspection\n            </Button>\n          </div>\n        </CardHeader>\n      </Card>\n\n      {/* 4 KPI Cards */}\n      <InspectionMetrics />\n\n      {/* Search & Filter Toolbar */}\n      <Card className=\"border-border shadow-xs\">\n        <CardContent className=\"p-4\">\n          <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n            {/* Filter Pills */}\n            <div className=\"flex flex-wrap items-center gap-1.5\">\n              <button\n                type=\"button\"\n                className={cn(\n                  'focus-visible:ring-ring inline-flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none',\n                  activeFilter === 'all'\n                    ? 'bg-primary text-primary-foreground font-semibold shadow-xs'\n                    : 'bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground',\n                )}\n                onClick={() => setActiveFilter('all')}\n              >\n                All Audits (5)\n              </button>\n\n              <button\n                type=\"button\"\n                className={cn(\n                  'focus-visible:ring-ring inline-flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none',\n                  activeFilter === 'passed'\n                    ? 'bg-success font-semibold text-white shadow-xs'\n                    : 'bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground',\n                )}\n                onClick={() => setActiveFilter('passed')}\n              >\n                <CheckCircle2 className=\"size-3.5\" />\n                Passed (2)\n              </button>\n\n              <button\n                type=\"button\"\n                className={cn(\n                  'focus-visible:ring-ring inline-flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none',\n                  activeFilter === 'critical'\n                    ? 'bg-destructive font-semibold text-white shadow-xs'\n                    : 'bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground',\n                )}\n                onClick={() => setActiveFilter('critical')}\n              >\n                <AlertTriangle className=\"size-3.5\" />\n                Critical Defects (2)\n              </button>\n\n              <button\n                type=\"button\"\n                className={cn(\n                  'focus-visible:ring-ring inline-flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none',\n                  activeFilter === 'minor'\n                    ? 'bg-warning font-semibold text-white shadow-xs'\n                    : 'bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground',\n                )}\n                onClick={() => setActiveFilter('minor')}\n              >\n                <AlertCircle className=\"size-3.5\" />\n                Minor Issues (1)\n              </button>\n            </div>\n\n            {/* Search Input & Facility Selector */}\n            <div className=\"flex flex-wrap items-center gap-2\">\n              <div className=\"w-full sm:w-48\">\n                <Select value={selectedFacility} onValueChange={(val) => val && setSelectedFacility(val)}>\n                  <SelectTrigger className=\"h-8 text-xs\">\n                    <SelectValue placeholder=\"All Facilities\" />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"all\">All Facilities (5)</SelectItem>\n                    <SelectItem value=\"Building A\">Building A (2)</SelectItem>\n                    <SelectItem value=\"Building B\">Building B (1)</SelectItem>\n                    <SelectItem value=\"Building C\">Building C (1)</SelectItem>\n                    <SelectItem value=\"Parking Structure\">Parking Structure (1)</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n\n              <div className=\"relative w-full sm:w-64\">\n                <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\" />\n                <Input\n                  value={searchQuery}\n                  onChange={(e) => setSearchQuery(e.target.value)}\n                  type=\"text\"\n                  placeholder=\"Search asset, ID, category...\"\n                  className=\"h-8 pl-8 text-xs\"\n                />\n              </div>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Audit Records Table */}\n      <Card className=\"border-border overflow-hidden shadow-xs\">\n        <div className=\"overflow-x-auto\">\n          <Table>\n            <TableHeader>\n              <TableRow className=\"bg-muted/30\">\n                <TableHead className=\"text-foreground w-[220px] text-xs font-semibold\">Asset & Facility</TableHead>\n                <TableHead className=\"text-foreground text-xs font-semibold\">Date & GPS Stamping</TableHead>\n                <TableHead className=\"text-foreground text-xs font-semibold\">Inspection Checklist</TableHead>\n                <TableHead className=\"text-foreground text-xs font-semibold\">Status & Work Order</TableHead>\n                <TableHead className=\"text-foreground text-xs font-semibold\">Photographic Evidence</TableHead>\n                <TableHead className=\"text-foreground text-xs font-semibold\">Inspector & Sign-off</TableHead>\n                <TableHead className=\"text-foreground text-right text-xs font-semibold\">Actions</TableHead>\n              </TableRow>\n            </TableHeader>\n\n            <TableBody>\n              {filteredRecords.map((record) => (\n                <TableRow key={record.id} className=\"border-border hover:bg-muted/20 transition-colors\">\n                  {/* 1. Asset & Facility */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"space-y-1\">\n                      <div className=\"flex items-center gap-1.5\">\n                        <span className=\"text-foreground text-xs font-bold\">{record.assetName}</span>\n                        <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                          {record.buildingBadge}\n                        </Badge>\n                      </div>\n                      <div className=\"text-muted-foreground font-mono text-xs\">{record.assetId}</div>\n                      <div className=\"text-muted-foreground/90 flex items-center gap-1 text-xs\">\n                        <Building2 className=\"size-3 shrink-0\" />\n                        <span className=\"truncate\">{record.facility}</span>\n                      </div>\n                    </div>\n                  </TableCell>\n\n                  {/* 2. Date & GPS Stamping */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"space-y-1\">\n                      <div className=\"text-foreground flex items-center gap-1 text-xs font-medium\">\n                        <Calendar className=\"text-muted-foreground size-3\" />\n                        <span>{record.date}</span>\n                      </div>\n                      <div className=\"text-muted-foreground flex items-center gap-1 font-mono text-xs\">\n                        <Clock className=\"size-3\" />\n                        <span>\n                          {record.time} ({record.duration})\n                        </span>\n                      </div>\n                      <button\n                        type=\"button\"\n                        aria-label={`Copy GPS coordinates for ${record.assetId}: ${record.gps}`}\n                        className=\"border-border hover:bg-muted focus-visible:ring-ring bg-muted/40 text-muted-foreground inline-flex cursor-pointer items-center gap-1 rounded border px-2 py-0.5 font-mono text-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                        onClick={() => copyGps(record.gps, record.id)}\n                      >\n                        <MapPin className=\"text-primary size-2.5\" />\n                        <span>{record.gps}</span>\n                        {copiedGpsId === record.id ? (\n                          <Check className=\"text-success size-2.5\" />\n                        ) : (\n                          <Copy className=\"text-muted-foreground/60 size-2.5\" />\n                        )}\n                      </button>\n                    </div>\n                  </TableCell>\n\n                  {/* 3. Inspection Checklist */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"w-48 space-y-1.5\">\n                      <div className=\"flex items-center justify-between text-xs\">\n                        <span className=\"text-muted-foreground font-medium\">Score</span>\n                        <span\n                          className={cn(\n                            'font-mono font-semibold',\n                            record.status === 'passed'\n                              ? 'text-success'\n                              : record.status === 'critical'\n                                ? 'text-destructive'\n                                : 'text-warning',\n                          )}\n                        >\n                          {{ record }.record.statusLabel}\n                        </span>\n                      </div>\n                      <div className=\"bg-muted h-1.5 w-full overflow-hidden rounded-full\">\n                        <div\n                          className={cn(\n                            'h-full rounded-full transition-[width] duration-300',\n                            record.status === 'passed'\n                              ? 'bg-success'\n                              : record.status === 'critical'\n                                ? 'bg-destructive'\n                                : 'bg-warning',\n                          )}\n                          style={{ width: `${(record.scorePassed / record.scoreTotal) * 100}%` }}\n                        />\n                      </div>\n                      <div className=\"text-muted-foreground space-y-0.5 text-xs\">\n                        {record.checklist.slice(0, 2).map((item) => (\n                          <div key={item.id} className=\"flex items-center gap-1 truncate font-mono text-xs\">\n                            {item.status === 'pass' && <CheckCircle2 className=\"text-success size-2.5 shrink-0\" />}\n                            {item.status === 'fail' && <AlertTriangle className=\"text-destructive size-2.5 shrink-0\" />}\n                            {item.status === 'minor' && <AlertCircle className=\"text-warning size-2.5 shrink-0\" />}\n                            <span className=\"truncate\">\n                              {item.label}: {item.value}\n                            </span>\n                          </div>\n                        ))}\n                      </div>\n                    </div>\n                  </TableCell>\n\n                  {/* 4. Status & Work Order */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"space-y-1.5\">\n                      <Badge\n                        variant={record.status === 'passed' ? 'default' : 'destructive'}\n                        className={cn(\n                          'text-xs font-semibold capitalize',\n                          record.status === 'passed' && 'bg-success hover:bg-success/90 text-white',\n                          record.status === 'minor' && 'bg-warning hover:bg-warning/90 text-white',\n                          record.status === 'critical' && 'bg-destructive hover:bg-destructive/90 text-white',\n                        )}\n                      >\n                        {record.status === 'passed' && <CheckCircle2 className=\"mr-1 size-3\" />}\n                        {record.status === 'critical' && <AlertTriangle className=\"mr-1 size-3\" />}\n                        {record.status === 'minor' && <AlertCircle className=\"mr-1 size-3\" />}\n                        {record.status}\n                      </Badge>\n\n                      {record.defectSummary ? (\n                        <p className=\"text-destructive max-w-[200px] text-xs leading-tight font-medium\">\n                          {record.defectSummary}\n                        </p>\n                      ) : (\n                        <p className=\"text-muted-foreground text-xs leading-tight\">\n                          All calibration points verified within tolerance.\n                        </p>\n                      )}\n\n                      {record.workOrder && (\n                        <div className=\"pt-0.5\">\n                          <span className=\"border-border bg-muted/30 text-muted-foreground inline-flex items-center gap-1 rounded border px-1.5 py-0.5 font-mono text-xs\">\n                            <Wrench className=\"text-warning size-2.5\" />\n                            <span className=\"max-w-[140px] truncate\">{record.workOrder}</span>\n                          </span>\n                        </div>\n                      )}\n                    </div>\n                  </TableCell>\n\n                  {/* 5. Photographic Evidence */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"space-y-1.5\">\n                      <div className=\"flex items-center gap-1.5\">\n                        {record.photos.map((photo, pIdx) => (\n                          <button\n                            key={photo.id}\n                            type=\"button\"\n                            aria-label={`View inspection photo ${pIdx + 1}: ${photo.title}`}\n                            className=\"border-border hover:border-primary focus-visible:ring-ring group/thumb relative size-11 shrink-0 cursor-pointer overflow-hidden rounded-md border bg-zinc-900 shadow-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n                            onClick={() => handleOpenPhoto(photo, record)}\n                          >\n                            <InspectionThumbnail type={photo.previewType} />\n                            <div className=\"absolute inset-0 flex items-center justify-center bg-black/60 opacity-0 transition-opacity group-hover/thumb:opacity-100\">\n                              <Eye className=\"size-3.5 text-white\" />\n                            </div>\n                          </button>\n                        ))}\n                      </div>\n                      <div className=\"text-muted-foreground flex items-center gap-1 text-xs\">\n                        <Camera className=\"size-3\" />\n                        <span>{record.photos.length} Attachments</span>\n                      </div>\n                    </div>\n                  </TableCell>\n\n                  {/* 6. Inspector & Sign-off */}\n                  <TableCell className=\"py-3.5 align-top\">\n                    <div className=\"space-y-1\">\n                      <div className=\"flex items-center gap-2\">\n                        <Avatar className=\"border-border size-6 border\">\n                          <AvatarFallback className=\"bg-primary/10 text-primary text-xs font-bold\">\n                            {record.inspector.initials}\n                          </AvatarFallback>\n                        </Avatar>\n                        <span className=\"text-foreground text-xs font-semibold\">{record.inspector.name}</span>\n                      </div>\n                      <div>\n                        <span\n                          className={cn(\n                            'inline-flex items-center gap-1 font-mono text-xs font-medium',\n                            record.status === 'critical' ? 'text-destructive' : 'text-success',\n                          )}\n                        >\n                          {record.status !== 'critical' ? (\n                            <ShieldCheck className=\"size-3 shrink-0\" />\n                          ) : (\n                            <ShieldAlert className=\"size-3 shrink-0\" />\n                          )}\n                          {record.inspector.signoffStatus}\n                        </span>\n                      </div>\n                      <div className=\"text-muted-foreground/80 font-mono text-xs\">{record.inspector.signoffHash}</div>\n                    </div>\n                  </TableCell>\n\n                  {/* 7. Actions Dropdown */}\n                  <TableCell className=\"py-3.5 text-right align-top\" onClick={(e) => e.stopPropagation()}>\n                    <DropdownMenu>\n                      <DropdownMenuTrigger asChild>\n                        <Button variant=\"ghost\" size=\"sm\" className=\"size-8 p-0\">\n                          <span className=\"sr-only\">Open audit menu</span>\n                          <MoreHorizontal className=\"size-4\" />\n                        </Button>\n                      </DropdownMenuTrigger>\n                      <DropdownMenuContent align=\"end\" className=\"w-48 text-xs\">\n                        <DropdownMenuLabel className=\"font-mono text-xs\">{record.assetId}</DropdownMenuLabel>\n                        <DropdownMenuSeparator />\n                        <DropdownMenuItem className=\"cursor-pointer gap-2\" onClick={() => handleViewReport(record)}>\n                          <Eye className=\"text-primary size-3.5\" />\n                          <span>View Audit Report</span>\n                        </DropdownMenuItem>\n                        <DropdownMenuItem className=\"cursor-pointer gap-2\" onClick={() => handleDownloadPdf(record)}>\n                          <Download className=\"size-3.5\" />\n                          <span>Download PDF</span>\n                        </DropdownMenuItem>\n                        <DropdownMenuItem\n                          className=\"cursor-pointer gap-2\"\n                          onClick={() => copyGps(record.gps, record.id)}\n                        >\n                          <Copy className=\"size-3.5\" />\n                          <span>Copy GPS Coordinates</span>\n                        </DropdownMenuItem>\n                        <DropdownMenuSeparator />\n                        <DropdownMenuItem\n                          className={cn(\n                            'cursor-pointer gap-2',\n                            record.status === 'critical' ? 'text-destructive font-semibold' : '',\n                          )}\n                          onClick={() => handleCreateWorkOrder(record)}\n                        >\n                          <Wrench className=\"size-3.5\" />\n                          <span>{record.status === 'critical' ? 'Expedite Work Order' : 'Create Work Order'}</span>\n                        </DropdownMenuItem>\n                      </DropdownMenuContent>\n                    </DropdownMenu>\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </div>\n      </Card>\n\n      {/* Photo Lightbox Dialog */}\n      <PhotoLightboxDialog\n        previewPhoto={previewPhoto}\n        onOpenChange={(open) => !open && setPreviewPhoto(null)}\n        onDownloadPhoto={() => showToast('Exporting high-resolution raw image file...')}\n      />\n\n      {/* Comprehensive Audit Report Dialog */}\n      <AuditReportDialog\n        selectedAudit={selectedAudit}\n        onOpenChange={(open) => !open && setSelectedAudit(null)}\n        onPreviewPhoto={handleOpenPhoto}\n        onDownloadReport={handleDownloadPdf}\n      />\n\n      {/* Start New Inspection Dialog */}\n      <NewAuditDialog open={isNewAuditOpen} onOpenChange={setIsNewAuditOpen} onToast={showToast} />\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/FieldInspectionManager.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/PhotoLightboxDialog.tsx",
      "content": "'use client'\n\nimport { Camera, Download } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport type { InspectionRecord, PhotoEvidence } from './field-inspection-types'\n\nexport interface PhotoLightboxDialogProps {\n  previewPhoto: { photo: PhotoEvidence; record: InspectionRecord } | null\n  onOpenChange: (open: boolean) => void\n  onDownloadPhoto: () => void\n}\n\nexport function PhotoLightboxDialog({ previewPhoto, onOpenChange, onDownloadPhoto }: PhotoLightboxDialogProps) {\n  return (\n    <Dialog open={!!previewPhoto} onOpenChange={onOpenChange}>\n      <DialogContent className=\"sm:max-w-2xl\">\n        {previewPhoto && (\n          <>\n            <DialogHeader>\n              <div className=\"flex items-center justify-between pr-4\">\n                <div className=\"flex items-center gap-2\">\n                  <Camera className=\"text-primary size-4\" />\n                  <DialogTitle className=\"text-base font-bold\">{previewPhoto.photo.title}</DialogTitle>\n                </div>\n                <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                  {previewPhoto.record.assetId}\n                </Badge>\n              </div>\n              <DialogDescription className=\"text-xs\">\n                Captured during {previewPhoto.record.assetName} site inspection audit.\n              </DialogDescription>\n            </DialogHeader>\n\n            <div className=\"space-y-4 py-2\">\n              <div className=\"border-border relative aspect-[16/10] w-full overflow-hidden rounded-lg border bg-gradient-to-br from-zinc-800 via-zinc-900 to-black p-4 text-white shadow-inner\">\n                <div className=\"absolute inset-0 flex items-center justify-center p-6\">\n                  {previewPhoto.photo.previewType === 'gauge' ? (\n                    <svg className=\"h-full w-full\" viewBox=\"0 0 300 200\" fill=\"none\">\n                      <rect width=\"300\" height=\"200\" fill=\"#18181b\" />\n                      <circle cx=\"150\" cy=\"100\" r=\"70\" fill=\"#27272a\" stroke=\"#71717a\" strokeWidth=\"4\" />\n                      <path\n                        d=\"M 100,125 A 55,55 0 1,1 200,125\"\n                        fill=\"none\"\n                        stroke=\"#22c55e\"\n                        strokeWidth=\"6\"\n                        strokeDasharray=\"4 2\"\n                      />\n                      <line\n                        x1=\"150\"\n                        y1=\"100\"\n                        x2=\"185\"\n                        y2=\"65\"\n                        stroke=\"#ef4444\"\n                        strokeWidth=\"3.5\"\n                        strokeLinecap=\"round\"\n                      />\n                      <circle cx=\"150\" cy=\"100\" r=\"8\" fill=\"#f4f4f5\" />\n                      <text x=\"150\" y=\"140\" fill=\"#a1a1aa\" fontSize=\"12\" textAnchor=\"middle\" fontFamily=\"monospace\">\n                        68.4 PSI · NOMINAL\n                      </text>\n                    </svg>\n                  ) : previewPhoto.photo.previewType === 'thermal' ? (\n                    <svg className=\"h-full w-full\" viewBox=\"0 0 300 200\" fill=\"none\">\n                      <rect width=\"300\" height=\"200\" fill=\"#3b0764\" />\n                      <circle cx=\"150\" cy=\"100\" r=\"65\" fill=\"#db2777\" fillOpacity=\"0.6\" />\n                      <circle cx=\"150\" cy=\"100\" r=\"30\" fill=\"#facc15\" />\n                      <line x1=\"80\" y1=\"100\" x2=\"220\" y2=\"100\" stroke=\"#ffffff\" strokeWidth=\"1.5\" />\n                      <line x1=\"150\" y1=\"30\" x2=\"150\" y2=\"170\" stroke=\"#ffffff\" strokeWidth=\"1.5\" />\n                      <circle cx=\"150\" cy=\"100\" r=\"6\" stroke=\"#ffffff\" strokeWidth=\"1.5\" fill=\"none\" />\n                      <text x=\"160\" y=\"90\" fill=\"#ffffff\" fontSize=\"14\" fontWeight=\"bold\" fontFamily=\"monospace\">\n                        84.2°C CRITICAL\n                      </text>\n                    </svg>\n                  ) : previewPhoto.photo.previewType === 'spall' ? (\n                    <svg className=\"h-full w-full\" viewBox=\"0 0 300 200\" fill=\"none\">\n                      <rect width=\"300\" height=\"200\" fill=\"#27272a\" />\n                      <polygon\n                        points=\"40,30 260,30 260,170 170,170 130,110 40,100\"\n                        fill=\"#52525b\"\n                        stroke=\"#71717a\"\n                        strokeWidth=\"2\"\n                      />\n                      <polygon\n                        points=\"130,110 180,90 170,170\"\n                        fill=\"#ef4444\"\n                        fillOpacity=\"0.4\"\n                        stroke=\"#ef4444\"\n                        strokeWidth=\"2\"\n                      />\n                      <line x1=\"130\" y1=\"110\" x2=\"180\" y2=\"90\" stroke=\"#facc15\" strokeWidth=\"2\" strokeDasharray=\"3 3\" />\n                      <text x=\"155\" y=\"80\" fill=\"#facc15\" fontSize=\"12\" fontFamily=\"monospace\">\n                        18cm SHEAR SPALL\n                      </text>\n                    </svg>\n                  ) : (\n                    <svg className=\"h-full w-full\" viewBox=\"0 0 300 200\" fill=\"none\">\n                      <rect width=\"300\" height=\"200\" fill=\"#18181b\" />\n                      <rect\n                        x=\"40\"\n                        y=\"30\"\n                        width=\"220\"\n                        height=\"140\"\n                        rx=\"4\"\n                        fill=\"#27272a\"\n                        stroke=\"#3f3f46\"\n                        strokeWidth=\"2\"\n                      />\n                      <circle cx=\"150\" cy=\"100\" r=\"35\" fill=\"#3f3f46\" stroke=\"#38bdf8\" strokeWidth=\"2\" />\n                      <line x1=\"70\" y1=\"60\" x2=\"230\" y2=\"60\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n                      <line x1=\"70\" y1=\"140\" x2=\"230\" y2=\"140\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n                    </svg>\n                  )}\n                </div>\n\n                <div className=\"pointer-events-none absolute inset-4 border border-white/20\">\n                  <div className=\"border-success absolute -top-1 -left-1 size-3 border-t-2 border-l-2\" />\n                  <div className=\"border-success absolute -top-1 -right-1 size-3 border-t-2 border-r-2\" />\n                  <div className=\"border-success absolute -bottom-1 -left-1 size-3 border-b-2 border-l-2\" />\n                  <div className=\"border-success absolute -right-1 -bottom-1 size-3 border-r-2 border-b-2\" />\n                </div>\n\n                <div className=\"absolute top-3 left-3 flex items-center gap-1.5 rounded bg-black/70 px-2 py-1 font-mono text-xs backdrop-blur-sm\">\n                  <span className=\"bg-success size-2 animate-pulse rounded-full\" />\n                  <span>GEO-AUTHENTICATED FIELD PHOTO</span>\n                </div>\n\n                <div className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/90 via-black/60 to-transparent p-3 pt-6 font-mono text-xs\">\n                  <div className=\"flex flex-wrap items-center justify-between gap-2\">\n                    <span className=\"text-success font-bold tabular-nums\">\n                      📍 {previewPhoto.record.gps} ({previewPhoto.record.gpsAccuracy})\n                    </span>\n                    <span className=\"text-zinc-300\">\n                      {previewPhoto.record.date} · {previewPhoto.photo.time}\n                    </span>\n                  </div>\n                </div>\n              </div>\n\n              <div className=\"border-border bg-muted/20 space-y-2 rounded-lg border p-3 text-xs\">\n                <div className=\"text-foreground font-semibold\">Inspector Field Observation:</div>\n                <p className=\"text-muted-foreground leading-relaxed\">{previewPhoto.photo.caption}</p>\n              </div>\n\n              <div className=\"grid grid-cols-2 gap-2 text-xs sm:grid-cols-4\">\n                <div className=\"border-border bg-muted/30 rounded border p-2\">\n                  <span className=\"text-muted-foreground block text-xs\">Asset ID</span>\n                  <span className=\"text-foreground font-mono font-semibold\">{previewPhoto.record.assetId}</span>\n                </div>\n                <div className=\"border-border bg-muted/30 rounded border p-2\">\n                  <span className=\"text-muted-foreground block text-xs\">Facility</span>\n                  <span className=\"text-foreground truncate font-medium\">{previewPhoto.record.buildingBadge}</span>\n                </div>\n                <div className=\"border-border bg-muted/30 rounded border p-2\">\n                  <span className=\"text-muted-foreground block text-xs\">Capture Timestamp</span>\n                  <span className=\"text-foreground font-mono font-medium tabular-nums\">{previewPhoto.photo.time}</span>\n                </div>\n                <div className=\"border-border bg-muted/30 rounded border p-2\">\n                  <span className=\"text-muted-foreground block text-xs\">Cryptographic Seal</span>\n                  <span className=\"text-success font-mono font-medium\">Valid SHA-256</span>\n                </div>\n              </div>\n            </div>\n\n            <DialogFooter className=\"flex flex-wrap items-center justify-between gap-2\">\n              <Button\n                aria-label=\"Download attachment\"\n                variant=\"outline\"\n                size=\"sm\"\n                className=\"text-xs font-medium\"\n                onClick={() => onDownloadPhoto()}\n              >\n                <Download className=\"mr-1.5 size-3.5\" />\n                Download Original Photo\n              </Button>\n              <DialogClose asChild>\n                <Button size=\"sm\" className=\"text-xs\">\n                  Close\n                </Button>\n              </DialogClose>\n            </DialogFooter>\n          </>\n        )}\n      </DialogContent>\n    </Dialog>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/PhotoLightboxDialog.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/AuditReportDialog.tsx",
      "content": "'use client'\n\nimport { AlertTriangle, Camera, Download, ShieldCheck } from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport type { InspectionRecord, PhotoEvidence } from './field-inspection-types'\n\nexport interface AuditReportDialogProps {\n  selectedAudit: InspectionRecord | null\n  onOpenChange: (open: boolean) => void\n  onPreviewPhoto: (photo: PhotoEvidence, record: InspectionRecord) => void\n  onDownloadReport: (audit: InspectionRecord) => void\n}\n\nexport function AuditReportDialog({\n  selectedAudit,\n  onOpenChange,\n  onPreviewPhoto,\n  onDownloadReport,\n}: AuditReportDialogProps) {\n  return (\n    <Dialog open={!!selectedAudit} onOpenChange={onOpenChange}>\n      <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-3xl\">\n        {selectedAudit && (\n          <>\n            <DialogHeader>\n              <div className=\"flex flex-wrap items-center justify-between gap-2 pr-4\">\n                <div className=\"space-y-1\">\n                  <div className=\"flex items-center gap-2\">\n                    <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                      {selectedAudit.assetId}\n                    </Badge>\n                    <Badge\n                      variant={\n                        selectedAudit.status === 'critical'\n                          ? 'destructive'\n                          : selectedAudit.status === 'minor'\n                            ? 'warning'\n                            : 'outline'\n                      }\n                      className={cn(\n                        'font-mono text-xs font-semibold',\n                        selectedAudit.status === 'passed' && 'border-success/30 bg-success/10 text-success',\n                      )}\n                    >\n                      {selectedAudit.statusLabel}\n                    </Badge>\n                  </div>\n                  <DialogTitle className=\"text-lg font-bold sm:text-xl\">{selectedAudit.assetName}</DialogTitle>\n                </div>\n              </div>\n              <DialogDescription className=\"text-xs\">\n                Commercial facility asset engineering inspection audit record · {selectedAudit.category}\n              </DialogDescription>\n            </DialogHeader>\n\n            <div className=\"space-y-5 py-2\">\n              <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n                <div className=\"border-border bg-muted/20 rounded-lg border p-3\">\n                  <span className=\"text-muted-foreground block text-xs font-medium\">Facility Location</span>\n                  <span className=\"text-foreground mt-0.5 block text-xs font-semibold\">{selectedAudit.facility}</span>\n                </div>\n                <div className=\"border-border bg-muted/20 rounded-lg border p-3\">\n                  <span className=\"text-muted-foreground block text-xs font-medium\">Inspection Time</span>\n                  <span className=\"text-foreground mt-0.5 block text-xs font-semibold tabular-nums\">\n                    {selectedAudit.date} · {selectedAudit.time}\n                  </span>\n                </div>\n                <div className=\"border-border bg-muted/20 rounded-lg border p-3\">\n                  <span className=\"text-muted-foreground block text-xs font-medium\">GPS Geostamp</span>\n                  <span className=\"text-foreground mt-0.5 block font-mono text-xs font-semibold tabular-nums\">\n                    {selectedAudit.gps}\n                  </span>\n                  <span className=\"text-muted-foreground text-xs\">Accuracy: {selectedAudit.gpsAccuracy}</span>\n                </div>\n                <div className=\"border-border bg-muted/20 rounded-lg border p-3\">\n                  <span className=\"text-muted-foreground block text-xs font-medium\">Audit Duration</span>\n                  <span className=\"text-foreground mt-0.5 block text-xs font-semibold tabular-nums\">\n                    {selectedAudit.duration}\n                  </span>\n                  <span className=\"text-muted-foreground text-xs\">SLA compliant</span>\n                </div>\n              </div>\n\n              {selectedAudit.status === 'critical' && (\n                <div className=\"border-destructive/30 bg-destructive/10 text-destructive space-y-1.5 rounded-lg border p-3.5 text-xs\">\n                  <div className=\"flex items-center gap-1.5 font-bold\">\n                    <AlertTriangle className=\"text-destructive size-4\" />\n                    <span>Critical Deficiencies Flagged · Action Dispatched</span>\n                  </div>\n                  <p className=\"leading-relaxed\">{selectedAudit.defectSummary}</p>\n                  <div className=\"pt-1 font-mono font-semibold\">Active Work Order: {selectedAudit.workOrder}</div>\n                </div>\n              )}\n\n              <div className=\"space-y-2\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-foreground text-xs font-semibold\">Pass / Fail Checklist Audit Items</span>\n                  <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                    {selectedAudit.scorePassed} / {selectedAudit.scoreTotal} Passed\n                  </span>\n                </div>\n                <div className=\"border-border divide-border divide-y rounded-lg border\">\n                  {selectedAudit.checklist.map((item) => (\n                    <div key={item.id} className=\"flex items-center justify-between p-2.5 text-xs\">\n                      <div className=\"flex items-center gap-2\">\n                        <Badge\n                          variant={\n                            item.status === 'fail' ? 'destructive' : item.status === 'minor' ? 'warning' : 'outline'\n                          }\n                          className=\"h-5 px-1.5 font-mono text-xs uppercase\"\n                        >\n                          {item.status}\n                        </Badge>\n                        <span className=\"text-foreground font-medium\">{item.label}</span>\n                      </div>\n                      <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">{item.value}</span>\n                    </div>\n                  ))}\n                </div>\n              </div>\n\n              <div className=\"space-y-2\">\n                <span className=\"text-foreground text-xs font-semibold\">Photographic Evidence Attachments</span>\n                <div className=\"grid grid-cols-3 gap-3\">\n                  {selectedAudit.photos.map((photo) => (\n                    <button\n                      key={photo.id}\n                      type=\"button\"\n                      className=\"border-border hover:border-primary/60 group/p cursor-pointer overflow-hidden rounded-lg border bg-zinc-900 p-2 text-left transition-colors\"\n                      onClick={() => onPreviewPhoto(photo, selectedAudit)}\n                    >\n                      <div className=\"relative aspect-[16/10] w-full overflow-hidden rounded bg-black\">\n                        <div className=\"absolute inset-0 flex items-center justify-center\">\n                          <Camera className=\"text-muted-foreground size-6\" />\n                        </div>\n                      </div>\n                      <div className=\"text-foreground mt-1.5 truncate text-xs font-semibold\">{photo.title}</div>\n                      <div className=\"text-muted-foreground font-mono text-xs tabular-nums\">{photo.time}</div>\n                    </button>\n                  ))}\n                </div>\n              </div>\n\n              <div className=\"border-border bg-muted/15 space-y-2 rounded-xl border p-4\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs font-medium\">\n                    <ShieldCheck className=\"text-primary size-3.5\" />\n                    Electronic Cryptographic Engineer Sign-off\n                  </span>\n                  <span className=\"text-muted-foreground font-mono text-xs\">{selectedAudit.inspector.badge}</span>\n                </div>\n                <div className=\"border-border/60 border-b pt-1 pb-3\">\n                  <p className=\"text-primary text-2xl font-medium tracking-wide italic\">\n                    {selectedAudit.inspector.name}\n                  </p>\n                </div>\n                <div className=\"text-muted-foreground flex flex-wrap items-center justify-between gap-2 font-mono text-xs\">\n                  <span>\n                    Signer: {selectedAudit.inspector.name} · {selectedAudit.inspector.role}\n                  </span>\n                  <span>{selectedAudit.inspector.signoffHash}</span>\n                </div>\n              </div>\n            </div>\n\n            <DialogFooter className=\"flex flex-wrap items-center justify-between gap-2\">\n              <Button\n                aria-label=\"Download attachment\"\n                variant=\"outline\"\n                size=\"sm\"\n                className=\"text-xs font-medium\"\n                onClick={() => onDownloadReport(selectedAudit)}\n              >\n                <Download className=\"mr-1.5 size-3.5\" />\n                Download PDF Report\n              </Button>\n              <DialogClose asChild>\n                <Button size=\"sm\" className=\"text-xs\">\n                  Close\n                </Button>\n              </DialogClose>\n            </DialogFooter>\n          </>\n        )}\n      </DialogContent>\n    </Dialog>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/AuditReportDialog.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/NewAuditDialog.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { CheckCircle2, ClipboardCheck, MapPin, UploadCloud } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport { Input } from '@/components/ui/input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\n\nexport interface NewAuditDialogProps {\n  open: boolean\n  onOpenChange: (open: boolean) => void\n  onToast: (msg: string) => void\n}\n\nexport function NewAuditDialog({ open, onOpenChange, onToast }: NewAuditDialogProps) {\n  const [newAuditAsset, setNewAuditAsset] = React.useState('AST-HVAC-4091')\n  const [newAuditFacility, setNewAuditFacility] = React.useState('Building A · Rooftop Mechanical Room')\n  const [newAuditNotes, setNewAuditNotes] = React.useState('')\n  const [newAuditSuccess, setNewAuditSuccess] = React.useState(false)\n\n  const submitNewAudit = () => {\n    setNewAuditSuccess(true)\n    onToast('New audit inspection successfully submitted and recorded!')\n    setTimeout(() => {\n      onOpenChange(false)\n      setNewAuditSuccess(false)\n      setNewAuditNotes('')\n    }, 1400)\n  }\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"sm:max-w-xl\">\n        <DialogHeader>\n          <div className=\"flex items-center gap-2\">\n            <ClipboardCheck className=\"text-primary size-5\" />\n            <DialogTitle className=\"text-base font-bold\"> Start New Site & Asset Inspection Audit </DialogTitle>\n          </div>\n          <DialogDescription className=\"text-xs\">\n            Initiate a field engineering inspection with automatic GPS geostamping and checklist validation.\n          </DialogDescription>\n        </DialogHeader>\n\n        {newAuditSuccess ? (\n          <div className=\"space-y-3 py-8 text-center\">\n            <div className=\"bg-success/20 text-success mx-auto flex size-12 items-center justify-center rounded-full\">\n              <CheckCircle2 className=\"size-6\" />\n            </div>\n            <h3 className=\"text-foreground text-base font-bold\">Inspection Audit Logged Successfully</h3>\n            <p className=\"text-muted-foreground mx-auto max-w-sm text-xs\">\n              Audit has been recorded with GPS geostamp 34.0522°N, 118.2437°W and synced to cloud repository.\n            </p>\n          </div>\n        ) : (\n          <div className=\"space-y-4 py-2\">\n            <div className=\"grid gap-3 sm:grid-cols-2\">\n              <div className=\"space-y-1.5\">\n                <label className=\"text-foreground text-xs font-semibold\">Select Target Asset *</label>\n                <Select value={newAuditAsset} onValueChange={(val) => val && setNewAuditAsset(val)}>\n                  <SelectTrigger className=\"h-8 text-xs\">\n                    <SelectValue />\n                  </SelectTrigger>\n                  <SelectContent>\n                    <SelectItem value=\"AST-HVAC-4091\">AST-HVAC-4091 · Chiller Unit #4</SelectItem>\n                    <SelectItem value=\"AST-SOLAR-1082\">AST-SOLAR-1082 · Solar Array & Inverters</SelectItem>\n                    <SelectItem value=\"AST-FIRE-8820\">AST-FIRE-8820 · Fire Sprinkler System</SelectItem>\n                    <SelectItem value=\"AST-GEN-3304\">AST-GEN-3304 · Backup Generator #2</SelectItem>\n                    <SelectItem value=\"AST-STR-0019\">AST-STR-0019 · Foundation & Beams</SelectItem>\n                    <SelectItem value=\"AST-ELEV-9012\">AST-ELEV-9012 · Passenger Elevator Bank A</SelectItem>\n                  </SelectContent>\n                </Select>\n              </div>\n\n              <div className=\"space-y-1.5\">\n                <label className=\"text-foreground text-xs font-semibold\">Facility Location</label>\n                <Input\n                  value={newAuditFacility}\n                  onChange={(e) => setNewAuditFacility(e.target.value)}\n                  className=\"h-8 text-xs\"\n                />\n              </div>\n            </div>\n\n            <div className=\"border-border bg-muted/20 flex items-center justify-between rounded-lg border p-3 text-xs\">\n              <div className=\"flex items-center gap-2\">\n                <MapPin className=\"text-success size-4 shrink-0\" />\n                <div>\n                  <span className=\"text-foreground font-semibold\">Live GPS Telemetry Lock</span>\n                  <span className=\"text-muted-foreground block font-mono text-xs\">\n                    34.0522°N, 118.2437°W · Accuracy ±1.5m\n                  </span>\n                </div>\n              </div>\n              <Badge variant=\"outline\" className=\"border-success/30 bg-success/10 text-success font-mono text-xs\">\n                GPS Locked\n              </Badge>\n            </div>\n\n            <div className=\"space-y-1.5\">\n              <label className=\"text-foreground text-xs font-semibold\">Photographic Evidence</label>\n              <div\n                className=\"border-border/80 hover:border-primary/50 bg-card cursor-pointer rounded-lg border-2 border-dashed p-4 text-center transition-colors\"\n                onClick={() => onToast('Mock photo uploaded: asset_evidence_live.jpg')}\n              >\n                <div className=\"flex flex-col items-center justify-center gap-1\">\n                  <UploadCloud className=\"text-primary size-5\" />\n                  <p className=\"text-foreground text-xs font-medium\">Click to upload photo evidence or drag & drop</p>\n                  <p className=\"text-muted-foreground text-xs\">Supports JPG, PNG up to 15MB with GPS EXIF retention</p>\n                </div>\n              </div>\n            </div>\n\n            <div className=\"space-y-1.5\">\n              <label className=\"text-foreground text-xs font-semibold\">Inspector Observations & Checklist Notes</label>\n              <Input\n                value={newAuditNotes}\n                onChange={(e) => setNewAuditNotes(e.target.value)}\n                placeholder=\"Enter notes, gauge pressures, or deficiency remarks...\"\n                className=\"h-8 text-xs\"\n              />\n            </div>\n          </div>\n        )}\n\n        {!newAuditSuccess && (\n          <DialogFooter className=\"flex items-center justify-end gap-2\">\n            <DialogClose asChild>\n              <Button variant=\"outline\" size=\"sm\" className=\"text-xs\">\n                Cancel\n              </Button>\n            </DialogClose>\n            <Button size=\"sm\" className=\"gap-1.5 text-xs font-medium\" onClick={submitNewAudit}>\n              <ClipboardCheck className=\"size-3.5\" />\n              Submit Completed Audit\n            </Button>\n          </DialogFooter>\n        )}\n      </DialogContent>\n    </Dialog>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/NewAuditDialog.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/InspectionMetrics.tsx",
      "content": "import * as React from 'react'\nimport { CheckCircle2, Clock, Percent, ShieldAlert } from 'lucide-react'\nimport { Card, CardContent } from '@/components/ui/card'\n\nexport function InspectionMetrics() {\n  return (\n    <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n      {/* Card 1: Completed Inspections */}\n      <Card className=\"border-border shadow-xs\">\n        <CardContent className=\"p-4 sm:p-5\">\n          <div className=\"flex items-center justify-between\">\n            <span className=\"text-muted-foreground text-xs font-medium\">Completed Inspections</span>\n            <div className=\"border-success/20 bg-success/10 text-success flex size-8 items-center justify-center rounded-md border\">\n              <CheckCircle2 className=\"size-4\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <div className=\"mt-3\">\n            <div className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">24</div>\n            <div className=\"text-muted-foreground mt-1 flex items-center gap-1.5 text-xs\">\n              <span className=\"text-success font-medium\">24 Audits This Week</span>\n              <span>·</span>\n              <span className=\"text-muted-foreground\">+14.2% vs target</span>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Card 2: Critical Defects Flagged */}\n      <Card className=\"border-border shadow-xs\">\n        <CardContent className=\"p-4 sm:p-5\">\n          <div className=\"flex items-center justify-between\">\n            <span className=\"text-muted-foreground text-xs font-medium\">Critical Defects Flagged</span>\n            <div className=\"border-destructive/20 bg-destructive/10 text-destructive flex size-8 items-center justify-center rounded-md border\">\n              <ShieldAlert className=\"size-4\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <div className=\"mt-3\">\n            <div className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">2</div>\n            <div className=\"text-muted-foreground mt-1 flex items-center gap-1.5 text-xs\">\n              <span className=\"text-destructive font-semibold\">2 Critical Deficiencies</span>\n              <span>·</span>\n              <span className=\"text-muted-foreground\">Work Orders Dispatched</span>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Card 3: First-Time Pass Rate */}\n      <Card className=\"border-border shadow-xs\">\n        <CardContent className=\"p-4 sm:p-5\">\n          <div className=\"flex items-center justify-between\">\n            <span className=\"text-muted-foreground text-xs font-medium\">First-Time Pass Rate</span>\n            <div className=\"border-primary/20 bg-primary/10 text-primary flex size-8 items-center justify-center rounded-md border\">\n              <Percent className=\"size-4\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <div className=\"mt-3\">\n            <div className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">91.6%</div>\n            <div className=\"text-muted-foreground mt-1 flex items-center gap-1.5 text-xs\">\n              <span className=\"text-success font-medium\">91.6% Pass Rate</span>\n              <span>·</span>\n              <span className=\"text-muted-foreground\">Above 90.0% SLA</span>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Card 4: Avg Inspection Duration */}\n      <Card className=\"border-border shadow-xs\">\n        <CardContent className=\"p-4 sm:p-5\">\n          <div className=\"flex items-center justify-between\">\n            <span className=\"text-muted-foreground text-xs font-medium\">Avg Inspection Duration</span>\n            <div className=\"border-warning/20 bg-warning/10 text-warning flex size-8 items-center justify-center rounded-md border\">\n              <Clock className=\"size-4\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <div className=\"mt-3\">\n            <div className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums\">28m</div>\n            <div className=\"text-muted-foreground mt-1 flex items-center gap-1.5 text-xs\">\n              <span className=\"text-foreground font-medium\">28 mins / audit</span>\n              <span>·</span>\n              <span className=\"text-success\">-4m vs benchmark</span>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/InspectionMetrics.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/InspectionThumbnail.tsx",
      "content": "import * as React from 'react'\nimport { cn } from '@/lib/utils'\nimport type { PhotoEvidence } from './field-inspection-types'\n\nexport interface InspectionThumbnailProps {\n  type: PhotoEvidence['previewType']\n  className?: string\n}\n\nexport function InspectionThumbnail({ type, className }: InspectionThumbnailProps) {\n  return (\n    <div className={cn('h-full w-full', className)}>\n      {type === 'gauge' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <circle cx=\"22\" cy=\"22\" r=\"19\" fill=\"#18181b\" stroke=\"#3f3f46\" strokeWidth=\"1.5\" />\n          <path d=\"M 12,28 A 14,14 0 1,1 32,28\" fill=\"none\" stroke=\"#22c55e\" strokeWidth=\"2\" strokeDasharray=\"2 2\" />\n          <line x1=\"22\" y1=\"22\" x2=\"28\" y2=\"15\" stroke=\"#ef4444\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n          <circle cx=\"22\" cy=\"22\" r=\"2.5\" fill=\"#f4f4f5\" />\n        </svg>\n      )}\n\n      {type === 'coil' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <line x1=\"6\" y1=\"10\" x2=\"38\" y2=\"10\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n          <line x1=\"6\" y1=\"18\" x2=\"38\" y2=\"18\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n          <line x1=\"6\" y1=\"26\" x2=\"38\" y2=\"26\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n          <line x1=\"6\" y1=\"34\" x2=\"38\" y2=\"34\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n          <circle cx=\"22\" cy=\"22\" r=\"7\" fill=\"#0284c7\" fillOpacity=\"0.3\" stroke=\"#38bdf8\" strokeWidth=\"1.5\" />\n        </svg>\n      )}\n\n      {type === 'mount' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"8\" y=\"8\" width=\"28\" height=\"4\" rx=\"1\" fill=\"#71717a\" />\n          <path d=\"M 14,12 C 14,18 30,18 30,24 C 30,30 14,30 14,36\" fill=\"none\" stroke=\"#f59e0b\" strokeWidth=\"2\" />\n          <rect x=\"8\" y=\"36\" width=\"28\" height=\"4\" rx=\"1\" fill=\"#71717a\" />\n        </svg>\n      )}\n\n      {type === 'thermal' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#3b0764\" />\n          <circle cx=\"22\" cy=\"22\" r=\"14\" fill=\"#db2777\" fillOpacity=\"0.6\" />\n          <circle cx=\"22\" cy=\"22\" r=\"7\" fill=\"#facc15\" />\n          <line x1=\"12\" y1=\"22\" x2=\"32\" y2=\"22\" stroke=\"#ffffff\" strokeWidth=\"0.75\" />\n          <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"32\" stroke=\"#ffffff\" strokeWidth=\"0.75\" />\n        </svg>\n      )}\n\n      {type === 'box' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"6\" y=\"6\" width=\"32\" height=\"32\" rx=\"2\" stroke=\"#eab308\" strokeWidth=\"1.5\" />\n          <line x1=\"14\" y1=\"12\" x2=\"14\" y2=\"32\" stroke=\"#f97316\" strokeWidth=\"2\" />\n          <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"32\" stroke=\"#f97316\" strokeWidth=\"2\" />\n          <circle cx=\"22\" cy=\"22\" r=\"5\" fill=\"#ef4444\" />\n        </svg>\n      )}\n\n      {type === 'conduit' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"16\" y=\"4\" width=\"12\" height=\"36\" fill=\"#52525b\" />\n          <circle cx=\"22\" cy=\"22\" r=\"10\" fill=\"#a1a1aa\" fillOpacity=\"0.3\" stroke=\"#e4e4e7\" strokeWidth=\"1.5\" />\n          <line x1=\"16\" y1=\"22\" x2=\"28\" y2=\"22\" stroke=\"#ef4444\" strokeWidth=\"1.5\" />\n        </svg>\n      )}\n\n      {type === 'riser' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"14\" y=\"4\" width=\"16\" height=\"36\" fill=\"#dc2626\" />\n          <circle cx=\"22\" cy=\"18\" r=\"8\" fill=\"#e4e4e7\" stroke=\"#dc2626\" strokeWidth=\"1.5\" />\n          <line x1=\"22\" y1=\"18\" x2=\"26\" y2=\"14\" stroke=\"#000000\" strokeWidth=\"1\" />\n        </svg>\n      )}\n\n      {type === 'pump' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <circle cx=\"22\" cy=\"22\" r=\"13\" fill=\"#b91c1c\" stroke=\"#f87171\" strokeWidth=\"1.5\" />\n          <circle cx=\"22\" cy=\"22\" r=\"5\" fill=\"#52525b\" />\n          <line x1=\"22\" y1=\"4\" x2=\"22\" y2=\"10\" stroke=\"#f87171\" strokeWidth=\"2\" />\n        </svg>\n      )}\n\n      {type === 'switch' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <circle cx=\"22\" cy=\"16\" r=\"9\" stroke=\"#dc2626\" strokeWidth=\"2\" fill=\"none\" />\n          <rect x=\"16\" y=\"24\" width=\"12\" height=\"14\" rx=\"2\" fill=\"#eab308\" />\n        </svg>\n      )}\n\n      {type === 'tank' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"10\" y=\"8\" width=\"24\" height=\"28\" rx=\"6\" fill=\"#3f3f46\" stroke=\"#71717a\" strokeWidth=\"1.5\" />\n          <rect x=\"14\" y=\"14\" width=\"4\" height=\"16\" rx=\"1\" fill=\"#22c55e\" />\n        </svg>\n      )}\n\n      {type === 'battery' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"6\" y=\"12\" width=\"32\" height=\"24\" rx=\"2\" fill=\"#27272a\" stroke=\"#52525b\" strokeWidth=\"1.5\" />\n          <rect x=\"11\" y=\"8\" width=\"6\" height=\"4\" fill=\"#ef4444\" />\n          <rect x=\"27\" y=\"8\" width=\"6\" height=\"4\" fill=\"#3b82f6\" />\n        </svg>\n      )}\n\n      {type === 'ats' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <rect x=\"6\" y=\"6\" width=\"32\" height=\"32\" rx=\"2\" fill=\"#27272a\" stroke=\"#059669\" strokeWidth=\"1.5\" />\n          <circle cx=\"14\" cy=\"14\" r=\"2.5\" fill=\"#22c55e\" />\n          <circle cx=\"14\" cy=\"22\" r=\"2.5\" fill=\"#eab308\" />\n          <line x1=\"22\" y1=\"12\" x2=\"32\" y2=\"12\" stroke=\"#a1a1aa\" strokeWidth=\"2\" />\n        </svg>\n      )}\n\n      {type === 'spall' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#27272a\" />\n          <polygon points=\"6,6 38,6 38,38 24,38 18,26 6,24\" fill=\"#71717a\" />\n          <polygon points=\"18,26 26,24 24,38\" fill=\"#ef4444\" fillOpacity=\"0.4\" stroke=\"#ef4444\" strokeWidth=\"1\" />\n        </svg>\n      )}\n\n      {type === 'rebar' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#27272a\" />\n          <line x1=\"6\" y1=\"38\" x2=\"38\" y2=\"6\" stroke=\"#b45309\" strokeWidth=\"4\" strokeDasharray=\"2 1\" />\n          <circle cx=\"22\" cy=\"22\" r=\"6\" stroke=\"#ef4444\" strokeWidth=\"1.5\" fill=\"none\" />\n        </svg>\n      )}\n\n      {type === 'crack' && (\n        <svg className=\"h-full w-full\" viewBox=\"0 0 44 44\" fill=\"none\">\n          <rect width=\"44\" height=\"44\" fill=\"#18181b\" />\n          <path d=\"M 12,38 L 18,26 L 24,20 L 32,6\" stroke=\"#ef4444\" strokeWidth=\"2\" fill=\"none\" />\n          <rect\n            x=\"14\"\n            y=\"14\"\n            width=\"16\"\n            height=\"12\"\n            rx=\"1\"\n            fill=\"#ffffff\"\n            fillOpacity=\"0.2\"\n            stroke=\"#ffffff\"\n            strokeWidth=\"0.75\"\n          />\n        </svg>\n      )}\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/InspectionThumbnail.tsx"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/field-inspection-types.ts",
      "content": "export type InspectionStatus = 'passed' | 'critical' | 'minor'\n\nexport interface PhotoEvidence {\n  id: string\n  title: string\n  caption: string\n  time: string\n  previewType:\n    | 'gauge'\n    | 'coil'\n    | 'mount'\n    | 'thermal'\n    | 'box'\n    | 'conduit'\n    | 'riser'\n    | 'pump'\n    | 'switch'\n    | 'tank'\n    | 'battery'\n    | 'ats'\n    | 'spall'\n    | 'rebar'\n    | 'crack'\n}\n\nexport interface ChecklistItem {\n  id: string\n  label: string\n  status: 'pass' | 'fail' | 'minor'\n  value: string\n}\n\nexport interface InspectionRecord {\n  id: string\n  assetId: string\n  assetName: string\n  category: string\n  facility: string\n  buildingBadge: string\n  date: string\n  time: string\n  gps: string\n  gpsAccuracy: string\n  scorePassed: number\n  scoreTotal: number\n  status: InspectionStatus\n  statusLabel: string\n  duration: string\n  defectSummary?: string\n  workOrder?: string\n  photos: PhotoEvidence[]\n  inspector: {\n    name: string\n    role: string\n    initials: string\n    badge: string\n    signoffStatus: string\n    signoffHash: string\n  }\n  checklist: ChecklistItem[]\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/field-inspection-types.ts"
    },
    {
      "path": "packages/registry-react/blocks/field-inspection-manager/field-inspection-data.ts",
      "content": "import type { InspectionRecord } from './field-inspection-types'\n\nexport const INITIAL_INSPECTION_RECORDS: InspectionRecord[] = [\n  {\n    id: 'insp-1',\n    assetId: 'AST-HVAC-4091',\n    assetName: 'Commercial HVAC Chiller Unit #4',\n    category: 'HVAC & Thermal Systems',\n    facility: 'Building A · Rooftop Mechanical Room',\n    buildingBadge: 'Bldg A',\n    date: 'Aug 21, 2026',\n    time: '09:15 AM EDT',\n    gps: '34.0522°N, 118.2437°W',\n    gpsAccuracy: '±2.4m',\n    scorePassed: 18,\n    scoreTotal: 18,\n    status: 'passed',\n    statusLabel: '18 / 18 Passed',\n    duration: '26 mins',\n    photos: [\n      {\n        id: 'p1-1',\n        title: 'Compressor Suction Manifold',\n        caption: 'Suction pressure holding steady at 68.4 PSI; temperature sensor verified within calibration spec.',\n        time: '09:18 AM',\n        previewType: 'gauge',\n      },\n      {\n        id: 'p1-2',\n        title: 'Condenser Fan Coil Assembly',\n        caption: 'Clean aluminum fin surfaces with zero debris obstruction; axial fan bearings lubricated.',\n        time: '09:24 AM',\n        previewType: 'coil',\n      },\n      {\n        id: 'p1-3',\n        title: 'Vibration Dampener Isolators',\n        caption: 'Neoprene spring isolator pads intact with zero hairline settling fractures or mounting deflection.',\n        time: '09:32 AM',\n        previewType: 'mount',\n      },\n    ],\n    inspector: {\n      name: 'Marcus Vance',\n      role: 'Senior Field Engineer',\n      initials: 'MV',\n      badge: 'PE #84920-CA',\n      signoffStatus: 'Verified Cryptographic Sign-off',\n      signoffHash: 'SHA-256: 9f8e21...41a2',\n    },\n    checklist: [\n      {\n        id: 'c1-1',\n        label: 'Refrigerant Charge & Pressures',\n        status: 'pass',\n        value: '68.4 PSI Suction / 225 PSI Discharge',\n      },\n      { id: 'c1-2', label: 'Compressor Motor Amp Draw', status: 'pass', value: '42.1A (rated 46A max)' },\n      { id: 'c1-3', label: 'Chilled Water Loop Delta-T', status: 'pass', value: '10.2°F Temperature Drop' },\n      { id: 'c1-4', label: 'Emergency High-Pressure Cutout', status: 'pass', value: 'Trips accurately at 380 PSI' },\n    ],\n  },\n  {\n    id: 'insp-2',\n    assetId: 'AST-SOLAR-1082',\n    assetName: 'Rooftop Solar Array & Inverters',\n    category: 'Renewable Energy & Power',\n    facility: 'Building C · South Wing Solar Deck',\n    buildingBadge: 'Bldg C',\n    date: 'Aug 21, 2026',\n    time: '10:45 AM EDT',\n    gps: '34.0528°N, 118.2445°W',\n    gpsAccuracy: '±1.8m',\n    scorePassed: 14,\n    scoreTotal: 18,\n    status: 'critical',\n    statusLabel: '14 / 18 - 2 Critical Fails',\n    duration: '34 mins',\n    defectSummary: 'DC string combiner box busbar overheating (84.2°C); micro-inverter #6 circuit failure.',\n    workOrder: 'WO-SOLAR-4921 (High Priority Dispatched)',\n    photos: [\n      {\n        id: 'p2-1',\n        title: 'Inverter #6 Thermal Hotspot',\n        caption: 'FLIR radiometric thermography shows 84.2°C localized hotspot at DC-AC bridge capacitor.',\n        time: '10:52 AM',\n        previewType: 'thermal',\n      },\n      {\n        id: 'p2-2',\n        title: 'Combiner Box Arc Degradation',\n        caption: 'Busbar contact surface oxidation with heat discoloration and slight terminal pitting.',\n        time: '11:04 AM',\n        previewType: 'box',\n      },\n      {\n        id: 'p2-3',\n        title: 'PV String #4 Conduit Ingress',\n        caption: 'Degraded rubber gasket on string junction conduit fitting allowing moisture penetration.',\n        time: '11:12 AM',\n        previewType: 'conduit',\n      },\n    ],\n    inspector: {\n      name: 'Marcus Vance',\n      role: 'Senior Field Engineer',\n      initials: 'MV',\n      badge: 'PE #84920-CA',\n      signoffStatus: 'Critical Defect Action Required',\n      signoffHash: 'SHA-256: 4c3d88...71ef',\n    },\n    checklist: [\n      {\n        id: 'c2-1',\n        label: 'Combiner Box Busbar Temp',\n        status: 'fail',\n        value: '84.2°C (exceeds 65°C safe operating limit)',\n      },\n      { id: 'c2-2', label: 'Micro-inverter #6 Communication', status: 'fail', value: 'Modbus timeout / Offline state' },\n      { id: 'c2-3', label: 'PV Panel Surface Clarity', status: 'pass', value: 'Soiling index < 1.8%' },\n      { id: 'c2-4', label: 'Rapid Shutdown System', status: 'pass', value: 'Voltages drop < 30V in 12s' },\n    ],\n  },\n  {\n    id: 'insp-3',\n    assetId: 'AST-FIRE-8820',\n    assetName: 'Fire Suppression & Sprinkler System',\n    category: 'Life Safety & Protection',\n    facility: 'Main Tower · Sub-Basement Pump Room B2',\n    buildingBadge: 'Tower B2',\n    date: 'Aug 21, 2026',\n    time: '11:30 AM EDT',\n    gps: '34.0515°N, 118.2420°W',\n    gpsAccuracy: '±3.1m',\n    scorePassed: 17,\n    scoreTotal: 18,\n    status: 'minor',\n    statusLabel: '17 / 18 - 1 Minor Defect',\n    duration: '22 mins',\n    defectSummary: 'Main riser pressure gauge annual NIST calibration tag expired by 21 days; pressure intact.',\n    workOrder: 'WO-FIRE-8820 (Standard Calibration Scheduled)',\n    photos: [\n      {\n        id: 'p3-1',\n        title: 'Main Riser Pressure Gauge',\n        caption: 'Static pressure 145 PSI (nominal). Calibration tag stamped 07/2025 requiring routine re-tagging.',\n        time: '11:34 AM',\n        previewType: 'riser',\n      },\n      {\n        id: 'p3-2',\n        title: 'Jockey Pump Shaft Packing',\n        caption: 'Packing gland seal dry with zero leakage; auto start/stop pressure cutoff cycle verified.',\n        time: '11:41 AM',\n        previewType: 'pump',\n      },\n      {\n        id: 'p3-3',\n        title: 'OS&Y Tamper Supervisory Switch',\n        caption: 'Zone 1 control valve open; tamper switch sends instant supervisory signal to FACP.',\n        time: '11:48 AM',\n        previewType: 'switch',\n      },\n    ],\n    inspector: {\n      name: 'Marcus Vance',\n      role: 'Senior Field Engineer',\n      initials: 'MV',\n      badge: 'PE #84920-CA',\n      signoffStatus: 'Verified Cryptographic Sign-off',\n      signoffHash: 'SHA-256: 7d1a99...33bc',\n    },\n    checklist: [\n      { id: 'c3-1', label: 'System Static Water Pressure', status: 'pass', value: '145 PSI static / 125 PSI residual' },\n      {\n        id: 'c3-2',\n        label: 'Riser Gauge Calibration Tag',\n        status: 'minor',\n        value: 'Overdue by 21 days (recalibration due)',\n      },\n      { id: 'c3-3', label: 'Diesel Fire Pump Auto-Start', status: 'pass', value: 'Cranked to 1750 RPM in 4.2s' },\n      { id: 'c3-4', label: 'Flow Alarm Switch Delay', status: 'pass', value: 'Gong chime triggered at 32s' },\n    ],\n  },\n  {\n    id: 'insp-4',\n    assetId: 'AST-GEN-3304',\n    assetName: 'Emergency Backup Generator #2',\n    category: 'Emergency Standby Power',\n    facility: 'East Campus · Utility Pad North',\n    buildingBadge: 'East Pad',\n    date: 'Aug 21, 2026',\n    time: '01:15 PM EDT',\n    gps: '34.0535°N, 118.2450°W',\n    gpsAccuracy: '±2.1m',\n    scorePassed: 18,\n    scoreTotal: 18,\n    status: 'passed',\n    statusLabel: '18 / 18 Passed',\n    duration: '29 mins',\n    photos: [\n      {\n        id: 'p4-1',\n        title: 'Diesel Sub-Base Day Tank',\n        caption:\n          'Ultra-low sulfur diesel fuel level at 98.4%; optical fuel water separator clean with zero particulate.',\n        time: '01:21 PM',\n        previewType: 'tank',\n      },\n      {\n        id: 'p4-2',\n        title: '24V Dual Starter Battery Bank',\n        caption: 'Terminal posts clean with dielectric grease coating; float charging verified at 27.6V.',\n        time: '01:28 PM',\n        previewType: 'battery',\n      },\n      {\n        id: 'p4-3',\n        title: '800A ATS Transfer Switch',\n        caption: 'Phase alignment and mechanical interlocking verified; utility power sync nominal.',\n        time: '01:38 PM',\n        previewType: 'ats',\n      },\n    ],\n    inspector: {\n      name: 'Marcus Vance',\n      role: 'Senior Field Engineer',\n      initials: 'MV',\n      badge: 'PE #84920-CA',\n      signoffStatus: 'Verified Cryptographic Sign-off',\n      signoffHash: 'SHA-256: 3a7b54...82e9',\n    },\n    checklist: [\n      { id: 'c4-1', label: 'Engine Crank & Run Test', status: 'pass', value: '60 Hz output reached in 6.8s' },\n      { id: 'c4-2', label: 'Coolant Jacket Heater Temp', status: 'pass', value: '118°F Block temperature' },\n      { id: 'c4-3', label: 'Oil Pressure & Level', status: 'pass', value: '55 PSI running oil pressure' },\n      { id: 'c4-4', label: 'Exhaust Silencer & Insulation', status: 'pass', value: 'Zero exhaust gas or soot leakage' },\n    ],\n  },\n  {\n    id: 'insp-5',\n    assetId: 'AST-STR-0019',\n    assetName: 'Structural Foundation & Load Beams',\n    category: 'Structural Integrity & Civil',\n    facility: 'Parking Structure · Level P3 Pillar Grid 4D',\n    buildingBadge: 'P3 Grid 4D',\n    date: 'Aug 21, 2026',\n    time: '02:40 PM EDT',\n    gps: '34.0510°N, 118.2412°W',\n    gpsAccuracy: '±1.9m',\n    scorePassed: 16,\n    scoreTotal: 18,\n    status: 'critical',\n    statusLabel: '16 / 18 - 2 Critical Fails',\n    duration: '31 mins',\n    defectSummary:\n      'Concrete shear spall at beam joint 4D corbel; exposed tension rebar #6 exhibiting active oxidation.',\n    workOrder: 'WO-STR-4922 (Structural Engineer On-Site)',\n    photos: [\n      {\n        id: 'p5-1',\n        title: 'Pillar 4D Beam Shear Spall',\n        caption: 'Concrete shear delamination (18cm wide x 4cm depth) near primary corbel support bracket.',\n        time: '02:46 PM',\n        previewType: 'spall',\n      },\n      {\n        id: 'p5-2',\n        title: 'Exposed Steel Rebar Oxidation',\n        caption: 'Deformed rebar #6 exposed to ambient moisture with active ferric surface oxidation.',\n        time: '02:54 PM',\n        previewType: 'rebar',\n      },\n      {\n        id: 'p5-3',\n        title: 'Optical Crack Comparator Test',\n        caption: 'Structural hairline fissure width measured at 2.2mm across tension face (spec max 0.3mm).',\n        time: '03:02 PM',\n        previewType: 'crack',\n      },\n    ],\n    inspector: {\n      name: 'Marcus Vance',\n      role: 'Senior Field Engineer',\n      initials: 'MV',\n      badge: 'PE #84920-CA',\n      signoffStatus: 'Critical Defect Action Required',\n      signoffHash: 'SHA-256: 8e5f12...04db',\n    },\n    checklist: [\n      { id: 'c5-1', label: 'Concrete Cover Spalling', status: 'fail', value: '18cm spall at corbel connection' },\n      {\n        id: 'c5-2',\n        label: 'Structural Crack Aperture',\n        status: 'fail',\n        value: '2.2mm fissure (exceeds 0.3mm tolerance)',\n      },\n      { id: 'c5-3', label: 'Expansion Joint Elastomer', status: 'pass', value: 'Sealant elasticity within spec' },\n      { id: 'c5-4', label: 'Drainage Channel Clearance', status: 'pass', value: 'Deck scuppers free of sediment' },\n    ],\n  },\n]\n",
      "type": "registry:block",
      "target": "~/components/blocks/field-inspection-data.ts"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/avatar.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/dialog.json",
    "https://uipkge.dev/r/react/dropdown-menu.json",
    "https://uipkge.dev/r/react/input.json",
    "https://uipkge.dev/r/react/select.json",
    "https://uipkge.dev/r/react/table.json"
  ],
  "description": "Mobile/Desktop commercial property & equipment site inspection audit manager featuring GPS geostamp telemetry, 4 KPI metric cards, searchable audits table with pass/fail checklist scores, photo evidence thumbnail gallery with interactive lightbox modal, cryptographic sign-off badges, and work order dispatch workflows.",
  "categories": [
    "logistics",
    "app",
    "forms",
    "dashboard"
  ]
}