{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "leaflet-last-mile-courier-dispatch",
  "title": "Leaflet Last Mile Courier Dispatch",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/leaflet-last-mile-courier-dispatch/LeafletLastMileCourierDispatch.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { BatteryCharging, Navigation, Phone, Radio, Truck } from 'lucide-react'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport { LeafletMap, LeafletMarker, LeafletPolyline, type LeafletMapRef } from '@/components/ui/leaflet-map'\nimport { cn } from '@/lib/utils'\n\nexport interface DeliveryStop {\n  id: string\n  stopNumber: number\n  trackingCode: string\n  recipient: string\n  address: string\n  parcels: number\n  timeWindow: string\n  eta: string\n  status: 'delivered' | 'en_route' | 'scheduled' | 'failed'\n  podType?: 'signature' | 'photo_scanned' | 'front_door'\n  podTimestamp?: string\n  coords?: [number, number]\n}\n\nexport interface LeafletLastMileCourierDispatchProps extends React.HTMLAttributes<HTMLDivElement> {\n  routeId?: string\n  driverName?: string\n  vehicleCode?: string\n}\n\nconst DEFAULT_STOPS: DeliveryStop[] = [\n  {\n    id: 'stp-1',\n    stopNumber: 1,\n    trackingCode: 'TRK-9941-8812',\n    recipient: 'Apex Logistics HQ',\n    address: '742 Evergreen Terrace, Sector 4',\n    parcels: 3,\n    timeWindow: '08:30 - 09:30',\n    eta: '08:52 AM',\n    status: 'delivered',\n    podType: 'signature',\n    podTimestamp: '08:54 AM (Signed by J. Doe)',\n    coords: [-73.991, 40.743],\n  },\n  {\n    id: 'stp-2',\n    stopNumber: 2,\n    trackingCode: 'TRK-9941-8813',\n    recipient: 'David K. Miller',\n    address: '1204 Pinehurst Ave, Apt 3B',\n    parcels: 1,\n    timeWindow: '09:30 - 10:30',\n    eta: '09:45 AM',\n    status: 'delivered',\n    podType: 'photo_scanned',\n    podTimestamp: '09:48 AM (Doorstep Verified)',\n    coords: [-73.987, 40.747],\n  },\n  {\n    id: 'stp-3',\n    stopNumber: 3,\n    trackingCode: 'TRK-9941-8814',\n    recipient: 'Global Tech Labs',\n    address: '450 Innovation Parkway, Suite 100',\n    parcels: 4,\n    timeWindow: '10:00 - 11:30',\n    eta: '10:25 AM',\n    status: 'en_route',\n    coords: [-73.982, 40.751],\n  },\n  {\n    id: 'stp-4',\n    stopNumber: 4,\n    trackingCode: 'TRK-9941-8815',\n    recipient: 'Sarah Jenkins',\n    address: '88 Riverfront Blvd',\n    parcels: 2,\n    timeWindow: '11:30 - 12:30',\n    eta: '11:45 AM',\n    status: 'scheduled',\n    coords: [-73.978, 40.755],\n  },\n  {\n    id: 'stp-5',\n    stopNumber: 5,\n    trackingCode: 'TRK-9941-8816',\n    recipient: 'Metro Health Clinic',\n    address: '310 Health Sciences Way',\n    parcels: 1,\n    timeWindow: '12:30 - 14:00',\n    eta: '01:10 PM',\n    status: 'scheduled',\n    coords: [-73.971, 40.758],\n  },\n]\n\nexport function LeafletLastMileCourierDispatch({\n  routeId = 'RTE-METRO-409',\n  driverName = 'Elena Rostova',\n  vehicleCode = 'VAN-EV-09 (Ford E-Transit)',\n  className,\n  ...props\n}: LeafletLastMileCourierDispatchProps) {\n  const [stops, setStops] = React.useState<DeliveryStop[]>(DEFAULT_STOPS)\n  const mapRef = React.useRef<LeafletMapRef>(null)\n\n  const completedCount = stops.filter((s) => s.status === 'delivered').length\n  const totalStops = stops.length\n  const onTimeRate = '98.4%'\n\n  const routePath = React.useMemo(() => stops.map((s) => s.coords).filter(Boolean) as [number, number][], [stops])\n\n  const focusStop = (stop: DeliveryStop) => {\n    if (!stop.coords) return\n    mapRef.current?.flyTo({ center: stop.coords, zoom: 15, duration: 800 })\n  }\n\n  const fitRoute = () => {\n    if (routePath.length < 2) return\n    const lngs = routePath.map((c) => c[0])\n    const lats = routePath.map((c) => c[1])\n    mapRef.current?.fitBounds(\n      [\n        [Math.min(...lngs), Math.min(...lats)],\n        [Math.max(...lngs), Math.max(...lats)],\n      ],\n      { padding: [48, 48] },\n    )\n  }\n\n  function markDelivered(id: string) {\n    setStops((prev) => {\n      let foundTarget = false\n      return prev.map((stop) => {\n        if (stop.id === id) {\n          foundTarget = true\n          return {\n            ...stop,\n            status: 'delivered' as const,\n            podType: 'signature' as const,\n            podTimestamp: 'Just now (Signed)',\n          }\n        }\n        if (foundTarget && stop.status === 'scheduled') {\n          foundTarget = false\n          return { ...stop, status: 'en_route' as const }\n        }\n        return stop\n      })\n    })\n  }\n\n  return (\n    <div data-slot=\"leaflet-last-mile-courier-dispatch\" className={cn('w-full space-y-6', className)} {...props}>\n      {/* Header / Dispatch Telemetry Overview */}\n      <Card>\n        <CardHeader className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n          <div className=\"space-y-1\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-foreground font-mono text-sm font-semibold\">{routeId}</span>\n              <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                {vehicleCode}\n              </Badge>\n              <Badge variant=\"secondary\" className=\"gap-1 text-xs\">\n                <Radio className=\"text-foreground size-3\" />\n                Live Telemetry Active\n              </Badge>\n            </div>\n            <CardTitle className=\"text-xl\">Last-Mile Courier Dispatch & POD Telemetry</CardTitle>\n            <CardDescription>\n              Courier: <span className=\"text-foreground font-medium\">{driverName}</span> · Urban Route Dispatch Matrix\n            </CardDescription>\n          </div>\n\n          <div className=\"flex items-center gap-2\">\n            <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\">\n              <Phone className=\"size-3.5\" />\n              Contact Driver\n            </Button>\n            <Button variant=\"default\" size=\"sm\" className=\"gap-1.5\" onClick={fitRoute}>\n              <Navigation className=\"size-3.5\" />\n              Live GPS Map\n            </Button>\n          </div>\n        </CardHeader>\n\n        <CardContent className=\"border-border grid grid-cols-1 gap-4 border-t pt-4 sm:grid-cols-4\">\n          {/* Progress Metric */}\n          <div className=\"border-border space-y-1 rounded-lg border p-3\">\n            <div className=\"text-muted-foreground text-xs font-medium\">ROUTE COMPLETION</div>\n            <div className=\"flex items-baseline justify-between pt-1\">\n              <div className=\"font-mono text-xl font-semibold\">\n                {completedCount} / {totalStops}\n              </div>\n              <span className=\"text-muted-foreground font-mono text-xs\">\n                {Math.round((completedCount / totalStops) * 100)}%\n              </span>\n            </div>\n          </div>\n\n          {/* On-time SLA */}\n          <div className=\"border-border space-y-1 rounded-lg border p-3\">\n            <div className=\"text-muted-foreground text-xs font-medium\">ON-TIME WINDOW SLA</div>\n            <div className=\"pt-1 font-mono text-xl font-semibold\">{onTimeRate}</div>\n          </div>\n\n          {/* Vehicle Telemetry */}\n          <div className=\"border-border space-y-1 rounded-lg border p-3\">\n            <div className=\"text-muted-foreground flex items-center gap-1 text-xs font-medium\">\n              <BatteryCharging className=\"size-3.5\" />\n              <span>EV BATTERY / RANGE</span>\n            </div>\n            <div className=\"pt-1 font-mono text-xl font-semibold\">74% · 142 km</div>\n          </div>\n\n          {/* Next Stop ETA */}\n          <div className=\"border-border space-y-1 rounded-lg border p-3\">\n            <div className=\"text-muted-foreground text-xs font-medium\">CURRENT TARGET ETA</div>\n            <div className=\"pt-1 font-mono text-xl font-semibold\">10:25 AM (Stop #3)</div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Live GPS Route Map */}\n      <Card className=\"overflow-hidden\">\n        <CardHeader className=\"border-border/70 border-b pb-3\">\n          <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n            <div>\n              <CardTitle className=\"flex items-center gap-2 text-base font-semibold\">\n                <Navigation className=\"text-info size-4\" />\n                <span>Live GPS Telemetry & Corridor Map</span>\n              </CardTitle>\n              <CardDescription>\n                Real-time courier positioning with sequenced drop waypoints and completion status.\n              </CardDescription>\n            </div>\n            <div className=\"flex items-center gap-2\">\n              <span className=\"bg-success inline-flex size-2 animate-ping rounded-full\" />\n              <span className=\"text-muted-foreground font-mono text-xs\">GPS Synced · 3s ago</span>\n            </div>\n          </div>\n        </CardHeader>\n        <div className=\"relative h-72 w-full sm:h-80\">\n          <LeafletMap ref={mapRef} variant=\"dark\" center={[-73.982, 40.75]} zoom={13.8} className=\"size-full\">\n            {/* Route Polyline */}\n            <LeafletPolyline lngLatPath={routePath} color=\"#0284c7\" weight={3} dashArray={[2, 2]} />\n\n            {/* Delivery Stop Markers */}\n            {stops.map((stop) => (\n              <LeafletMarker key={stop.id} lngLat={stop.coords!} anchor=\"center\">\n                <div className=\"flex cursor-pointer flex-col items-center\" onClick={() => focusStop(stop)}>\n                  <div\n                    className={cn(\n                      'border-background flex size-6 items-center justify-center rounded-full border-2 font-mono text-xs font-bold shadow-md',\n                      stop.status === 'delivered'\n                        ? 'bg-success text-white'\n                        : stop.status === 'en_route'\n                          ? 'bg-warning text-white ring-2 ring-amber-400/50'\n                          : 'bg-muted text-muted-foreground',\n                    )}\n                  >\n                    {stop.stopNumber}\n                  </div>\n                  <span className=\"border-border/80 bg-background/90 py-0.2 mt-0.5 rounded border px-1 font-mono text-xs font-medium shadow-xs backdrop-blur-xs\">\n                    {stop.recipient.split(' ')[0]}\n                  </span>\n                </div>\n              </LeafletMarker>\n            ))}\n\n            {/* Live Courier Van Marker */}\n            <LeafletMarker lngLat={[-73.984, 40.749]} anchor=\"center\" zIndexOffset={1000}>\n              <div className=\"relative flex size-9 items-center justify-center\">\n                <span className=\"bg-info absolute inline-flex size-full animate-ping rounded-full opacity-60\" />\n                <div className=\"bg-info relative flex size-8 items-center justify-center rounded-full border-2 border-white text-white shadow-lg\">\n                  <Truck className=\"size-4\" />\n                </div>\n              </div>\n            </LeafletMarker>\n          </LeafletMap>\n        </div>\n      </Card>\n\n      {/* Dispatch Sequence Table */}\n      <Card>\n        <CardHeader className=\"pb-3\">\n          <CardTitle className=\"text-base font-semibold\">Delivery Manifest & Proof of Delivery (POD)</CardTitle>\n          <CardDescription>\n            Ordered drop sequence with recipient signature capture and delivery window timestamps.\n          </CardDescription>\n        </CardHeader>\n\n        <CardContent className=\"p-0\">\n          <Table>\n            <TableHeader>\n              <TableRow>\n                <TableHead className=\"w-[60px]\">Stop</TableHead>\n                <TableHead className=\"w-[180px]\">Tracking ID</TableHead>\n                <TableHead className=\"w-[260px]\">Recipient & Address</TableHead>\n                <TableHead>Window / ETA</TableHead>\n                <TableHead className=\"text-right\">Parcels</TableHead>\n                <TableHead>Status & Proof of Delivery</TableHead>\n                <TableHead className=\"w-[100px] text-right\">Action</TableHead>\n              </TableRow>\n            </TableHeader>\n            <TableBody>\n              {stops.map((stop) => (\n                <TableRow key={stop.id} className={stop.status === 'en_route' ? 'bg-muted/40 font-medium' : ''}>\n                  {/* Stop Number */}\n                  <TableCell className=\"text-muted-foreground font-mono text-xs\">#0{stop.stopNumber}</TableCell>\n\n                  {/* Tracking Code */}\n                  <TableCell>\n                    <div className=\"text-foreground font-mono text-xs font-semibold\">{stop.trackingCode}</div>\n                  </TableCell>\n\n                  {/* Recipient & Address */}\n                  <TableCell>\n                    <div className=\"text-foreground font-medium\">{stop.recipient}</div>\n                    <div className=\"text-muted-foreground truncate text-xs\">{stop.address}</div>\n                  </TableCell>\n\n                  {/* Time Window & ETA */}\n                  <TableCell>\n                    <div className=\"text-foreground text-xs\">{stop.timeWindow}</div>\n                    <div className=\"text-muted-foreground font-mono text-xs\">ETA: {stop.eta}</div>\n                  </TableCell>\n\n                  {/* Parcels Count */}\n                  <TableCell className=\"text-right font-mono text-sm\">{stop.parcels} pkg</TableCell>\n\n                  {/* Status & Proof of Delivery */}\n                  <TableCell>\n                    <div className=\"flex flex-col gap-1\">\n                      <div className=\"flex items-center gap-2\">\n                        <Badge\n                          variant={\n                            stop.status === 'delivered'\n                              ? 'default'\n                              : stop.status === 'en_route'\n                                ? 'secondary'\n                                : 'outline'\n                          }\n                          className=\"capitalize\"\n                        >\n                          {stop.status.replace('_', ' ')}\n                        </Badge>\n                      </div>\n                      {stop.podTimestamp && (\n                        <span className=\"text-muted-foreground font-mono text-xs\">{stop.podTimestamp}</span>\n                      )}\n                    </div>\n                  </TableCell>\n\n                  {/* Action */}\n                  <TableCell className=\"text-right\">\n                    {stop.status === 'en_route' && (\n                      <Button\n                        size=\"sm\"\n                        variant=\"default\"\n                        className=\"h-7 text-xs\"\n                        onClick={() => markDelivered(stop.id)}\n                      >\n                        Confirm POD\n                      </Button>\n                    )}\n                    {stop.status === 'delivered' && <span className=\"text-muted-foreground text-xs\">Logged</span>}\n                    {stop.status === 'scheduled' && <span className=\"text-muted-foreground text-xs\">Queued</span>}\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n\n        <CardFooter className=\"border-border text-muted-foreground flex items-center justify-between border-t py-3 text-xs\">\n          <div>Geotagged proof of delivery records are synced automatically to customer tracking portals.</div>\n          <div className=\"text-foreground font-medium\">\n            Route summary: <span className=\"font-mono\">{totalStops}</span> total consignments\n          </div>\n        </CardFooter>\n      </Card>\n    </div>\n  )\n}\n\nexport default LeafletLastMileCourierDispatch\n",
      "type": "registry:block",
      "target": "~/components/blocks/LeafletLastMileCourierDispatch.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/table.json",
    "https://uipkge.dev/r/react/leaflet-map.json"
  ],
  "description": "Last-mile courier dispatch matrix on free OpenStreetMap tiles — no API key. Route progress, ETA telemetry, and Proof of Delivery (POD) logging.",
  "categories": [
    "dashboard",
    "data-display"
  ]
}