{
 "name": "deck-twin",
 "homepage": "https://deck-twin-library.demoareeb.workers.dev",
 "categories": [
  {
   "id": "piping",
   "title": "Piping & fittings",
   "blurb": "ASME B36.10 pipe, B16.9 fittings, B16.5 flanges, supports and specialty items."
  },
  {
   "id": "valves",
   "title": "Valves",
   "blurb": "Manual, actuated, control and relief valves sized to B16.10 and API 526."
  },
  {
   "id": "vessels",
   "title": "Vessels & tanks",
   "blurb": "ASME VIII pressure vessels, separators, columns, filters and API 650 tanks."
  },
  {
   "id": "thermal",
   "title": "Heat transfer & flare",
   "blurb": "TEMA exchangers, air coolers, plate exchangers, heaters, flare and vent stacks."
  },
  {
   "id": "rotating",
   "title": "Rotating equipment",
   "blurb": "API 610 pumps, API 617/618 compressors, gas turbines, motors and engines."
  },
  {
   "id": "wellhead",
   "title": "Wells & pipelines",
   "blurb": "API 6A trees and wellheads, BOPs, manifolds, pig traps and risers."
  },
  {
   "id": "drilling",
   "title": "Drilling & subsea",
   "blurb": "Mud system, pipe handling, well service units, subsea manifolds, PLETs and umbilical terminations."
  },
  {
   "id": "instruments",
   "title": "Instruments",
   "blurb": "Transmitters, gauges, flowmeters, level instruments and analysers."
  },
  {
   "id": "safety",
   "title": "Fire, gas & safety",
   "blurb": "F&G detectors, call points, deluge, monitors, showers and lifesaving."
  },
  {
   "id": "structure",
   "title": "Structure & access",
   "blurb": "Decks, beams, grating, stairs, ladders, racks, jackets and bridges."
  },
  {
   "id": "electrical",
   "title": "Power & buildings",
   "blurb": "Transformers, switchgear, E-houses, panels, lighting and cable tray."
  },
  {
   "id": "interiors",
   "title": "Control room & interiors",
   "blurb": "CCR consoles, video walls, screens, doors, windows, rooms, cabinets and CCTV."
  },
  {
   "id": "lifting",
   "title": "Lifting & logistics",
   "blurb": "Pedestal cranes, monorails, davits, containers and cargo units."
  },
  {
   "id": "packages",
   "title": "Packages & skids",
   "blurb": "Chemical injection, metering, nitrogen, air, HPU and treatment skids."
  },
  {
   "id": "onshore",
   "title": "Onshore & terminals",
   "blurb": "Loading arms, truck bays, pipeline valve stations, bunds, fences, boilers, substations and site buildings."
  },
  {
   "id": "environment",
   "title": "Environment",
   "blurb": "Animated ocean and a day or night sky with matching lights, haze and reflections."
  }
 ],
 "items": [
  {
   "name": "mud-pump",
   "title": "Drilling mud pump",
   "category": "drilling",
   "description": "Horizontal single-acting triplex (or 4–6 cylinder) mud pump on an oilfield skid, sized on a 14\" stroke, 2200 hp class unit: 5.5 m over skids, discharge centreline 1.25 m, 10\" class 150 suction manifold, 5\" 10K discharge through a strainer cross. Forged fluid-end modules with hammer-lug valve and cylinder-head covers, liner retainers, pony rods that stroke when `running`, liner-wash header and drip pan. Bladder pulsation dampener and reset relief valve on the cross, two top-mounted AC motors driving each end of the pinion shaft by banded V-belts behind mesh guards or by enclosed gear cases (`drive`).",
   "import": "./drilling/mud-pump",
   "export": "MudPump",
   "anchor": "base",
   "standards": [
    "API 7K",
    "API 6A",
    "ASME B16.5",
    "ISO 14120"
   ],
   "vendors": [
    "NOV",
    "HMH",
    "Bentec"
   ],
   "tags": [
    "mud system",
    "triplex",
    "reciprocating",
    "drilling",
    "high pressure"
   ],
   "params": [
    {
     "key": "cylinders",
     "label": "Cylinders",
     "type": "number",
     "min": 3,
     "max": 6,
     "step": 1
    },
    {
     "key": "kw",
     "label": "Motor power (each)",
     "type": "number",
     "min": 450,
     "max": 1200,
     "step": 10,
     "unit": "kW"
    },
    {
     "key": "drive",
     "label": "Drive",
     "type": "select",
     "options": [
      "belt",
      "gear"
     ]
    },
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 8,
     "max": 12
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 4,
     "max": 6
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "cylinders": 3,
    "kw": 860,
    "drive": "belt",
    "suctionNps": 10,
    "dischargeNps": 5,
    "dischargeRating": 2500,
    "color": "#35608c",
    "tag": "P-3101A",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      2.1,
      0.505,
      -1.39
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 10,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      1.83,
      1.251,
      1.65
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 5,
     "rating": 2500,
     "kind": "process"
    },
    {
     "id": "relief",
     "label": "Relief valve outlet",
     "position": [
      1.42,
      1.671,
      1.56
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 3,
     "rating": 150,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     5.54,
     3.526,
     3.125
    ],
    "center": [
     0,
     1.763,
     0.143
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/mud-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (reciprocating pump) / API 7K mud system",
    "drawn": "Reciprocating pump symbol (circle with a piston and crank) on the mud system flow sheet, with a pulsation dampener (small dome) on the discharge going to the standpipe manifold and suction from the mud tanks; usually two or three pumps in parallel.",
    "tags": [
     "MP",
     "P"
    ],
    "notes": "The dampener dome and the mud / standpipe service distinguish it from a process plunger pump (reciprocating-pump). Only on drilling flow sheets.",
    "datasheet": {
     "form": "Mud pump datasheet (API 7K)",
     "fields": {
      "Number of cylinders": "cylinders",
      "Input power": "kw",
      "Drive type": "drive",
      "Suction size": "suctionNps",
      "Discharge size": "dischargeNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "choke-manifold",
   "title": "Choke & kill manifold",
   "category": "drilling",
   "description": "Skid-mounted drilling choke manifold to API 16C with API 6A 6BX ring-joint connections: 4-1/16\" inlet through two gate valves into a studded-cross header, one branch per choke (hydraulic remote chokes with rotary actuators and hoses to a panel junction plate, manual adjustable chokes with handwheels) plus a full-bore bypass with a target block, a gate valve each side of every choke, and a buffer chamber with gauge, drain and two isolated 4-1/16\" 5K outlets to the mud-gas separator and the shakers. Ports sit on the API faces; their `rating` is the nearest ASME B16.5 class (10K/15K → 2500, 5K → 1500).",
   "import": "./drilling/choke-manifold",
   "export": "ChokeManifold",
   "anchor": "base",
   "standards": [
    "API 16C",
    "API 6A",
    "API RP 53 / API S53"
   ],
   "vendors": [
    "NOV"
   ],
   "tags": [
    "well control",
    "choke",
    "kill",
    "drilling",
    "manifold"
   ],
   "params": [
    {
     "key": "psi",
     "label": "Working pressure",
     "type": "select",
     "options": [
      5000,
      10000,
      15000
     ]
    },
    {
     "key": "bore",
     "label": "Branch bore",
     "type": "select",
     "options": [
      {
       "value": 2.0625,
       "label": "2-1/16\""
      },
      {
       "value": 3.0625,
       "label": "3-1/16\""
      },
      {
       "value": 4.0625,
       "label": "4-1/16\""
      }
     ]
    },
    {
     "key": "remoteChokes",
     "label": "Remote chokes",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 1
    },
    {
     "key": "manualChokes",
     "label": "Manual chokes",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 1
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "psi": 10000,
    "bore": 3.0625,
    "remoteChokes": 2,
    "manualChokes": 1,
    "color": "#c25b28",
    "tag": "CM-101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet (choke line)",
     "position": [
      -1.6767,
      1.8039,
      -0.425
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 2500,
     "kind": "process"
    },
    {
     "id": "outlet-1",
     "label": "Outlet to mud-gas separator",
     "position": [
      0.8215,
      0.608,
      2.5541
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "outlet-2",
     "label": "Outlet to shakers",
     "position": [
      0.8215,
      0.608,
      -2.5541
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 4,
     "rating": 1500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3.769,
     2.331,
     5.113
    ],
    "center": [
     0.008,
     1.166,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/choke-manifold.svg",
    "standard": "API 16C / API RP 53 well-control schematic, ISO 10628-2 valves",
    "drawn": "From the BOP choke line: two gate valves into a cross or header, then parallel branches each with a gate valve and a choke (bow-tie with a diagonal arrow), rejoining to the mud-gas separator or flare; a straight-through bleed line in the middle on many manifolds.",
    "isa": [
     "HCV",
     "PV",
     "PI",
     "PT"
    ],
    "notes": "Production chokes on a tree are single valves; a choke manifold has several parallel choke branches with block valves. Only on well-control schematics.",
    "datasheet": {
     "form": "Choke and kill manifold datasheet (API 16C)",
     "fields": {
      "Rated working pressure": "psi",
      "Bore": "bore",
      "Remote (hydraulic) chokes": "remoteChokes",
      "Manual chokes": "manualChokes",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "shale-shaker",
   "title": "Shale shaker (linear motion)",
   "category": "drilling",
   "description": "Linear-motion shale shaker sized on a 4-panel unit (3.3 × 2.0 m, 1.17 × 0.66 m pretensioned panels ≈ 3.1 m² of screen, first panel flat then inclined by `deckAngle`). Spring-mounted basket with wedge clamps, optional stacked scalping decks (`decks`), two counter-rotating vibrator motors on an inclined beam giving a 45° line of action; the basket vibrates when `running`. Fixed possum-belly feeder with weir, mud level, bypass gate and flanged feed nozzle, underflow pan draining through the tank-top opening, discharge lip, starter panel. Origin on the mud tank top.",
   "import": "./drilling/shale-shaker",
   "export": "ShaleShaker",
   "anchor": "base",
   "standards": [
    "API RP 13C",
    "ISO 13501 (screen testing)",
    "IEC 60079 (Ex motors)"
   ],
   "vendors": [
    "NOV (Brandt)",
    "Derrick"
   ],
   "tags": [
    "mud system",
    "solids control",
    "shaker",
    "drilling"
   ],
   "params": [
    {
     "key": "panels",
     "label": "Panels",
     "type": "number",
     "min": 3,
     "max": 5,
     "step": 1
    },
    {
     "key": "decks",
     "label": "Decks",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 1
    },
    {
     "key": "deckAngle",
     "label": "Deck angle",
     "type": "number",
     "min": -1,
     "max": 7,
     "step": 0.5,
     "unit": "°"
    },
    {
     "key": "feedNps",
     "label": "Feed",
     "type": "nps",
     "min": 6,
     "max": 12
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "panels": 4,
    "decks": 1,
    "deckAngle": 5,
    "feedNps": 10,
    "color": "#2f7d4f",
    "tag": "SS-101",
    "running": true
   },
   "ports": [
    {
     "id": "feed",
     "label": "Feed (flowline)",
     "position": [
      -1.89,
      0.42,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 10,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3.795,
     1.4,
     2.118
    ],
    "center": [
     -0.022,
     0.66,
     0.052
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/shale-shaker.svg",
    "standard": "Drilling mud system flow sheet convention (API RP 13C)",
    "drawn": "A box with a sloping dashed screen deck: returns from the flowline enter one end, cuttings leave off the low end of the screen, and the cleaned mud drops through to the tank below; vibrator motors drawn on the basket.",
    "notes": "Dashed sloping screen = shaker. Desanders and desilters on the mud system are cyclones (cones); a degasser is a vessel.",
    "datasheet": {
     "form": "Shale shaker datasheet (API RP 13C screens)",
     "fields": {
      "Screen panels": "panels",
      "Decks": "decks",
      "Deck angle": "deckAngle",
      "Feed size": "feedNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "mud-tank",
   "title": "Active mud tank",
   "category": "drilling",
   "description": "Skid-mounted active mud pit: open-top steel tank on runners with external stiffeners, compartment bulkheads with top-operated equalising valves, translucent mud surface at `level`, grating top with ISO 14122 perimeter handrail and caged ladder. One top-entry agitator per compartment (right-angle helical-bevel gearbox and motor on bridge beams, shaft and canted-blade impellers turning when `running`, second impeller in tall tanks) seen through a guarded hatch opening. Mud-gun header with valved drop pipes and swivel nozzles, suction nozzle with suction bell, return and equalising nozzles, clean-out doors.",
   "import": "./drilling/mud-tank",
   "export": "MudTank",
   "anchor": "base",
   "standards": [
    "API RP 13C",
    "ISO 14122-2/3/4",
    "ASME B16.5"
   ],
   "vendors": [
    "NOV (Brandt)"
   ],
   "tags": [
    "mud system",
    "pit",
    "agitator",
    "tank",
    "drilling"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 4,
     "max": 14,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 2,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1.5,
     "max": 3.2,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "compartments",
     "label": "Compartments",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "agitatorKw",
     "label": "Agitator motor",
     "type": "number",
     "min": 5.5,
     "max": 30,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "level",
     "label": "Mud level",
     "type": "number",
     "min": 0.1,
     "max": 0.95,
     "step": 0.05
    },
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 6,
     "max": 12
    },
    {
     "key": "returnNps",
     "label": "Return",
     "type": "nps",
     "min": 4,
     "max": 10
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 9,
    "width": 3,
    "height": 2.4,
    "compartments": 2,
    "agitatorKw": 15,
    "level": 0.62,
    "suctionNps": 10,
    "returnNps": 8,
    "color": "#a8402e",
    "tag": "T-3201",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Pump suction",
     "position": [
      -4.7,
      0.7,
      -0.8
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 10,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "return",
     "label": "Mud return",
     "position": [
      4.7,
      2.3,
      0.8
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "equalise",
     "label": "Equalising line",
     "position": [
      4.7,
      0.7,
      -0.8
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 10,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "mud-gun",
     "label": "Mud gun supply",
     "position": [
      4.85,
      3,
      1.2
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     10.244,
     3.822,
     3.16
    ],
    "center": [
     -0.252,
     1.911,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/mud-tank.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (open tank with agitators) / API RP 13C mud system",
    "drawn": "An open-topped rectangular tank divided into compartments, each with an agitator (motor M on a shaft with impeller blades) and the mud level dashed; suction to the mud pumps and returns from the shakers.",
    "tags": [
     "T"
    ],
    "isa": [
     "LT",
     "LI"
    ],
    "notes": "Open top plus agitators = mud pit. A closed process vessel is drawn as a capsule. Pit volume totaliser (PVT) level transmitters sit on each compartment. ISA codes here: LT = pit volume.",
    "datasheet": {
     "form": "Mud tank datasheet (API RP 13C)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Height": "height",
      "Compartments": "compartments",
      "Agitator motor power": "agitatorKw",
      "Suction size": "suctionNps",
      "Return size": "returnNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "plet",
   "title": "Pipeline end termination (PLET)",
   "category": "drilling",
   "description": "Subsea PLET: skirted mudmat with stiffeners and padeyes, tubular protection frame with sloped (overtrawlable) ends, rigging padeyes, ROV grab bars, anodes and an ROV-readable nameplate. Pipeline stub with a tie-in flange, ROV-operated trunnion ball valve (gearbox and class-4 bucket facing the ROV side), then a vertical jumper hub inside an alignment funnel or a horizontal hub on a connector receiver (`hubOrientation`); optional hub protection cap. The item sits on its mudmat with y = 0 at the seabed (skirts penetrate below it). The hub port has no flange rating: it is a clamp/collet hub face.",
   "import": "./drilling/plet",
   "export": "Plet",
   "anchor": "base",
   "standards": [
    "API 17P",
    "API 17D",
    "API 17R",
    "DNV-ST-F101",
    "DNV-RP-B401"
   ],
   "vendors": [
    "Oil States",
    "Turcomp"
   ],
   "tags": [
    "subsea",
    "pipeline",
    "plet",
    "hub",
    "mudmat"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Pipeline",
     "type": "nps",
     "min": 6,
     "max": 20
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      900,
      1500,
      2500
     ]
    },
    {
     "key": "hubOrientation",
     "label": "Hub",
     "type": "select",
     "options": [
      "vertical",
      "horizontal"
     ]
    },
    {
     "key": "hubCap",
     "label": "Hub cap",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 12,
    "rating": 1500,
    "hubOrientation": "vertical",
    "hubCap": false,
    "tag": "PLET-01"
   },
   "ports": [
    {
     "id": "pipeline",
     "label": "Pipeline (tie-in flange)",
     "position": [
      -3.3714,
      1.0119,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 12,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "hub",
     "label": "Jumper hub",
     "position": [
      2.0714,
      2.2619,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     6.424,
     3.091,
     3.735
    ],
    "center": [
     -0.224,
     1.246,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/plet.svg",
    "standard": "Subsea field layout / subsea P&ID convention (API 17P)",
    "drawn": "On subsea P&IDs: the pipeline ending at a structure (dashed boundary) with an isolation valve and a connection hub (clamp or collet connector, drawn as a pair of thick bars or a hub outline) for the spool or jumper; on field layouts a small rectangle at the pipeline end.",
    "tags": [
     "PLET",
     "PLEM"
    ],
    "notes": "A PLEM is the same idea with several hubs or a manifold header. Topsides pig traps and risers are separate items.",
    "datasheet": {
     "form": "Subsea structure datasheet (API 17P / API 17D)",
     "fields": {
      "Pipeline size": "nps",
      "Flange rating": "rating",
      "Hub orientation": "hubOrientation",
      "Hub cap": "hubCap",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "subsea-manifold",
   "title": "Subsea production manifold",
   "category": "drilling",
   "description": "Cluster-type subsea production manifold: two headers (production and test) with weld-capped ends rising to vertical outlet hubs, well slots on both long sides, each with a vertical jumper hub in a soft-landing funnel, a branch across both headers and an ROV-operated trunnion ball valve on each drop (gearbox and class-4 bucket). Header transmitters, saddles, overtrawlable tubular protection structure with sloped members, roof grating over the valves and open strips over the hubs, lift points, grab bars, anodes and an ROV-readable nameplate. Sits on a skirted mudmat; y = 0 is the seabed. Hub ports carry no flange rating (clamp hubs).",
   "import": "./drilling/subsea-manifold",
   "export": "SubseaManifold",
   "anchor": "base",
   "standards": [
    "API 17P",
    "API 17D",
    "API 17R",
    "ISO 13628-15",
    "DNV-RP-B401"
   ],
   "vendors": [
    "OneSubsea (SLB)"
   ],
   "tags": [
    "subsea",
    "manifold",
    "production",
    "hub",
    "mudmat"
   ],
   "params": [
    {
     "key": "slots",
     "label": "Well slots",
     "type": "number",
     "min": 2,
     "max": 8,
     "step": 1
    },
    {
     "key": "slotNps",
     "label": "Slot size",
     "type": "nps",
     "min": 4,
     "max": 8
    },
    {
     "key": "headerNps",
     "label": "Header size",
     "type": "nps",
     "min": 8,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      900,
      1500,
      2500
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "slots": 4,
    "slotNps": 6,
    "headerNps": 10,
    "rating": 1500,
    "tag": "PM-01"
   },
   "ports": [
    {
     "id": "slot-1",
     "label": "Well slot 1 hub",
     "position": [
      -2.2,
      3.4914,
      -2
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "slot-2",
     "label": "Well slot 2 hub",
     "position": [
      -1.9,
      3.4914,
      2
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "slot-3",
     "label": "Well slot 3 hub",
     "position": [
      0,
      3.4914,
      -2
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "slot-4",
     "label": "Well slot 4 hub",
     "position": [
      0.3,
      3.4914,
      2
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "header-a",
     "label": "Production header hub",
     "position": [
      2.7,
      2.35,
      -0.55
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 10,
     "kind": "process"
    },
    {
     "id": "header-b",
     "label": "Test / second header hub",
     "position": [
      2.7,
      2.35,
      0.55
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 10,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     7.6,
     4.826,
     7
    ],
    "center": [
     0,
     2.014,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/subsea-manifold.svg",
    "standard": "Subsea P&ID / field layout convention (API 17P)",
    "drawn": "Subsea P&ID: a dashed structure boundary containing production and test headers with each well slot (jumper hub) branching to both headers through its own subsea valves, and header outlets to the flowlines; on field layouts a rectangle with the wells radiating to it.",
    "tags": [
     "SM",
     "MF"
    ],
    "notes": "Same branching logic as a topsides production-manifold, but inside a subsea structure boundary with hubs instead of flanges. A single-hub structure at a pipeline end is a PLET.",
    "datasheet": {
     "form": "Subsea manifold datasheet (API 17P / API 17D)",
     "fields": {
      "Number of well slots": "slots",
      "Slot (jumper) size": "slotNps",
      "Header size": "headerNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "umbilical-termination-assembly",
   "title": "Umbilical termination assembly (UTA)",
   "category": "drilling",
   "description": "Subsea UTA on a skirted mudmat: square-tube frame with lift points, grab bars and anodes; umbilical termination head bolted to a bulkhead frame, vertebrae bend restrictor dropping to the seabed and an umbilical stub lying on the seabed to its cut end. ROV panel with a fixed MQC stab plate (`couplers`) carrying a mated flying MQC half with ROV handle and bucket, its hydraulic flying lead running to a parking bracket on the mudmat; wet-mate electrical receptacles with dust caps (`electrical`) plus one mated electrical jumper parked on a second bracket. Internal tubing and cables run from the head to the plates. y = 0 is the seabed.",
   "import": "./drilling/umbilical-termination-assembly",
   "export": "UmbilicalTerminationAssembly",
   "anchor": "base",
   "standards": [
    "API 17E",
    "ISO 13628-5",
    "API 17D",
    "ISO 13628-8 (ROV interfaces)"
   ],
   "vendors": [
    "Viper Subsea",
    "Prysmian"
   ],
   "tags": [
    "subsea",
    "umbilical",
    "UTA",
    "flying lead",
    "MQC",
    "mudmat"
   ],
   "params": [
    {
     "key": "umbilicalOd",
     "label": "Umbilical OD",
     "type": "number",
     "min": 0.08,
     "max": 0.25,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "couplers",
     "label": "MQC couplers",
     "type": "number",
     "min": 4,
     "max": 16,
     "step": 1
    },
    {
     "key": "electrical",
     "label": "Electrical connectors",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "umbilicalOd": 0.16,
    "couplers": 8,
    "electrical": 2,
    "tag": "UTA-01"
   },
   "ports": [
    {
     "id": "umbilical",
     "label": "Umbilical (cut end)",
     "position": [
      -3.8,
      0.08,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "utility"
    },
    {
     "id": "hydraulic",
     "label": "Hydraulic flying lead (parked MQC head)",
     "position": [
      1.77,
      0.62,
      -1.05
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "kind": "utility"
    },
    {
     "id": "electrical-1",
     "label": "Wet-mate electrical 1",
     "position": [
      1.71,
      1.2,
      0.65
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 1,
     "kind": "electrical"
    },
    {
     "id": "electrical-2",
     "label": "Wet-mate electrical 2",
     "position": [
      1.71,
      0.98,
      0.65
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 1,
     "kind": "electrical"
    }
   ],
   "bounds": {
    "size": [
     6.206,
     2.181,
     3.34
    ],
    "center": [
     -0.699,
     0.842,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/umbilical-termination-assembly.svg",
    "standard": "Subsea control system schematic / field layout convention (API 17E)",
    "drawn": "On subsea control schematics: the umbilical (a thick double line or bundle) ending at a termination head inside a dashed structure, fanning out to hydraulic, chemical and electrical couplers that connect by flying leads to trees and manifolds.",
    "tags": [
     "UTA",
     "SUTU"
    ],
    "notes": "A structure where the umbilical bundle splits into many small hydraulic / electrical lines is a UTA or SUTU; one carrying production pipework is a manifold or PLET.",
    "datasheet": {
     "form": "Umbilical termination datasheet (API 17E / ISO 13628-5)",
     "fields": {
      "Umbilical outside diameter": "umbilicalOd",
      "Hydraulic / chemical couplers": "couplers",
      "Electrical connectors": "electrical",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "subsea-tree",
   "title": "Subsea Xmas tree (vertical)",
   "category": "drilling",
   "description": "Vertical subsea tree on a permanent guide base: skirted mudmat, four guide posts on a 6 ft radius, conductor and 18-3/4\" wellhead housings, hydraulic collet wellhead connector with lock indicators, valve block with fail-safe hydraulic actuators (PMV, PSV, AMV, PWV, AWV) and ROV overrides, production wing to a retrievable choke module (stepping actuator, ROV handle and bucket) and a horizontal flowline hub, annulus wing to an annulus hub, tree cap with T-handle. Tree frame with guide funnels, ROV panel (buckets, hot stabs, gauges), subsea control module with hydraulic tubing, grab bars, anodes and nameplate. y = 0 is the seabed. Hub ports carry no flange rating.",
   "import": "./drilling/subsea-tree",
   "export": "SubseaTree",
   "anchor": "base",
   "standards": [
    "API 17D",
    "ISO 13628-4",
    "API 17H (ROV interfaces)",
    "API 6A"
   ],
   "vendors": [],
   "tags": [
    "subsea",
    "xmas tree",
    "wellhead",
    "production",
    "hub"
   ],
   "params": [
    {
     "key": "productionNps",
     "label": "Production",
     "type": "nps",
     "min": 4,
     "max": 7
    },
    {
     "key": "annulusNps",
     "label": "Annulus",
     "type": "nps",
     "min": 2,
     "max": 3
    },
    {
     "key": "choke",
     "label": "Choke module",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "productionNps": 5,
    "annulusNps": 2,
    "choke": true,
    "tag": "XT-S01"
   },
   "ports": [
    {
     "id": "production",
     "label": "Production flowline hub",
     "position": [
      2.4,
      2.1,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 5,
     "kind": "process"
    },
    {
     "id": "annulus",
     "label": "Annulus hub",
     "position": [
      -2.25,
      3.2,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     4.801,
     5.324,
     4.8
    ],
    "center": [
     0,
     2.313,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/subsea-tree.svg",
    "standard": "API 17D subsea P&ID convention, drawn like the surface tree (ISO 10628-2 valves)",
    "drawn": "Same valve stack as a surface tree, but every valve is actuated (small actuator boxes), it sits inside a dashed subsea boundary above the seabed line, and an annulus line and SCSSV control line run alongside. Production master (PMV), production wing (PWV) and the subsea choke sit on the side outlet to the flowline or jumper.",
    "tags": [
     "XT",
     "SXT",
     "W"
    ],
    "isa": [
     "XV",
     "PT",
     "TT"
    ],
    "notes": "A dashed subsea boundary, seabed line and all-actuated valves distinguish it from a surface christmas-tree. PMV / PWV / AMV / AWV are subsea valve tags, not ISA letter codes.",
    "datasheet": {
     "form": "Subsea tree datasheet (API 17D / ISO 13628-4)",
     "fields": {
      "Production outlet size": "productionNps",
      "Annulus outlet size": "annulusNps",
      "Subsea choke": "choke",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pipe-handling-catwalk",
   "title": "Pipe-handling catwalk & V-door ramp",
   "category": "drilling",
   "description": "Pipe-handling catwalk machine: fabricated body on base runners, checker-plate deck, lined V-trough with a chain-driven skate, three pipe-rack bays each side with stands, end stops and indexer fingers, and hydraulic kicker arms that lift with `kick`. Range-2 drill-pipe joints with tool-joint upsets, hardbanding and thread protectors lie on the racks (`joints` per side) and one waits in the trough. A 36° V-door ramp (slide) with wear plate and side guides climbs to a drill-floor landing at `floorHeight`; control console with hydraulic hoses at the far end. No process ports.",
   "import": "./drilling/pipe-handling-catwalk",
   "export": "PipeHandlingCatwalk",
   "anchor": "base",
   "standards": [
    "API 7K",
    "API 5DP",
    "ISO 14122"
   ],
   "vendors": [
    "NOV",
    "Forum Energy Technologies",
    "HMH"
   ],
   "tags": [
    "drilling",
    "pipe handling",
    "catwalk",
    "V-door",
    "drill pipe"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 10,
     "max": 18,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "floorHeight",
     "label": "Drill floor height",
     "type": "number",
     "min": 2.5,
     "max": 10,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "joints",
     "label": "Joints per rack",
     "type": "number",
     "min": 0,
     "max": 8,
     "step": 1
    },
    {
     "key": "pipeOd",
     "label": "Pipe OD",
     "type": "number",
     "min": 2.375,
     "max": 6.625,
     "step": 0.125,
     "unit": "in"
    },
    {
     "key": "kick",
     "label": "Kicker arms",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 13.5,
    "floorHeight": 6,
    "joints": 4,
    "pipeOd": 5,
    "kick": 0.35,
    "color": "#d9a21b",
    "tag": "CW-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     22.739,
     8.2,
     6.73
    ],
    "center": [
     3.744,
     4.1,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipe-handling-catwalk.svg",
    "standard": "Layout plan convention (drill floor / pipe deck layout)",
    "drawn": "Drill-floor and pipe-deck layouts: a long rectangle with the trough centreline aimed at the V-door, pipe racks drawn as parallel lines along both sides, and an arrow towards the drill floor.",
    "tags": [
     "CW"
    ],
    "notes": "Only on drilling layouts, never on P&IDs.",
    "datasheet": {
     "form": "Pipe-handling equipment datasheet (API 7K)",
     "fields": {
      "Catwalk length": "length",
      "Drill floor height": "floorHeight",
      "Maximum pipe OD": "pipeOd",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "cement-unit",
   "title": "Cementing unit (twin pump skid)",
   "category": "drilling",
   "description": "Offshore twin-pump cementing skid, about 7.5 × 2.5 m: two electric-driven triplex plunger pumps (TEFC motor, guarded coupling and reduction gearbox turning when `running`, crankcase, plunger windows, fluid end with hammer-lug valve caps) feeding an HP header with plug valves, transducer, gauge and pop-off valve to a 2\" discharge flange. Recirculating mixer tub with agitator, mixing head under the bulk cement inlet, recirc pump and densitometer, mix-water inlet with butterfly valve. Two displacement tanks (`tankBbl` each) with sight gauges, grating top, handrail and ladder, a 4\" suction header to both pumps, and an operator cabin with windows, console and roof A/C.",
   "import": "./drilling/cement-unit",
   "export": "CementUnit",
   "anchor": "base",
   "standards": [
    "API 10A",
    "API 7K",
    "DNV 2.7-3",
    "ISO 14122"
   ],
   "vendors": [
    "Halliburton",
    "SLB"
   ],
   "tags": [
    "drilling",
    "cementing",
    "well service",
    "triplex",
    "skid"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Motor per pump",
     "type": "number",
     "min": 150,
     "max": 450,
     "step": 10,
     "unit": "kW"
    },
    {
     "key": "tankBbl",
     "label": "Displacement tank",
     "type": "number",
     "min": 5,
     "max": 20,
     "step": 1,
     "unit": "bbl"
    },
    {
     "key": "dischargeRating",
     "label": "Discharge class",
     "type": "rating",
     "options": [
      1500,
      2500
     ]
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 300,
    "tankBbl": 10,
    "dischargeRating": 2500,
    "color": "#c8352b",
    "tag": "CU-01",
    "running": true
   },
   "ports": [
    {
     "id": "discharge",
     "label": "HP discharge (to cement head)",
     "position": [
      -0.3,
      1.55,
      -1.5
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 2500,
     "kind": "process"
    },
    {
     "id": "water",
     "label": "Mix water supply",
     "position": [
      0.1,
      0.758,
      1.55
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "bulk",
     "label": "Dry cement (bulk) inlet",
     "position": [
      -0.1,
      2.358,
      0.45
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 5,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     7.5,
     2.988,
     3.1
    ],
    "center": [
     0,
     1.494,
     0.021
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cement-unit.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary; reciprocating pumps)",
    "drawn": "On well-service schematics: a dash-dot skid boundary with displacement / mixing tanks and two reciprocating (triplex) pump symbols discharging into a common high-pressure line to the cement head or standpipe.",
    "tags": [
     "CU",
     "X"
    ],
    "notes": "Twin reciprocating pumps on a skid with displacement tanks = cement unit; a single mud pump with a dampener is a mud-pump. Usually on temporary well-service layouts rather than process P&IDs.",
    "datasheet": {
     "form": "Cementing unit datasheet (API 7K pumps, DNV 2.7-3 skid)",
     "fields": {
      "Pump driver power": "kw",
      "Displacement tank capacity": "tankBbl",
      "Discharge rating": "dischargeRating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "coiled-tubing-unit",
   "title": "Coiled-tubing unit (reel, cabin, power pack)",
   "category": "drilling",
   "description": "Offshore coiled-tubing spread sized on a 5.6 × 3.0 × 4.7 m reel skid with a 2.9 m core: spoked reel with wraps of tubing (`tubingOd`, `fill`) turning when `running`, A-frame stands and bearings, chain-guarded drive sprocket with twin hydraulic motors and brakes, HP swivel with isolation valve, gauge and a 2\" inlet flange on the axle, level wind with guide tubes, diamond screw and a traversing carriage (`wind`) with depth counter, tubing paying off towards the injector, crash/lifting frame. With `spread`, an elevated operator cabin skid with wraparound windows and an electric hydraulic power pack (pump stack, reservoir, fan cooler, hose reels) are placed alongside and hosed to the reel drive. The injector head is not included.",
   "import": "./drilling/coiled-tubing-unit",
   "export": "CoiledTubingUnit",
   "anchor": "base",
   "standards": [
    "API RP 16ST",
    "API 5ST",
    "API 16A (stack, not modelled)",
    "DNV 2.7-3"
   ],
   "vendors": [
    "Weatherford"
   ],
   "tags": [
    "well service",
    "coiled tubing",
    "reel",
    "intervention",
    "drilling"
   ],
   "params": [
    {
     "key": "tubingOd",
     "label": "Tubing OD",
     "type": "number",
     "min": 1,
     "max": 3.5,
     "step": 0.25,
     "unit": "in"
    },
    {
     "key": "flangeDia",
     "label": "Flange dia",
     "type": "number",
     "min": 3.2,
     "max": 4.8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "coreDia",
     "label": "Core dia",
     "type": "number",
     "min": 1.8,
     "max": 3.2,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "fill",
     "label": "Tubing fill",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "wind",
     "label": "Level wind",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "spread",
     "label": "Cabin + power pack",
     "type": "bool"
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "tubingOd": 1.75,
    "flangeDia": 4.3,
    "coreDia": 2.9,
    "fill": 0.7,
    "wind": 0.4,
    "spread": true,
    "color": "#1f5fa8",
    "tag": "CTU-01",
    "running": false
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Reel swivel inlet",
     "position": [
      0,
      2.5,
      -1.77
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 2500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     13.653,
     5.073,
     3.534
    ],
    "center": [
     -2.973,
     2.536,
     -0.032
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/coiled-tubing-unit.svg",
    "standard": "Layout plan convention (well-intervention spread)",
    "drawn": "Well-intervention layouts: a reel (two concentric circles) with the tubing running over the gooseneck to the injector head (box) above the well-control stack on the well; the control cabin and power pack are rectangles beside the reel.",
    "tags": [
     "CTU"
    ],
    "notes": "Temporary equipment, not shown on process P&IDs. The stack below the injector is a well-control item (bop-stack).",
    "datasheet": {
     "form": "Coiled tubing equipment datasheet (API RP 16ST, API 5ST tubing)",
     "fields": {
      "Tubing OD": "tubingOd",
      "Reel flange diameter": "flangeDia",
      "Reel core diameter": "coreDia",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "transformer",
   "title": "Power transformer (oil-immersed)",
   "category": "electrical",
   "description": "Oil-immersed ONAN / ONAF power transformer on a bunded steel plinth with skids. Pressed-steel radiator banks with isolating valves and side-blow fans, conservator with magnetic level gauge, OLTC sight glass, Buchholz relay and silica-gel breathers, OLTC compartment with motor drive and protective relay, bushing CT boxes on outdoor turrets, cover access ladder from 10 MVA, pressure relief device, marshalling kiosk with OTI / WTI and a rating plate. Tank size follows the MVA rating; terminations are air-filled cable boxes or porcelain bushings on the cover.",
   "import": "./electrical/transformer",
   "export": "Transformer",
   "anchor": "base",
   "standards": [
    "IEC 60076-1",
    "IEC 60076-2",
    "IEC 60137",
    "IEC 60214-1",
    "IEC 60296"
   ],
   "vendors": [
    "Hitachi Energy",
    "Siemens Energy"
   ],
   "tags": [
    "transformer",
    "power",
    "substation",
    "ONAF",
    "electrical"
   ],
   "params": [
    {
     "key": "mva",
     "label": "Rating",
     "type": "number",
     "min": 1,
     "max": 60,
     "step": 0.5,
     "unit": "MVA"
    },
    {
     "key": "hvKv",
     "label": "HV voltage",
     "type": "select",
     "options": [
      6.6,
      11,
      13.8,
      33,
      66,
      132
     ]
    },
    {
     "key": "lvKv",
     "label": "LV voltage",
     "type": "select",
     "options": [
      0.69,
      3.3,
      6.6,
      11,
      13.8,
      33
     ]
    },
    {
     "key": "cooling",
     "label": "Cooling",
     "type": "select",
     "options": [
      "ONAN",
      "ONAF"
     ]
    },
    {
     "key": "terminations",
     "label": "Terminations",
     "type": "select",
     "options": [
      "cable-box",
      "outdoor"
     ]
    },
    {
     "key": "oltc",
     "label": "On-load tap changer",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Fans running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mva": 20,
    "hvKv": 33,
    "lvKv": 11,
    "cooling": "ONAF",
    "terminations": "cable-box",
    "oltc": true,
    "tag": "TR-101",
    "running": true
   },
   "ports": [],
   "bounds": {
    "size": [
     4.917,
     4.422,
     3.246
    ],
    "center": [
     0,
     2.211,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/transformer.svg",
    "standard": "IEC 60617 (single-line diagram)",
    "drawn": "Two overlapping circles (one per winding) on the single-line diagram, with the HV feeder above and the LV feeder below. Winding symbols (Δ, Y, Yn) and the MVA / kV rating are written beside it; a diagonal arrow through both circles marks an on-load tap changer.",
    "tags": [
     "TR",
     "TX"
    ],
    "notes": "Two circles = two-winding transformer; three circles = three-winding. ANSI drawings show two facing coils instead. Two circles in a P&ID instrument context are not used, so this symbol is almost always electrical.",
    "datasheet": {
     "form": "Transformer datasheet / rating plate (IEC 60076-1)",
     "fields": {
      "Rated power": "mva",
      "HV rated voltage": "hvKv",
      "LV rated voltage": "lvKv",
      "Cooling (ONAN / ONAF)": "cooling",
      "Terminations": "terminations",
      "On-load tap changer": "oltc",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "switchgear",
   "title": "Switchgear / MCC line-up",
   "category": "electrical",
   "description": "Line-up of MV metal-clad switchgear, LV switchboard or motor control centre panels. MV panels carry a protection relay, ammeter, indicator lamps, breaker viewing window, racking point, earthing-switch socket and bolted cable compartment under an arc-gas duct, with bolted rear covers for rear access; LV / MCC sections have withdrawable tiers with rotary isolators. Panel size follows the type and voltage; the plinth adds a rear cable trench, rubber operator mat and main earth bar.",
   "import": "./electrical/switchgear",
   "export": "Switchgear",
   "anchor": "base",
   "standards": [
    "IEC 62271-200",
    "IEC 61439-1/2",
    "IEC 60073",
    "IEC 61111"
   ],
   "vendors": [
    "Siemens",
    "Eaton",
    "Schneider Electric",
    "alfanar"
   ],
   "tags": [
    "switchgear",
    "MCC",
    "switchboard",
    "electrical",
    "substation"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      {
       "value": "mv",
       "label": "MV switchgear"
      },
      {
       "value": "lv",
       "label": "LV switchboard"
      },
      {
       "value": "mcc",
       "label": "MCC"
      }
     ]
    },
    {
     "key": "panels",
     "label": "Panels",
     "type": "number",
     "min": 1,
     "max": 20,
     "step": 1
    },
    {
     "key": "kv",
     "label": "Voltage",
     "type": "select",
     "options": [
      0.69,
      3.3,
      6.6,
      11,
      13.8,
      33
     ]
    },
    {
     "key": "plinth",
     "label": "Plinth and trench",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "mv",
    "panels": 8,
    "kv": 11,
    "plinth": true,
    "tag": "SWBD-8801"
   },
   "ports": [],
   "bounds": {
    "size": [
     5.9,
     2.975,
     3.148
    ],
    "center": [
     0,
     1.487,
     0.024
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/switchgear.svg",
    "standard": "IEC 60617 (single-line diagram)",
    "drawn": "Thick horizontal busbar with an incoming feeder and several outgoing feeders, each through a circuit breaker (a switch blade with a small × on the fixed contact) or contactor, often inside a dashed boundary with the board tag and voltage.",
    "tags": [
     "SWG",
     "MCC"
    ],
    "notes": "Breaker: × on the contact. Disconnector: a bar across the contact. Contactor (MCC starter): a half-circle on the contact. On layouts a switchgear line-up is a long rectangle divided into panels inside an E-house.",
    "datasheet": {
     "form": "Switchgear / switchboard datasheet (IEC 62271-200 / IEC 61439)",
     "fields": {
      "Type (MV / LV / MCC)": "kind",
      "Number of panels": "panels",
      "Rated voltage": "kv",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "e-house",
   "title": "E-house / local equipment room",
   "category": "electrical",
   "description": "Prefabricated A60 steel equipment module on an HEB skid with a cable cellar. Profiled or flat cladding, double equipment door and personnel doors with frames, canopies, lights and signage, front walkway and ISO 14122 stairs, roof HVAC packages with condenser fans, wall louvres with fire dampers and intake gas detectors, an overpressure relief damper, manual call points by the doors, a hollow cable cellar, multi-cable transits with a ladder tray, caged roof ladder, earthing bosses and lifting pad-eyes. Length, width, height and cellar drive the geometry; the optional interior holds a switchgear line-up (with a rear access aisle when the room is deep enough) and MCC under a lit ceiling with smoke detectors, visible with doorOpen.",
   "import": "./electrical/e-house",
   "export": "EHouse",
   "anchor": "base",
   "standards": [
    "IEC 62271-202",
    "IEC 61439",
    "ISO 14122-3/4",
    "SOLAS / IMO FTP Code (A60)",
    "NORSOK C-002"
   ],
   "vendors": [
    "ABB",
    "Siemens",
    "Schneider Electric",
    "CTM"
   ],
   "tags": [
    "e-house",
    "LER",
    "substation",
    "module",
    "building",
    "electrical"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 5,
     "max": 24,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 3.5,
     "max": 10,
     "step": 0.25,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Eaves height",
     "type": "number",
     "min": 3.8,
     "max": 7,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "cellar",
     "label": "Floor height (cellar)",
     "type": "number",
     "min": 0.6,
     "max": 2.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "cladding",
     "label": "Cladding",
     "type": "select",
     "options": [
      "corrugated",
      "flat"
     ]
    },
    {
     "key": "doorOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "interior",
     "label": "Interior",
     "type": "bool"
    },
    {
     "key": "kv",
     "label": "Switchgear voltage",
     "type": "select",
     "options": [
      3.3,
      6.6,
      11,
      13.8,
      33
     ]
    },
    {
     "key": "running",
     "label": "HVAC fans running",
     "type": "bool"
    },
    {
     "key": "label",
     "label": "Room sign",
     "type": "text"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 12,
    "width": 6,
    "height": 4.4,
    "cellar": 0.9,
    "cladding": "corrugated",
    "doorOpen": false,
    "interior": true,
    "kv": 11,
    "label": "LOCAL EQUIPMENT ROOM",
    "tag": "B-9100",
    "running": true
   },
   "ports": [],
   "bounds": {
    "size": [
     13.444,
     5.635,
     8.615
    ],
    "center": [
     0.568,
     2.818,
     0.383
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/e-house.svg",
    "standard": "Layout plan convention (plot plan / equipment layout)",
    "drawn": "Rectangle with door swings (quarter arcs at the openings) on the layout, labelled with the building tag (LER, E-house, MCC room). On a P&ID it appears only as a dashed boundary or an off-sheet reference.",
    "tags": [
     "B",
     "LER"
    ],
    "notes": "All buildings look alike on a plot plan: read the label. A rectangle with an AT bubble inside is an analyser-shelter; a small square with JB is a junction-box.",
    "datasheet": {
     "form": "Modular building / E-house datasheet (IEC 62271-202; A60 fire rating)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Height": "height",
      "Cable cellar depth": "cellar",
      "Cladding": "cladding",
      "Main voltage": "kv",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "local-control-station",
   "title": "Local control station",
   "category": "electrical",
   "description": "Ex e push-button station for a motor or valve, on a galvanised UPN post with base plate and anchors. Start button and a shrouded lock-off stop with padlock, L-O-R selector, moving-iron ammeter with run lamp and a latching E-stop, each with an engraved legend. Rain hood, bottom cable gland with armoured cable cleated down the post, earth stud and tag plate. Rows appear only for the devices switched on.",
   "import": "./electrical/local-control-station",
   "export": "LocalControlStation",
   "anchor": "base",
   "standards": [
    "IEC 60079-0 / -7",
    "IEC 60947-5-1",
    "IEC 60204-1",
    "ISO 13850"
   ],
   "vendors": [
    "R. STAHL",
    "Eaton (Crouse-Hinds CEAG)",
    "Hubbell Killark",
    "Abtech"
   ],
   "tags": [
    "LCS",
    "push button",
    "motor control",
    "Ex e",
    "electrical"
   ],
   "params": [
    {
     "key": "height",
     "label": "Enclosure height",
     "type": "number",
     "min": 0.9,
     "max": 1.7,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "enclosure",
     "label": "Enclosure",
     "type": "select",
     "options": [
      "stainless",
      "grp"
     ]
    },
    {
     "key": "ammeter",
     "label": "Ammeter",
     "type": "bool"
    },
    {
     "key": "selector",
     "label": "L-O-R selector",
     "type": "bool"
    },
    {
     "key": "estop",
     "label": "E-stop",
     "type": "bool"
    },
    {
     "key": "amps",
     "label": "Full-load current",
     "type": "number",
     "min": 5,
     "max": 600,
     "step": 5,
     "unit": "A"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 1.3,
    "enclosure": "stainless",
    "ammeter": true,
    "selector": true,
    "estop": true,
    "amps": 100,
    "tag": "HS-1501A"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.322,
     1.704,
     0.414
    ],
    "center": [
     0.001,
     0.852,
     0.057
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/local-control-station.svg",
    "standard": "ISA 5.1 (hand switch bubble) / IEC 60617",
    "drawn": "Field bubble marked HS (hand switch) beside the motor it starts and stops, joined to it by a dashed electrical signal line; the bubble is often annotated START / STOP or L-O-R.",
    "tags": [
     "LCS"
    ],
    "isa": [
     "HS",
     "HMS"
    ],
    "notes": "HS bubbles with a horizontal bar are on the console, not in the field. Some P&IDs omit local stations entirely; they then appear only on the electrical layout as a small rectangle at the motor.",
    "datasheet": {
     "form": "Local control station datasheet (IEC 60079-7, IEC 60947-5-1)",
     "fields": {
      "Enclosure": "enclosure",
      "Ammeter": "ammeter",
      "Selector (L-O-R)": "selector",
      "Emergency stop": "estop",
      "Ammeter range": "amps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "junction-box",
   "title": "Junction box (Ex e)",
   "category": "electrical",
   "description": "Increased-safety field junction box in 316 stainless or GRP on a galvanised UPN floor stand. Hollow body with mounting plate, DIN-rail terminals, trunking and cable cores (shown with `open`); gasketed lid with captive screws and hinges, Ex marking and warning label, breather drain, external earth stud and tag plate. A bottom gland plate carries a row of cable glands with shrouds; the cables drop and run out along a deck-level ladder tray. Size sets the enclosure and the stand (one or two legs).",
   "import": "./electrical/junction-box",
   "export": "JunctionBox",
   "anchor": "base",
   "standards": [
    "IEC 60079-0 / -7",
    "IEC 60079-14",
    "IEC 62444",
    "IEC 60529 (IP66)"
   ],
   "vendors": [
    "R. STAHL"
   ],
   "tags": [
    "junction box",
    "JB",
    "Ex e",
    "cable gland",
    "electrical",
    "instrument"
   ],
   "params": [
    {
     "key": "size",
     "label": "Size",
     "type": "select",
     "options": [
      "small",
      "medium",
      "large"
     ]
    },
    {
     "key": "enclosure",
     "label": "Enclosure",
     "type": "select",
     "options": [
      "stainless",
      "grp"
     ]
    },
    {
     "key": "glands",
     "label": "Glands",
     "type": "number",
     "min": 1,
     "max": 16,
     "step": 1
    },
    {
     "key": "height",
     "label": "Box height",
     "type": "number",
     "min": 0.7,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "open",
     "label": "Lid open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "size": "medium",
    "enclosure": "stainless",
    "glands": 6,
    "height": 1.2,
    "open": false,
    "tag": "JB-4101"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.7,
     1.45,
     0.685
    ],
    "center": [
     0.35,
     0.725,
     0.223
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/junction-box.svg",
    "standard": "Instrument / electrical layout convention",
    "drawn": "Small square or rectangle labelled JB plus its number, with field cables entering from the bottom and a multicore leaving towards the control room.",
    "tags": [
     "JB",
     "JBE",
     "JBI"
    ],
    "notes": "Appears on instrument location plans, cable block diagrams and electrical layouts, not on P&IDs. An LCS is a similar small box at a motor with push-buttons.",
    "datasheet": {
     "form": "Junction box datasheet (IEC 60079-7 / IEC 60529)",
     "fields": {
      "Size": "size",
      "Enclosure material": "enclosure",
      "Number of cable glands": "glands",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "lighting-mast",
   "title": "Lighting mast / pole",
   "category": "electrical",
   "description": "Area-lighting structure in two styles. Flood mast: tapered galvanised mast on a gusseted base plate with anchor bolts, inspection door and cable entry, lightning finial and a head frame carrying up to eight Ex floodlights on yokes (front and back rows) aimed down by `tilt`. Access is base-hinged (bolted flange as gravity lock, hinge pin, hydraulic counterbalance ram with hand pump; `lowered` swings the head down onto a rest for ground-level maintenance) or fixed with a caged ladder and fall-arrest rail. Pole: short galvanised pole with linear LED bulkhead fittings on arms and a base junction box. Lenses glow when `lit` (emissive only, no light sources).",
   "import": "./electrical/lighting-mast",
   "export": "LightingMast",
   "anchor": "base",
   "standards": [
    "EN 40-3",
    "IEC 60598-2-5",
    "IEC 60079-0 / -1 / -7",
    "ISO 14122-4"
   ],
   "vendors": [
    "Glamox",
    "Abacus Lighting"
   ],
   "tags": [
    "lighting",
    "floodlight",
    "mast",
    "pole",
    "electrical"
   ],
   "params": [
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "flood-mast",
      "pole"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 2.5,
     "max": 20,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "count",
     "label": "Lamps",
     "type": "number",
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "key": "tilt",
     "label": "Aim down",
     "type": "number",
     "min": 0,
     "max": 70,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "access",
     "label": "Access",
     "type": "select",
     "options": [
      "hinged",
      "ladder"
     ]
    },
    {
     "key": "lowered",
     "label": "Lowered",
     "type": "bool"
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "style": "flood-mast",
    "height": 9,
    "count": 4,
    "lit": true,
    "tilt": 30,
    "access": "hinged",
    "lowered": false,
    "tag": "LM-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     2.2,
     9.6,
     1.394
    ],
    "center": [
     0,
     4.8,
     0.011
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/lighting-mast.svg",
    "standard": "IEC 60617 (lamp: circle with ×) / lighting layout convention",
    "drawn": "On lighting layouts: the lamp symbol (circle with ×) for each floodlight, drawn on a mast or pole with its mounting height noted; floodlights sometimes add an arrow or wedge for the aiming direction.",
    "notes": "Circle with × is the generic IEC lamp; a status beacon on F&G layouts uses a similar lamp with rays (alarm-beacon). Lighting is not shown on P&IDs.",
    "datasheet": {
     "form": "Lighting mast / floodlight datasheet (EN 40-3, IEC 60598-2-5)",
     "fields": {
      "Mast style": "style",
      "Mounting height": "height",
      "Number of floodlights": "count",
      "Aiming tilt": "tilt",
      "Head access": "access",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "analyser-shelter",
   "title": "Analyser shelter (GRP)",
   "category": "electrical",
   "description": "Walk-in GRP analyser house on a steel skid with checker-plate floor, outward-opening doors at both ends (when wide enough), manual call points by the doors, an external shutdown panel, a pressurising ventilation intake stack with rain hood and fan, and a smoke detector inside. Stainless sample conditioning panels (filters, regulators with gauges, rotameters, ball valves, bulkhead tubing) under a front roof canopy, a chained gas-cylinder rack with regulators and pigtails, an Ex wall-mounted AC unit, ventilation louvres, MCT cable entry, gas detector, beacons, door light and signage. The door opens with doorOpen to show the analyser cabinets inside.",
   "import": "./electrical/analyser-shelter",
   "export": "AnalyserShelter",
   "anchor": "base",
   "standards": [
    "IEC 61285",
    "EEMUA 138",
    "IEC 60079-2 / -13",
    "ISO 10297"
   ],
   "vendors": [
    "Intertec",
    "Yokogawa"
   ],
   "tags": [
    "analyser house",
    "shelter",
    "GRP",
    "sample conditioning",
    "instrument",
    "electrical"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 2.4,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 1.8,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Eaves height",
     "type": "number",
     "min": 2.7,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "panels",
     "label": "Sample panels",
     "type": "number",
     "min": 0,
     "max": 4,
     "step": 1
    },
    {
     "key": "bottles",
     "label": "Gas cylinders",
     "type": "number",
     "min": 0,
     "max": 8,
     "step": 1
    },
    {
     "key": "doorOpen",
     "label": "Door open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 3.6,
    "width": 2.5,
    "height": 3,
    "panels": 2,
    "bottles": 4,
    "doorOpen": false,
    "tag": "AH-3001"
   },
   "ports": [],
   "bounds": {
    "size": [
     4.752,
     5.14,
     4.482
    ],
    "center": [
     -0.134,
     2.57,
     -0.111
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/analyser-shelter.svg",
    "standard": "Layout plan convention (plot plan / equipment layout) + ISA 5.1 analyser bubbles",
    "drawn": "Building rectangle with doors at each end on the layout. On the P&ID the analysers inside (AT / AE bubbles) are often drawn within a dashed boundary marked \"analyser house\" with sample and return lines to the process.",
    "tags": [
     "B"
    ],
    "isa": [
     "AT",
     "AE",
     "AIT"
    ],
    "notes": "Look for sample lines (small-bore, often with a sample cooler) running to a boundary that contains several AT bubbles. A building with no analysers is an E-house or LER.",
    "datasheet": {
     "form": "Analyser house datasheet (IEC 61285 / EEMUA 138)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Height": "height",
      "Analyser panels": "panels",
      "Calibration gas bottles": "bottles",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "ups-battery-cabinet",
   "title": "UPS and battery cabinets",
   "category": "electrical",
   "description": "Industrial UPS line-up on a base frame: rectifier / charger and inverter with static bypass (each with mimic panel, lamps and louvred doors), an AC distribution section with meters and MCB window, and hollow VRLA battery cabinets with shelves of 12 V blocks, inter-block links, string labels and a DC breaker. doorOpen swings the battery doors. Top gland plates, hinges, locks, earth boss and tag plate. kVA adds an inverter section above 120 kVA.",
   "import": "./electrical/ups-battery-cabinet",
   "export": "UpsBatteryCabinet",
   "anchor": "base",
   "standards": [
    "IEC 62040-1",
    "IEC 62040-3",
    "IEC 62485-2",
    "IEC 60896-21"
   ],
   "vendors": [
    "Vertiv (Chloride)",
    "Eaton",
    "Legrand",
    "EnerSys"
   ],
   "tags": [
    "UPS",
    "battery",
    "VRLA",
    "charger",
    "electrical"
   ],
   "params": [
    {
     "key": "kva",
     "label": "Rating",
     "type": "number",
     "min": 10,
     "max": 400,
     "step": 10,
     "unit": "kVA"
    },
    {
     "key": "batteryCabinets",
     "label": "Battery cabinets",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "doorOpen",
     "label": "Battery doors open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kva": 60,
    "batteryCabinets": 2,
    "doorOpen": false,
    "tag": "UPS-8701"
   },
   "ports": [],
   "bounds": {
    "size": [
     4.102,
     2.197,
     0.852
    ],
    "center": [
     0.021,
     1.098,
     0.026
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/ups-battery-cabinet.svg",
    "standard": "IEC 60617 (single-line diagram)",
    "drawn": "Rectifier (square with a diagonal, ~ above and = below) feeding a DC link with a battery (pairs of long and short parallel lines), then an inverter (= / ~), often with a static bypass switch drawn around them, inside a UPS boundary.",
    "tags": [
     "UPS",
     "BAT",
     "DB"
    ],
    "notes": "Square with a diagonal is the IEC converter: ~ / = is a rectifier or charger, = / ~ an inverter, ~ / ~ a frequency converter (VFD). Battery alone (long and short lines) is a DC battery bank.",
    "datasheet": {
     "form": "UPS datasheet (IEC 62040-3, batteries IEC 60896-21)",
     "fields": {
      "Rated output": "kva",
      "Battery cabinets": "batteryCabinets",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vfd-cabinet",
   "title": "Variable frequency drive",
   "category": "electrical",
   "description": "Air-cooled VFD line-up: control section with keypad, lamps, E-stop and start / stop, input (isolation) section, power sections set by kW, and an output / bypass section. Louvred door intakes, roof extract fans with guards (spinning), top cable boxes with glands for the supply and motor cables, hinges, quarter-turn locks, warning label, earth boss and tag plate. LV and MV (kV > 1) cabinet sizes differ.",
   "import": "./electrical/vfd-cabinet",
   "export": "VfdCabinet",
   "anchor": "base",
   "standards": [
    "IEC 61800-4",
    "IEC 61800-5-1",
    "IEC 61439-1"
   ],
   "vendors": [
    "ABB",
    "Siemens",
    "Schneider Electric",
    "Eaton"
   ],
   "tags": [
    "VFD",
    "VSD",
    "drive",
    "motor control",
    "electrical"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Rating",
     "type": "number",
     "min": 50,
     "max": 10000,
     "step": 50,
     "unit": "kW"
    },
    {
     "key": "kv",
     "label": "Motor voltage",
     "type": "select",
     "options": [
      0.69,
      3.3,
      6.6,
      11
     ]
    },
    {
     "key": "running",
     "label": "Fans running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 2600,
    "kv": 6.6,
    "tag": "VSD-2200",
    "running": true
   },
   "ports": [],
   "bounds": {
    "size": [
     6.102,
     2.95,
     1.255
    ],
    "center": [
     0.021,
     1.475,
     0.027
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vfd-cabinet.svg",
    "standard": "IEC 60617 (single-line diagram)",
    "drawn": "IEC converter square with a diagonal and ~ on both sides (frequency converter), in the feeder to a motor (circle with M). On P&IDs the motor may carry an SC or VSD note, and the speed signal is an SC / SIC loop.",
    "tags": [
     "VFD",
     "VSD",
     "U"
    ],
    "isa": [
     "SC",
     "SIC",
     "SY"
    ],
    "notes": "~ / ~ = frequency converter (VFD); ~ / = = rectifier; = / ~ = inverter. Soft starters are drawn as a box with a different note.",
    "datasheet": {
     "form": "Variable speed drive datasheet (IEC 61800-4 / IEC 61800-5-1)",
     "fields": {
      "Rated motor power": "kw",
      "Rated voltage": "kv",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "neutral-earthing-resistor",
   "title": "Neutral earthing resistor",
   "category": "electrical",
   "description": "Outdoor neutral earthing resistor: stacks of stainless grid elements on post insulators with mica plates and series links, in a ventilated 316 stainless enclosure (louvred sides, roof with overhang) on galvanised legs. Neutral entry by a cable box with ring CT and gland or by a roof bushing; LV earth bushing to the earth bar, two enclosure earth bosses, rating plate with the resistance from kV and amps, HV warning and tag. Energy (kV, A, s) sets the number of stacks; `open` removes a side panel.",
   "import": "./electrical/neutral-earthing-resistor",
   "export": "NeutralEarthingResistor",
   "anchor": "base",
   "standards": [
    "IEEE 32",
    "IEC 60529 (IP23)",
    "ENA / utility NER specs"
   ],
   "vendors": [
    "Vishay",
    "Pestech"
   ],
   "tags": [
    "NER",
    "NGR",
    "earthing",
    "resistor",
    "electrical"
   ],
   "params": [
    {
     "key": "kv",
     "label": "System voltage",
     "type": "select",
     "options": [
      3.3,
      6.6,
      11,
      13.8,
      33
     ]
    },
    {
     "key": "amps",
     "label": "Let-through current",
     "type": "number",
     "min": 50,
     "max": 2000,
     "step": 50,
     "unit": "A"
    },
    {
     "key": "seconds",
     "label": "Rated time",
     "type": "number",
     "min": 5,
     "max": 30,
     "step": 5,
     "unit": "s"
    },
    {
     "key": "entry",
     "label": "Neutral entry",
     "type": "select",
     "options": [
      "cable",
      "bushing"
     ]
    },
    {
     "key": "open",
     "label": "Side panel off",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kv": 11,
    "amps": 400,
    "seconds": 10,
    "open": false,
    "entry": "cable",
    "tag": "NER-8201"
   },
   "ports": [],
   "bounds": {
    "size": [
     2.253,
     1.525,
     1.02
    ],
    "center": [
     0.151,
     0.757,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/neutral-earthing-resistor.svg",
    "standard": "IEC 60617 (single-line diagram)",
    "drawn": "Rectangle (IEC resistor) in the line from the transformer or generator star point down to the earth symbol (three shortening horizontal lines), often with a CT on the neutral.",
    "tags": [
     "NER"
    ],
    "notes": "IEC draws resistors as rectangles; ANSI drawings use a zig-zag. A rectangle in a neutral-to-earth connection is an NER; an earthing transformer is a zig-zag winding symbol instead.",
    "datasheet": {
     "form": "Neutral earthing resistor datasheet (IEEE 32)",
     "fields": {
      "System voltage": "kv",
      "Rated current": "amps",
      "Rated time": "seconds",
      "Neutral entry": "entry",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "navigation-aid",
   "title": "Navigation aid (lantern / fog signal)",
   "category": "electrical",
   "description": "Offshore platform marking unit to IALA R0139 on a galvanised pedestal: marine lantern with a Fresnel prism drum (size from the nominal range, white / yellow / red, emissive when lit), bird spikes and lightning finial, and an electronic fog signal of stacked horn emitters with its driver box. Control / monitoring box with tag plate and cable to deck, earth boss.",
   "import": "./electrical/navigation-aid",
   "export": "NavigationAid",
   "anchor": "base",
   "standards": [
    "IALA R0139 (O-139)",
    "IALA E-200",
    "IEC 60529"
   ],
   "vendors": [
    "Orga",
    "Sealite"
   ],
   "tags": [
    "aid to navigation",
    "lantern",
    "foghorn",
    "marking",
    "offshore",
    "electrical"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Unit",
     "type": "select",
     "options": [
      "combined",
      "lantern",
      "foghorn"
     ]
    },
    {
     "key": "color",
     "label": "Light colour",
     "type": "select",
     "options": [
      "white",
      "yellow",
      "red"
     ]
    },
    {
     "key": "range",
     "label": "Nominal range",
     "type": "number",
     "min": 2,
     "max": 15,
     "step": 1,
     "unit": "nm"
    },
    {
     "key": "height",
     "label": "Pedestal height",
     "type": "number",
     "min": 0.6,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "combined",
    "color": "white",
    "range": 10,
    "height": 1.2,
    "lit": true,
    "tag": "NAV-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.9,
     2.172,
     0.679
    ],
    "center": [
     0.15,
     1.086,
     0.119
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/navigation-aid.svg",
    "standard": "Layout plan convention (plot plan / equipment layout); IALA R0139 marking",
    "drawn": "On layouts: a lantern (circle) with light rays at the platform corners, labelled with its character (e.g. Mo(U) 15s, 10 nm) and a fog signal marked FOG or a horn outline.",
    "notes": "Not on P&IDs. Obstruction lights on stacks and cranes are smaller red lamps; status beacons on F&G layouts are alarm-beacon.",
    "datasheet": {
     "form": "Aids to navigation specification (IALA R0139)",
     "fields": {
      "Type": "kind",
      "Light colour": "color",
      "Nominal range": "range",
      "Mounting height": "height",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "ocean",
   "title": "Ocean",
   "category": "environment",
   "description": "Animated open sea for offshore scenes: six Gerstner swell components scaled by the significant wave height, wind chop and whitecaps in the per-pixel normals, a physical water material (IOR 1.333) with Fresnel, sun glints and environment reflections, and foam rings around legs, risers and piles (`foam`: [x, z, radius]). Slightly transparent looking down, so an underwater jacket reads through. Origin at mean sea level (y = 0); the polar LOD grid follows the camera and respects scene fog.",
   "import": "./environment/ocean",
   "export": "Ocean",
   "anchor": "base",
   "standards": [
    "Gerstner (trochoidal) waves"
   ],
   "vendors": [],
   "tags": [
    "sea",
    "water",
    "waves",
    "ocean",
    "offshore",
    "environment"
   ],
   "params": [
    {
     "key": "waveHeight",
     "label": "Wave height Hs",
     "type": "number",
     "min": 0,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "wind",
     "label": "Wind",
     "type": "number",
     "min": 0,
     "max": 30,
     "step": 0.5,
     "unit": "m/s"
    },
    {
     "key": "opacity",
     "label": "Opacity (looking down)",
     "type": "number",
     "min": 0.4,
     "max": 1,
     "step": 0.02
    },
    {
     "key": "speed",
     "label": "Speed",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 0.1
    },
    {
     "key": "color",
     "label": "Water colour",
     "type": "color"
    },
    {
     "key": "night",
     "label": "Night",
     "type": "bool"
    },
    {
     "key": "radius",
     "label": "Radius",
     "type": "number",
     "min": 200,
     "max": 8000,
     "step": 100,
     "unit": "m"
    },
    {
     "key": "follow",
     "label": "Follow camera",
     "type": "bool"
    }
   ],
   "defaults": {
    "waveHeight": 1.5,
    "wind": 7,
    "radius": 4000,
    "follow": true,
    "night": false,
    "color": "#0c4a62",
    "opacity": 0.8,
    "speed": 1,
    "foam": []
   },
   "ports": [],
   "bounds": null,
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/ocean.svg",
    "standard": "Layout plan convention (structural elevations, plot plans); metocean design basis",
    "drawn": "Elevation: the mean sea level (MSL) or LAT line marked with an inverted triangle and its elevation (EL +0.000), with wave lines below it; jacket and riser drawings dimension the air gap and water depth from it.",
    "notes": "Not on P&IDs. Metocean data (significant wave height, wind speed) comes from the project design basis.",
    "datasheet": {
     "form": "Metocean design basis",
     "fields": {
      "Significant wave height (Hs)": "waveHeight",
      "Wind speed (10 m)": "wind"
     }
    }
   }
  },
  {
   "name": "sky",
   "title": "Sky and lights",
   "category": "environment",
   "description": "Drop-in sky and lighting rig. Day: a physical (Preetham) sky, a warm sun with soft shadows, a hemisphere fill, an offline environment map baked from the sky and Lightformers (no network), exponential haze and a horizon band that hides the sea and sky seam. Night: a star dome with a moon in the sun direction, cool moonlight, a warm fill standing in for deck floodlights (`deckLights`) and a dark environment map. Set `lights: false` to keep your own lights; `preview` adds a reference pile with chrome and matte spheres standing in the sea.",
   "import": "./environment/sky",
   "export": "Sky",
   "anchor": "base",
   "standards": [
    "Preetham sky model (three.js Sky)"
   ],
   "vendors": [],
   "tags": [
    "sky",
    "sun",
    "moon",
    "stars",
    "night",
    "lighting",
    "environment",
    "fog"
   ],
   "params": [
    {
     "key": "mode",
     "label": "Mode",
     "type": "select",
     "options": [
      "day",
      "night"
     ]
    },
    {
     "key": "elevation",
     "label": "Sun / moon elevation",
     "type": "number",
     "min": 2,
     "max": 85,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "azimuth",
     "label": "Sun / moon bearing",
     "type": "number",
     "min": 0,
     "max": 360,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "haze",
     "label": "Haze",
     "type": "number",
     "min": 0,
     "max": 4,
     "step": 0.1
    },
    {
     "key": "deckLights",
     "label": "Night deck lights",
     "type": "number",
     "min": 0,
     "max": 2,
     "step": 0.1
    },
    {
     "key": "stars",
     "label": "Stars",
     "type": "bool"
    },
    {
     "key": "lights",
     "label": "Lights",
     "type": "bool"
    },
    {
     "key": "preview",
     "label": "Reference scene",
     "type": "bool"
    }
   ],
   "defaults": {
    "mode": "day",
    "elevation": 33,
    "azimuth": 112,
    "lights": true,
    "shadowRadius": 40,
    "shadowCenter": [
     0,
     0,
     0
    ],
    "haze": 1,
    "stars": true,
    "deckLights": 1,
    "preview": false
   },
   "ports": [],
   "bounds": {
    "size": [
     3,
     5.6,
     1.6
    ],
    "center": [
     0,
     0.8,
     0
    ]
   },
   "registryDependencies": [
    "core",
    "ocean"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/sky.svg",
    "standard": "Not drawn",
    "drawn": "Not drawn on P&IDs or layouts. Plot plans only carry a north arrow; sun path or lighting studies are separate reports.",
    "notes": "Scene lighting for the 3D model, not plant equipment."
   }
  },
  {
   "name": "pressure-transmitter",
   "title": "Pressure transmitter",
   "category": "instruments",
   "description": "Gauge pressure transmitter with coplanar sensor module and a dual-compartment Ex d head (LCD cover, cable gland, stopping plug) on a 2-valve block-and-bleed manifold. Pipe-stand mounted on an offset U-bolted bracket with gusseted base plate and an optional stainless sunshade. 1/2\" impulse tubing with compression fittings falls at 1:10 towards a 1/2\" flanged process connection (gas service, transmitter above the tap).",
   "import": "./instruments/pressure-transmitter",
   "export": "PressureTransmitter",
   "anchor": "base",
   "standards": [
    "IEC 60079-1",
    "IEC 61298",
    "ASME B16.5",
    "ASTM A269 tubing"
   ],
   "vendors": [
    "Emerson (Rosemount)",
    "Yokogawa"
   ],
   "tags": [
    "PT",
    "pressure",
    "transmitter",
    "field instrument"
   ],
   "params": [
    {
     "key": "height",
     "label": "Display height",
     "type": "number",
     "min": 0.9,
     "max": 1.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "rating",
     "label": "Process flange class",
     "type": "rating"
    },
    {
     "key": "sunshade",
     "label": "Sunshade",
     "type": "bool"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 1.35,
    "rating": 600,
    "housing": "actuatorBlue",
    "tag": "PT-1001",
    "sunshade": true
   },
   "ports": [
    {
     "id": "process",
     "label": "Process connection",
     "position": [
      -0.24,
      0.673,
      0.1212
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "instrument"
    }
   ],
   "bounds": {
    "size": [
     0.46,
     1.451,
     0.403
    ],
    "center": [
     -0.01,
     0.726,
     0.071
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pressure-transmitter.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Plain circle (field-mounted bubble) with PT, PIT or PT plus loop number, joined by a short solid process connection line to the pipe or vessel.",
    "isa": [
     "PT",
     "PIT",
     "PE"
    ],
    "notes": "A bubble with a horizontal bar across it is a DCS / control-room function (PIC, PI on the console), not a field device. PG / PI with no bar is a local gauge (pressure-gauge). PDT has two process connections (dp-transmitter). PST / PSH / PSL are switches (pressure-switch).",
    "datasheet": {
     "form": "Pressure transmitter specification form (ISA-TR20.00.01)",
     "fields": {
      "Process connection rating": "rating",
      "Housing material / finish": "housing",
      "Sunshade": "sunshade",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "dp-transmitter",
   "title": "Differential pressure transmitter",
   "category": "instruments",
   "description": "DP transmitter with coplanar flange (H / L marked) and Ex d head on a 5-valve manifold: two block, two equalise, two vent valves. Pipe-stand mounted with an optional stainless sunshade; separate HP and LP 1/2\" impulse lines with compression fittings and tube clamps fall at 1:10 to two 1/2\" flanged process connections (gas service, transmitter above the taps).",
   "import": "./instruments/dp-transmitter",
   "export": "DpTransmitter",
   "anchor": "base",
   "standards": [
    "IEC 60079-1",
    "IEC 61518",
    "ASME B16.5",
    "ISO 5167 impulse lines"
   ],
   "vendors": [
    "Emerson (Rosemount)",
    "Yokogawa"
   ],
   "tags": [
    "PDT",
    "FT",
    "differential pressure",
    "flow",
    "level",
    "transmitter"
   ],
   "params": [
    {
     "key": "height",
     "label": "Display height",
     "type": "number",
     "min": 0.9,
     "max": 1.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "rating",
     "label": "Process flange class",
     "type": "rating"
    },
    {
     "key": "sunshade",
     "label": "Sunshade",
     "type": "bool"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 1.35,
    "rating": 600,
    "housing": "actuatorBlue",
    "tag": "PDT-1001",
    "sunshade": true
   },
   "ports": [
    {
     "id": "hp",
     "label": "High-pressure side",
     "position": [
      -0.24,
      0.688,
      0.1212
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "instrument"
    },
    {
     "id": "lp",
     "label": "Low-pressure side",
     "position": [
      -0.24,
      0.538,
      0.1212
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "instrument"
    }
   ],
   "bounds": {
    "size": [
     0.459,
     1.451,
     0.403
    ],
    "center": [
     -0.011,
     0.726,
     0.071
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/dp-transmitter.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Field bubble with PDT (or PDIT, FT, LT) joined by two process connection lines, the high side and the low side, to two points on the pipe or vessel, e.g. either side of a filter, strainer or exchanger.",
    "isa": [
     "PDT",
     "PDIT",
     "FT",
     "LT"
    ],
    "notes": "Two impulse lines from one bubble = differential pressure. If the two taps straddle an orifice plate the loop is a flow measurement (orifice-flowmeter); if they are on the top and bottom of a vessel it is a DP level transmitter. ISA codes here: FT = with orifice; LT = DP level.",
    "datasheet": {
     "form": "Differential pressure transmitter specification form (ISA-TR20.00.01)",
     "fields": {
      "Process connection rating": "rating",
      "Housing material / finish": "housing",
      "Sunshade": "sunshade",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "orifice-flowmeter",
   "title": "Orifice flowmeter",
   "category": "instruments",
   "description": "Orifice meter run: ASME B16.36 weld-neck orifice flange pair (class 300 minimum, 1.5 in minimum thickness) with paddle plate with a bored orifice (beta prop) and a stamped tab, spiral-wound gaskets, studs and jack screws. Flange taps 1 in from each face (the opposite pair plugged) feed root valves and close-coupled tubing to a 5-valve manifold and DP transmitter. Upstream and downstream straight lengths are set in pipe diameters.",
   "import": "./instruments/orifice-flowmeter",
   "export": "OrificeFlowmeter",
   "anchor": "inline",
   "standards": [
    "ISO 5167-2",
    "ASME B16.36",
    "ASME B16.5",
    "AGA 3 / API MPMS 14.3"
   ],
   "vendors": [],
   "tags": [
    "FT",
    "flow",
    "orifice",
    "DP flow",
    "meter run"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "beta",
     "label": "Beta ratio",
     "type": "number",
     "min": 0.2,
     "max": 0.75,
     "step": 0.01
    },
    {
     "key": "upstream",
     "label": "Upstream run",
     "type": "number",
     "min": 2,
     "max": 20,
     "step": 1,
     "unit": "D"
    },
    {
     "key": "downstream",
     "label": "Downstream run",
     "type": "number",
     "min": 2,
     "max": 10,
     "step": 1,
     "unit": "D"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 600,
    "beta": 0.6,
    "upstream": 5,
    "downstream": 3,
    "housing": "actuatorBlue",
    "tag": "FT-1001"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet (upstream)",
     "position": [
      -0.8415,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet (downstream)",
     "position": [
      0.5049,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.346,
     0.896,
     0.421
    ],
    "center": [
     -0.168,
     0.248,
     0.032
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/orifice-flowmeter.svg",
    "standard": "ISA 5.1 (orifice plate in flanges, FE + FT)",
    "drawn": "Two short parallel bars across the line (the orifice flanges with the plate between them), tagged FE, with two taps to an FT or FIT bubble. Some legends draw a single bar, or a box around the line with a diagonal.",
    "tags": [
     "FE"
    ],
    "isa": [
     "FE",
     "FT",
     "FIT",
     "FO"
    ],
    "notes": "With no transmitter and tag RO or FO it is a restriction orifice, not a meter. Venturi and flow nozzle are drawn as a converging / diverging outline instead. A flanged meter run with 10D / 5D straight lengths and a flow conditioner is still this element. ISA codes here: FO = restriction orifice.",
    "datasheet": {
     "form": "Orifice plate / flow element specification form (ISA-TR20.00.01; ISO 5167-2 calculation)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Beta ratio (d/D)": "beta",
      "Upstream straight length": "upstream",
      "Downstream straight length": "downstream",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "coriolis-flowmeter",
   "title": "Coriolis flowmeter",
   "category": "instruments",
   "description": "Dual bent-tube Coriolis mass flowmeter: flanged process connections, flow-splitting manifolds, a welded stainless U-shaped case enclosing the tubes, purge / rupture-disc connections, a flow-direction arrow and an integral transmitter with core processor and Ex d head. Tubes hang below the line for liquid or stand above it for gas.",
   "import": "./instruments/coriolis-flowmeter",
   "export": "CoriolisFlowmeter",
   "anchor": "inline",
   "standards": [
    "ISO 10790",
    "API MPMS 5.6",
    "ASME B16.5",
    "IEC 60079-1"
   ],
   "vendors": [
    "Emerson (Micro Motion)"
   ],
   "tags": [
    "FT",
    "flow",
    "mass flow",
    "coriolis",
    "custody transfer"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tubes",
     "label": "Tubes",
     "type": "select",
     "options": [
      "down",
      "up"
     ]
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 3,
    "rating": 300,
    "tubes": "down",
    "housing": "actuatorBlue",
    "tag": "FT-1501"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.375,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.375,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.75,
     0.788,
     0.21
    ],
    "center": [
     0,
     -0.151,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/coriolis-flowmeter.svg",
    "standard": "ISA 5.1 (flow element + transmitter); no agreed ISA element shape for Coriolis",
    "drawn": "Inline box on the line, often with a U or double-U loop drawn inside, joined to an FT / FIT bubble (integral transmitter). Frequently just a generic FE box with \"CORIOLIS\" or \"MASS\" written beside it.",
    "tags": [
     "FE"
    ],
    "isa": [
     "FE",
     "FT",
     "FIT",
     "FQT"
    ],
    "notes": "ISA 5.1 has no dedicated Coriolis element, so legends differ; read the text beside the box, the instrument index or the datasheet for the technology. Common on chemical injection, condensate, fiscal liquid and test separator outlets. ISA codes here: FQT = totaliser.",
    "datasheet": {
     "form": "Coriolis mass flowmeter specification form (ISA-TR20.00.01)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Installation orientation (tubes)": "tubes",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "ultrasonic-flowmeter",
   "title": "Ultrasonic flowmeter",
   "category": "instruments",
   "description": "Multipath transit-time ultrasonic flowmeter: a forged 3D spoolpiece with weld-neck flanges and 2, 4 or 6 chordal paths at Gauss-Jacobi heights. Each path has a pair of transducer bosses crossing at 45 degrees, enclosed by a stainless transducer shroud (or exposed with individual conduits), a Pm pressure tap with needle valve, an electronics base enclosure and Ex d head on a pedestal, and lifting lugs.",
   "import": "./instruments/ultrasonic-flowmeter",
   "export": "UltrasonicFlowmeter",
   "anchor": "inline",
   "standards": [
    "ISO 17089-1",
    "AGA Report 9",
    "API MPMS 5.8",
    "ASME B16.5"
   ],
   "vendors": [
    "Emerson (Rosemount / Daniel)"
   ],
   "tags": [
    "FT",
    "flow",
    "ultrasonic",
    "USM",
    "fiscal metering",
    "custody transfer"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "paths",
     "label": "Paths",
     "type": "select",
     "options": [
      2,
      4,
      6
     ]
    },
    {
     "key": "shroud",
     "label": "Transducer shroud",
     "type": "bool"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 8,
    "rating": 600,
    "paths": 4,
    "shroud": true,
    "housing": "equipmentPaintDark",
    "tag": "FT-2501"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.4683,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.4684,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.937,
     0.731,
     0.435
    ],
    "center": [
     0,
     0.148,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/ultrasonic-flowmeter.svg",
    "standard": "ISA 5.1 (flow element + transmitter); ultrasonic element varies by legend",
    "drawn": "Inline spool box with transducer marks on opposite sides and a diagonal acoustic path between them, joined to an FT bubble. Many legends just write \"USM\" or \"UFM\" beside a generic FE box.",
    "tags": [
     "FE"
    ],
    "isa": [
     "FE",
     "FT",
     "FIT",
     "FQ"
    ],
    "notes": "Fiscal gas metering runs (AGA 9) are usually multipath ultrasonic; a clamp-on meter is drawn on the outside of the pipe with no break in the line. Check the technology in the instrument index.",
    "datasheet": {
     "form": "Ultrasonic flowmeter specification form (ISA-TR20.00.01; AGA 9 / ISO 17089-1)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Number of acoustic paths": "paths",
      "Transducer shroud": "shroud",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "guided-wave-radar",
   "title": "Guided wave radar level transmitter",
   "category": "instruments",
   "description": "Guided wave radar (TDR) level transmitter: single rigid probe, process seal, neck and Ex d head with LCD on a flanged top connection (port process, facing down, origin on the flange face). With chamber: true it sits on an external cage with two flanged side connections (ports upper and lower), a blind bottom with drain valve and a side vent; length is then the centre-to-centre of the connections.",
   "import": "./instruments/guided-wave-radar",
   "export": "GuidedWaveRadar",
   "anchor": "fitting",
   "standards": [
    "IEC 62828",
    "IEC 60079-1",
    "ASME B16.5",
    "API RP 551"
   ],
   "vendors": [
    "Emerson (Rosemount)"
   ],
   "tags": [
    "LT",
    "level",
    "radar",
    "GWR",
    "bridle",
    "cage"
   ],
   "params": [
    {
     "key": "chamber",
     "label": "External cage",
     "type": "bool"
    },
    {
     "key": "length",
     "label": "Probe / centres",
     "type": "number",
     "min": 0.3,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "nps",
     "label": "Process connection",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "chamberNps",
     "label": "Cage size",
     "type": "nps",
     "min": 2,
     "max": 4
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "chamber": false,
    "length": 1.5,
    "nps": 2,
    "chamberNps": 3,
    "rating": 300,
    "housing": "actuatorBlue",
    "tag": "LT-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Process connection",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.205,
     1.266,
     0.17
    ],
    "center": [
     0.017,
     -0.367,
     0.002
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/guided-wave-radar.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "LT / LIT field bubble on top of an external chamber (cage) bolted to the vessel by an upper and a lower connection, with a probe line hanging down inside the chamber; or the bubble sits directly on a vessel top nozzle.",
    "isa": [
     "LT",
     "LIT",
     "LE"
    ],
    "notes": "A bridle (vertical standpipe) carrying several instruments is common: the LT, an LG (magnetic-level-gauge) and LSHH / LSLL switches all hang off it. Non-contact radar uses the same LT bubble without a probe. Interface level is LT with the service written beside it.",
    "datasheet": {
     "form": "Level transmitter specification form (ISA-TR20.00.01)",
     "fields": {
      "External chamber": "chamber",
      "Probe length": "length",
      "Process connection size": "nps",
      "Chamber size": "chamberNps",
      "Flange rating": "rating",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "magnetic-level-gauge",
   "title": "Magnetic level gauge",
   "category": "instruments",
   "description": "Magnetic (float) level gauge: stainless chamber with flanged side connections (ports upper and lower), blind-flanged top and bottom with vent and drain valves, and a bicolour flag indicator with graduated scale behind a window. Optional clamp-on magnetostrictive transmitter and up to three clamp-on level switches. The level prop sets the flags.",
   "import": "./instruments/magnetic-level-gauge",
   "export": "MagneticLevelGauge",
   "anchor": "fitting",
   "standards": [
    "IEC 62828",
    "ASME B16.5",
    "API RP 551"
   ],
   "vendors": [
    "Magnetrol / Orion Instruments",
    "Emerson (Rosemount)"
   ],
   "tags": [
    "LG",
    "LI",
    "level",
    "level gauge",
    "bridle"
   ],
   "params": [
    {
     "key": "length",
     "label": "Centre to centre",
     "type": "number",
     "min": 0.4,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "nps",
     "label": "Side connections",
     "type": "nps",
     "min": 0.75,
     "max": 2
    },
    {
     "key": "chamberNps",
     "label": "Chamber size",
     "type": "nps",
     "min": 2,
     "max": 4
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "level",
     "label": "Level",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.01
    },
    {
     "key": "transmitter",
     "label": "Transmitter",
     "type": "bool"
    },
    {
     "key": "switches",
     "label": "Level switches",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 1
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 1.2,
    "nps": 2,
    "chamberNps": 3,
    "rating": 300,
    "level": 0.55,
    "transmitter": false,
    "switches": 0,
    "housing": "actuatorBlue",
    "tag": "LG-1101"
   },
   "ports": [
    {
     "id": "upper",
     "label": "Upper connection",
     "position": [
      -0.25,
      0.6,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "lower",
     "label": "Lower connection",
     "position": [
      -0.25,
      -0.6,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.491,
     2.055,
     0.21
    ],
    "center": [
     -0.005,
     -0.04,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/magnetic-level-gauge.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Tall narrow chamber beside the vessel with an upper and a lower side connection (isolation valves on each, vent on top, drain below), labelled with an LG or LI bubble.",
    "tags": [
     "LG"
    ],
    "isa": [
     "LG",
     "LI"
    ],
    "notes": "Same chamber with a transmitter strapped on is LG plus LT on one bridle (set transmitter). A plain glass (reflex / transparent) gauge is drawn the same and is also tagged LG; check the datasheet.",
    "datasheet": {
     "form": "Level gauge specification form (ISA-TR20.00.01)",
     "fields": {
      "Centre-to-centre": "length",
      "Process connection size": "nps",
      "Chamber size": "chamberNps",
      "Flange rating": "rating",
      "Clamp-on transmitter": "transmitter",
      "Level switches": "switches",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "temperature-transmitter",
   "title": "Temperature transmitter",
   "category": "instruments",
   "description": "Head-mounted temperature transmitter on a one-piece flanged thermowell: tapered stem below the raised face, lagging extension, union and nipple, and a dual-compartment Ex d housing with LCD. Origin and port on the flange face (pointing down); insertion and extension lengths are props.",
   "import": "./instruments/temperature-transmitter",
   "export": "TemperatureTransmitter",
   "anchor": "fitting",
   "standards": [
    "ASME PTC 19.3 TW",
    "IEC 60751",
    "IEC 60079-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Emerson (Rosemount)"
   ],
   "tags": [
    "TT",
    "temperature",
    "RTD",
    "thermowell",
    "transmitter"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Flange",
     "type": "nps",
     "min": 1,
     "max": 2
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "insertion",
     "label": "Insertion",
     "type": "number",
     "min": 0.1,
     "max": 0.6,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "extension",
     "label": "Lagging extension",
     "type": "number",
     "min": 0.05,
     "max": 0.3,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 1.5,
    "rating": 600,
    "insertion": 0.25,
    "extension": 0.1,
    "housing": "actuatorBlue",
    "tag": "TT-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Thermowell flange",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 1.5,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.184,
     0.597,
     0.155
    ],
    "center": [
     0.014,
     0.039,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/temperature-transmitter.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "TT or TIT field bubble joined to a thermowell (a short U-shaped pocket pushed into the pipe, sometimes tagged TW), on the pipe or vessel.",
    "isa": [
     "TT",
     "TIT",
     "TE",
     "TW"
    ],
    "notes": "TE (element) plus TT (transmitter) of the same loop are one physical item. TI / TG with no transmitter is a dial thermometer (temperature-gauge). A TW bubble on its own is a spare or test thermowell.",
    "datasheet": {
     "form": "Temperature transmitter + thermowell specification forms (ISA-TR20.00.01; ASME PTC 19.3 TW)",
     "fields": {
      "Thermowell flange size": "nps",
      "Flange rating": "rating",
      "Insertion length (U)": "insertion",
      "Lagging extension (T)": "extension",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pressure-gauge",
   "title": "Pressure gauge",
   "category": "instruments",
   "description": "Bottom-connected Bourdon tube pressure gauge on a 1/2\" weld-neck flange, through a bar-stock block-and-bleed gauge valve and an optional pigtail siphon. Solid-front stainless case with bayonet ring, glass and blow-out back. Dial size and range are props.",
   "import": "./instruments/pressure-gauge",
   "export": "PressureGauge",
   "anchor": "fitting",
   "standards": [
    "EN 837-1",
    "ASME B40.100",
    "ASME B16.5"
   ],
   "vendors": [
    "WIKA"
   ],
   "tags": [
    "PI",
    "PG",
    "pressure",
    "gauge",
    "local indicator"
   ],
   "params": [
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "dial",
     "label": "Dial",
     "type": "select",
     "options": [
      {
       "value": 0.063,
       "label": "63 mm"
      },
      {
       "value": 0.1,
       "label": "100 mm"
      },
      {
       "value": 0.15,
       "label": "150 mm"
      }
     ]
    },
    {
     "key": "max",
     "label": "Range",
     "type": "select",
     "options": [
      10,
      16,
      25,
      40,
      60,
      100,
      160,
      250,
      400
     ]
    },
    {
     "key": "siphon",
     "label": "Siphon",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "rating": 600,
    "dial": 0.1,
    "max": 100,
    "siphon": false,
    "tag": "PI-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Process connection",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "instrument"
    }
   ],
   "bounds": {
    "size": [
     0.108,
     0.287,
     0.11
    ],
    "center": [
     0,
     0.143,
     0.007
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pressure-gauge.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Field bubble marked PI (or PG on some legends) joined to the pipe by a short process line; no signal line leaves it, because it is a local dial.",
    "tags": [
     "PG"
    ],
    "isa": [
     "PI",
     "PG"
    ],
    "notes": "Same bubble as a transmitter but with PI / PG and no signal line. A bubble with a bar through it reading PI is a console indication, not a gauge. PDI / PDG across a filter is a differential gauge.",
    "datasheet": {
     "form": "Pressure gauge specification form (ISA-TR20.00.01; EN 837-1 / ASME B40.100)",
     "fields": {
      "Flange rating": "rating",
      "Dial size": "dial",
      "Range (max)": "max",
      "Siphon": "siphon",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "temperature-gauge",
   "title": "Temperature gauge",
   "category": "instruments",
   "description": "Bimetal dial thermometer with an every-angle (hinged, back-connected) stainless case on a one-piece flanged thermowell with lagging extension and union. Origin and port on the thermowell flange face (pointing down).",
   "import": "./instruments/temperature-gauge",
   "export": "TemperatureGauge",
   "anchor": "fitting",
   "standards": [
    "EN 13190",
    "ASME B40.200",
    "ASME PTC 19.3 TW",
    "ASME B16.5"
   ],
   "vendors": [
    "WIKA"
   ],
   "tags": [
    "TI",
    "TG",
    "temperature",
    "thermometer",
    "local indicator"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Flange",
     "type": "nps",
     "min": 1,
     "max": 2
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "insertion",
     "label": "Insertion",
     "type": "number",
     "min": 0.1,
     "max": 0.6,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "extension",
     "label": "Lagging extension",
     "type": "number",
     "min": 0.05,
     "max": 0.3,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "dial",
     "label": "Dial",
     "type": "select",
     "options": [
      {
       "value": 0.1,
       "label": "100 mm"
      },
      {
       "value": 0.125,
       "label": "125 mm"
      },
      {
       "value": 0.15,
       "label": "150 mm"
      }
     ]
    },
    {
     "key": "max",
     "label": "Range",
     "type": "select",
     "options": [
      100,
      150,
      200,
      300,
      400
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 1.5,
    "rating": 600,
    "insertion": 0.25,
    "extension": 0.08,
    "dial": 0.125,
    "max": 200,
    "tag": "TI-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Thermowell flange",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 1.5,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.155,
     0.627,
     0.155
    ],
    "center": [
     0,
     0.054,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/temperature-gauge.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Field bubble marked TI (or TG) on a thermowell pocket in the pipe; no signal line.",
    "tags": [
     "TG"
    ],
    "isa": [
     "TI",
     "TG",
     "TW"
    ],
    "notes": "Same as the temperature transmitter but with TI / TG. A test thermowell with no instrument is a TW bubble alone.",
    "datasheet": {
     "form": "Bimetal thermometer + thermowell specification forms (ISA-TR20.00.01; ASME B40.200)",
     "fields": {
      "Thermowell flange size": "nps",
      "Flange rating": "rating",
      "Insertion length (U)": "insertion",
      "Lagging extension (T)": "extension",
      "Dial size": "dial",
      "Range (max)": "max",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "magnetic-flowmeter",
   "title": "Electromagnetic flowmeter",
   "category": "instruments",
   "description": "Electromagnetic (mag) flowmeter: flanged sensor tube with PTFE or rubber liner flared over the raised faces, stainless grounding rings with tabs and braided earth straps, coil housing and an integral Ex d transmitter on a junction neck. Face-to-face from the ISO 13359 short series; ports sit on the grounding ring faces.",
   "import": "./instruments/magnetic-flowmeter",
   "export": "MagneticFlowmeter",
   "anchor": "inline",
   "standards": [
    "ISO 13359",
    "ISO 6817",
    "ASME B16.5",
    "IEC 60079-1"
   ],
   "vendors": [
    "Endress+Hauser"
   ],
   "tags": [
    "FT",
    "flow",
    "magmeter",
    "water injection",
    "produced water"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "liner",
     "label": "Liner",
     "type": "select",
     "options": [
      "ptfe",
      "rubber"
     ]
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 300,
    "liner": "ptfe",
    "housing": "actuatorBlue",
    "tag": "FT-4101"
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.128,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.128,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.258,
     0.424,
     0.292
    ],
    "center": [
     0,
     0.085,
     0.019
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/magnetic-flowmeter.svg",
    "standard": "ISA 5.1 (flow element + transmitter); magnetic element drawn as a box or circle with M",
    "drawn": "Inline box (or circle) on the line marked M, joined to an FT bubble. Some legends use a generic FE with \"MAG\" written beside it.",
    "tags": [
     "FE"
    ],
    "isa": [
     "FE",
     "FT",
     "FIT"
    ],
    "notes": "Only for conductive liquids (water, produced water, seawater, chemicals); a meter on a gas line is never a mag meter. A circle with M on a valve stem is a motor actuator, not a flowmeter.",
    "datasheet": {
     "form": "Magnetic flowmeter specification form (ISA-TR20.00.01)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Liner material": "liner",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vortex-flowmeter",
   "title": "Vortex flowmeter",
   "category": "instruments",
   "description": "Flanged vortex shedding flowmeter: cast body with an open bore and a bluff shedder bar plus sensing wing across it, a sensor boss and stiffened neck (longer for hot service) carrying an integral Ex d transmitter, and a flow-direction arrow.",
   "import": "./instruments/vortex-flowmeter",
   "export": "VortexFlowmeter",
   "anchor": "inline",
   "standards": [
    "ISO 12764",
    "ASME B16.5",
    "IEC 60079-1"
   ],
   "vendors": [
    "Emerson (Rosemount)"
   ],
   "tags": [
    "FT",
    "flow",
    "vortex",
    "steam",
    "utilities"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "neck",
     "label": "Neck length",
     "type": "number",
     "min": 0.1,
     "max": 0.4,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 3,
    "rating": 300,
    "neck": 0.16,
    "housing": "actuatorBlue",
    "tag": "FT-3101"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.1092,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.1092,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.218,
     0.434,
     0.21
    ],
    "center": [
     0,
     0.112,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vortex-flowmeter.svg",
    "standard": "ISA 5.1 (flow element + transmitter); vortex element varies by legend",
    "drawn": "Inline box with a small bluff-body triangle (the shedder bar) and wavy vortex lines downstream, joined to an FT bubble. Often a generic FE with \"VORTEX\" written beside it.",
    "tags": [
     "FE"
    ],
    "isa": [
     "FE",
     "FT",
     "FIT"
    ],
    "notes": "Used on steam, fuel gas, utility gas and clean liquids. Read the instrument index to confirm the technology when the legend only gives a generic flow element.",
    "datasheet": {
     "form": "Vortex flowmeter specification form (ISA-TR20.00.01)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Extended (high-temperature) neck": "neck",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "level-switch",
   "title": "Vibrating fork level switch",
   "category": "instruments",
   "description": "Vibrating fork point level switch for side mounting: flanged process connection (port process, facing -X, origin on the face), extension tube and two flat tines set side by side so the gap drains vertically, a finned thermal neck and a compact housing with status LEDs behind a window and two cable entries underneath. Fork length from the flange face is a prop.",
   "import": "./instruments/level-switch",
   "export": "LevelSwitch",
   "anchor": "fitting",
   "standards": [
    "IEC 62828",
    "IEC 61508 (SIL)",
    "ASME B16.5"
   ],
   "vendors": [
    "Emerson (Rosemount)"
   ],
   "tags": [
    "LSHH",
    "LSLL",
    "level switch",
    "overfill",
    "fork"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Flange",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "length",
     "label": "Fork length",
     "type": "number",
     "min": 0.06,
     "max": 1.5,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 2,
    "rating": 300,
    "length": 0.102,
    "housing": "aluminium",
    "tag": "LSHH-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Process flange",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.289,
     0.165,
     0.165
    ],
    "center": [
     0.042,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/level-switch.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Field bubble with LS plus H / HH / L / LL (LSH, LSHH, LSLL) on a side connection of a vessel or bridle at the trip height. In a SIS it is often drawn with a diamond or hexagon tag for the logic it feeds.",
    "isa": [
     "LSH",
     "LSHH",
     "LSL",
     "LSLL",
     "LS"
    ],
    "notes": "S = switch, so the bubble has no transmitter letter T. Trip levels are written beside it in mm or %. Vibrating fork, float and displacer switches all use the same bubble.",
    "datasheet": {
     "form": "Level switch specification form (ISA-TR20.00.01)",
     "fields": {
      "Process connection size": "nps",
      "Flange rating": "rating",
      "Insertion length": "length",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pressure-switch",
   "title": "Pressure switch",
   "category": "instruments",
   "description": "Explosion-proof pressure switch on a 1/2\" weld-neck flange (port process, facing down) through a bar-stock block valve with bleed plug: a bolted diaphragm-sealed sensing element under a cast Ex d enclosure with a threaded round cover, set-point access cap and a gland on the conduit entry.",
   "import": "./instruments/pressure-switch",
   "export": "PressureSwitch",
   "anchor": "fitting",
   "standards": [
    "IEC 60079-1",
    "IEC 60947-5-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Ashcroft"
   ],
   "tags": [
    "PSHH",
    "PSLL",
    "pressure switch",
    "trip"
   ],
   "params": [
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "housing",
     "label": "Housing",
     "type": "select",
     "options": [
      "actuatorBlue",
      "stainless",
      "aluminium",
      "equipmentPaintDark"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "rating": 600,
    "housing": "equipmentPaintDark",
    "tag": "PSHH-1101"
   },
   "ports": [
    {
     "id": "process",
     "label": "Process connection",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "instrument"
    }
   ],
   "bounds": {
    "size": [
     0.164,
     0.393,
     0.11
    ],
    "center": [
     0.019,
     0.196,
     0.007
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pressure-switch.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble)",
    "drawn": "Field bubble with PS plus H / HH / L / LL (PSH, PSHH, PSL, PSLL) on a short process connection, usually feeding a trip.",
    "isa": [
     "PSH",
     "PSHH",
     "PSL",
     "PSLL",
     "PS"
    ],
    "notes": "Switches have S as the function letter and no T. A PSV is a relief valve, not a switch: PSV has V for valve. PDSH across a filter is a differential pressure switch.",
    "datasheet": {
     "form": "Pressure switch specification form (ISA-TR20.00.01)",
     "fields": {
      "Flange rating": "rating",
      "Housing material / finish": "housing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vibration-probe",
   "title": "Vibration probes (API 670)",
   "category": "instruments",
   "description": "Machinery protection sensors on a bearing. Proximity: an X-Y pair of eddy-current probes at 45° either side of vertical, each in an externally mounted API 670 probe housing (stainless boss and hex, PPS body, cap and 3/4\" conduit fitting) reading shaft vibration. Accelerometer: stud-mounted top-exit case sensors, vertical and horizontal, with 2-pin MIL-C-5015 connectors and booted armoured cable. Flexible conduit or cable loops to a stainless proximitor junction box with brass glands on a 2\" pipe stand, and an outgoing multicore drops to the deck. Origin at the shaft centreline in the bearing plane, shaft along X; an optional pedestal bearing and shaft stub show the mounting. These are the VE / VT elements behind VI, VA and VSHH trip loops and condition-monitoring (CMS) systems. Sizes typical.",
   "import": "./instruments/vibration-probe",
   "export": "VibrationProbe",
   "anchor": "fitting",
   "standards": [
    "API 670",
    "ISO 20816-1",
    "IEC 60079-11"
   ],
   "vendors": [
    "Baker Hughes (Bently Nevada)",
    "Amphenol (Wilcoxon)"
   ],
   "tags": [
    "VE",
    "VT",
    "vibration",
    "proximity probe",
    "accelerometer",
    "machinery protection",
    "condition monitoring"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Sensor",
     "type": "select",
     "options": [
      {
       "value": "proximity",
       "label": "Proximity probes"
      },
      {
       "value": "accelerometer",
       "label": "Accelerometers"
      }
     ]
    },
    {
     "key": "pair",
     "label": "X-Y pair",
     "type": "bool"
    },
    {
     "key": "housingRadius",
     "label": "Bearing housing radius",
     "type": "number",
     "min": 0.08,
     "max": 0.4,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "shaftHeight",
     "label": "Shaft height",
     "type": "number",
     "min": 0.25,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "jbOffset",
     "label": "Junction box offset",
     "type": "number",
     "min": 0.3,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "pedestal",
     "label": "Pedestal bearing",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "proximity",
    "pair": true,
    "housingRadius": 0.16,
    "shaftHeight": 0.45,
    "jbOffset": 0.5,
    "pedestal": true,
    "tag": "VE-1001"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.7,
     0.774,
     1.513
    ],
    "center": [
     0,
     -0.063,
     0.491
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vibration-probe.svg",
    "standard": "ISA 5.1 (field-mounted instrument bubble) / API 670",
    "drawn": "A VE or VT bubble joined to a small square or dot on a motor, pump, compressor or bearing outline, often in A / B or X / Y pairs, feeding VI / VA / VSHH functions in the DCS, SIS or CMS.",
    "tags": [
     "VE",
     "VT"
    ],
    "isa": [
     "VE",
     "VT",
     "VXE",
     "VYE",
     "VI",
     "VSHH"
    ],
    "notes": "V as the first letter is vibration (ISA 5.1). One vibration-probe per monitored bearing; pair for X-Y proximity probes, kind accelerometer for casing sensors. ZE on a machine is an axial position probe and maps here too. Voting such as 1oo2 between A and B means two sensors exist.",
    "datasheet": {
     "form": "Machinery protection system datasheet (API 670)",
     "fields": {
      "Transducer type": "kind",
      "X-Y pair": "pair",
      "Shaft centreline height": "shaftHeight",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "control-console",
   "title": "Control room operator console",
   "category": "interiors",
   "description": "CCR operator console run of 1–5 segments laid out straight, angled with wedge fillers, or curved about the operator. Each segment has a compact-laminate worksurface with a rubber-nosed front edge, a lower rear monitor level on a technical base with louvred rear access doors and a recessed kick plinth, a cable basket, one or two monitor rails with arm-mounted narrow-bezel monitors, keyboard and mouse and a 24/7 chair; phone, desk radio and LED task lights at the ends. `sitStand` puts the worksurface on electric lifting columns. Monitors show procedural sample HMI pages (alarm list, mimic, trends, F&G, ESD, CCTV); pass `screens` (CanvasTexture, VideoTexture or render-target texture per monitor) for live content.",
   "import": "./interiors/control-console",
   "export": "ControlConsole",
   "anchor": "base",
   "standards": [
    "ISO 11064",
    "EN 527-1",
    "ISA-101 (screen style)"
   ],
   "vendors": [
    "Winsted",
    "Vertiv Knürr",
    "GESAB",
    "Thinking Space"
   ],
   "tags": [
    "control room",
    "ccr",
    "console",
    "operator",
    "workstation",
    "hmi",
    "monitors"
   ],
   "params": [
    {
     "key": "segments",
     "label": "Segments",
     "type": "number",
     "min": 1,
     "max": 5,
     "step": 1
    },
    {
     "key": "layout",
     "label": "Layout",
     "type": "select",
     "options": [
      "straight",
      "angled",
      "curved"
     ]
    },
    {
     "key": "angle",
     "label": "Angle per segment",
     "type": "number",
     "min": 0,
     "max": 45,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "segmentWidth",
     "label": "Segment width",
     "type": "number",
     "min": 0.8,
     "max": 2.4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Depth",
     "type": "number",
     "min": 0.9,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sitStand",
     "label": "Sit-stand",
     "type": "bool"
    },
    {
     "key": "deskHeight",
     "label": "Desk height",
     "type": "number",
     "min": 0.65,
     "max": 1.25,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "monitorsPerSegment",
     "label": "Monitors / segment",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "rows",
     "label": "Monitor rows",
     "type": "number",
     "min": 1,
     "max": 2,
     "step": 1
    },
    {
     "key": "monitorSize",
     "label": "Monitor size",
     "type": "number",
     "min": 19,
     "max": 34,
     "step": 1,
     "unit": "in"
    },
    {
     "key": "chairs",
     "label": "Chairs",
     "type": "bool"
    },
    {
     "key": "accessories",
     "label": "Accessories",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "segments": 3,
    "layout": "curved",
    "angle": 20,
    "segmentWidth": 1.6,
    "depth": 1.2,
    "deskHeight": 0.74,
    "sitStand": false,
    "monitorsPerSegment": 2,
    "rows": 2,
    "monitorSize": 24,
    "chairs": true,
    "accessories": true,
    "content": [
     "alarm",
     "mimic",
     "trend",
     "overview",
     "fg",
     "esd",
     "cctv",
     "kpi",
     "weather"
    ],
    "screens": [],
    "tag": "OWS-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     5.818,
     1.485,
     2.529
    ],
    "center": [
     0,
     0.742,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/control-console.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064)",
    "drawn": "Plan view: a run of desk segments (straight, angled or curved) with the monitor line along the back edge and operator chairs as circles in front, laid out facing the video wall.",
    "tags": [
     "OWS"
    ],
    "notes": "Only on control room layouts. A straight table with a chair is a desk; a grid of tiles on a wall is the video wall.",
    "datasheet": {
     "form": "Control room layout / console specification (ISO 11064-3 / -4)",
     "fields": {
      "Segments": "segments",
      "Layout": "layout",
      "Segment angle": "angle",
      "Segment width": "segmentWidth",
      "Depth": "depth",
      "Sit-stand": "sitStand",
      "Desk height": "deskHeight",
      "Monitors per segment": "monitorsPerSegment",
      "Monitor rows": "rows",
      "Monitor size": "monitorSize",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "video-wall",
   "title": "Video wall",
   "category": "interiors",
   "description": "Rows × columns of narrow-bezel LCD tiles (0.88 mm bezel-to-bezel by default) or seamless fine-pitch LED tiles. Floor-standing frame with uprights, rails, pop-out mounts and a base cabinet with perforated doors, or wall-mounted on rails. The optional controller is a stack of 19\" units behind a glazed door in the base, or a rack beside a wall-mounted wall. Tiles show procedural sample pages (CCTV, overview, mimic, helideck camera, metocean, trends, F&G); pass `screens` per tile, or set `span` to stretch screens[0] across the whole wall.",
   "import": "./interiors/video-wall",
   "export": "VideoWall",
   "anchor": "base",
   "standards": [
    "ISO 11064",
    "ISA-101 (screen style)"
   ],
   "vendors": [
    "Barco",
    "Planar"
   ],
   "tags": [
    "control room",
    "ccr",
    "video wall",
    "display",
    "lcd",
    "led",
    "cctv"
   ],
   "params": [
    {
     "key": "rows",
     "label": "Rows",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "cols",
     "label": "Columns",
     "type": "number",
     "min": 1,
     "max": 10,
     "step": 1
    },
    {
     "key": "diagonal",
     "label": "Tile diagonal",
     "type": "number",
     "min": 27,
     "max": 98,
     "step": 1,
     "unit": "in"
    },
    {
     "key": "bezel",
     "label": "Bezel-to-bezel",
     "type": "select",
     "options": [
      0.88,
      1.8,
      3.5
     ]
    },
    {
     "key": "technology",
     "label": "Technology",
     "type": "select",
     "options": [
      "lcd",
      "led"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "floor",
      "wall"
     ]
    },
    {
     "key": "elevation",
     "label": "Bottom edge",
     "type": "number",
     "min": 0.4,
     "max": 2.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "controller",
     "label": "Controller",
     "type": "bool"
    },
    {
     "key": "span",
     "label": "Span one source",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "rows": 3,
    "cols": 4,
    "diagonal": 55,
    "bezel": 0.88,
    "technology": "lcd",
    "mount": "floor",
    "elevation": 0.75,
    "controller": true,
    "span": false,
    "content": [
     "cctv",
     "overview",
     "mimic",
     "helideck",
     "trend",
     "fg",
     "alarm",
     "weather",
     "cctv",
     "kpi",
     "esd",
     "cctv"
    ],
    "screens": [],
    "tag": "VW-001"
   },
   "ports": [],
   "bounds": {
    "size": [
     4.944,
     2.832,
     0.617
    ],
    "center": [
     0,
     1.416,
     0.003
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/video-wall.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064)",
    "drawn": "Elevation: a grid of display tiles (rows × columns) on a frame with a base cabinet; in plan, a long thin rectangle along the CCR wall with the viewing distance to the consoles dimensioned.",
    "notes": "Only on control room drawings.",
    "datasheet": {
     "form": "Large-screen display specification (ISO 11064-4)",
     "fields": {
      "Rows": "rows",
      "Columns": "cols",
      "Tile diagonal": "diagonal",
      "Bezel width": "bezel",
      "Technology": "technology",
      "Mounting": "mount",
      "Bottom edge height": "elevation",
      "Video wall controller": "controller",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "door",
   "title": "Door set (fire, blast, sliding, roller shutter)",
   "category": "interiors",
   "description": "Offshore door set in a short lined wall stub with a real hole, so you can see through it when open. `kind` picks a single or double hinged steel door (pressed-steel rebated frame with seals, 3–4 hinges, stainless threshold and kick plates, overhead closer, lever or panic bar, vision panel, astragal and flush bolts on pairs), a top-hung sliding door, a blast door (100 mm leaf, heavy hinges, multi-point locking with dog lever, bolted laminated vision panel) or a roller shutter (slat curtain in side guides, coil box with drive, push-button station). `fireRating` sets leaf thickness and the A60 / H120 rating plates. `open` (0–1) swings, slides or rolls the leaf; leaves swing towards +Z. ISO 7010 exit sign over the door and a room-name sign beside it. Set `wall: none` to drop it into a room wall; `doorOpening()` gives the hole size.",
   "import": "./interiors/door",
   "export": "Door",
   "anchor": "base",
   "standards": [
    "IMO FTP Code (A60 / H120)",
    "ISO 7010 E001",
    "EN 1125 (panic exit)",
    "EN 1154 (closers)"
   ],
   "vendors": [
    "MML Marine",
    "Baggerod",
    "Bimar",
    "NORAC"
   ],
   "tags": [
    "door",
    "fire door",
    "a60",
    "h120",
    "blast door",
    "roller shutter",
    "sliding door",
    "building"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "single",
      "double",
      "sliding",
      "blast",
      "roller-shutter"
     ]
    },
    {
     "key": "fireRating",
     "label": "Fire rating",
     "type": "select",
     "options": [
      "A60",
      "H120",
      "none"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "width",
     "label": "Clear width (0 = auto)",
     "type": "number",
     "min": 0,
     "max": 4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Clear height (0 = auto)",
     "type": "number",
     "min": 0,
     "max": 4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "hand",
     "label": "Hinge side",
     "type": "select",
     "options": [
      "left",
      "right"
     ]
    },
    {
     "key": "hardware",
     "label": "Hardware",
     "type": "select",
     "options": [
      "lever",
      "panic"
     ]
    },
    {
     "key": "visionPanel",
     "label": "Vision panel",
     "type": "bool"
    },
    {
     "key": "wall",
     "label": "Wall",
     "type": "select",
     "options": [
      "stub",
      "none"
     ]
    },
    {
     "key": "wallThickness",
     "label": "Wall thickness",
     "type": "number",
     "min": 0.06,
     "max": 0.4,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "sign",
     "label": "Signs",
     "type": "select",
     "options": [
      "both",
      "exit",
      "room",
      "none"
     ]
    },
    {
     "key": "label",
     "label": "Room name",
     "type": "text"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "single",
    "fireRating": "A60",
    "width": 0,
    "height": 0,
    "open": 0.35,
    "hand": "left",
    "hardware": "lever",
    "visionPanel": true,
    "wall": "stub",
    "wallThickness": 0.15,
    "sign": "both",
    "label": "CENTRAL CONTROL ROOM",
    "tag": "D-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     2.544,
     2.9,
     0.775
    ],
    "center": [
     0,
     1.45,
     0.268
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/door.svg",
    "standard": "Architectural plan convention (door swing); IMO FTP Code fire ratings",
    "drawn": "Plan view: a gap in the wall with the door leaf drawn as a line at 90° and a quarter-circle arc for the swing; double doors have two leaves and arcs, sliding doors a leaf parallel to the wall. The fire rating (A60, H120) is noted on the door schedule.",
    "notes": "Arc = hinged door; the hinge side is the arc centre. Blast doors are drawn thicker; roller shutters as a dashed line across the opening.",
    "datasheet": {
     "form": "Door schedule (IMO FTP Code A60 / H120, EN 1125 / EN 1154 hardware)",
     "fields": {
      "Type": "kind",
      "Fire rating": "fireRating",
      "Clear width": "width",
      "Clear height": "height",
      "Handing": "hand",
      "Hardware": "hardware",
      "Vision panel": "visionPanel",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "window",
   "title": "Window (A60 / H120 / blast)",
   "category": "interiors",
   "description": "Fixed offshore window in a short lined wall stub with a real hole. Square outer frame filling the hole, rounded-corner lights, exterior bolting flange, double glazing (laminated panes for the blast type) with a spacer, EPDM gaskets both faces, bolted inside clamping ring, interior window board and exterior drip sill, rating plate and tag. Mullions split it into `panes` lights; `sunshade` adds an external louvred eyebrow. +Z is the outside face. Set `wall: none` to drop it into a room wall; `windowOpening()` gives the hole.",
   "import": "./interiors/window",
   "export": "Window",
   "anchor": "base",
   "standards": [
    "IMO FTP Code (A60 / H120)",
    "ISO 3903 (ship windows)",
    "EN 1363-2 (hydrocarbon curve)"
   ],
   "vendors": [
    "Bohamet",
    "TeamTec"
   ],
   "tags": [
    "window",
    "glazing",
    "a60",
    "h120",
    "blast",
    "building"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "fixed",
      "blast"
     ]
    },
    {
     "key": "fireRating",
     "label": "Fire rating",
     "type": "select",
     "options": [
      "A60",
      "H120",
      "none"
     ]
    },
    {
     "key": "width",
     "label": "Glazed width",
     "type": "number",
     "min": 0.3,
     "max": 4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Glazed height",
     "type": "number",
     "min": 0.3,
     "max": 2.4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sill",
     "label": "Sill height",
     "type": "number",
     "min": 0.1,
     "max": 2.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "panes",
     "label": "Lights across",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "sunshade",
     "label": "Sunshade",
     "type": "bool"
    },
    {
     "key": "wall",
     "label": "Wall",
     "type": "select",
     "options": [
      "stub",
      "none"
     ]
    },
    {
     "key": "wallThickness",
     "label": "Wall thickness",
     "type": "number",
     "min": 0.06,
     "max": 0.4,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "fixed",
    "fireRating": "A60",
    "width": 1.2,
    "height": 0.9,
    "sill": 1,
    "panes": 1,
    "sunshade": false,
    "wall": "stub",
    "wallThickness": 0.15,
    "tag": "W-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     2.74,
     2.9,
     0.39
    ],
    "center": [
     0,
     1.45,
     -0.01
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/window.svg",
    "standard": "Architectural plan convention (window in wall); IMO FTP Code fire ratings",
    "drawn": "Plan view: the wall is interrupted and parallel thin lines across the opening show the glazing; sill height and fire / blast rating are on the window schedule.",
    "notes": "A gap with an arc is a door; a gap with thin parallel lines is a window.",
    "datasheet": {
     "form": "Window schedule (IMO FTP Code A60 / H120, ISO 3903)",
     "fields": {
      "Type": "kind",
      "Fire rating": "fireRating",
      "Width": "width",
      "Height": "height",
      "Sill height": "sill",
      "Panes": "panes",
      "Sunshade": "sunshade",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "room",
   "title": "Room shell (control room, LER, office)",
   "category": "interiors",
   "description": "Walk-through room: lined walls with real openings from a `doors` array (wall side, offset, kind, open…) and a `windows` array, each filled with the door and window components. Raised access floor (slab at y = 0, finished floor at `floorHeight`, 600 mm tiles, pedestals and cables visible at the cut, perforated supply tiles) or carpet tiles; suspended 600 mm ceiling with LED panels, slot diffusers, smoke detectors, PA speakers and gas-suppression nozzles; ladder tray in the ceiling void; cove skirting; exit sign, call point, switch and CO2 extinguisher inside each door. `cutaway` leaves out the ceiling and the +Z wall so the twin can look in. Place consoles, video walls and cabinets inside on the finished floor.",
   "import": "./interiors/room",
   "export": "Room",
   "anchor": "base",
   "standards": [
    "ISO 11064-3 (control room layout)",
    "EN 12825 (raised access floors)",
    "ISO 7010 E001",
    "IMO FTP Code"
   ],
   "vendors": [
    "Kingspan (Tate)"
   ],
   "tags": [
    "room",
    "control room",
    "ccr",
    "building",
    "interior",
    "raised floor",
    "ceiling",
    "walls"
   ],
   "params": [
    {
     "key": "width",
     "label": "Inside width",
     "type": "number",
     "min": 2,
     "max": 40,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Inside depth",
     "type": "number",
     "min": 2,
     "max": 30,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Ceiling height",
     "type": "number",
     "min": 2.3,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "wallThickness",
     "label": "Wall thickness",
     "type": "number",
     "min": 0.06,
     "max": 0.4,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "raisedFloor",
     "label": "Raised floor",
     "type": "bool"
    },
    {
     "key": "floorHeight",
     "label": "Floor height",
     "type": "number",
     "min": 0.1,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "ceiling",
     "label": "Ceiling",
     "type": "bool"
    },
    {
     "key": "cableTray",
     "label": "Cable tray",
     "type": "bool"
    },
    {
     "key": "cutaway",
     "label": "Cutaway",
     "type": "bool"
    },
    {
     "key": "fireRating",
     "label": "Fire rating",
     "type": "select",
     "options": [
      "A60",
      "H120",
      "none"
     ]
    },
    {
     "key": "label",
     "label": "Room name",
     "type": "text"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "width": 8,
    "depth": 6,
    "height": 3,
    "wallThickness": 0.15,
    "raisedFloor": true,
    "floorHeight": 0.3,
    "ceiling": true,
    "cableTray": true,
    "cutaway": true,
    "doors": [
     {
      "wall": "-x",
      "offset": 1.4,
      "kind": "single",
      "open": 0.5,
      "hardware": "panic"
     },
     {
      "wall": "+x",
      "offset": -1.2,
      "kind": "double",
      "open": 0
     }
    ],
    "windows": [
     {
      "wall": "-z",
      "offset": 1.6,
      "width": 1.8,
      "height": 0.9,
      "sill": 1
     }
    ],
    "fireRating": "A60",
    "label": "CENTRAL CONTROL ROOM",
    "tag": "B-300"
   },
   "ports": [],
   "bounds": {
    "size": [
     9.129,
     3.9,
     6.272
    ],
    "center": [
     -0.328,
     1.95,
     -0.124
    ]
   },
   "registryDependencies": [
    "core",
    "door",
    "window"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/room.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064)",
    "drawn": "Plan view: double-line walls enclosing the room with door and window openings and the room name and number written inside; raised floors noted RAF with the floor height.",
    "notes": "Rooms are background for consoles, cabinets and furniture. A single building rectangle on a plot plan is an e-house or module.",
    "datasheet": {
     "form": "Room data sheet (ISO 11064-3; EN 12825 raised floor)",
     "fields": {
      "Width": "width",
      "Depth": "depth",
      "Ceiling height": "height",
      "Wall thickness": "wallThickness",
      "Raised floor": "raisedFloor",
      "Raised floor height": "floorHeight",
      "Ceiling": "ceiling",
      "Cable tray": "cableTray",
      "Fire rating": "fireRating",
      "Room name": "label",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "system-cabinet",
   "title": "System cabinet row (DCS / SIS / F&G / server)",
   "category": "interiors",
   "description": "Row of `count` baying cabinets (800 × 800 × 2000 mm on a 100 mm plinth by default, RAL 7035) for DCS, SIS or F&G controllers, field marshalling or servers. Glazed, perforated or solid front doors hinged on the right with swing-handle locks and label strips, SIS / F&G status lamps, rear doors with vents, side panels and roof cable-entry brushes, cabinet lights. Behind the door: zinc mounting plate with trunking, I/O carriers with status LEDs, terminal rows and power supplies, or 19\" rails full of servers and switches. Cables rise through bottom gland plates from a raised floor. `open` swings the front doors.",
   "import": "./interiors/system-cabinet",
   "export": "SystemCabinet",
   "anchor": "base",
   "standards": [
    "IEC 61439",
    "IEC 60297 (19\" racks)",
    "IEC 60529 (IP54)"
   ],
   "vendors": [
    "Rittal",
    "Emerson"
   ],
   "tags": [
    "cabinet",
    "dcs",
    "sis",
    "fire and gas",
    "marshalling",
    "server",
    "rack",
    "equipment room"
   ],
   "params": [
    {
     "key": "count",
     "label": "Cabinets",
     "type": "number",
     "min": 1,
     "max": 12,
     "step": 1
    },
    {
     "key": "system",
     "label": "System",
     "type": "select",
     "options": [
      "dcs",
      "sis",
      "fg",
      "marshalling",
      "server"
     ]
    },
    {
     "key": "width",
     "label": "Width",
     "type": "select",
     "options": [
      0.6,
      0.8,
      1.2
     ]
    },
    {
     "key": "depth",
     "label": "Depth",
     "type": "select",
     "options": [
      0.6,
      0.8,
      1
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "select",
     "options": [
      1.8,
      2,
      2.2
     ]
    },
    {
     "key": "door",
     "label": "Door",
     "type": "select",
     "options": [
      "glazed",
      "perforated",
      "solid"
     ]
    },
    {
     "key": "open",
     "label": "Doors open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "rearDoors",
     "label": "Rear doors",
     "type": "bool"
    },
    {
     "key": "cableEntry",
     "label": "Cable entry",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "count": 4,
    "system": "dcs",
    "width": 0.8,
    "depth": 0.8,
    "height": 2,
    "door": "glazed",
    "open": 0,
    "rearDoors": true,
    "cableEntry": true,
    "tag": "SC-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     3.257,
     2.204,
     1.568
    ],
    "center": [
     0.011,
     1.002,
     0.344
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/system-cabinet.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064) / equipment room layout",
    "drawn": "Plan view: a row of squares (cabinets) against a wall or back to back, with door swing arcs on the front and the system (DCS, SIS, F&G, marshalling) written on each; front and rear access clearances dashed.",
    "notes": "Only on equipment-room layouts. Switchgear line-ups look similar but are deeper and labelled with feeders.",
    "datasheet": {
     "form": "Cabinet layout / system cabinet specification (IEC 61439, IEC 60297)",
     "fields": {
      "Number of cabinets": "count",
      "System": "system",
      "Width": "width",
      "Depth": "depth",
      "Height": "height",
      "Front door": "door",
      "Rear doors": "rearDoors",
      "Cable entry": "cableEntry",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "operator-chair",
   "title": "24/7 operator chair",
   "category": "interiors",
   "description": "Intensive-use control-room chair: five-star polished aluminium base (about 700 mm) with twin-wheel castors, gas lift with shroud, synchro mechanism, upholstered seat with waterfall edge, tall back with lumbar shaping, headrest and height-adjustable arms. `swivel` turns the upper part on the gas lift; `seatHeight` follows the gas-lift range.",
   "import": "./interiors/operator-chair",
   "export": "OperatorChair",
   "anchor": "base",
   "standards": [
    "EN 1335",
    "BS 5459-2 (24-hour use)"
   ],
   "vendors": [
    "Neutral Posture"
   ],
   "tags": [
    "chair",
    "control room",
    "ccr",
    "furniture",
    "operator"
   ],
   "params": [
    {
     "key": "seatHeight",
     "label": "Seat height",
     "type": "number",
     "min": 0.43,
     "max": 0.64,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "headrest",
     "label": "Headrest",
     "type": "bool"
    },
    {
     "key": "arms",
     "label": "Arms",
     "type": "bool"
    },
    {
     "key": "color",
     "label": "Upholstery",
     "type": "color"
    },
    {
     "key": "swivel",
     "label": "Swivel",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    }
   ],
   "defaults": {
    "seatHeight": 0.5,
    "headrest": true,
    "arms": true,
    "color": "#2b2f35",
    "swivel": 0,
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     0.699,
     1.391,
     0.783
    ],
    "center": [
     0,
     0.696,
     -0.031
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/operator-chair.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064) (furniture)",
    "drawn": "Plan view: a rounded seat square with a curved backrest and armrests, placed at a console or desk; often just a circle.",
    "notes": "Furniture appears only on control room and office layouts.",
    "datasheet": {
     "form": "Furniture schedule (EN 1335, BS 5459-2 24-hour use)",
     "fields": {
      "Seat height": "seatHeight",
      "Headrest": "headrest",
      "Armrests": "arms"
     }
    }
   }
  },
  {
   "name": "desk",
   "title": "Supervisor desk / meeting table",
   "category": "interiors",
   "description": "Shift supervisor desk (compact-laminate top, side and modesty panels, drawer pedestal, up to three monitors on stands, keyboard, phone, document tray, chair on the +Z side) or a pedestal meeting table with chairs round it. Monitors show procedural sample pages (ESD status, alarm list, KPIs); pass `screens` for live content.",
   "import": "./interiors/desk",
   "export": "Desk",
   "anchor": "base",
   "standards": [
    "EN 527-1"
   ],
   "vendors": [
    "Winsted",
    "Vertiv Knürr"
   ],
   "tags": [
    "desk",
    "table",
    "supervisor",
    "meeting",
    "control room",
    "furniture"
   ],
   "params": [
    {
     "key": "layout",
     "label": "Layout",
     "type": "select",
     "options": [
      "supervisor",
      "meeting"
     ]
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Depth",
     "type": "number",
     "min": 0.6,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "monitors",
     "label": "Monitors",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 1
    },
    {
     "key": "seats",
     "label": "Seats (meeting)",
     "type": "number",
     "min": 2,
     "max": 16,
     "step": 1
    },
    {
     "key": "chairs",
     "label": "Chairs",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Label",
     "type": "text"
    }
   ],
   "defaults": {
    "layout": "supervisor",
    "width": 1.8,
    "depth": 0.9,
    "monitors": 2,
    "seats": 6,
    "chairs": true,
    "content": [
     "esd",
     "alarm",
     "kpi"
    ],
    "screens": [],
    "tag": "SUPERVISOR"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.8,
     1.391,
     1.573
    ],
    "center": [
     0,
     0.696,
     0.336
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/desk.svg",
    "standard": "Layout plan convention (architectural / control room layout, ISO 11064) (furniture)",
    "drawn": "Plan view: a rectangle (desk or table) with monitors drawn as thick lines along the back edge and chairs as circles or seat shapes around it.",
    "notes": "A curved or angled run of desks with many monitors is a control-console.",
    "datasheet": {
     "form": "Furniture schedule (EN 527-1)",
     "fields": {
      "Layout": "layout",
      "Width": "width",
      "Depth": "depth",
      "Monitors": "monitors",
      "Seats": "seats",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "wall-display",
   "title": "Wall / ceiling display or panel PC",
   "category": "interiors",
   "description": "Single large-format display on a tilting wall bracket (wall plane at z = 0), a ceiling drop pole with yoke, or a mobile stand on castors; or an industrial panel PC with a stainless IP66 bezel, function keys and status LEDs. Shows a procedural sample page (`content`: CCTV, overview, mimic, trend, alarm, F&G, ESD, metocean, helideck, KPIs) or a live `screen` texture (CanvasTexture, VideoTexture, render target).",
   "import": "./interiors/wall-display",
   "export": "WallDisplay",
   "anchor": "base",
   "standards": [
    "VESA MIS-F",
    "ISA-101 (screen style)",
    "IEC 60529 (panel PC IP66)"
   ],
   "vendors": [
    "Barco",
    "Planar"
   ],
   "tags": [
    "display",
    "screen",
    "monitor",
    "hmi",
    "panel pc",
    "control room",
    "tv"
   ],
   "params": [
    {
     "key": "size",
     "label": "Diagonal",
     "type": "number",
     "min": 10,
     "max": 98,
     "step": 1,
     "unit": "in"
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "ceiling",
      "stand"
     ]
    },
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "display",
      "panel-pc"
     ]
    },
    {
     "key": "elevation",
     "label": "Centre height",
     "type": "number",
     "min": 0.6,
     "max": 3,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "ceilingHeight",
     "label": "Ceiling height",
     "type": "number",
     "min": 2.4,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tilt",
     "label": "Tilt",
     "type": "number",
     "min": -10,
     "max": 30,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "content",
     "label": "Content",
     "type": "select",
     "options": [
      "cctv",
      "overview",
      "mimic",
      "trend",
      "alarm",
      "fg",
      "esd",
      "weather",
      "helideck",
      "kpi",
      "off"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "size": 55,
    "mount": "wall",
    "style": "display",
    "elevation": 1.8,
    "ceilingHeight": 3,
    "tilt": 0,
    "content": "cctv",
    "screen": null,
    "tag": "DSP-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.234,
     0.707,
     0.137
    ],
    "center": [
     0,
     1.797,
     0.068
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/wall-display.svg",
    "standard": "Layout plan convention (control room / instrument layout)",
    "drawn": "Control room or equipment-room layout: a thin rectangle on the wall (plan) or a framed screen on a bracket (elevation), labelled with its size and content.",
    "notes": "A single screen; a grid of tiles is the video wall.",
    "datasheet": {
     "form": "Display specification (ISO 11064-4)",
     "fields": {
      "Screen size": "size",
      "Mounting": "mount",
      "Style": "style",
      "Mounting height": "elevation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "cctv-camera",
   "title": "Ex d CCTV camera (fixed / PTZ)",
   "category": "interiors",
   "description": "Hazardous-area CCTV camera in electropolished 316L: flameproof barrel with bolted window and rear flanges, glazed window, sunshield on standoffs, wiper, rear gland and armoured cable, Ex marking plate and tag. `kind: ptz` adds the pan drive, U-yoke and tilt drive; `pan` and `tilt` (degrees) turn the head, and also aim the fixed camera on its knuckle bracket. Mounted on a galvanised pole with a gusseted base plate and anchor bolts, cable cleats and an Ex e junction box, or on a wall bracket (wall plane z = 0).",
   "import": "./interiors/cctv-camera",
   "export": "CctvCamera",
   "anchor": "base",
   "standards": [
    "IEC 60079-0 / -1 (Ex d)",
    "ATEX 2014/34/EU",
    "IECEx",
    "IEC 60529 (IP66/67)"
   ],
   "vendors": [
    "Videotec (Pelco)",
    "Axis",
    "Eaton Hernis"
   ],
   "tags": [
    "cctv",
    "camera",
    "ptz",
    "ex",
    "atex",
    "security",
    "hazardous area"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "fixed",
      "ptz"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1.5,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pan",
     "label": "Pan",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "tilt",
     "label": "Tilt",
     "type": "number",
     "min": -90,
     "max": 40,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "wiper",
     "label": "Wiper",
     "type": "bool"
    },
    {
     "key": "junctionBox",
     "label": "Junction box",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "ptz",
    "mount": "pole",
    "height": 3.5,
    "pan": 25,
    "tilt": -12,
    "wiper": true,
    "junctionBox": true,
    "tag": "CCTV-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.446,
     3.96,
     0.633
    ],
    "center": [
     -0.006,
     1.98,
     -0.013
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cctv-camera.svg",
    "standard": "Security / telecom layout convention (camera with field of view)",
    "drawn": "Telecom layout: a camera symbol (small box with a lens) with its field-of-view wedge drawn dashed in the direction it looks; PTZ cameras marked PTZ with a full circle of coverage.",
    "tags": [
     "CCTV"
    ],
    "notes": "A wedge from a camera box is the CCTV view; a wedge from a circle with F is a flame detector cone. Not on P&IDs.",
    "datasheet": {
     "form": "CCTV camera datasheet (IEC 60079-1, IEC 60529)",
     "fields": {
      "Type": "kind",
      "Mounting": "mount",
      "Mounting height": "height",
      "Wiper": "wiper",
      "Junction box": "junctionBox",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fire-alarm-panel",
   "title": "Fire & gas alarm panel / ESD mimic panel",
   "category": "interiors",
   "description": "Fire & gas alarm control panel (red header, backlit LCD showing sample status, FIRE / GAS / FAULT / DISABLED / TEST / POWER LEDs, a zone LED column per `zones`, SILENCE / MUTE / RESET / EVACUATE buttons, access keyswitch, cable glands, sounder-beacon above) or an ESD mimic panel (process mimic with status LEDs per area, APS / ESD1 / ESD2 / PSD red mushroom buttons under hinged clear flaps, override keyswitches, lamp test). Wall cabinet (wall plane z = 0) or floor-standing desk with a 30° raked button shelf. Fascia text is sample content.",
   "import": "./interiors/fire-alarm-panel",
   "export": "FireAlarmPanel",
   "anchor": "base",
   "standards": [
    "EN 54-2 (control and indicating equipment)",
    "IEC 61511 (SIS)",
    "ISO 13850 (emergency stop)"
   ],
   "vendors": [
    "Autronica"
   ],
   "tags": [
    "fire alarm",
    "fire and gas",
    "esd",
    "mimic",
    "panel",
    "control room",
    "safety"
   ],
   "params": [
    {
     "key": "panel",
     "label": "Panel",
     "type": "select",
     "options": [
      "fire-alarm",
      "esd-mimic"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "floor"
     ]
    },
    {
     "key": "zones",
     "label": "Zones",
     "type": "number",
     "min": 4,
     "max": 32,
     "step": 2
    },
    {
     "key": "elevation",
     "label": "Centre height",
     "type": "number",
     "min": 0.8,
     "max": 2.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "panel": "fire-alarm",
    "mount": "wall",
    "zones": 16,
    "elevation": 1.5,
    "tag": "FACP-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.6,
     1.145,
     0.204
    ],
    "center": [
     0,
     1.657,
     0.098
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fire-alarm-panel.svg",
    "standard": "F&G / safety layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); EN 54-2",
    "drawn": "On F&G block diagrams and room layouts: a rectangle labelled FACP, F&G or ESD with the zones it serves; detectors and call points are wired to it in loops.",
    "tags": [
     "FACP",
     "FGP"
    ],
    "notes": "An F&G or ESD mimic panel in the CCR; the logic itself lives in the system cabinets (system-cabinet).",
    "datasheet": {
     "form": "Fire alarm control panel datasheet (EN 54-2 / IEC 61511)",
     "fields": {
      "Panel type": "panel",
      "Mounting": "mount",
      "Zones": "zones",
      "Mounting height": "elevation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pedestal-crane",
   "title": "Offshore pedestal crane",
   "category": "lifting",
   "description": "Diesel-hydraulic offshore pedestal crane with a wire-luffed lattice boom (hollow tubular chords and lacing). Flanged pedestal with bolted slew bearing and external gear, twin slew drives, caged ladders, rest and ring platforms, machinery house with louvres, cooler and exhaust, main and auxiliary winches, counterweight, operator cab beside the boom foot, A-frame gantry with lead sheaves and the upper luffing block, 6-fall luffing tackle with a floating spreader and LMI load cell, pendants, boom backstops, boom-angle indicator, head with rope keepers, anemometer and aviation lights, anti-two-block weight and switch, 4-fall hook block with a latched hook, whip line and ball, and an optional braced boom rest along +X. Sheave pitch diameters meet API 2C D/d ≥ 18. Slew (deg, counter-clockwise from above, 0 = boom along +X), luff (boom angle) and hook (drop below the head sheaves) move the boom, ropes and blocks; luff is clamped between the rest angle and 78°.",
   "import": "./lifting/pedestal-crane",
   "export": "PedestalCrane",
   "anchor": "base",
   "standards": [
    "API Spec 2C",
    "EN 13852-1",
    "ISO 14122-3/4",
    "DNV-ST-0378"
   ],
   "vendors": [
    "Liebherr",
    "PALFINGER"
   ],
   "tags": [
    "crane",
    "lifting",
    "offshore",
    "pedestal",
    "lattice boom",
    "moving"
   ],
   "params": [
    {
     "key": "boomLength",
     "label": "Boom length",
     "type": "number",
     "min": 20,
     "max": 60,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "slew",
     "label": "Slew",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 1,
     "unit": "deg"
    },
    {
     "key": "luff",
     "label": "Boom angle",
     "type": "number",
     "min": -7,
     "max": 78,
     "step": 1,
     "unit": "deg"
    },
    {
     "key": "hook",
     "label": "Hook drop",
     "type": "number",
     "min": 2.6,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "pedestalHeight",
     "label": "Pedestal height",
     "type": "number",
     "min": 5,
     "max": 25,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "swl",
     "label": "SWL",
     "type": "number",
     "min": 2,
     "max": 100,
     "step": 1,
     "unit": "t"
    },
    {
     "key": "boomRest",
     "label": "Boom rest",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "boomLength": 36,
    "slew": 0,
    "luff": 42,
    "hook": 14,
    "pedestalHeight": 10,
    "swl": 25,
    "boomRest": true,
    "tag": "CR-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     35.73,
     39.447,
     6.229
    ],
    "center": [
     14.778,
     19.724,
     0.025
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pedestal-crane.svg",
    "standard": "Layout plan convention (lifting / materials-handling study); API Spec 2C",
    "drawn": "Plan view: the pedestal as a circle at the crane position with the maximum (and minimum) working radius drawn as large dashed circles around it, the boom as a line, and laydown areas and lift paths inside the radius; tagged CR- with SWL at radius.",
    "tags": [
     "CR"
    ],
    "notes": "The large dashed reach circle is the clue. A small post with a short jib and no reach study is a davit-crane. Not on P&IDs, except a diesel or hydraulic utility tie-in.",
    "datasheet": {
     "form": "Offshore crane datasheet (API Spec 2C / EN 13852-1)",
     "fields": {
      "Boom length": "boomLength",
      "Pedestal height": "pedestalHeight",
      "Safe working load": "swl",
      "Boom rest": "boomRest",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "shipping-container",
   "title": "ISO shipping container",
   "category": "lifting",
   "description": "ISO 668 series 1 freight container in 10, 20, 40 ft or 40 ft high-cube: trapezoidal corrugated side, end and roof panels, ISO 1161 corner castings with apertures, corner posts and rails, a door end with two corrugated leaves, four locking bars with cam keepers, handles and hinges, CSC plate and ISO 6346 marking. 10 and 20 ft units get forklift pockets; side walls carry labyrinth vents and the leaves have EPDM gaskets. doorsOpen swings the leaves back 250° to show the plywood-floored interior; the CSC plate is on the left leaf. The optional offshore lifting set adds padeyes, shackles and a 4-leg sling to a master link. Length runs along X with the doors at +X.",
   "import": "./lifting/shipping-container",
   "export": "ShippingContainer",
   "anchor": "base",
   "standards": [
    "ISO 668",
    "ISO 1161",
    "ISO 1496-1",
    "ISO 6346",
    "DNV 2.7-1 (lifting set)"
   ],
   "vendors": [
    "CIMC",
    "Sea Box",
    "Bullbox",
    "HZ Containers"
   ],
   "tags": [
    "container",
    "logistics",
    "cargo",
    "laydown",
    "storage"
   ],
   "params": [
    {
     "key": "size",
     "label": "Size",
     "type": "select",
     "options": [
      "10ft",
      "20ft",
      "40ft",
      "40ft-hc"
     ]
    },
    {
     "key": "color",
     "label": "Colour",
     "type": "color"
    },
    {
     "key": "marking",
     "label": "Marking",
     "type": "text"
    },
    {
     "key": "liftingSet",
     "label": "Offshore lifting set",
     "type": "bool"
    },
    {
     "key": "doorsOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "size": "20ft",
    "color": "#c4561c",
    "marking": "DTKU 220516 4",
    "liftingSet": false,
    "doorsOpen": false,
    "tag": "CT-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.149,
     2.593,
     2.468
    ],
    "center": [
     0.044,
     1.296,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/shipping-container.svg",
    "standard": "Layout plan convention (lifting / materials-handling study)",
    "drawn": "Plan view: a rectangle at the ISO footprint (10, 20 or 40 ft) in a laydown area, often with a diagonal cross meaning \"laydown / temporary\", the door end marked by a thicker line, and its size written inside.",
    "notes": "Laydown areas are rectangles with a cross or hatch; a container is one sized like an ISO box. Baskets are open and smaller; tote tanks are near-square.",
    "datasheet": {
     "form": "Offshore container certificate / specification (DNV 2.7-1, ISO 668)",
     "fields": {
      "Size": "size",
      "Marking": "marking",
      "Lifting set": "liftingSet",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "cargo-basket",
   "title": "Offshore cargo basket",
   "category": "lifting",
   "description": "Open-top offshore cargo basket: RHS 200 × 100 base frame with channel cross members and a checker-plate floor, two fork-pocket tunnels across the width, SHS posts at ≤ 1.6 m with top and mid rails, kick plates and expanded-metal mesh sides, floor lashing and tag-line D-rings, marking plates and four padeyes with shackles and a 4-leg sling set to a master link. Length runs along X.",
   "import": "./lifting/cargo-basket",
   "export": "CargoBasket",
   "anchor": "base",
   "standards": [
    "DNV 2.7-1",
    "EN 12079-1",
    "ISO 10855-1"
   ],
   "vendors": [
    "OEG",
    "Byrne Group",
    "Simmonds Equipment"
   ],
   "tags": [
    "basket",
    "cargo carrying unit",
    "CCU",
    "logistics",
    "laydown",
    "supply boat"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 1.2,
     "max": 3,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Wall height",
     "type": "number",
     "min": 0.6,
     "max": 2.4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "color",
     "label": "Colour",
     "type": "color"
    },
    {
     "key": "swl",
     "label": "Max gross",
     "type": "number",
     "min": 1,
     "max": 25,
     "step": 0.5,
     "unit": "t"
    },
    {
     "key": "liftingSet",
     "label": "Lifting set",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 6,
    "width": 2.5,
    "height": 1.2,
    "color": "#e8641c",
    "swl": 10,
    "liftingSet": true,
    "tag": "CB-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.116,
     4.774,
     2.581
    ],
    "center": [
     0,
     2.387,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cargo-basket.svg",
    "standard": "Layout plan convention (lifting / materials-handling study)",
    "drawn": "Elevation: an open-topped frame with mesh sides hanging from a four-leg sling set to a master link; in plan, a long rectangle in the laydown area.",
    "notes": "Open top and mesh sides tell it from a closed container. Not on P&IDs.",
    "datasheet": {
     "form": "Offshore container certificate (DNV 2.7-1 / EN 12079-1)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Height": "height",
      "Safe working load": "swl",
      "Lifting set": "liftingSet",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "monorail-hoist",
   "title": "Monorail with chain hoist",
   "category": "lifting",
   "description": "Runway beam (IPE or HEB, sized by SWL) hung from HEB goalpost supports at ≤ 6 m with base plates, anchor bolts and knee braces, end stops with rubber buffers and SWL marking. A push trolley with four flanged wheels on the bottom flange carries an electric chain hoist with motor, gearbox, chain bag and push-button pendant; round-link load chain to the bottom hook. trolley (0–1) moves it along X and hook sets the chain drop.",
   "import": "./lifting/monorail-hoist",
   "export": "MonorailHoist",
   "anchor": "base",
   "standards": [
    "EN 14492-2",
    "FEM 9.511",
    "ISO 4301-1",
    "EN 818-7"
   ],
   "vendors": [
    "J D Neuhaus",
    "Tiger Lifting"
   ],
   "tags": [
    "monorail",
    "hoist",
    "chain hoist",
    "trolley",
    "maintenance lifting",
    "moving"
   ],
   "params": [
    {
     "key": "length",
     "label": "Runway length",
     "type": "number",
     "min": 3,
     "max": 30,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Beam underside",
     "type": "number",
     "min": 2.5,
     "max": 10,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "swl",
     "label": "SWL",
     "type": "number",
     "min": 0.5,
     "max": 20,
     "step": 0.5,
     "unit": "t"
    },
    {
     "key": "trolley",
     "label": "Trolley position",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.01
    },
    {
     "key": "hook",
     "label": "Hook drop",
     "type": "number",
     "min": 0.3,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 8,
    "height": 4.5,
    "swl": 5,
    "trolley": 0.4,
    "hook": 2.2,
    "tag": "HM-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     8,
     5.06,
     2.44
    ],
    "center": [
     0,
     2.53,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/monorail-hoist.svg",
    "standard": "Layout plan convention (lifting / materials-handling study)",
    "drawn": "Plan view: a dash-dot or thick line along the runway beam labelled \"monorail, SWL x t\" from the equipment it serves to the drop or laydown zone; in elevation a beam with a trolley, hoist block and hook.",
    "notes": "Shown on mechanical handling and layout drawings over pumps, compressors and exchangers that need lifting. Not on P&IDs.",
    "datasheet": {
     "form": "Hoist and runway datasheet (EN 14492-2 / FEM 9.511)",
     "fields": {
      "Runway length": "length",
      "Beam height": "height",
      "Safe working load": "swl",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "lifeboat-davit",
   "title": "Lifeboat (TEMPSC) and gravity davit",
   "category": "lifting",
   "description": "Totally enclosed motor-propelled survival craft in orange, sized from its certified capacity (about 6–11 m), with lofted hull and canopy, gunwale fender, coxswain cupola, windows, boarding doors, hatches, grab rails, keel, rudder and propeller nozzle, and on-load release hooks with the fall rings seated in upturned tongues. It hangs stowed in two gravity davits (deck frame, inclined track, cradle arm with head sheave, falls and fall blocks), with a winch and brake lever and a cantilevered embarkation platform. The boat lies along X, outboard at +Z; the deck edge is at z ≈ 0.25 and the hull hangs below deck level, as it does on a real platform.",
   "import": "./lifting/lifeboat-davit",
   "export": "LifeboatDavit",
   "anchor": "base",
   "standards": [
    "SOLAS III",
    "IMO LSA Code IV/4.6 and VI/6.1",
    "IMO MSC.81(70)",
    "NORSOK R-002"
   ],
   "vendors": [
    "PALFINGER",
    "VIKING (Norsafe)"
   ],
   "tags": [
    "lifeboat",
    "TEMPSC",
    "davit",
    "lifesaving",
    "evacuation",
    "muster"
   ],
   "params": [
    {
     "key": "capacity",
     "label": "Capacity",
     "type": "number",
     "min": 20,
     "max": 120,
     "step": 5,
     "unit": "persons"
    },
    {
     "key": "tag",
     "label": "Boat number",
     "type": "text"
    },
    {
     "key": "color",
     "label": "Colour",
     "type": "color"
    }
   ],
   "defaults": {
    "capacity": 50,
    "tag": "LB-1",
    "color": "#f26a1b"
   },
   "ports": [],
   "bounds": {
    "size": [
     7.87,
     4.348,
     6.448
    ],
    "center": [
     -0.06,
     1.134,
     0.474
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/lifeboat-davit.svg",
    "standard": "Layout plan convention (lifting / materials-handling study) (lifesaving appliance plan); SOLAS LSA Code",
    "drawn": "On escape and lifesaving plans: a boat outline (pointed or rounded ends) at the muster station, under davit arms, with its capacity (e.g. 50 P) written inside; often marked TEMPSC.",
    "tags": [
     "TEMPSC"
    ],
    "notes": "Liferafts are drawn as small circles or canisters. Never on P&IDs.",
    "datasheet": {
     "form": "Lifeboat and davit certificate / schedule (SOLAS LSA Code IV/4.6, VI/6.1)",
     "fields": {
      "Certified capacity (persons)": "capacity",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "tote-tank",
   "title": "Offshore chemical tote tank",
   "category": "lifting",
   "description": "Portable offshore chemical tank: a stainless tank, sized from its capacity, in a painted SHS lifting frame with an RHS base, two fork-pocket tunnels, tank bearers and side and rear diagonals. The tank has a clamped manway, a vent with flame arrestor, a fill cap and a sight-glass level gauge. The bottom outlet is a 2\" ball valve with a lever, ending in a Class 150 weld-neck flange inside the frame (port outlet, utility). DNV data plate, tag plate, padeyes, shackles and a 4-leg sling set.",
   "import": "./lifting/tote-tank",
   "export": "ToteTank",
   "anchor": "base",
   "standards": [
    "DNV 2.7-1",
    "EN 12079-1",
    "ASME B16.5"
   ],
   "vendors": [
    "OEG",
    "Suretank",
    "IKM"
   ],
   "tags": [
    "tote",
    "chemical tank",
    "IBC",
    "cargo carrying unit",
    "chemical injection",
    "logistics"
   ],
   "params": [
    {
     "key": "volume",
     "label": "Capacity",
     "type": "number",
     "min": 500,
     "max": 6000,
     "step": 100,
     "unit": "L"
    },
    {
     "key": "color",
     "label": "Frame colour",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    },
    {
     "key": "liftingSet",
     "label": "Lifting set",
     "type": "bool"
    }
   ],
   "defaults": {
    "volume": 1500,
    "color": "#2d5fa8",
    "tag": "TT-101",
    "liftingSet": true
   },
   "ports": [
    {
     "id": "outlet",
     "label": "Bottom outlet",
     "position": [
      0,
      0.28,
      0.6763
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 2,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     1.513,
     2.807,
     1.513
    ],
    "center": [
     0,
     1.374,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/tote-tank.svg",
    "standard": "Layout plan convention (lifting / materials-handling study) / P&ID (temporary chemical supply)",
    "drawn": "Layout: a near-square frame with the tank outline inside, in the chemical laydown; on P&IDs a small vessel or \"tote\" box with a hose connection to the chemical injection skid suction.",
    "tags": [
     "IBC"
    ],
    "notes": "A permanent chemical tank is part of the chemical-injection-skid. Totes are temporary, hose-connected supplies.",
    "datasheet": {
     "form": "Portable tank certificate (DNV 2.7-1 / EN 12079-1)",
     "fields": {
      "Capacity": "volume",
      "Lifting set": "liftingSet",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "davit-crane",
   "title": "Pedestal davit crane (manual)",
   "category": "lifting",
   "description": "Small slewing pipe davit for maintenance and stores lifts. A gusseted base plate with anchor bolts carries a socket with a slew-lock pin. The mast is pipe sized by SWL, turning through a 2.5D gooseneck bend into the jib, with a knee brace. A hand winch on the mast has a ratchet, pawl and crank, and the wire runs over a guide sheave at the gooseneck, along rope guides on the jib, over the tip sheave and down to a swivel hook. slew and hook move it. SWL and tag plates sit on the socket.",
   "import": "./lifting/davit-crane",
   "export": "DavitCrane",
   "anchor": "base",
   "standards": [
    "EN 13852-1",
    "EN 13157",
    "LOLER / DNV-ST-0378"
   ],
   "vendors": [
    "OZ Lifting Products"
   ],
   "tags": [
    "davit",
    "jib crane",
    "maintenance lifting",
    "manual winch",
    "moving"
   ],
   "params": [
    {
     "key": "reach",
     "label": "Reach",
     "type": "number",
     "min": 0.9,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Jib height",
     "type": "number",
     "min": 1.8,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "slew",
     "label": "Slew",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 1,
     "unit": "deg"
    },
    {
     "key": "hook",
     "label": "Hook drop",
     "type": "number",
     "min": 0.3,
     "max": 10,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "swl",
     "label": "SWL",
     "type": "number",
     "min": 0.25,
     "max": 5,
     "step": 0.25,
     "unit": "t"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "reach": 1.6,
    "height": 2.6,
    "slew": 0,
    "hook": 1.4,
    "swl": 0.5,
    "tag": "DC-101"
   },
   "ports": [],
   "bounds": {
    "size": [
     2.065,
     2.706,
     0.57
    ],
    "center": [
     0.605,
     1.353,
     0.035
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/davit-crane.svg",
    "standard": "Layout plan convention (lifting / materials-handling study)",
    "drawn": "Elevation: a post curving into a short jib with a hook; in plan, a small circle with a short reach radius (dashed) over the item it serves, labelled with SWL.",
    "tags": [
     "DAV",
     "CR"
    ],
    "notes": "Small reach circle (a few metres) versus the large reach of a pedestal crane. Not on P&IDs.",
    "datasheet": {
     "form": "Davit datasheet (EN 13852-1 / EN 13157)",
     "fields": {
      "Outreach": "reach",
      "Height under hook": "height",
      "Safe working load": "swl",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "gas-cylinder-quad",
   "title": "Gas cylinder quad (bundle)",
   "category": "lifting",
   "description": "Offshore cylinder bundle (\"quad\") of 50 L seamless cylinders in a 2.2 m lifting frame. The frame has an RHS base with fork pockets, a checker-plate floor, SHS posts and top frame, angle clamp rails with rubber strips and guard bars over the valves. Each cylinder has an EN 1089-3 shoulder colour for the gas, a neck, valve and handwheel, and a pigtail to its row header. The headers feed a collector with a master valve, a gauge and an outlet in a guard. Marked with the gas name, a class 2 diamond, a DNV plate and a tag, with padeyes, shackles and a 4-leg sling. count sets the cylinders (default 16, 4 × 4).",
   "import": "./lifting/gas-cylinder-quad",
   "export": "GasCylinderQuad",
   "anchor": "base",
   "standards": [
    "DNV 2.7-1",
    "EN 12079-1",
    "ISO 10961",
    "EN 1089-3",
    "IMCA D 043"
   ],
   "vendors": [
    "Linde",
    "Wilhelmsen Ships Service",
    "Uniteam",
    "Unique Group",
    "SMP"
   ],
   "tags": [
    "gas quad",
    "cylinder bundle",
    "nitrogen",
    "gas rack",
    "logistics"
   ],
   "params": [
    {
     "key": "count",
     "label": "Cylinders",
     "type": "number",
     "min": 4,
     "max": 25,
     "step": 1
    },
    {
     "key": "gas",
     "label": "Gas",
     "type": "select",
     "options": [
      "nitrogen",
      "oxygen",
      "air",
      "helium",
      "argon",
      "co2"
     ]
    },
    {
     "key": "color",
     "label": "Frame colour",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    },
    {
     "key": "liftingSet",
     "label": "Lifting set",
     "type": "bool"
    }
   ],
   "defaults": {
    "count": 16,
    "gas": "nitrogen",
    "color": "#d9a21b",
    "tag": "GQ-101",
    "liftingSet": true
   },
   "ports": [],
   "bounds": {
    "size": [
     1.63,
     3.301,
     1.36
    ],
    "center": [
     0.015,
     1.64,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gas-cylinder-quad.svg",
    "standard": "Layout plan convention (lifting / materials-handling study) / P&ID (bottle rack)",
    "drawn": "Layout: a square frame filled with small circles (the cylinders). On P&IDs a bottle rack is drawn as one or more small capsules joined to a manifold with a regulator (PCV) on the outlet.",
    "notes": "Nitrogen back-up racks and calibration gas bottles use the same drawing; read the gas. A nitrogen generator package is a separate item.",
    "datasheet": {
     "form": "Cylinder bundle certificate (EN 12079-1 / ISO 10961)",
     "fields": {
      "Number of cylinders": "count",
      "Gas": "gas",
      "Lifting set": "liftingSet",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "marine-loading-arm",
   "title": "Marine loading arm",
   "category": "onshore",
   "description": "Counterbalanced marine loading arm on a jetty riser (stand post): base slewing swivel with ring gear, luffing swivel, inboard arm with its counterweight, rigid-link pantograph (lever, tie rod, apex crank) carrying the outboard counterweight, outboard arm, triple swivel, insulating flange, emergency release coupler with twin ball valves, and a hydraulic QC/DC coupler. Hydraulic cylinders, power unit, platform with caged ladder and earth bond. `luff`, `slew` and `outboard` move the arms; the coupler hangs plumb. Stand post height and arm length follow published data per size.",
   "import": "./onshore/marine-loading-arm",
   "export": "MarineLoadingArm",
   "anchor": "base",
   "standards": [
    "OCIMF Design and Construction Specification for Marine Loading Arms",
    "EN 1474",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Emco Wheaton"
   ],
   "tags": [
    "jetty",
    "marine",
    "terminal",
    "loading",
    "ERS",
    "QCDC",
    "swivel"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 6,
     "max": 20
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "reach",
     "label": "Arm length",
     "type": "number",
     "min": 6,
     "max": 14,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "luff",
     "label": "Inboard luff",
     "type": "number",
     "min": 20,
     "max": 85,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "slew",
     "label": "Slew",
     "type": "number",
     "min": -60,
     "max": 60,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "outboard",
     "label": "Outboard",
     "type": "number",
     "min": -15,
     "max": 90,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "ers",
     "label": "Emergency release",
     "type": "bool"
    },
    {
     "key": "hydraulic",
     "label": "Hydraulic",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 12,
    "rating": 150,
    "reach": 11,
    "luff": 55,
    "slew": 0,
    "outboard": 30,
    "ers": true,
    "hydraulic": true,
    "tag": ""
   },
   "ports": [
    {
     "id": "riser",
     "label": "Riser inlet",
     "position": [
      0,
      1.2,
      -0.6404
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 12,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     6.553,
     18.25,
     16.281
    ],
    "center": [
     1.424,
     9.125,
     5.045
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/marine-loading-arm.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / OCIMF loading arm convention",
    "drawn": "An articulated line from the jetty riser through swivel joints (small circles) at the base, apex and outboard end, ending in the emergency release coupling (two close bars with valves) and the ship manifold flange; a counterweight box on the inboard arm.",
    "tags": [
     "MLA"
    ],
    "isa": [
     "XV",
     "ZS"
    ],
    "notes": "Swivels plus the ERS mark tell it from a hose. Truck loading arms are smaller and drawn with the truck outline. ISA codes here: XV = ERS.",
    "datasheet": {
     "form": "Marine loading arm datasheet (OCIMF / EN 1474)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Outreach": "reach",
      "Emergency release system": "ers",
      "Hydraulic operation": "hydraulic",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "truck-loading-bay",
   "title": "Truck loading bay (gantry)",
   "category": "onshore",
   "description": "Road-tanker loading gantry with one island per lane under a portal-frame canopy. Each bay has a meter run (block valve, basket strainer, air eliminator, PD meter with register, digital set-stop valve), API RP 1004 bottom-loading arms with balance cylinders and API couplers, a vapour recovery arm, a counterbalanced top-loading arm with drop tube, a gantry platform with stair and fold-down gangway, a batch controller, an overfill and earth-verification monitor with plug and clamp, and an emergency stop. Product sets the colour bands; `loading` picks bottom, top or both.",
   "import": "./onshore/truck-loading-bay",
   "export": "TruckLoadingBay",
   "anchor": "base",
   "standards": [
    "API RP 1004",
    "EN 13083",
    "API 2610",
    "NFPA 30",
    "ISO 14122",
    "API RP 2003"
   ],
   "vendors": [],
   "tags": [
    "terminal",
    "road tanker",
    "loading rack",
    "gantry",
    "bottom loading",
    "vapour recovery",
    "overfill"
   ],
   "params": [
    {
     "key": "bays",
     "label": "Bays",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "product",
     "label": "Product",
     "type": "select",
     "options": [
      "gasoline",
      "diesel",
      "jet",
      "crude"
     ]
    },
    {
     "key": "loading",
     "label": "Loading",
     "type": "select",
     "options": [
      "bottom",
      "top",
      "both"
     ]
    },
    {
     "key": "nps",
     "label": "Line size",
     "type": "nps",
     "min": 3,
     "max": 6
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "gangwayDown",
     "label": "Gangway down",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "bays": 2,
    "product": "gasoline",
    "loading": "both",
    "nps": 4,
    "rating": 150,
    "gangwayDown": true,
    "tag": ""
   },
   "ports": [
    {
     "id": "inlet-1",
     "label": "Bay 1 product inlet",
     "position": [
      -8.6,
      0.75,
      -5.7
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "inlet-2",
     "label": "Bay 2 product inlet",
     "position": [
      -8.6,
      0.75,
      0.4
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     23,
     7.75,
     13.2
    ],
    "center": [
     0.5,
     3.875,
     0
    ]
   },
   "registryDependencies": [
    "core",
    "gate-valve"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/truck-loading-bay.svg",
    "standard": "ISO 10628-2 / PIP PIC001 + ISA 5.1 metering / layout convention for the bay",
    "drawn": "Per bay: block valve, strainer, meter (FE / FQ, often PD), digital set-stop control valve and the loading arm or hose dropping to a road tanker outline; on the plot plan, lanes under a canopy rectangle.",
    "tags": [
     "TLB"
    ],
    "isa": [
     "FQ",
     "FQIC",
     "FV",
     "XV"
    ],
    "notes": "A meter run ending at a tanker outline is the clue. Marine loading uses articulated arms to a ship manifold instead.",
    "datasheet": {
     "form": "Loading bay specification (API RP 1004 / EN 13083, API 2610)",
     "fields": {
      "Number of bays": "bays",
      "Product": "product",
      "Loading method": "loading",
      "Line size": "nps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pipeline-valve-station",
   "title": "Pipeline block-valve station",
   "category": "onshore",
   "description": "Mainline block-valve station on a buried pipeline. A fully welded, full-bore trunnion ball valve sits in the trench on a support pad, with a stem extension and extended vent, drain and sealant lines up to a concrete pad, topped by a gas-over-oil (twin gas/oil tanks, scotch-yoke, manual pump) or electric actuator. Above grade: bypass with two block valves, blowdown risers with valves to a common stack and silencer, pressure transmitters, RTU kiosk with solar panel, CP test post, marker posts and a chain-link compound with a double gate. `cutaway` leaves the trench open; `cover` sets the depth of cover; ports are flanged pup ends at the trench limits.",
   "import": "./onshore/pipeline-valve-station",
   "export": "PipelineValveStation",
   "anchor": "base",
   "standards": [
    "ASME B31.8",
    "API 6D",
    "ISO 14313",
    "ASME B16.5",
    "BS 1722-10"
   ],
   "vendors": [],
   "tags": [
    "pipeline",
    "block valve",
    "MLV",
    "buried",
    "blowdown",
    "bypass",
    "gas transmission"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Mainline size",
     "type": "nps",
     "min": 8,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900
     ]
    },
    {
     "key": "actuator",
     "label": "Actuator",
     "type": "select",
     "options": [
      "gas-over-oil",
      "electric"
     ]
    },
    {
     "key": "cover",
     "label": "Cover",
     "type": "number",
     "min": 0.6,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "cutaway",
     "label": "Cut-away trench",
     "type": "bool"
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 24,
    "rating": 600,
    "actuator": "gas-over-oil",
    "cover": 1.2,
    "cutaway": true,
    "open": 1,
    "tag": ""
   },
   "ports": [
    {
     "id": "upstream",
     "label": "Upstream pipeline",
     "position": [
      -7,
      -1.505,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 24,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "downstream",
     "label": "Downstream pipeline",
     "position": [
      7,
      -1.505,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 24,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     14.121,
     7.66,
     8.6
    ],
    "center": [
     0,
     1.37,
     -0.9
    ]
   },
   "registryDependencies": [
    "core",
    "gate-valve"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipeline-valve-station.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / pipeline P&ID convention (ASME B31.8)",
    "drawn": "A mainline ball valve below the grade line with its stem extended up to an above-grade actuator (rectangle: gas-over-oil or electric), and blowdown / bypass branches rising to their own valves; often within a fenced compound outline.",
    "tags": [
     "BVS",
     "MLV",
     "SDV"
    ],
    "isa": [
     "XV",
     "SDV",
     "PT",
     "ZS"
    ],
    "notes": "The grade line with a buried valve and stem extension identifies it. Topsides ESDVs are esd-valve.",
    "datasheet": {
     "form": "Pipeline valve datasheet (API 6D / ISO 14313) + actuator sheet",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Actuator type": "actuator",
      "Depth of cover": "cover",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "packaged-boiler",
   "title": "Packaged fire-tube steam boiler",
   "category": "onshore",
   "description": "Three-pass wetback shell (fire-tube) steam boiler on a skid and housekeeping pad: ribbed clad shell on saddles, bolted front and rear smoke-box doors with davits, flue outlet and stack, duoblock burner with windbox, FD fan with motor and inlet silencer, gas train (isolation, filter, regulator, double block shut-offs), main steam stop valve, twin safety valves with escape pipes, manway, water column with two gauge glasses and level controls, feedwater and bottom-blowdown connections, control panel, and an optional top platform with caged ladder. Shell size scales with `steam` (t/h).",
   "import": "./onshore/packaged-boiler",
   "export": "PackagedBoiler",
   "anchor": "base",
   "standards": [
    "EN 12953",
    "ASME Section I",
    "EN 676",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Cleaver-Brooks"
   ],
   "tags": [
    "boiler",
    "steam",
    "utilities",
    "fire-tube",
    "shell boiler",
    "burner"
   ],
   "params": [
    {
     "key": "steam",
     "label": "Steam output",
     "type": "number",
     "min": 1,
     "max": 25,
     "step": 0.5,
     "unit": "t/h"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 6,
     "max": 30,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "fuel",
     "label": "Fuel",
     "type": "select",
     "options": [
      "gas",
      "dual"
     ]
    },
    {
     "key": "platform",
     "label": "Top platform",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "steam": 8,
    "pressure": 12,
    "rating": 300,
    "fuel": "gas",
    "platform": true,
    "tag": ""
   },
   "ports": [
    {
     "id": "steam",
     "label": "Main steam",
     "position": [
      0.697,
      3.7479,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "feedwater",
     "label": "Feedwater",
     "position": [
      0.697,
      2.243,
      1.4043
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "blowdown",
     "label": "Bottom blowdown",
     "position": [
      2.207,
      0.38,
      1.56
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 2,
     "rating": 300,
     "kind": "drain"
    },
    {
     "id": "fuel",
     "label": "Fuel gas",
     "position": [
      -1.904,
      0.95,
      1.96
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 2,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     9.408,
     7.79,
     4.269
    ],
    "center": [
     -0.95,
     3.895,
     -0.154
    ]
   },
   "registryDependencies": [
    "core",
    "gate-valve"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/packaged-boiler.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (boiler / fired steam generator)",
    "drawn": "A horizontal shell (capsule) with fire tubes drawn as parallel lines inside, a burner box with the fuel line on the front end, a flue stack on top, steam outlet from the top and feedwater inlet; often inside a package boundary with the feedwater pumps.",
    "tags": [
     "BLR",
     "H"
    ],
    "notes": "Shell with tubes plus burner and stack = fire-tube boiler. A fired heater is a vertical firebox with a process coil; a TEG reboiler is a smaller fire-tube capsule inside a regeneration package.",
    "datasheet": {
     "form": "Steam boiler datasheet (EN 12953 / ASME Section I)",
     "fields": {
      "Steam output": "steam",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Fuel": "fuel",
      "Access platform": "platform",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "oily-water-separator",
   "title": "Oily-water separator (CPI)",
   "category": "onshore",
   "description": "Corrugated plate interceptor in a lined reinforced-concrete or stiffened steel basin. Inlet chamber with sludge draw-off, perforated distribution baffle, 45° corrugated plate packs in stainless frames (one per 60 m³/h), oil layer gathering at a rotatable slotted-pipe skimmer, underflow baffle and adjustable outlet weir into the clean-water chamber. Checker-plate covers with vents and a level transmitter leave the plate-pack bay open; walkway and stair along one wall. Ports: inlet, treated-water outlet and skimmed-oil outlet.",
   "import": "./onshore/oily-water-separator",
   "export": "OilyWaterSeparator",
   "anchor": "base",
   "standards": [
    "API 421",
    "API 650 (steel variant)",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [],
   "tags": [
    "produced water",
    "effluent",
    "CPI",
    "interceptor",
    "drains",
    "oil skimmer",
    "terminal"
   ],
   "params": [
    {
     "key": "flow",
     "label": "Design flow",
     "type": "number",
     "min": 30,
     "max": 360,
     "step": 10,
     "unit": "m³/h"
    },
    {
     "key": "construction",
     "label": "Construction",
     "type": "select",
     "options": [
      "concrete",
      "steel"
     ]
    },
    {
     "key": "inletNps",
     "label": "Inlet / outlet",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "oilNps",
     "label": "Oil outlet",
     "type": "nps",
     "min": 2,
     "max": 6
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "covers",
     "label": "Covers",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "flow": 120,
    "construction": "concrete",
    "inletNps": 8,
    "oilNps": 3,
    "rating": 150,
    "covers": true,
    "tag": ""
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Oily water inlet",
     "position": [
      -4.25,
      2.15,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "water-out",
     "label": "Treated water outlet",
     "position": [
      4.25,
      1.9,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "oil-out",
     "label": "Skimmed oil outlet",
     "position": [
      0.4,
      2,
      1.85
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 3,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     11.32,
     3.951,
     4.341
    ],
    "center": [
     -1.268,
     1.976,
     -0.3
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/oily-water-separator.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (open separator / interceptor)",
    "drawn": "An open rectangular basin (no top line) with inclined parallel plates drawn as slanted lines in the middle, an inlet chamber with a baffle, an oil skimmer or weir to the oil outlet, a sludge draw-off at the bottom and the clean water outlet over a weir at the far end.",
    "tags": [
     "V",
     "T",
     "X"
    ],
    "notes": "Slanted plate pack in an open basin = CPI / plate interceptor. A closed horizontal vessel with weirs is a separator; produced water offshore uses hydrocyclones and degassers instead.",
    "datasheet": {
     "form": "Oil-water separator datasheet (API 421)",
     "fields": {
      "Design flow": "flow",
      "Construction": "construction",
      "Inlet size": "inletNps",
      "Oil outlet size": "oilNps",
      "Flange rating": "rating",
      "Covers": "covers",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "bund-wall",
   "title": "Tank bund wall",
   "category": "onshore",
   "description": "Reinforced-concrete secondary containment: walls on a footing toe with coping, internal coating band and sealed expansion joints, a lined floor slab with perimeter fillets falling to a gully and a gratinged sump, a drain line through the wall to a normally-closed bund drain valve, step-over stairs (outside flight, landing over the wall, inside flight) to ISO 14122, and a capacity sign. `complete` builds the full rectangle (length × width); otherwise a single straight wall segment along X.",
   "import": "./onshore/bund-wall",
   "export": "BundWall",
   "anchor": "base",
   "standards": [
    "NFPA 30",
    "API 2610",
    "EN 1992-3",
    "EI 19",
    "ISO 14122"
   ],
   "vendors": [],
   "tags": [
    "bund",
    "dike",
    "secondary containment",
    "tank farm",
    "terminal",
    "civil"
   ],
   "params": [
    {
     "key": "complete",
     "label": "Complete bund",
     "type": "bool"
    },
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 3,
     "max": 120,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 3,
     "max": 120,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Wall height",
     "type": "number",
     "min": 0.4,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "thickness",
     "label": "Wall thickness",
     "type": "number",
     "min": 0.2,
     "max": 0.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "stairs",
     "label": "Step-over stairs",
     "type": "bool"
    },
    {
     "key": "drainNps",
     "label": "Drain size",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "complete": true,
    "length": 30,
    "width": 22,
    "height": 1.5,
    "thickness": 0.3,
    "stairs": true,
    "drainNps": 4,
    "tag": ""
   },
   "ports": [
    {
     "id": "drain",
     "label": "Bund drain",
     "position": [
      15.6,
      0.35,
      9.8
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     30.871,
     2.706,
     26.669
    ],
    "center": [
     0.185,
     1.348,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/bund-wall.svg",
    "standard": "Layout plan convention (plot plan containment)",
    "drawn": "Plot plan: a double-line rectangle (the wall thickness) enclosing the tank outline, with the bund drain sump in a corner and a normally closed drain valve outside the wall; the bund capacity and wall height are noted.",
    "tags": [
     "BW"
    ],
    "notes": "A double-line enclosure around tanks = bund. On P&IDs only the bund drain line and its locked-closed valve appear.",
    "datasheet": {
     "form": "Secondary containment design (NFPA 30 / EI 19, EN 1992-3)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Wall height": "height",
      "Wall thickness": "thickness",
      "Access stairs": "stairs",
      "Drain size": "drainNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "perimeter-fence",
   "title": "Perimeter security fence",
   "category": "onshore",
   "description": "Straight fence run along X. Palisade: RSJ posts at 2.75 m on concrete footings, angle rails and bolted W-section pales with triple-pointed heads. Chain-link: tube posts at 3 m, top rail, tension wires, 50 mm diamond mesh and diagonal braces. Topping is cranked arms with three barbed strands or a razor coil. Gate options are a double-leaf swing gate or a cantilever sliding gate with roller posts and motor operator. Warning signs and gate earth bond.",
   "import": "./onshore/perimeter-fence",
   "export": "PerimeterFence",
   "anchor": "base",
   "standards": [
    "BS 1722-10",
    "BS 1722-12",
    "ASTM F567",
    "ASTM F1184"
   ],
   "vendors": [],
   "tags": [
    "fence",
    "security",
    "palisade",
    "chain-link",
    "gate",
    "razor wire",
    "site"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 2,
     "max": 120,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "palisade",
      "chain-link"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1.2,
     "max": 3.6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "topping",
     "label": "Topping",
     "type": "select",
     "options": [
      "razor",
      "barbed",
      "none"
     ]
    },
    {
     "key": "gate",
     "label": "Gate",
     "type": "select",
     "options": [
      "none",
      "swing",
      "sliding"
     ]
    },
    {
     "key": "gateWidth",
     "label": "Gate opening",
     "type": "number",
     "min": 1,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "green"
     ]
    },
    {
     "key": "tag",
     "label": "Sign",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 30,
    "style": "palisade",
    "height": 2.4,
    "topping": "razor",
    "gate": "sliding",
    "gateWidth": 6,
    "finish": "galvanised",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     20.312,
     3.018,
     0.954
    ],
    "center": [
     0,
     1.509,
     0.273
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/perimeter-fence.svg",
    "standard": "Layout plan convention (site plan)",
    "drawn": "Site plan: a line with crosses at intervals (-x-x-) along the boundary, gates shown as a swing (leaf and arc) or a sliding leaf, with fence height and type noted.",
    "tags": [
     "FNC"
    ],
    "notes": "Only on site plans. The crosses tell it from a wall (solid double line) or a kerb.",
    "datasheet": {
     "form": "Fencing specification (BS 1722-10 / -12, ASTM F567)",
     "fields": {
      "Run length": "length",
      "Style": "style",
      "Height": "height",
      "Topping": "topping",
      "Gate": "gate",
      "Gate width": "gateWidth",
      "Finish": "finish",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hv-circuit-breaker",
   "title": "HV circuit breaker (live tank SF6)",
   "category": "onshore",
   "description": "Outdoor live-tank SF6 circuit breaker: three poles on a common base frame carried by two tubular columns on piers. Each pole has a support insulator, a cast mechanism head with the lower terminal pad, an interrupter insulator and a top flange with the upper terminal. At 420 kV the head is a T with two horizontal interrupters, grading capacitors and corona rings. SF6 density monitors, gas piping, interphase linkage, and a spring operating-mechanism cubicle under the frame. Insulator heights and phase spacing follow the rated voltage.",
   "import": "./onshore/hv-circuit-breaker",
   "export": "HvCircuitBreaker",
   "anchor": "base",
   "standards": [
    "IEC 62271-100",
    "IEC 62271-1",
    "IEC 60071-1",
    "IEC 61936-1",
    "IEC 60273"
   ],
   "vendors": [],
   "tags": [
    "substation",
    "switchyard",
    "breaker",
    "SF6",
    "live tank",
    "HV",
    "electrical"
   ],
   "params": [
    {
     "key": "kv",
     "label": "Rated voltage",
     "type": "select",
     "options": [
      {
       "value": 72.5,
       "label": "72.5 kV"
      },
      {
       "value": 145,
       "label": "145 kV"
      },
      {
       "value": 245,
       "label": "245 kV"
      },
      {
       "value": 420,
       "label": "420 kV"
      }
     ]
    },
    {
     "key": "insulation",
     "label": "Insulation",
     "type": "select",
     "options": [
      "porcelain",
      "composite"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kv": 145,
    "insulation": "porcelain",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     5.723,
     6.335,
     1.113
    ],
    "center": [
     0,
     3.167,
     0.17
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hv-circuit-breaker.svg",
    "standard": "IEC 60617 (single-line diagram); IEC 62271-100",
    "drawn": "Single-line: a switch blade (a line at an angle) with a small × on the fixed contact, in the feeder between busbar and line or transformer; often drawn inside a bay with disconnectors on either side.",
    "tags": [
     "CB",
     "QA"
    ],
    "notes": "IEC symbols: × on the contact = circuit breaker; a bar across the contact = disconnector; a blade to the earth symbol = earthing switch. ANSI drawings use a square box with device number 52. QA / QB / QC are IEC 81346-2 class letters for breaker, disconnector and earthing switch.",
    "datasheet": {
     "form": "HV circuit breaker datasheet (IEC 62271-100)",
     "fields": {
      "Rated voltage": "kv",
      "External insulation": "insulation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "disconnector",
   "title": "HV disconnector with earthing switch",
   "category": "onshore",
   "description": "Outdoor three-pole disconnector on four tubular columns and cross beams. Centre-break: two rotating post insulators per phase on bearings, carrying contact arms that meet in the middle (male and finger contacts) and swing 90° to the same side as `open` goes to 1. Pantograph: a support insulator and a rotating operating insulator, with scissor arms folding as it opens. Each phase has a hinged earthing blade that rises to the terminal when `earthed` and the main contacts are open. Motor operating mechanism with drive shaft and interphase coupling rods; manual earthing-switch mechanism.",
   "import": "./onshore/disconnector",
   "export": "Disconnector",
   "anchor": "base",
   "standards": [
    "IEC 62271-102",
    "IEC 62271-1",
    "IEC 60273",
    "IEC 61936-1"
   ],
   "vendors": [
    "Hitachi Energy"
   ],
   "tags": [
    "substation",
    "switchyard",
    "isolator",
    "disconnect switch",
    "earthing switch",
    "HV",
    "electrical"
   ],
   "params": [
    {
     "key": "kv",
     "label": "Rated voltage",
     "type": "select",
     "options": [
      {
       "value": 72.5,
       "label": "72.5 kV"
      },
      {
       "value": 145,
       "label": "145 kV"
      },
      {
       "value": 245,
       "label": "245 kV"
      },
      {
       "value": 420,
       "label": "420 kV"
      }
     ]
    },
    {
     "key": "style",
     "label": "Type",
     "type": "select",
     "options": [
      "centre-break",
      "pantograph"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "earthed",
     "label": "Earthed",
     "type": "bool"
    },
    {
     "key": "insulation",
     "label": "Insulation",
     "type": "select",
     "options": [
      "porcelain",
      "composite"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kv": 145,
    "style": "centre-break",
    "open": 0,
    "earthed": false,
    "insulation": "porcelain",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     6.719,
     4.59,
     4.947
    ],
    "center": [
     0,
     2.295,
     -0.725
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/disconnector.svg",
    "standard": "IEC 60617 (single-line diagram); IEC 62271-102",
    "drawn": "Single-line: a switch blade with a short bar across the fixed contact (disconnector), usually next to an earthing switch drawn as a second blade going to the earth symbol (three shortening lines).",
    "tags": [
     "QB",
     "QC"
    ],
    "notes": "Bar on the contact = disconnector (isolator, no load breaking); × = circuit breaker. Some drawings tag disconnectors DS. ANSI device numbers are 89 for the disconnector and 57 for the earthing switch.",
    "datasheet": {
     "form": "HV disconnector datasheet (IEC 62271-102)",
     "fields": {
      "Rated voltage": "kv",
      "Style": "style",
      "External insulation": "insulation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "instrument-transformer",
   "title": "Instrument transformer (CT / VT / CVT)",
   "category": "onshore",
   "description": "Single-phase outdoor instrument transformer on a tubular support. CT: head type, with the oil-filled head on a tall insulator, P1/P2 primary pads and an oil-level bellows. VT: inductive, with a ribbed base tank and a single top terminal. CVT: stacked capacitor units on an electromagnetic-unit tank. Each has a secondary terminal box with a conduit to grade, an earth bond, and a grading ring at 245 kV and above.",
   "import": "./onshore/instrument-transformer",
   "export": "InstrumentTransformer",
   "anchor": "base",
   "standards": [
    "IEC 61869-2",
    "IEC 61869-3",
    "IEC 61869-5",
    "IEC 60071-1"
   ],
   "vendors": [],
   "tags": [
    "substation",
    "CT",
    "VT",
    "CVT",
    "metering",
    "protection",
    "HV",
    "electrical"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "ct",
      "vt",
      "cvt"
     ]
    },
    {
     "key": "kv",
     "label": "Rated voltage",
     "type": "select",
     "options": [
      {
       "value": 72.5,
       "label": "72.5 kV"
      },
      {
       "value": 145,
       "label": "145 kV"
      },
      {
       "value": 245,
       "label": "245 kV"
      },
      {
       "value": 420,
       "label": "420 kV"
      }
     ]
    },
    {
     "key": "insulation",
     "label": "Insulation",
     "type": "select",
     "options": [
      "porcelain",
      "composite"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "ct",
    "kv": 145,
    "insulation": "porcelain",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     0.872,
     5.733,
     1.48
    ],
    "center": [
     0,
     2.866,
     0.012
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/instrument-transformer.svg",
    "standard": "IEC 60617 (single-line diagram); IEC 61869",
    "drawn": "Single-line: a current transformer is a small circle threaded on the primary conductor (or a loop) with its secondary leads; a voltage transformer is a pair of small overlapping circles connected from the line to earth. A CVT adds a capacitor stack (two parallel plates) above the VT.",
    "tags": [
     "CT",
     "VT",
     "CVT"
    ],
    "notes": "Circle on the line = CT; two circles from line to earth = VT. Small overlapping circles in a feeder (not to earth) are a power transformer. CT also collides with cooling-tower tags on process drawings: context decides.",
    "datasheet": {
     "form": "Instrument transformer datasheet (IEC 61869-2 / -3 / -5)",
     "fields": {
      "Type": "kind",
      "Rated voltage": "kv",
      "External insulation": "insulation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "surge-arrester",
   "title": "Surge arrester (station class)",
   "category": "onshore",
   "description": "Station-class metal-oxide surge arrester on a tubular support: one to four stacked housed units (by system voltage) with pressure-relief vents, top terminal and a hanging grading ring from 145 kV. It stands on an insulating base of four small post insulators, with an insulated lead to a surge counter / leakage monitor on the column and an earth lead to an inspection pit.",
   "import": "./onshore/surge-arrester",
   "export": "SurgeArrester",
   "anchor": "base",
   "standards": [
    "IEC 60099-4",
    "IEC 60099-5",
    "IEC 61936-1"
   ],
   "vendors": [],
   "tags": [
    "substation",
    "lightning arrester",
    "MOV",
    "surge counter",
    "HV",
    "electrical"
   ],
   "params": [
    {
     "key": "kv",
     "label": "Rated voltage",
     "type": "select",
     "options": [
      {
       "value": 72.5,
       "label": "72.5 kV"
      },
      {
       "value": 145,
       "label": "145 kV"
      },
      {
       "value": 245,
       "label": "245 kV"
      },
      {
       "value": 420,
       "label": "420 kV"
      }
     ]
    },
    {
     "key": "insulation",
     "label": "Insulation",
     "type": "select",
     "options": [
      "porcelain",
      "composite"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kv": 145,
    "insulation": "composite",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     1.005,
     5.353,
     1.192
    ],
    "center": [
     0,
     2.677,
     0.094
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/surge-arrester.svg",
    "standard": "IEC 60617 (single-line diagram); IEC 60099-4",
    "drawn": "Single-line: a rectangle (non-linear resistor) with an arrow inside pointing to earth, connected from the line to the earth symbol, usually at transformer terminals and line entries.",
    "tags": [
     "SA",
     "LA"
    ],
    "notes": "Rectangle with an internal arrow to earth = surge arrester; a plain rectangle to earth on a neutral is a neutral earthing resistor. LA (lightning arrester) is an older name.",
    "datasheet": {
     "form": "Surge arrester datasheet (IEC 60099-4)",
     "fields": {
      "System voltage": "kv",
      "Housing insulation": "insulation",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "busbar-gantry",
   "title": "Substation strain gantry",
   "category": "onshore",
   "description": "Pair of substation strain gantries `span` apart: square lattice columns on piers, box lattice girders, earth-wire peaks with shield wires, anti-climb guards and earth bonds. Each phase of each bay has cap-and-pin glass strain strings (disc count by voltage) and a stranded conductor with about 3 % sag, twin-bundled at 420 kV. Bay width, column height and phase spacing scale with `kv`.",
   "import": "./onshore/busbar-gantry",
   "export": "BusbarGantry",
   "anchor": "base",
   "standards": [
    "IEC 61936-1",
    "IEC 60383",
    "IEC 60305",
    "EN 50341"
   ],
   "vendors": [],
   "tags": [
    "substation",
    "switchyard",
    "gantry",
    "strung bus",
    "overhead line",
    "HV",
    "structure"
   ],
   "params": [
    {
     "key": "bays",
     "label": "Bays",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "kv",
     "label": "Rated voltage",
     "type": "select",
     "options": [
      {
       "value": 72.5,
       "label": "72.5 kV"
      },
      {
       "value": 145,
       "label": "145 kV"
      },
      {
       "value": 245,
       "label": "245 kV"
      },
      {
       "value": 420,
       "label": "420 kV"
      }
     ]
    },
    {
     "key": "span",
     "label": "Span",
     "type": "number",
     "min": 8,
     "max": 60,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "bays": 2,
    "kv": 145,
    "span": 24,
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     21.525,
     12.575,
     25.865
    ],
    "center": [
     0,
     6.287,
     0.17
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/busbar-gantry.svg",
    "standard": "IEC 60617 (single-line diagram) (busbar); layout elevation for the gantry steel",
    "drawn": "Single-line: a thick horizontal line (busbar) with bay connections dropping from it at dots; on substation layouts and elevations the gantry is a pair of lattice columns with a girder carrying strain insulator strings and the bus conductors.",
    "tags": [
     "BB",
     "BUS"
    ],
    "notes": "A thick line with feeders = busbar. Double-busbar stations show two parallel thick lines with a coupler bay between them.",
    "datasheet": {
     "form": "Substation design basis (IEC 61936-1, IEC 60383 insulators)",
     "fields": {
      "Number of bays": "bays",
      "Rated voltage": "kv",
      "Gantry span": "span",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "industrial-building",
   "title": "Industrial building (portal frame)",
   "category": "onshore",
   "description": "Steel portal-frame building shell on a floor slab: IPE columns with haunched rafters on anchored base plates, purlins, a blockwork dado with profiled metal cladding above, a profiled duo-pitch roof with rooflights, ridge cap, ridge ventilators, gutters and downpipes. Roller shutters have coil boxes, motors, striped jambs, bollards and ramps; personnel doors have canopies, exit signs and lights. High-level louvres, lightning down-conductors with earth pits. `kind`: a workshop adds an overhead crane, a control building swaps the shutters for a window strip and AC condensers. The roller shutters open with `doorOpen`, showing the hollow interior.",
   "import": "./onshore/industrial-building",
   "export": "IndustrialBuilding",
   "anchor": "base",
   "standards": [
    "EN 1993-1-1",
    "EN 14509",
    "EN 508-1",
    "EN 13241",
    "EN 62305-3"
   ],
   "vendors": [],
   "tags": [
    "building",
    "warehouse",
    "workshop",
    "control building",
    "portal frame",
    "site",
    "civil"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Use",
     "type": "select",
     "options": [
      "warehouse",
      "workshop",
      "control"
     ]
    },
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 6,
     "max": 90,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Span",
     "type": "number",
     "min": 6,
     "max": 40,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "eaves",
     "label": "Eaves height",
     "type": "number",
     "min": 3,
     "max": 15,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "pitch",
     "label": "Roof pitch",
     "type": "number",
     "min": 3,
     "max": 20,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "rollerDoors",
     "label": "Roller shutters",
     "type": "number",
     "min": 0,
     "max": 6,
     "step": 1
    },
    {
     "key": "personnelDoors",
     "label": "Personnel doors",
     "type": "number",
     "min": 0,
     "max": 6,
     "step": 1
    },
    {
     "key": "doorOpen",
     "label": "Shutters open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "cladding",
     "label": "Cladding",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Name",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "workshop",
    "length": 30,
    "width": 18,
    "eaves": 7,
    "pitch": 6,
    "rollerDoors": 2,
    "personnelDoors": 2,
    "doorOpen": 0.6,
    "cladding": "#9fb0b6",
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     31.1,
     8.701,
     20.01
    ],
    "center": [
     0,
     4.35,
     0.595
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/industrial-building.svg",
    "standard": "Layout plan convention (site plan / architectural plan)",
    "drawn": "Site or floor plan: a rectangle on the structural grid (dash-dot), with roller-shutter doors shown as dashed lines across openings and personnel doors as swing arcs; the building name and use are written inside.",
    "tags": [
     "B",
     "BLDG"
    ],
    "notes": "Buildings are identified by label on plot plans; an E-house or analyser shelter is smaller and skid-based. Not on P&IDs.",
    "datasheet": {
     "form": "Building specification (EN 1993-1-1 frame, EN 14509 cladding, EN 13241 doors)",
     "fields": {
      "Use": "kind",
      "Length": "length",
      "Width": "width",
      "Eaves height": "eaves",
      "Roof pitch": "pitch",
      "Roller doors": "rollerDoors",
      "Personnel doors": "personnelDoors",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "gatehouse",
   "title": "Gatehouse with boom barrier",
   "category": "onshore",
   "description": "Site security gatehouse on a kerbed island with striped ends. The glazed guard hut has solid lower panels, mullions, a part-glazed door, a flat roof with a canopy over the lane, a SECURITY fascia and an inside counter with monitors and a chair. Outside are a wall-mounted AC condenser, a CCTV and floodlight pole, an automatic boom barrier cabinet with bollards and earth bond, a red and white boom with a rubber skirt, a rest post across the lane, a stop line and a road hump. `open` raises the boom.",
   "import": "./onshore/gatehouse",
   "export": "Gatehouse",
   "anchor": "base",
   "standards": [
    "EN 12453",
    "EN 13241",
    "EN 12635"
   ],
   "vendors": [],
   "tags": [
    "security",
    "gate",
    "barrier",
    "guard house",
    "access control",
    "site",
    "building"
   ],
   "params": [
    {
     "key": "laneWidth",
     "label": "Lane width",
     "type": "number",
     "min": 3,
     "max": 8,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "open",
     "label": "Boom raised",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "laneWidth": 5,
    "open": 0,
    "tag": ""
   },
   "ports": [],
   "bounds": {
    "size": [
     7.5,
     5.191,
     8.87
    ],
    "center": [
     -0.75,
     2.595,
     2.715
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gatehouse.svg",
    "standard": "Layout plan convention (site plan)",
    "drawn": "Site plan: a small hut rectangle on a kerbed island beside the lane, a boom barrier drawn as a thick line from a pivot across the lane, and lane direction arrows.",
    "tags": [
     "GH"
    ],
    "notes": "Only on site and security plans.",
    "datasheet": {
     "form": "Barrier / gate specification (EN 12453, EN 13241)",
     "fields": {
      "Lane width": "laneWidth",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "chemical-injection-skid",
   "title": "Chemical injection skid",
   "category": "packages",
   "description": "Bunded chemical injection package: stainless storage tank on legs with magnetic level gauge, radar transmitter, breather with flame arrestor and fill line, a row of motor-driven diaphragm metering pumps with suction header, calibration pot, Y-strainers, pulsation dampeners, PSVs returning to the tank, back-pressure and non-return valves, gauges, an Ex junction box, a local control panel with HMI and cable tray, drip trays and shackled padeyes. One battery-limit outlet per pump; `pumps` sets the count and the skid length.",
   "import": "./packages/chemical-injection-skid",
   "export": "ChemicalInjectionSkid",
   "anchor": "base",
   "standards": [
    "API 675",
    "ASME B31.3",
    "ASME B16.5",
    "IEC 60072"
   ],
   "vendors": [
    "LEWA",
    "Pulsafeeder",
    "Blue-White"
   ],
   "tags": [
    "chemical injection",
    "metering pump",
    "corrosion inhibitor",
    "scale inhibitor",
    "skid"
   ],
   "params": [
    {
     "key": "pumps",
     "label": "Metering pumps",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "tankDiameter",
     "label": "Tank diameter",
     "type": "number",
     "min": 0.6,
     "max": 1.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tankHeight",
     "label": "Tank height",
     "type": "number",
     "min": 0.8,
     "max": 2.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "kw",
     "label": "Pump motor",
     "type": "number",
     "min": 0.37,
     "max": 7.5,
     "step": 0.01,
     "unit": "kW"
    },
    {
     "key": "fillNps",
     "label": "Fill",
     "type": "nps",
     "min": 1,
     "max": 3
    },
    {
     "key": "outletNps",
     "label": "Outlets",
     "type": "nps",
     "min": 0.5,
     "max": 1
    },
    {
     "key": "outletRating",
     "label": "Outlet class",
     "type": "rating"
    },
    {
     "key": "chemical",
     "label": "Chemical",
     "type": "text"
    },
    {
     "key": "canopy",
     "label": "Sunshade",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "pumps": 3,
    "tankDiameter": 1,
    "tankHeight": 1.4,
    "kw": 0.75,
    "fillNps": 2,
    "outletNps": 0.5,
    "outletRating": 1500,
    "chemical": "CORROSION INHIBITOR",
    "canopy": false,
    "tag": "X-1700",
    "running": true
   },
   "ports": [
    {
     "id": "fill",
     "label": "Chemical fill",
     "position": [
      -2.296,
      1.118,
      -0.194
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "outlet-1",
     "label": "Injection outlet 1",
     "position": [
      2.296,
      1.518,
      -0.03
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 1500,
     "kind": "utility"
    },
    {
     "id": "outlet-2",
     "label": "Injection outlet 2",
     "position": [
      2.296,
      1.518,
      -0.18
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 1500,
     "kind": "utility"
    },
    {
     "id": "outlet-3",
     "label": "Injection outlet 3",
     "position": [
      2.296,
      1.518,
      -0.33
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 1500,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     4.748,
     2.929,
     1.992
    ],
    "center": [
     0.057,
     1.465,
     0.013
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/chemical-injection-skid.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents)",
    "drawn": "Dash-dot package boundary containing a small storage tank, a suction header and one or more metering pumps (small circles with a diagonal arrow), with injection lines (CI / MI, ½\"–1\") leaving to the injection points, each with a check valve and isolation at the quill.",
    "tags": [
     "C",
     "X",
     "A"
    ],
    "notes": "The chemical (demulsifier, corrosion inhibitor, scale inhibitor, methanol, biocide) is written on the tank or on the outgoing lines. Vendor packages are often a single box with only the battery-limit connections shown.",
    "datasheet": {
     "form": "Chemical injection package datasheet (API 675 pumps)",
     "fields": {
      "Number of pumps": "pumps",
      "Tank diameter": "tankDiameter",
      "Tank height": "tankHeight",
      "Pump driver power": "kw",
      "Fill connection size": "fillNps",
      "Injection outlet size": "outletNps",
      "Outlet flange rating": "outletRating",
      "Chemical": "chemical",
      "Canopy": "canopy",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "metering-skid",
   "title": "Fiscal metering skid",
   "category": "packages",
   "description": "Liquid or gas fiscal metering skid: inlet and outlet headers with blind-flanged ends, parallel meter runs (ultrasonic or turbine) each with an inlet block valve, basket strainer with DP gauge, plate flow conditioner, 10D / 5D straight lengths, P transmitter, duplicate TTs plus a test thermowell, thermal relief valve and a motor-operated DBB outlet valve with body bleed, plus a prover header with MOV diverters, prover return with check valve, sampler, densitometer loop, local JB and overhead cable tray. `runs` sets the run count and skid width.",
   "import": "./packages/metering-skid",
   "export": "MeteringSkid",
   "anchor": "base",
   "standards": [
    "API MPMS Ch. 4 / 5",
    "ISO 17089-1",
    "AGA 9",
    "ASME B16.5",
    "ASME B16.10"
   ],
   "vendors": [
    "Emerson (Daniel)",
    "KROHNE",
    "Sensia / SLB (Caldon)"
   ],
   "tags": [
    "metering",
    "fiscal",
    "custody transfer",
    "ultrasonic",
    "turbine",
    "prover"
   ],
   "params": [
    {
     "key": "runs",
     "label": "Meter runs",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "meterType",
     "label": "Meter",
     "type": "select",
     "options": [
      "ultrasonic",
      "turbine"
     ]
    },
    {
     "key": "headerNps",
     "label": "Header",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "runNps",
     "label": "Meter run",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "runs": 3,
    "meterType": "ultrasonic",
    "headerNps": 10,
    "runNps": 6,
    "rating": 600,
    "tag": "X-R150"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -4.7326,
      1.7132,
      -1.7556
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      4.7326,
      1.7132,
      -1.7556
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "prover-out",
     "label": "To prover",
     "position": [
      4.7326,
      0.548,
      -1.7556
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "prover-return",
     "label": "From prover",
     "position": [
      4.7326,
      0.548,
      1.5056
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     9.541,
     2.673,
     4.875
    ],
    "center": [
     0,
     1.337,
     -0.001
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/metering-skid.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents); ISA 5.1 FE / FQ",
    "drawn": "Dash-dot boundary with an inlet header and outlet header joined by parallel meter runs; each run has an inlet block valve, strainer, flow element (FE / FQ, ultrasonic or turbine) with PT and TT, and an outlet valve; a prover connection and sampler may be shown.",
    "tags": [
     "X",
     "A"
    ],
    "isa": [
     "FE",
     "FT",
     "FQI",
     "FQ",
     "PT",
     "TT",
     "AT"
    ],
    "notes": "Parallel identical runs between two headers are the signature. A single flowmeter in a line is an instrument, not a metering skid; a compact prover (X-R155 type) is a separate box connected by the prover loop. ISA codes here: AT = sampler / densitometer.",
    "datasheet": {
     "form": "Fiscal metering system datasheet (API MPMS Ch. 4 / 5, AGA 9 / ISO 17089-1)",
     "fields": {
      "Number of meter runs": "runs",
      "Meter type": "meterType",
      "Header size": "headerNps",
      "Meter run size": "runNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "instrument-air-package",
   "title": "Instrument air package",
   "category": "packages",
   "description": "Oil-free screw compressor in an acoustic enclosure (louvres, roof fan, controller), pre-filter and coalescer with auto drains, a twin-tower heatless desiccant dryer with switching valves, purge silencers and controller, an after-filter with dew-point transmitter and a vertical dry-air receiver with PSV, gauge, transmitter, inspection opening and auto drain. Enclosure scales with `kw`; the receiver wall comes from UG-27 for `pressure`.",
   "import": "./packages/instrument-air-package",
   "export": "InstrumentAirPackage",
   "anchor": "base",
   "standards": [
    "ISO 8573-1",
    "ISO 1217",
    "ASME BPVC VIII-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Atlas Copco",
    "FIRSCOMP",
    "BLUTEK",
    "Roeslein"
   ],
   "tags": [
    "instrument air",
    "compressor",
    "dryer",
    "receiver",
    "utility"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Compressor motor",
     "type": "number",
     "min": 11,
     "max": 250,
     "step": 1,
     "unit": "kW"
    },
    {
     "key": "receiverDiameter",
     "label": "Receiver diameter",
     "type": "number",
     "min": 0.5,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "receiverHeight",
     "label": "Receiver height",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 8,
     "max": 20,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 55,
    "receiverDiameter": 1,
    "receiverHeight": 2.2,
    "pressure": 13,
    "outletNps": 2,
    "tag": "K-4600",
    "running": true
   },
   "ports": [
    {
     "id": "outlet",
     "label": "Dry instrument air",
     "position": [
      3.3217,
      2.592,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     6.664,
     3.692,
     2.068
    ],
    "center": [
     0.01,
     1.779,
     -0.001
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/instrument-air-package.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents)",
    "drawn": "Dash-dot package boundary containing an air compressor (screw symbol or generic compressor), a twin-tower desiccant dryer (two tall capsules side by side), filters, and the air receiver (vertical vessel) before the instrument-air (IA) header.",
    "tags": [
     "X",
     "A"
    ],
    "isa": [
     "PT",
     "PSLL",
     "AT"
    ],
    "notes": "Two identical tall capsules side by side = dryer towers. Often only the package box with IA outlet and the receiver are shown on the utilities P&ID. ISA codes here: AT = dew point.",
    "datasheet": {
     "form": "Instrument air package datasheet (ISO 8573-1 class, ISO 1217 capacity)",
     "fields": {
      "Compressor motor power": "kw",
      "Receiver diameter": "receiverDiameter",
      "Receiver height": "receiverHeight",
      "Design pressure": "pressure",
      "Outlet size": "outletNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "teg-regeneration",
   "title": "TEG regeneration package",
   "category": "packages",
   "description": "Glycol regeneration skid: fire-tube reboiler with bolted bundle flange, natural-draft burner, flame arrestor, fuel train, stripping-gas rotameter and guided exhaust stack, mounted on a portal frame over the surge drum; still column with finned reflux condenser and vent; flash drum with PSV and level control valve; sock and carbon filters; lean/rich exchanger; vertical in-line glycol pumps with check valves; top platform with caged ladder and a BMS panel. Pumps, vessel sizes and stack height are props.",
   "import": "./packages/teg-regeneration",
   "export": "TegRegeneration",
   "anchor": "base",
   "standards": [
    "API 12GDU",
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Croft Systems",
    "Kimray",
    "Cimarron"
   ],
   "tags": [
    "TEG",
    "glycol",
    "dehydration",
    "reboiler",
    "still column",
    "gas treatment"
   ],
   "params": [
    {
     "key": "reboilerDiameter",
     "label": "Reboiler diameter",
     "type": "number",
     "min": 0.6,
     "max": 1.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "reboilerLength",
     "label": "Reboiler length",
     "type": "number",
     "min": 3.5,
     "max": 7,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "stillDiameter",
     "label": "Still column",
     "type": "number",
     "min": 0.25,
     "max": 0.6,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "stackHeight",
     "label": "Stack top",
     "type": "number",
     "min": 5,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pumps",
     "label": "Glycol pumps",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 1
    },
    {
     "key": "kw",
     "label": "Pump motor",
     "type": "number",
     "min": 1.5,
     "max": 30,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "glycolNps",
     "label": "Glycol lines",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "leanRating",
     "label": "Lean class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "reboilerDiameter": 1,
    "reboilerLength": 4,
    "stillDiameter": 0.36,
    "stackHeight": 7.5,
    "pumps": 2,
    "kw": 7.5,
    "glycolNps": 2,
    "leanRating": 600,
    "tag": "C-5350"
   },
   "ports": [
    {
     "id": "rich-in",
     "label": "Rich glycol in",
     "position": [
      3.834,
      1.208,
      -1.161
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "lean-out",
     "label": "Lean glycol out",
     "position": [
      -0.484,
      1.458,
      1.381
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "vent",
     "label": "Still vent",
     "position": [
      1.116,
      6.358,
      -0.475
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "vent"
    },
    {
     "id": "fuel",
     "label": "Fuel gas",
     "position": [
      -3.834,
      0.958,
      0.331
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     7.705,
     7.74,
     3.207
    ],
    "center": [
     0.002,
     3.87,
     -0.192
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/teg-regeneration.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents)",
    "drawn": "Dash-dot package boundary with a horizontal reboiler (capsule with a U-shaped fire tube drawn inside), a short packed still column standing on top of it with the vent to atmosphere, a surge drum and lean-glycol pumps; rich TEG in, lean TEG out to the contactor.",
    "tags": [
     "X",
     "A",
     "C"
    ],
    "notes": "The reboiler with a fire-tube and a vertical still on top is the clue. The tall TEG contactor column itself is a separate item (column).",
    "datasheet": {
     "form": "Glycol regeneration package datasheet (API 12GDU)",
     "fields": {
      "Reboiler diameter": "reboilerDiameter",
      "Reboiler length": "reboilerLength",
      "Still column diameter": "stillDiameter",
      "Exhaust stack height": "stackHeight",
      "Number of lean glycol pumps": "pumps",
      "Pump driver power": "kw",
      "Glycol connection size": "glycolNps",
      "Lean glycol rating": "leanRating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hydraulic-power-unit",
   "title": "Hydraulic power unit (HPU)",
   "category": "packages",
   "description": "Wellhead-control hydraulic power unit on a bunded skid: stainless reservoir with level / temperature gauge, low-level switch, desiccant breather, inspection covers and tank-top return filter; duty / standby motor-pump sets on the reservoir with bellhousings, HP filters with clogging indicators, check and needle valves, header PSV back to tank and pressure transmitter; a framed bank of nitrogen-precharged bladder accumulators with isolation and bleed valves; a stainless gauge panel; LCP with cable tray. `pumps`, `accumulators` and `reservoir` size the skid.",
   "import": "./packages/hydraulic-power-unit",
   "export": "HydraulicPowerUnit",
   "anchor": "base",
   "standards": [
    "ISO 4413",
    "API 6A",
    "ISO 10945",
    "ASME B16.5"
   ],
   "vendors": [
    "Semco Maritime",
    "Johnson Controls",
    "HYDAC"
   ],
   "tags": [
    "HPU",
    "hydraulic",
    "wellhead control",
    "accumulator",
    "utility"
   ],
   "params": [
    {
     "key": "reservoir",
     "label": "Reservoir",
     "type": "number",
     "min": 150,
     "max": 1500,
     "step": 10,
     "unit": "L"
    },
    {
     "key": "pumps",
     "label": "Motor-pump sets",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 1
    },
    {
     "key": "kw",
     "label": "Motor",
     "type": "number",
     "min": 1.5,
     "max": 22,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "accumulators",
     "label": "Accumulators",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 1
    },
    {
     "key": "supplyNps",
     "label": "Supply",
     "type": "nps",
     "min": 0.5,
     "max": 2
    },
    {
     "key": "supplyRating",
     "label": "Supply class",
     "type": "rating"
    },
    {
     "key": "returnNps",
     "label": "Return",
     "type": "nps",
     "min": 0.75,
     "max": 3
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "reservoir": 400,
    "pumps": 2,
    "kw": 5.5,
    "accumulators": 6,
    "supplyNps": 0.75,
    "supplyRating": 2500,
    "returnNps": 1.5,
    "tag": "X-1900",
    "running": true
   },
   "ports": [
    {
     "id": "supply",
     "label": "HP hydraulic supply",
     "position": [
      2.175,
      0.788,
      -0.2
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.75,
     "rating": 2500,
     "kind": "utility"
    },
    {
     "id": "return",
     "label": "Hydraulic return",
     "position": [
      2.175,
      0.488,
      0.25
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 1.5,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     4.515,
     2.168,
     2.012
    ],
    "center": [
     -0.062,
     1.084,
     0.023
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hydraulic-power-unit.svg",
    "standard": "ISO 1219-1 fluid power symbols in a package boundary",
    "drawn": "Dash-dot package boundary with an open reservoir (U-shaped tank), hydraulic pumps (circle with a filled triangle pointing outward on the outlet), filters, accumulators (vertical capsules with a dividing line) and the HP / LP supply headers leaving as hydraulic lines.",
    "tags": [
     "X",
     "HPU",
     "A"
    ],
    "isa": [
     "PT",
     "LSL",
     "PSL"
    ],
    "notes": "ISO 1219 symbols (filled triangle in a circle = hydraulic pump; capsule with a line = accumulator) identify a hydraulic system. The WHCP sits downstream with one line per actuator.",
    "datasheet": {
     "form": "Hydraulic power unit datasheet (ISO 4413 / API 6A control systems)",
     "fields": {
      "Reservoir volume": "reservoir",
      "Number of pumps": "pumps",
      "Pump motor power": "kw",
      "Accumulators": "accumulators",
      "Supply connection size": "supplyNps",
      "Supply rating": "supplyRating",
      "Return connection size": "returnNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "nitrogen-generator",
   "title": "Membrane nitrogen generator",
   "category": "packages",
   "description": "Hollow-fibre membrane nitrogen package: inlet block valve, coalescing, fine-coalescing and activated-carbon filters with auto drains to a drip tray, flanged electric air heater with TT, a framed rack of membrane modules with feed, product and permeate headers, a permeate / off-spec vent riser, O2 analyser cabinet with sample rotameter, product pressure-control valve and 3-way off-spec valve, and a buffer receiver with PSV, gauge, transmitter and drain. `modules` sets the rack size.",
   "import": "./packages/nitrogen-generator",
   "export": "NitrogenGenerator",
   "anchor": "base",
   "standards": [
    "ISO 8573-1",
    "ASME BPVC VIII-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Semco Maritime",
    "Air Products (PRISM)",
    "BERG Kompressoren",
    "Atlas Copco"
   ],
   "tags": [
    "nitrogen",
    "membrane",
    "N2",
    "inert gas",
    "utility"
   ],
   "params": [
    {
     "key": "modules",
     "label": "Membrane modules",
     "type": "number",
     "min": 2,
     "max": 16,
     "step": 1
    },
    {
     "key": "receiverDiameter",
     "label": "Receiver diameter",
     "type": "number",
     "min": 0.5,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "receiverHeight",
     "label": "Receiver height",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 8,
     "max": 20,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "airNps",
     "label": "Air inlet",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "n2Nps",
     "label": "N2 outlet",
     "type": "nps",
     "min": 1,
     "max": 3
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "modules": 6,
    "receiverDiameter": 0.8,
    "receiverHeight": 1.8,
    "pressure": 13,
    "airNps": 2,
    "n2Nps": 1.5,
    "tag": "X-8300"
   },
   "ports": [
    {
     "id": "air-in",
     "label": "Compressed air in",
     "position": [
      -3.358,
      1.318,
      -0.42
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "n2-out",
     "label": "Nitrogen out",
     "position": [
      3.358,
      2.126,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 1.5,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "vent",
     "label": "Permeate / off-spec vent",
     "position": [
      -0.708,
      2.918,
      -0.15
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "vent"
    }
   ],
   "bounds": {
    "size": [
     6.753,
     3.071,
     1.78
    ],
    "center": [
     -0.002,
     1.536,
     -0.001
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/nitrogen-generator.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents)",
    "drawn": "Dash-dot package boundary with air filters (diamond with a dashed line), an air heater, membrane modules (rectangles with a diagonal dashed membrane line, permeate vented to atmosphere) and a nitrogen receiver before the N2 outlet.",
    "tags": [
     "X",
     "A"
    ],
    "isa": [
     "AT",
     "PT",
     "FT"
    ],
    "notes": "Membrane modules with a vent line identify the generator; a nitrogen bottle rack is a gas-cylinder-quad. Often shown on the utilities P&ID as a single package box. ISA codes here: AT = O2.",
    "datasheet": {
     "form": "Nitrogen generator package datasheet (ISO 8573-1 feed air; ASME VIII-1 receiver)",
     "fields": {
      "Membrane modules": "modules",
      "Receiver diameter": "receiverDiameter",
      "Receiver height": "receiverHeight",
      "Design pressure": "pressure",
      "Air inlet size": "airNps",
      "N2 outlet size": "n2Nps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hydrocyclone-package",
   "title": "De-oiling hydrocyclone package",
   "category": "packages",
   "description": "Produced-water de-oiling hydrocyclone skid: horizontal multi-liner vessels on saddles with a bolted reject-end cover showing the liner end caps and a cover lifting eye, inlet header with gate-valved top branches, underflow gate valves into an outlet header with level control valve, reject ball valves into a reject header with a PDR (pressure-differential-ratio) control valve, DP transmitters, OIW monitor with sample line, gauges, drains, vents and a JB with cable tray. `vessels` sets the count; the reject end is kept clear for liner withdrawal.",
   "import": "./packages/hydrocyclone-package",
   "export": "HydrocyclonePackage",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "ASME B16.10"
   ],
   "vendors": [
    "SLB (Vortoil)",
    "CECO Environmental (Peerless)",
    "FLSmidth (Krebs)"
   ],
   "tags": [
    "produced water",
    "hydrocyclone",
    "de-oiling",
    "water treatment"
   ],
   "params": [
    {
     "key": "vessels",
     "label": "Vessels",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "vesselDiameter",
     "label": "Vessel diameter",
     "type": "number",
     "min": 0.4,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "vesselLength",
     "label": "Vessel length",
     "type": "number",
     "min": 2,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 10,
     "max": 100,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "rejectNps",
     "label": "Reject",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "vessels": 2,
    "vesselDiameter": 0.6,
    "vesselLength": 3,
    "pressure": 30,
    "inletNps": 8,
    "outletNps": 8,
    "rejectNps": 2,
    "rating": 300,
    "tag": "X-4200"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Produced water in",
     "position": [
      -3.879,
      2.6875,
      -1.52
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Treated water out",
     "position": [
      -3.879,
      1.168,
      1.52
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "reject",
     "label": "Oily reject",
     "position": [
      3.879,
      1.168,
      1.52
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     7.808,
     3.018,
     4.152
    ],
    "center": [
     -0.004,
     1.509,
     0.023
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hydrocyclone-package.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents); cyclone convention",
    "drawn": "Horizontal vessel(s) with cyclone liners drawn as long cones (or a single inverted cone, the generic cyclone symbol), produced water in at the inlet header, clean water out, and the oily reject to the reject header controlled by a PDV / PDIC ratio loop.",
    "tags": [
     "X",
     "A",
     "HC"
    ],
    "isa": [
     "PDV",
     "PDIC",
     "PDT"
    ],
    "notes": "Cones inside a vessel = hydrocyclones (or a desander if on the well stream with a sand accumulator). Reject-ratio control is the PDIC loop between inlet, outlet and reject.",
    "datasheet": {
     "form": "Hydrocyclone package datasheet (ASME VIII-1)",
     "fields": {
      "Number of vessels": "vessels",
      "Vessel diameter": "vesselDiameter",
      "Vessel length": "vesselLength",
      "Design pressure": "pressure",
      "Inlet size": "inletNps",
      "Outlet size": "outletNps",
      "Reject size": "rejectNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "compact-prover",
   "title": "Compact piston prover",
   "category": "packages",
   "description": "Small-volume (compact) piston prover on a skid: honed flow tube between bolted inlet and outlet housings, nitrogen spring plenum with charge panel, optical switch housing with detector blocks, duplicate flow-tube TTs and housing PTs, a hydraulic piston-return pack, and a motor-operated 4-way diverter valve with seal-check bleed that sends meter flow through the prover in either direction. Prover controller, cable tray, supports and shackled padeyes.",
   "import": "./packages/compact-prover",
   "export": "CompactProver",
   "anchor": "base",
   "standards": [
    "API MPMS Ch. 4.2",
    "ASME B16.5",
    "ASME B31.3"
   ],
   "vendors": [
    "Emerson (Brooks / Daniel)",
    "Welker",
    "Ergil"
   ],
   "tags": [
    "prover",
    "metering",
    "calibration",
    "custody transfer"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Line size",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tubeLength",
     "label": "Flow tube length",
     "type": "number",
     "min": 1.2,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "tubeLength": 2,
    "tag": "X-R155"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet (from meter)",
     "position": [
      -2.625,
      0.628,
      0.3
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet (to line)",
     "position": [
      2.625,
      0.628,
      0.3
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     5.3,
     2.433,
     2.128
    ],
    "center": [
     0,
     1.217,
     0.031
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/compact-prover.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / API MPMS Ch. 4.2 prover convention",
    "drawn": "A horizontal flow tube with a piston (displacer) drawn inside and two detector switches on top marking the calibrated volume, connected by a prover loop with valves to the metering skid; often just a box labelled \"prover\".",
    "tags": [
     "X",
     "A"
    ],
    "isa": [
     "ZS",
     "PT",
     "TT"
    ],
    "notes": "Piston in a tube with detector marks = compact prover; a long U-shaped pipe loop with spheres is a conventional ball prover. ISA codes here: ZS = detector.",
    "datasheet": {
     "form": "Meter prover datasheet (API MPMS Ch. 4.2)",
     "fields": {
      "Connection size": "nps",
      "Flange rating": "rating",
      "Flow tube length": "tubeLength",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "water-filter-package",
   "title": "Multimedia filter package",
   "category": "packages",
   "description": "Seawater / produced-water multimedia pressure filter skid: 2–4 vertical filter vessels on legs with top media-loading and side media-removal manways, air-release valves and drains; front face piping with four pneumatically actuated wafer butterfly valves per vessel (service in, service out, backwash in, backwash out) on inlet, outlet, backwash-in and backwash-out headers; gear-operated backwash supply valve, bed DP gauges, sample points, header transmitters and flow meters, and a filter control panel with solenoid air tubing and cable tray.",
   "import": "./packages/water-filter-package",
   "export": "WaterFilterPackage",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "AWWA B100",
    "ASME B16.5",
    "API 609"
   ],
   "vendors": [
    "Evoqua",
    "Pure Aqua",
    "ISI Water",
    "Ecologix"
   ],
   "tags": [
    "filter",
    "multimedia",
    "seawater",
    "water injection",
    "backwash"
   ],
   "params": [
    {
     "key": "filters",
     "label": "Filters",
     "type": "number",
     "min": 2,
     "max": 4,
     "step": 1
    },
    {
     "key": "filterDiameter",
     "label": "Vessel diameter",
     "type": "number",
     "min": 0.6,
     "max": 2.4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "filterHeight",
     "label": "Vessel height",
     "type": "number",
     "min": 1.2,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 4,
     "max": 20,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "headerNps",
     "label": "Headers",
     "type": "nps",
     "min": 3,
     "max": 12
    },
    {
     "key": "branchNps",
     "label": "Face piping",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "filters": 3,
    "filterDiameter": 1.2,
    "filterHeight": 1.8,
    "pressure": 10,
    "headerNps": 6,
    "branchNps": 4,
    "rating": 150,
    "tag": "X-W330"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Raw water in",
     "position": [
      -3.575,
      3.166,
      0.3947
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Filtered water out",
     "position": [
      3.575,
      0.816,
      0.3947
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "backwash",
     "label": "Backwash waste out",
     "position": [
      3.575,
      2.566,
      1.1571
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     7.2,
     3.479,
     3.545
    ],
    "center": [
     0,
     1.74,
     0.048
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/water-filter-package.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents) (filter: vessel crossed by a dashed medium line)",
    "drawn": "Dash-dot package boundary with two to four vertical filter vessels in parallel between inlet and outlet headers, each crossed by dashed lines for the media bed, plus backwash and air-scour headers with butterfly valves.",
    "tags": [
     "X",
     "A",
     "F"
    ],
    "isa": [
     "PDT",
     "PDI",
     "FT"
    ],
    "notes": "Parallel identical filter vessels with backwash lines = multimedia filter package. A single cartridge housing is cartridge-filter.",
    "datasheet": {
     "form": "Filter package datasheet (AWWA B100 / ASME VIII-1)",
     "fields": {
      "Number of filters": "filters",
      "Filter diameter": "filterDiameter",
      "Filter height": "filterHeight",
      "Design pressure": "pressure",
      "Header size": "headerNps",
      "Branch size": "branchNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hypochlorite-generator",
   "title": "Electrochlorination (hypochlorite) package",
   "category": "packages",
   "description": "Seawater electrochlorination skid: inlet ball valve, motorised auto-backwash strainer with DP gauges and flush valve, electromagnetic flowmeter (low-flow trip), a rack of tubular electrolyser cells in series with U-bends, DC terminals and busbars fed from a louvred transformer-rectifier cabinet, a GRP degassing tank with level instruments, manway and H2 / air vent stack, duty / standby hydrogen-dilution blowers with ducts, and duty / standby dosing pumps to the hypochlorite outlet. LCP and cable tray. `cells` sets the stack height.",
   "import": "./packages/hypochlorite-generator",
   "export": "HypochloriteGenerator",
   "anchor": "base",
   "standards": [
    "NORSOK M-001 (materials)",
    "ASME B16.5",
    "IEC 60146 (rectifiers)"
   ],
   "vendors": [
    "De Nora (SEACLOR)",
    "Evoqua (OSEC / Chloropac)",
    "Chlory Technology",
    "OCEANCHLOR"
   ],
   "tags": [
    "electrochlorination",
    "hypochlorite",
    "seawater",
    "biofouling",
    "utility"
   ],
   "params": [
    {
     "key": "cells",
     "label": "Cells in series",
     "type": "number",
     "min": 2,
     "max": 8,
     "step": 1
    },
    {
     "key": "tankDiameter",
     "label": "Degassing tank dia",
     "type": "number",
     "min": 0.8,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tankHeight",
     "label": "Degassing tank height",
     "type": "number",
     "min": 1.2,
     "max": 2.6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "seawaterNps",
     "label": "Seawater inlet",
     "type": "nps",
     "min": 2,
     "max": 6
    },
    {
     "key": "hypoNps",
     "label": "Hypo outlet",
     "type": "nps",
     "min": 1,
     "max": 3
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "cells": 4,
    "tankDiameter": 1.2,
    "tankHeight": 1.8,
    "seawaterNps": 3,
    "hypoNps": 2,
    "tag": "X-6500",
    "running": true
   },
   "ports": [
    {
     "id": "seawater-in",
     "label": "Seawater in",
     "position": [
      -3.1,
      0.768,
      -0.85
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "hypo-out",
     "label": "Hypochlorite out",
     "position": [
      3.1,
      0.918,
      0.95
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "vent",
     "label": "H2 / air vent",
     "position": [
      1.75,
      3.518,
      -0.45
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "vent"
    }
   ],
   "bounds": {
    "size": [
     6.341,
     3.539,
     2.912
    ],
    "center": [
     0.05,
     1.769,
     0.023
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hypochlorite-generator.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (package boundary with contents) + IEC 60617 rectifier",
    "drawn": "Dash-dot package boundary with a seawater strainer, electrolyser cells (boxes with parallel electrode plates) fed from a DC rectifier (square with diagonal, ~ / =), a degassing tank venting hydrogen, and hypochlorite dosing out to the seawater caissons.",
    "tags": [
     "X",
     "A",
     "CL"
    ],
    "isa": [
     "FT",
     "FSL",
     "AT"
    ],
    "notes": "Electrolyser cells plus a rectifier identify it; a chemical-injection-skid has a tank and metering pumps instead. ISA codes here: AT = H2.",
    "datasheet": {
     "form": "Electrochlorination package datasheet (IEC 60146 rectifier)",
     "fields": {
      "Electrolyser cells": "cells",
      "Degassing tank diameter": "tankDiameter",
      "Degassing tank height": "tankHeight",
      "Seawater inlet size": "seawaterNps",
      "Hypochlorite outlet size": "hypoNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "weld-neck-flange",
   "title": "Weld-neck flange",
   "category": "piping",
   "description": "Single forged weld-neck flange: tapered hub from the B16.5 / B16.47 hub diameter down to the pipe OD, B16.25 37.5° weld bevel with root land, bore matched to the pipe schedule and real drilled bolt holes. Raised face with a serrated finish, flat face, or ring-type joint with the B16.5 octagonal groove for the class. Optional butt-welded pipe stub; the rim carries a stamped marking.",
   "import": "./piping/weld-neck-flange",
   "export": "WeldNeckFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B16.47 Series A",
    "ASME B16.25",
    "ASME B16.20",
    "MSS SP-25"
   ],
   "vendors": [
    "All Metals & Forge Group"
   ],
   "tags": [
    "flange",
    "weld neck",
    "WN",
    "RTJ",
    "raised face"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "facing",
     "label": "Facing",
     "type": "select",
     "options": [
      "RF",
      "FF",
      "RTJ"
     ]
    },
    {
     "key": "schedule",
     "label": "Bore schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "facing": "RF",
    "schedule": "40",
    "stub": 0,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Flange face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.099,
     0.317,
     0.318
    ],
    "center": [
     0.049,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/weld-neck-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar",
    "drawn": "In section: a flange disc with a long tapered hub narrowing to the pipe wall and a butt weld at the hub end. On P&IDs just a short bar across the line; on isometrics a bar with a weld dot.",
    "tags": [
     "WN"
    ],
    "notes": "The flange type comes from the piping class, not the P&ID. The long taper identifies weld-neck; slip-on and socket-weld have short hubs; lap-joint has a loose ring on a stub end.",
    "datasheet": {
     "form": "Piping class / flange bill of materials (ASME B16.5 / B16.47)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Facing": "facing",
      "Bore (schedule)": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "slip-on-flange",
   "title": "Slip-on flange",
   "category": "piping",
   "description": "ASME B16.5 slip-on flange on a pipe stub: short tapered hub, bore B a little over the pipe OD, drilled bolt holes, RF / FF / RTJ facing. The pipe end is set back from the face by the inside fillet weld leg (the smaller of the wall and 6 mm) and an outside fillet weld closes the hub end, as ASME B31.3 Fig. 328.5.2B shows. Hub length Y comes from the B16.5 slip-on table for each class. Where B16.5 has no slip-on flange (Class 1500 above NPS 2-1/2, Class 2500), the next lower class that has one is used.",
   "import": "./piping/slip-on-flange",
   "export": "SlipOnFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B31.3",
    "ASME B16.20"
   ],
   "vendors": [
    "All Metals & Forge Group"
   ],
   "tags": [
    "flange",
    "slip-on",
    "SO",
    "fillet weld"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "facing",
     "label": "Facing",
     "type": "select",
     "options": [
      "RF",
      "FF",
      "RTJ"
     ]
    },
    {
     "key": "schedule",
     "label": "Pipe schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 150,
    "facing": "RF",
    "schedule": "40",
    "stub": 0.2,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Flange face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.234,
     0.229,
     0.229
    ],
    "center": [
     0.117,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/slip-on-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar",
    "drawn": "In section: a flange with a short hub slid over the pipe, the pipe end set back from the face, with fillet welds inside the bore and at the hub. On P&IDs a short bar across the line.",
    "tags": [
     "SO"
    ],
    "notes": "Pipe passing into the flange bore with two fillet welds = slip-on. Weld-neck has a long tapered hub and one butt weld.",
    "datasheet": {
     "form": "Piping class / flange bill of materials (ASME B16.5)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Facing": "facing",
      "Pipe schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "socket-weld-flange",
   "title": "Socket-weld flange",
   "category": "piping",
   "description": "Small-bore ASME B16.5 socket-weld flange (NPS 1/2–3, to 2-1/2 in Class 900 / 1500). The socket bore and depth come from B16.5, the pipe-stop shoulder steps down to the schedule bore, and the inserted pipe stands 1.6 mm off the shoulder as an expansion gap before the outside fillet weld. RF / FF / RTJ facing, real bolt holes.",
   "import": "./piping/socket-weld-flange",
   "export": "SocketWeldFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B31.3",
    "ASME B16.11"
   ],
   "vendors": [
    "All Metals & Forge Group"
   ],
   "tags": [
    "flange",
    "socket weld",
    "SW",
    "small bore"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 3
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "facing",
     "label": "Facing",
     "type": "select",
     "options": [
      "RF",
      "FF",
      "RTJ"
     ]
    },
    {
     "key": "schedule",
     "label": "Pipe schedule",
     "type": "select",
     "options": [
      "40",
      "80",
      "160",
      "XXS",
      "40S",
      "80S"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 0.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 2,
    "rating": 600,
    "facing": "RF",
    "schedule": "80",
    "stub": 0.15,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Flange face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.199,
     0.165,
     0.166
    ],
    "center": [
     0.099,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/socket-weld-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar; ASME B16.11 socket",
    "drawn": "In section: a small-bore flange with a socket the pipe slides into against a shoulder (small gap at the bottom), and one fillet weld at the hub. On P&IDs a short bar on a small-bore (≤ 2\") line.",
    "tags": [
     "SW"
    ],
    "notes": "Socket-weld is small-bore only (NPS ½–3). Threaded flanges show thread hatching in the bore instead of a weld.",
    "datasheet": {
     "form": "Piping class / flange bill of materials (ASME B16.5, B16.11)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Facing": "facing",
      "Pipe schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "threaded-flange",
   "title": "Threaded flange",
   "category": "piping",
   "description": "ASME B16.5 threaded (screwed) flange with an ASME B1.20.1 NPT taper thread through the hub (11.5 or 8 threads per inch by size, 1:16 taper) and a 45° entry chamfer. The pipe is made up power-tight with two threads showing at the hub end; optional seal weld. RF / FF / RTJ facing, real bolt holes. Where B16.5 has no threaded flange (Class 1500 above NPS 2-1/2, Class 2500 above NPS 12), the next lower class that has one is used.",
   "import": "./piping/threaded-flange",
   "export": "ThreadedFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B1.20.1",
    "ASME B31.3"
   ],
   "vendors": [
    "All Metals & Forge Group"
   ],
   "tags": [
    "flange",
    "threaded",
    "screwed",
    "NPT"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "facing",
     "label": "Facing",
     "type": "select",
     "options": [
      "RF",
      "FF",
      "RTJ"
     ]
    },
    {
     "key": "schedule",
     "label": "Pipe schedule",
     "type": "select",
     "options": [
      "40",
      "80",
      "160",
      "XXS"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 0.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sealWeld",
     "label": "Seal weld",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 2,
    "rating": 300,
    "facing": "RF",
    "schedule": "80",
    "stub": 0.15,
    "sealWeld": false,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Flange face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.184,
     0.165,
     0.166
    ],
    "center": [
     0.092,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/threaded-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar; ASME B1.20.1 NPT",
    "drawn": "In section: a flange with a short hub and thread marks (zig-zag) in the bore where the pipe screws in, sometimes with a seal weld. On P&IDs a short bar, usually on utility or small-bore lines.",
    "tags": [
     "THD",
     "SCRD"
    ],
    "notes": "Zig-zag thread lines in the bore identify it. Most offshore hydrocarbon piping classes do not allow threaded joints; expect it on utility water or air.",
    "datasheet": {
     "form": "Piping class / flange bill of materials (ASME B16.5, B1.20.1)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Facing": "facing",
      "Pipe schedule": "schedule",
      "Seal weld": "sealWeld",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "lap-joint-flange",
   "title": "Lap-joint flange and stub end",
   "category": "piping",
   "description": "Loose ASME B16.5 lap-joint backing flange on a stainless stub end. The flange is flat with a radiused bore edge so it clears the stub-end fillet and turns freely to line up the bolt holes. The stub end is B16.9 long pattern or MSS SP-43 short pattern, with its lap diameter matched to the raised face. The serrated lap face is the gasket face (port A). An optional pipe can be butt-welded on.",
   "import": "./piping/lap-joint-flange",
   "export": "LapJointFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B16.9",
    "MSS SP-43",
    "ASME B16.25"
   ],
   "vendors": [],
   "tags": [
    "flange",
    "lap joint",
    "stub end",
    "loose flange",
    "stainless"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "schedule",
     "label": "Stub schedule",
     "type": "select",
     "options": [
      "5S",
      "10S",
      "40S",
      "80S",
      "40",
      "80"
     ]
    },
    {
     "key": "pattern",
     "label": "Stub end",
     "type": "select",
     "options": [
      "long",
      "short"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "backing",
     "label": "Backing flange",
     "type": "select",
     "options": [
      "carbon",
      "galvanised"
     ]
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 150,
    "schedule": "10S",
    "pattern": "long",
    "stub": 0,
    "backing": "carbon",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Lap face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.203,
     0.279,
     0.28
    ],
    "center": [
     0.102,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/lap-joint-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar; MSS SP-43 stub end",
    "drawn": "In section: a stub end (pipe with a flared lap at the face) with a loose backing flange sitting behind the lap, not welded to the pipe. On P&IDs a short bar like any flange.",
    "tags": [
     "LJ"
    ],
    "notes": "The loose ring behind a lap identifies it. Used on stainless or alloy lines where the backing flange can be carbon steel, and where bolt holes must be lined up after welding.",
    "datasheet": {
     "form": "Piping class / flange bill of materials (ASME B16.5, MSS SP-43)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Stub-end schedule": "schedule",
      "Stub-end pattern": "pattern",
      "Backing flange material": "backing",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "swivel-ring-flange",
   "title": "Swivel-ring flange",
   "category": "piping",
   "description": "Pipeline and riser swivel-ring flange. A forged weld hub with a bevelled weld end carries the gasket face, RTJ with the B16.5 octagonal groove for the class or RF. A loose drilled ring sits on a tapered seat behind the hub head. `swivel` turns the ring so the bolt holes can be aligned with the mating flange without rolling the pipeline. Drilling and OD follow ASME B16.5, so the flange mates a standard flange; the head, seat and neck proportions are typical.",
   "import": "./piping/swivel-ring-flange",
   "export": "SwivelRingFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5 (drilling)",
    "MSS SP-44",
    "ASME B16.20",
    "ASME B16.25"
   ],
   "vendors": [
    "Oil States"
   ],
   "tags": [
    "flange",
    "swivel ring",
    "pipeline",
    "riser",
    "tie-in",
    "RTJ"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "facing",
     "label": "Facing",
     "type": "select",
     "options": [
      "RTJ",
      "RF"
     ]
    },
    {
     "key": "schedule",
     "label": "Bore schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "swivel",
     "label": "Ring angle",
     "type": "number",
     "min": 0,
     "max": 45,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Marking",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 12,
    "rating": 600,
    "facing": "RTJ",
    "schedule": "80",
    "swivel": 0,
    "stub": 0,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Hub face",
     "position": [
      0,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.235,
     0.559,
     0.559
    ],
    "center": [
     0.118,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/swivel-ring-flange.svg",
    "standard": "ASME B16.5 flange types drawn in half-section (GA / isometric detail convention); on P&IDs every flange is a short bar; MSS SP-44 / pipeline convention",
    "drawn": "In section: a weld hub carrying the gasket face with a separate loose ring that can rotate around it to align bolt holes; drawn with a curved arrow on some pipeline tie-in details. On P&IDs a flange bar, often at a riser or spool tie-in.",
    "tags": [
     "SRF"
    ],
    "notes": "Found at subsea and riser tie-ins where bolt-hole alignment is hard. On P&IDs it is indistinguishable from other flanges; read the tie-in detail.",
    "datasheet": {
     "form": "Pipeline flange datasheet (ASME B16.5 drilling, MSS SP-44)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Facing": "facing",
      "Pipe schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "olet",
   "title": "Branch outlet (olet)",
   "category": "piping",
   "description": "MSS SP-97 integrally reinforced branch outlets on a run pipe stub. Weldolet (butt-weld outlet with a flared bore), Sockolet (B16.11 socket and pipe stop), Thredolet (NPT female outlet), Nipolet (integral XS nipple, plain or male-threaded end), Elbolet (on a B16.9 LR elbow, outlet on the axis of one leg for thermowells) and Latrolet (45° lateral); the type names are used generically. The base is contoured to the run along the true intersection curve and finished with a fillet weld cap. The run is cut along the bore, so the branch opens into the run bore. Height, base OD and bore come from the SP-97 tables; `kind` selects the type.",
   "import": "./piping/olet",
   "export": "Olet",
   "anchor": "fitting",
   "standards": [
    "MSS SP-97",
    "ASME B16.11",
    "ASME B1.20.1",
    "ASME B16.9",
    "ASME B16.25",
    "ASME B31.3"
   ],
   "vendors": [
    "Bonney Forge"
   ],
   "tags": [
    "olet",
    "weldolet",
    "sockolet",
    "threadolet",
    "nipolet",
    "elbolet",
    "latrolet",
    "branch",
    "small bore",
    "thermowell"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "weldolet",
      "sockolet",
      "threadolet",
      "nipolet",
      "elbolet",
      "latrolet"
     ]
    },
    {
     "key": "runNps",
     "label": "Run size",
     "type": "nps",
     "min": 1,
     "max": 24
    },
    {
     "key": "nps",
     "label": "Branch size",
     "type": "nps",
     "min": 0.25,
     "max": 12
    },
    {
     "key": "runSchedule",
     "label": "Run schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "schedule",
     "label": "Branch schedule",
     "type": "select",
     "options": [
      "STD",
      "XS",
      "80",
      "160"
     ]
    },
    {
     "key": "pressureClass",
     "label": "Class (SW / thd)",
     "type": "select",
     "options": [
      3000,
      6000
     ]
    },
    {
     "key": "end",
     "label": "Outlet end",
     "type": "select",
     "options": [
      "weld",
      "socket",
      "thread"
     ]
    },
    {
     "key": "nipple",
     "label": "Nipple",
     "type": "number",
     "min": 0.03,
     "max": 0.2,
     "step": 0.005,
     "unit": "m"
    },
    {
     "key": "runLength",
     "label": "Run length",
     "type": "number",
     "min": 0,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    }
   ],
   "defaults": {
    "kind": "weldolet",
    "runNps": 8,
    "nps": 2,
    "runSchedule": "STD",
    "schedule": "STD",
    "pressureClass": 3000,
    "end": "weld",
    "nipple": 0.09,
    "runLength": 0
   },
   "ports": [
    {
     "id": "run",
     "label": "Run end A",
     "position": [
      -0.307,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "kind": "process"
    },
    {
     "id": "run-b",
     "label": "Run end B",
     "position": [
      0.307,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "kind": "process"
    },
    {
     "id": "branch",
     "label": "Branch outlet",
     "position": [
      0,
      0.1477,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.614,
     0.257,
     0.219
    ],
    "center": [
     0,
     0.019,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/olet.svg",
    "standard": "ISO 10628-2 branch connection / MSS SP-97 (isometric detail)",
    "drawn": "On P&IDs a branch is just a line meeting another line with a dot (like a tee); on isometrics a branch outlet is a small saddle-shaped boss on the run pipe with the branch rising from it, noted WOL, SOL, TOL, NOL, EOL or LOL.",
    "tags": [
     "WOL",
     "SOL",
     "TOL",
     "NOL",
     "EOL",
     "LOL"
    ],
    "notes": "P&IDs do not distinguish an olet from a tee: the piping class branch table decides (small branches off large runs are olets). Instrument connections and vents and drains are usually olets.",
    "datasheet": {
     "form": "Piping class branch table / bill of materials (MSS SP-97)",
     "fields": {
      "Olet type": "kind",
      "Run size": "runNps",
      "Branch size": "nps",
      "Run schedule": "runSchedule",
      "Branch schedule": "schedule",
      "Pressure class": "pressureClass",
      "Branch end": "end"
     }
    }
   }
  },
  {
   "name": "small-bore-fitting",
   "title": "Small-bore forged fitting",
   "category": "piping",
   "description": "ASME B16.11 forged steel small-bore fittings, Class 3000 or 6000, socket-weld or NPT threaded: 90° and 45° elbows, tee, coupling, half coupling, cap and hex-head plug. Also an MSS SP-83 ground-joint union with hex nut and an MSS SP-95 concentric swage nipple. Socket bore, depth, wall and centre-to-bottom-of-socket follow B16.11. Sockets have the pipe-stop shoulder and drilled bores meeting in a radiused passage (the tee branch is cut into the run bore). Female threads are tapered NPT. `stub` inserts pipe with the 1.6 mm socket gap and fillet weld, or makes it up into the thread.",
   "import": "./piping/small-bore-fitting",
   "export": "SmallBoreFitting",
   "anchor": "fitting",
   "standards": [
    "ASME B16.11",
    "ASME B1.20.1",
    "MSS SP-83",
    "MSS SP-95",
    "ASME B31.3"
   ],
   "vendors": [
    "Bonney Forge"
   ],
   "tags": [
    "small bore",
    "socket weld",
    "threaded",
    "forged",
    "elbow",
    "tee",
    "coupling",
    "union",
    "cap",
    "plug",
    "swage"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "elbow90",
      "elbow45",
      "tee",
      "coupling",
      "half-coupling",
      "union",
      "cap",
      "plug",
      "swage"
     ]
    },
    {
     "key": "end",
     "label": "Ends",
     "type": "select",
     "options": [
      "socket",
      "thread"
     ]
    },
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 4
    },
    {
     "key": "smallNps",
     "label": "Swage small end",
     "type": "nps",
     "min": 0.25,
     "max": 3
    },
    {
     "key": "pressureClass",
     "label": "Class",
     "type": "select",
     "options": [
      3000,
      6000
     ]
    },
    {
     "key": "schedule",
     "label": "Pipe schedule",
     "type": "select",
     "options": [
      "40",
      "80",
      "160",
      "XXS"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stubs",
     "type": "number",
     "min": 0,
     "max": 0.3,
     "step": 0.01,
     "unit": "m"
    }
   ],
   "defaults": {
    "kind": "elbow90",
    "end": "socket",
    "nps": 1,
    "smallNps": 0.5,
    "pressureClass": 3000,
    "schedule": "80",
    "stub": 0
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.035,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 1,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0,
      0.035,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 1,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.058,
     0.058,
     0.045
    ],
    "center": [
     -0.006,
     0.006,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/small-bore-fitting.svg",
    "standard": "Isometric / piping class convention (ASME B16.11); P&IDs show only the connection",
    "drawn": "Not drawn as a separate item on P&IDs: small-bore vents, drains and instrument connections appear as short ¾\"–2\" lines off the main line. On isometrics the forged fitting (elbow, tee, coupling, union, cap, plug, swage) is drawn with SW or THD weld / thread marks and called up in the bill of materials.",
    "tags": [
     "SW",
     "THD"
    ],
    "notes": "A short NPS ≤ 2 branch with a valve and cap or plug (vent / drain) on a P&ID is made of these fittings. Class 3000 / 6000 comes from the piping class.",
    "datasheet": {
     "form": "Piping class / small-bore bill of materials (ASME B16.11, MSS SP-83 / SP-95)",
     "fields": {
      "Fitting type": "kind",
      "End connection": "end",
      "Nominal size": "nps",
      "Reduced size (swage)": "smallNps",
      "Pressure class": "pressureClass",
      "Pipe schedule": "schedule"
     }
    }
   }
  },
  {
   "name": "expansion-joint",
   "title": "Bellows expansion joint",
   "category": "piping",
   "description": "Metallic bellows expansion joint with weld-neck flanged ends and pipe nipples. Stainless bellows with formed convolutions (count, pitch and height scale with the size) and reinforcing collars on the cuffs. `kind` selects the hardware: single (unrestrained), tied (tie rods, gusseted lugs, spherical washers and nuts), hinged (a hinge pair with pins), gimbal (a gimbal ring with two pin pairs at 90°) or in-line pressure-balanced (two line bellows and a larger balancing bellows on an intermediate spool, tied end to end). Optional internal flow liner and external cover.",
   "import": "./piping/expansion-joint",
   "export": "ExpansionJoint",
   "anchor": "inline",
   "standards": [
    "EJMA 10th ed. (typical)",
    "ASME B31.3 Appendix X",
    "ASME B16.5"
   ],
   "vendors": [
    "U.S. Bellows"
   ],
   "tags": [
    "expansion joint",
    "bellows",
    "compensator",
    "tied",
    "hinged",
    "gimbal",
    "pressure balanced"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "single",
      "tied",
      "hinged",
      "gimbal",
      "pressure-balanced"
     ]
    },
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "convolutions",
     "label": "Convolutions",
     "type": "number",
     "min": 2,
     "max": 20,
     "step": 1
    },
    {
     "key": "liner",
     "label": "Liner",
     "type": "bool"
    },
    {
     "key": "cover",
     "label": "Cover",
     "type": "bool"
    }
   ],
   "defaults": {
    "kind": "tied",
    "nps": 8,
    "rating": 150,
    "convolutions": 8,
    "liner": true,
    "cover": false
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.3242,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.3242,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.653,
     0.446,
     0.343
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/expansion-joint.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (compensator / bellows)",
    "drawn": "A short section of the line drawn with a zig-zag (convoluted) outline between two flange bars; tie rods, hinges or gimbals are noted as EJ type, often tagged EJ or XJ.",
    "tags": [
     "EJ",
     "XJ"
    ],
    "notes": "Zig-zag outline in the line = bellows; a flexible hose is drawn as a wavy line. Found on exhaust ducts, cooling water, compressor and turbine connections.",
    "datasheet": {
     "form": "Expansion joint datasheet (EJMA)",
     "fields": {
      "Joint type": "kind",
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Convolutions": "convolutions",
      "Internal liner": "liner",
      "External cover": "cover"
     }
    }
   }
  },
  {
   "name": "flexible-hose",
   "title": "Flexible hose assembly",
   "category": "piping",
   "description": "Flexible hose assembly between two flanged or union ends. Braided: annularly corrugated stainless hose under a stainless braid. Armoured: rubber hose with an interlocked galvanised armour. Both have crimped ferrules, weld collars and weld-neck RF flanges carrying half joint studs. The hose droops by `sag` but never tighter than `bendRadius` (default 5 x OD braided, 7 x OD armoured, typical). Rotary: a steel chiksan-style loop of long-radius elbows and ball-race swivel joints (race bands, ball plugs, grease fittings) with Fig 1502 hammer unions on the ends.",
   "import": "./piping/flexible-hose",
   "export": "FlexibleHose",
   "anchor": "inline",
   "standards": [
    "ISO 10380",
    "EN 14585-1",
    "API 16C (rotary, typical)",
    "ASME B16.5"
   ],
   "vendors": [
    "Witzenmann"
   ],
   "tags": [
    "hose",
    "flexible",
    "braided",
    "armoured",
    "chiksan",
    "swivel",
    "temporary",
    "well test"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "braided",
      "armoured",
      "rotary"
     ]
    },
    {
     "key": "nps",
     "label": "Bore",
     "type": "nps",
     "min": 0.5,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating",
     "options": [
      150,
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "length",
     "label": "Face to face",
     "type": "number",
     "min": 0.3,
     "max": 6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sag",
     "label": "Sag",
     "type": "number",
     "min": 0,
     "max": 1.5,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "bendRadius",
     "label": "Min bend radius",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 0.05,
     "unit": "m"
    }
   ],
   "defaults": {
    "kind": "braided",
    "nps": 2,
    "rating": 300,
    "length": 1.2,
    "sag": 0.15,
    "bendRadius": 0
   },
   "ports": [
    {
     "id": "A",
     "label": "Flange A",
     "position": [
      -0.6,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Flange B",
     "position": [
      0.6,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.204,
     0.266,
     0.165
    ],
    "center": [
     0,
     -0.05,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/flexible-hose.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (flexible hose / connection)",
    "drawn": "A wavy (sinusoidal) line between two end connections, sometimes with \"FH\" or the hose type noted; drilling rotary hoses and loading hoses are drawn the same way.",
    "tags": [
     "HOSE"
    ],
    "notes": "Wavy line = flexible hose; a zig-zag outline = bellows expansion-joint. Some legends tag hoses FH, which clashes with fire hydrants.",
    "datasheet": {
     "form": "Hose assembly datasheet (ISO 10380 / EN 14585-1; API 16C rotary)",
     "fields": {
      "Hose type": "kind",
      "Nominal size": "nps",
      "End rating": "rating",
      "Assembly length": "length",
      "Minimum bend radius": "bendRadius"
     }
    }
   }
  },
  {
   "name": "hammer-union",
   "title": "Hammer union (Fig 1502)",
   "category": "piping",
   "description": "Wing (hammer) union for well testing, frac and temporary flowlines. The male sub has a three-lug wing nut stamped with its figure number. The female sub has an exposed ACME thread and an elastomer lip seal at the joint. Butt-weld subs taper to bevelled Sch 160 weld ends, with optional pup joints. The nut is painted red, the colour commonly used for Fig 1502. Proportions are typical, not a particular maker's drawing.",
   "import": "./piping/hammer-union",
   "export": "HammerUnion",
   "anchor": "inline",
   "standards": [
    "API 6A (service, typical)",
    "NACE MR0175 (sour, optional)",
    "ASME B16.25"
   ],
   "vendors": [
    "Abdex",
    "Kuriyama"
   ],
   "tags": [
    "hammer union",
    "wing union",
    "1502",
    "well test",
    "frac",
    "temporary"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "select",
     "options": [
      1,
      1.5,
      2,
      3,
      4
     ]
    },
    {
     "key": "stub",
     "label": "Pup joints",
     "type": "number",
     "min": 0,
     "max": 0.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "figure",
     "label": "Figure",
     "type": "select",
     "options": [
      "1502",
      "602",
      "2002"
     ]
    }
   ],
   "defaults": {
    "nps": 2,
    "stub": 0,
    "figure": "1502"
   },
   "ports": [
    {
     "id": "A",
     "label": "Male end",
     "position": [
      -0.1228,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Female end",
     "position": [
      0.1228,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.246,
     0.145,
     0.155
    ],
    "center": [
     0,
     0.013,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hammer-union.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (union) / well-testing temporary flowline convention",
    "drawn": "A union symbol (two short bars with a third bar between them) in the line, with the figure number (e.g. Fig 1502) noted; well-test and frac schematics show one at every temporary flowline joint.",
    "tags": [
     "UN"
    ],
    "notes": "A flanged joint has two bars only. Figure numbers are not interchangeable (1502 vs 602 vs 2002 pressure ratings), so read the note.",
    "datasheet": {
     "form": "Temporary flowline equipment list (union figure number, API 6A service)",
     "fields": {
      "Nominal size": "nps",
      "Figure number": "figure"
     }
    }
   }
  },
  {
   "name": "insulating-joint",
   "title": "Insulating joint",
   "category": "piping",
   "description": "Electrical isolation for cathodically protected pipelines. Monolithic: a weld-in joint of two forged hubs locked over insulating rings, with the exposed filler band, an internal lining, epoxy coating, CP test terminals each side, a red / white warning band, a tag plate and bevelled pups. Gasket kit: a weld-neck flanged joint with a full-face G10 Type E gasket, full-length insulating sleeves in the bolt holes, G10 washers, steel washers and nuts both sides. Ports are the pup weld ends.",
   "import": "./piping/insulating-joint",
   "export": "InsulatingJoint",
   "anchor": "inline",
   "standards": [
    "ISO 15589-1",
    "NACE SP0286",
    "ASME B16.5",
    "ASME B31.4 / B31.8"
   ],
   "vendors": [
    "GPT Industries (Pikotek)",
    "Barlow (IMAC Systems)"
   ],
   "tags": [
    "insulating joint",
    "isolation joint",
    "monolithic",
    "cathodic protection",
    "insulating gasket kit",
    "flange isolation"
   ],
   "params": [
    {
     "key": "variant",
     "label": "Type",
     "type": "select",
     "options": [
      "monolithic",
      "gasket-kit"
     ]
    },
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "stub",
     "label": "Pups",
     "type": "number",
     "min": 0.05,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "variant": "monolithic",
    "nps": 6,
    "rating": 600,
    "schedule": "40",
    "stub": 0.25,
    "tag": "IJ-001"
   },
   "ports": [
    {
     "id": "A",
     "label": "Weld end A",
     "position": [
      -0.512,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Weld end B",
     "position": [
      0.512,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.024,
     0.273,
     0.315
    ],
    "center": [
     0,
     0.001,
     0.022
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/insulating-joint.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / pipeline cathodic protection convention",
    "drawn": "Two heavy bars across the line with a gap and a zig-zag or hatch between them, labelled IJ or IK (insulating kit), at the boundary between a cathodically protected pipeline and topsides or plant piping.",
    "tags": [
     "IJ",
     "IK"
    ],
    "notes": "Found where a pipeline or riser meets the plant. Plain double bars are an ordinary flanged joint; a monolithic IJ is a weld-in item, an insulating gasket kit is a flange pair with an IK note.",
    "datasheet": {
     "form": "Insulating joint datasheet (ISO 15589-1, NACE SP0286)",
     "fields": {
      "Variant": "variant",
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Pipe schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "rupture-disc",
   "title": "Rupture disc assembly",
   "category": "piping",
   "description": "Bursting disc assembly. An insert-type stainless holder (inlet and outlet halves with cap screws and seal) is centred inside the bolt circle between two weld-neck flanges. It holds a reverse-acting domed disc, convex towards the process. A stamped disc tag sticks up between the flanges with the tag number, burst pressure and flow direction. A burst-indicator sensor has an Ex connector, gland and field cable tail. Port A (holder inlet) is process and port B (holder outlet) is relief.",
   "import": "./piping/rupture-disc",
   "export": "RuptureDisc",
   "anchor": "inline",
   "standards": [
    "ISO 4126-2",
    "ASME VIII UG-127",
    "API 520 Part I",
    "ASME B16.5"
   ],
   "vendors": [
    "Fike",
    "Continental Disc"
   ],
   "tags": [
    "rupture disc",
    "bursting disc",
    "relief",
    "overpressure",
    "PSE",
    "burst indicator"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "burst",
     "label": "Burst pressure",
     "type": "number",
     "min": 1,
     "max": 400,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "flanges",
     "label": "Flanges",
     "type": "bool"
    },
    {
     "key": "indicator",
     "label": "Burst indicator",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 3,
    "rating": 300,
    "burst": 42,
    "flanges": true,
    "indicator": true,
    "tag": "PSE-1101"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet (process side)",
     "position": [
      -0.0214,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet (vent side)",
     "position": [
      0.0214,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     0.41,
     0.455,
     0.246
    ],
    "center": [
     0,
     -0.047,
     0.018
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/rupture-disc.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / ISA 5.1 (PSE)",
    "drawn": "A curved disc (arc) between two flange bars across the relief line, usually vertical with the inlet below, tagged PSE with the burst pressure; often fitted under a PSV with a pressure gauge or switch between them.",
    "tags": [
     "RD",
     "BD"
    ],
    "isa": [
     "PSE",
     "PI",
     "PSH"
    ],
    "notes": "An arc between flange bars with no spring = rupture disc; a spring zig-zag = PSV. A disc under a PSV forms a combination device; the PI / PSH in the space between detects a leak or burst.",
    "datasheet": {
     "form": "Rupture disc datasheet (ISO 4126-2 / API 520 Part I)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Burst pressure": "burst",
      "Holder with flanges": "flanges",
      "Burst indicator": "indicator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "restriction-orifice",
   "title": "Restriction orifice",
   "category": "piping",
   "description": "Restriction orifice for fixed flow limiting or pressure breakdown. Single stage: a stainless paddle plate between two weld-neck flanges with gaskets and through studs. The handle carries the tag and bore, and there is a telltale hole. Multi-stage: a flanged Sch 80 spool with two to six internal welded plates, each bore larger than the last for the expanding gas, with weld bands and a tag plate. `beta` sets the first bore. Single-plate ports are the plate faces; multi-stage ports are the spool flange faces.",
   "import": "./piping/restriction-orifice",
   "export": "RestrictionOrifice",
   "anchor": "inline",
   "standards": [
    "ISO 5167-2 (plate geometry)",
    "ASME MFC-14M",
    "ASME B16.36 / B16.5"
   ],
   "vendors": [],
   "tags": [
    "restriction orifice",
    "RO",
    "flow limiter",
    "pressure breakdown",
    "multi-stage"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "beta",
     "label": "Bore ratio",
     "type": "number",
     "min": 0.05,
     "max": 0.75,
     "step": 0.01
    },
    {
     "key": "flanges",
     "label": "Flanges (single)",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 2,
    "rating": 600,
    "stages": 1,
    "beta": 0.3,
    "flanges": true,
    "tag": "RO-2001"
   },
   "ports": [
    {
     "id": "A",
     "label": "Upstream",
     "position": [
      -0.003,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Downstream",
     "position": [
      0.003,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.374,
     0.244,
     0.165
    ],
    "center": [
     0,
     0.04,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/restriction-orifice.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / ISA 5.1 (RO / FO)",
    "drawn": "A plate across the line (one bar, or a bar with the bore gap at the centre) between two flange bars, tagged RO or FO with the bore size, and no transmitter or taps; multi-stage ROs show several plates in a row.",
    "tags": [
     "RO"
    ],
    "isa": [
     "FO",
     "RO"
    ],
    "notes": "With two taps to an FT bubble it is an orifice-flowmeter; without taps it is a restriction orifice. Common downstream of a BDV, in minimum-flow bypasses and on purge lines.",
    "datasheet": {
     "form": "Restriction orifice datasheet (ASME MFC-14M / ISO 5167-2 plate geometry)",
     "fields": {
      "Line size": "nps",
      "Flange rating": "rating",
      "Number of stages": "stages",
      "Bore ratio (d/D)": "beta",
      "Supplied with flanges": "flanges",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "steam-trap",
   "title": "Steam trap",
   "category": "piping",
   "description": "Steam trap for condensate drainage. Thermodynamic: a compact stainless disc trap with its disc chamber under a screwed, hex-topped insulating cap. Float: a ball-float and thermostatic trap with a cast chamber below the line, a bolted cover, an air-vent boss on top and a drain plug. Both have an integral Y-type strainer with a blowdown valve, a downstream test valve with T-handle, a cast flow arrow and a tag plate. Ends are screwed (female NPT in hex bosses) or ASME B16.5 flanged; proportions are typical.",
   "import": "./piping/steam-trap",
   "export": "SteamTrap",
   "anchor": "inline",
   "standards": [
    "ISO 6704 / EN 26704 (trap types)",
    "ISO 6554 / EN 26554 (face-to-face, flanged)",
    "ASME B16.5",
    "ASME B1.20.1"
   ],
   "vendors": [],
   "tags": [
    "steam trap",
    "thermodynamic",
    "float trap",
    "condensate",
    "strainer",
    "steam"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "thermodynamic",
      "float"
     ]
    },
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 2
    },
    {
     "key": "ends",
     "label": "Ends",
     "type": "select",
     "options": [
      "flanged",
      "screwed"
     ]
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "strainer",
     "label": "Strainer",
     "type": "bool"
    },
    {
     "key": "testValve",
     "label": "Test valve",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "thermodynamic",
    "nps": 0.75,
    "ends": "flanged",
    "rating": 300,
    "strainer": true,
    "testValve": true,
    "tag": "ST-101"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet (steam / condensate)",
     "position": [
      -0.1142,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 0.75,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet (condensate)",
     "position": [
      0.1142,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.75,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.233,
     0.123,
     0.117
    ],
    "center": [
     0,
     -0.003,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/steam-trap.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "A small square (or circle) in the condensate line marked T or ST, often preceded by a strainer and followed by a check valve and a test valve, at the low point of a steam line.",
    "tags": [
     "ST"
    ],
    "notes": "Box with T on a steam or condensate line = steam trap. Some legends tag traps TR, which clashes with transformer tags.",
    "datasheet": {
     "form": "Steam trap datasheet (ISO 6704 / ISO 6554)",
     "fields": {
      "Trap type": "kind",
      "Nominal size": "nps",
      "End connection": "ends",
      "Pressure class": "rating",
      "Integral strainer": "strainer",
      "Test valve": "testValve",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "drain-hub",
   "title": "Open drain hub / tundish",
   "category": "piping",
   "description": "Deck open-drain collection point. Hub: a cast drain hub just proud of the deck, with a bowl falling to the outlet bore and a removable round bar grating. Tundish: a raised galvanised funnel with a rolled rim on a riser, giving an air break for PSV and instrument drain tails, with an optional grating. Both sit on a deck doubler with a penetration sleeve. The drain pipe runs down to a Class 150 weld-neck flange (port `drain`, kind drain) below the deck.",
   "import": "./piping/drain-hub",
   "export": "DrainHub",
   "anchor": "base",
   "standards": [
    "ISO 13702 (open drains, typical)",
    "API RP 14C / API 14J (drain systems, typical)",
    "ASME B16.5"
   ],
   "vendors": [],
   "tags": [
    "drain",
    "open drain",
    "tundish",
    "hub",
    "deck drain",
    "funnel"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "hub",
      "tundish"
     ]
    },
    {
     "key": "nps",
     "label": "Outlet",
     "type": "nps",
     "min": 1,
     "max": 8
    },
    {
     "key": "height",
     "label": "Rim height",
     "type": "number",
     "min": 0.05,
     "max": 0.8,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Outlet depth",
     "type": "number",
     "min": 0.2,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "cover",
     "label": "Grating",
     "type": "bool"
    }
   ],
   "defaults": {
    "kind": "hub",
    "nps": 4,
    "height": 0.1,
    "depth": 0.45,
    "cover": true
   },
   "ports": [
    {
     "id": "drain",
     "label": "Drain outlet",
     "position": [
      0,
      -0.45,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     0.414,
     0.552,
     0.414
    ],
    "center": [
     0,
     -0.176,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/drain-hub.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (funnel / tundish)",
    "drawn": "A funnel (V or trapezoid) open at the top with the drain pipe leaving the bottom to the open-drain (OD) header; drawn below the vents and drains of equipment that discharge into it.",
    "tags": [
     "DH",
     "TD"
    ],
    "notes": "A funnel feeding an OD line = open drain hub or tundish. Closed drains (CD) are piped directly with no funnel.",
    "datasheet": {
     "form": "Open drain item schedule (ISO 13702 / API RP 14C drain systems)",
     "fields": {
      "Type": "kind",
      "Outlet size": "nps",
      "Height": "height",
      "Bowl depth": "depth",
      "Cover": "cover"
     }
    }
   }
  },
  {
   "name": "pipe-spool",
   "title": "Pipe spool",
   "category": "piping",
   "description": "Shop-fabricated straight spool: B36.10 pipe with weld-neck flanged or B16.25 bevelled ends, butt welds, optional aluminium-jacketed insulation with stainless banding and ISO 14726 service identification bands. NPS, schedule, class and length drive the geometry.",
   "import": "./piping/pipe-spool",
   "export": "PipeSpool",
   "anchor": "inline",
   "standards": [
    "ASME B36.10M",
    "ASME B16.5",
    "ASME B16.25",
    "ISO 14726"
   ],
   "vendors": [
    "Johns Manville (metal jacketing)"
   ],
   "tags": [
    "pipe",
    "spool",
    "insulation",
    "line"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 36
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 0.3,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "ends",
     "label": "Ends",
     "type": "select",
     "options": [
      "flanged",
      "plain",
      "flanged-plain"
     ]
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "none",
      "oil",
      "gas",
      "multiphase",
      "water",
      "seawater",
      "firewater",
      "steam",
      "air",
      "nitrogen",
      "chemical",
      "flare",
      "drain",
      "fuel-gas",
      "diesel",
      "potable",
      "cooling"
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "schedule": "40",
    "rating": 300,
    "length": 3,
    "ends": "flanged",
    "insulated": false,
    "service": "oil"
   },
   "ports": [
    {
     "id": "A",
     "label": "End A (flange)",
     "position": [
      -1.5,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B (flange)",
     "position": [
      1.5,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3.004,
     0.317,
     0.317
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipe-spool.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A solid line labelled with its line number (size-service-number-class-insulation, e.g. 8\"-PG-2101-D6A-N); flanged joints appear as short double bars across the line. Insulation is marked by the H / IH suffix or a dashed outline along the line.",
    "notes": "Process lines are thick solid; utility and minor lines thinner; instrument signal lines are dashed (electrical) or with hash marks (pneumatic). Each line number between two nozzles becomes one spool run.",
    "datasheet": {
     "form": "Line list / piping class (ASME B31.3, B36.10)",
     "fields": {
      "Nominal size": "nps",
      "Wall schedule": "schedule",
      "Flange rating (from class)": "rating",
      "End connection": "ends",
      "Insulation": "insulated",
      "Service code": "service"
     }
    }
   }
  },
  {
   "name": "elbow",
   "title": "Elbow",
   "category": "piping",
   "description": "Butt-welding elbow: 90° and 180° return in long (1.5D) or short (1.0D) radius, 45° long radius. Centre-to-end from ASME B16.9, machined B16.25 weld bevels or welded-on weld-neck flanges. The work point (tangent intersection) is the origin; turn sets whether end B goes up, down or sideways.",
   "import": "./piping/elbow",
   "export": "Elbow",
   "anchor": "fitting",
   "standards": [
    "ASME B16.9",
    "ASME B16.25",
    "ASME B16.5",
    "MSS SP-75"
   ],
   "vendors": [
    "Weldbend"
   ],
   "tags": [
    "fitting",
    "elbow",
    "bend",
    "return"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "angle",
     "label": "Angle",
     "type": "select",
     "options": [
      90,
      45,
      180
     ]
    },
    {
     "key": "radius",
     "label": "Radius",
     "type": "select",
     "options": [
      "LR",
      "SR"
     ]
    },
    {
     "key": "ends",
     "label": "Ends",
     "type": "select",
     "options": [
      "butt-weld",
      "flanged"
     ]
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating"
    },
    {
     "key": "turn",
     "label": "Turn",
     "type": "select",
     "options": [
      "up",
      "down",
      "side"
     ]
    },
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "none",
      "oil",
      "gas",
      "multiphase",
      "water",
      "seawater",
      "firewater",
      "steam",
      "air",
      "nitrogen",
      "chemical",
      "flare",
      "drain",
      "fuel-gas",
      "diesel",
      "potable",
      "cooling"
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "schedule": "40",
    "angle": 90,
    "radius": "LR",
    "ends": "butt-weld",
    "rating": 300,
    "turn": "up",
    "service": "none"
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.2286,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0,
      0.2286,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.313,
     0.313,
     0.168
    ],
    "center": [
     -0.072,
     0.072,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/elbow.svg",
    "standard": "ISO 6412 / isometric convention (fittings are not shown individually on P&IDs)",
    "drawn": "On P&IDs a change of direction is just a corner in the line; elbows are only drawn on isometrics and GA drawings, as a bend or a corner with a short tick at each weld.",
    "notes": "Take the angle and radius (LR / SR) from the isometric or the piping class, not the P&ID. Treat a P&ID corner as an elbow only when building a 3D route.",
    "datasheet": {
     "form": "Piping class / isometric bill of materials (ASME B16.9)",
     "fields": {
      "Nominal size": "nps",
      "Wall schedule": "schedule",
      "Angle": "angle",
      "Radius (LR / SR)": "radius",
      "End connection": "ends",
      "Flange rating": "rating",
      "Service code": "service"
     }
    }
   }
  },
  {
   "name": "tee",
   "title": "Tee",
   "category": "piping",
   "description": "Butt-welding equal or reducing tee with a forged crotch radius. Run centre-to-end C and outlet M from ASME B16.9 (reducing outlet M approximated), B16.25 weld bevels or welded weld-neck flanges. Origin at the run and branch centreline intersection; the outlet points up, down or sideways.",
   "import": "./piping/tee",
   "export": "Tee",
   "anchor": "fitting",
   "standards": [
    "ASME B16.9",
    "ASME B16.25",
    "ASME B16.5",
    "MSS SP-75"
   ],
   "vendors": [
    "Weldbend"
   ],
   "tags": [
    "fitting",
    "tee",
    "branch",
    "reducing tee"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Run size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "branchNps",
     "label": "Branch size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "ends",
     "label": "Ends",
     "type": "select",
     "options": [
      "butt-weld",
      "flanged"
     ]
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating"
    },
    {
     "key": "branch",
     "label": "Branch",
     "type": "select",
     "options": [
      "up",
      "down",
      "side"
     ]
    },
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "none",
      "oil",
      "gas",
      "multiphase",
      "water",
      "seawater",
      "firewater",
      "steam",
      "air",
      "nitrogen",
      "chemical",
      "flare",
      "drain",
      "fuel-gas",
      "diesel",
      "potable",
      "cooling"
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "branchNps": 6,
    "schedule": "40",
    "ends": "butt-weld",
    "rating": 300,
    "branch": "up",
    "service": "none"
   },
   "ports": [
    {
     "id": "run-a",
     "label": "Run A",
     "position": [
      -0.1427,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "run-b",
     "label": "Run B",
     "position": [
      0.1427,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "branch",
     "label": "Branch",
     "position": [
      0,
      0.1427,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.285,
     0.227,
     0.168
    ],
    "center": [
     0,
     0.029,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/tee.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A branch line meeting a run line; a dot at the junction confirms a connection (lines crossing without a dot or with a gap / hop are not connected).",
    "notes": "Reducing tees are shown by the different line sizes of run and branch. Crossing lines without a dot are not a tee. On isometrics the tee is drawn with weld ticks.",
    "datasheet": {
     "form": "Piping class / isometric bill of materials (ASME B16.9)",
     "fields": {
      "Run size": "nps",
      "Branch size": "branchNps",
      "Wall schedule": "schedule",
      "End connection": "ends",
      "Flange rating": "rating",
      "Service code": "service"
     }
    }
   }
  },
  {
   "name": "reducer",
   "title": "Reducer",
   "category": "piping",
   "description": "Butt-welding concentric or eccentric reducer (flat on top or bottom) with a smooth cone between short straight ends. End-to-end length from ASME B16.9 for the large end; B16.25 weld bevels or welded weld-neck flanges. Port A is the large end on the axis; for eccentric reducers port B is offset by the radius difference.",
   "import": "./piping/reducer",
   "export": "Reducer",
   "anchor": "inline",
   "standards": [
    "ASME B16.9",
    "ASME B16.25",
    "ASME B16.5"
   ],
   "vendors": [
    "Weldbend"
   ],
   "tags": [
    "fitting",
    "reducer",
    "concentric",
    "eccentric",
    "pump suction"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Large end",
     "type": "nps",
     "min": 0.75,
     "max": 48
    },
    {
     "key": "smallNps",
     "label": "Small end",
     "type": "nps",
     "min": 0.5,
     "max": 42
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "kind",
     "label": "Type",
     "type": "select",
     "options": [
      "concentric",
      "eccentric"
     ]
    },
    {
     "key": "flat",
     "label": "Flat side",
     "type": "select",
     "options": [
      "top",
      "bottom"
     ]
    },
    {
     "key": "ends",
     "label": "Ends",
     "type": "select",
     "options": [
      "butt-weld",
      "flanged"
     ]
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating"
    },
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "none",
      "oil",
      "gas",
      "multiphase",
      "water",
      "seawater",
      "firewater",
      "steam",
      "air",
      "nitrogen",
      "chemical",
      "flare",
      "drain",
      "fuel-gas",
      "diesel",
      "potable",
      "cooling"
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "smallNps": 4,
    "schedule": "40",
    "kind": "concentric",
    "flat": "top",
    "ends": "butt-weld",
    "rating": 300,
    "service": "none"
   },
   "ports": [
    {
     "id": "A",
     "label": "Large end",
     "position": [
      -0.0698,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Small end",
     "position": [
      0.0699,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.14,
     0.168,
     0.168
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/reducer.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A trapezoid in the line, the large end facing the larger pipe, with the two sizes written beside it (e.g. 8\"×6\"). Eccentric reducers have one flat side, noted FOT (flat on top) or FOB (flat on bottom).",
    "notes": "A size change at a valve or pump nozzle is often shown only by the size note. Eccentric FOT reducers sit on pump suctions.",
    "datasheet": {
     "form": "Piping class / isometric bill of materials (ASME B16.9)",
     "fields": {
      "Large end size": "nps",
      "Small end size": "smallNps",
      "Wall schedule": "schedule",
      "Type (concentric / eccentric)": "kind",
      "Flat side": "flat",
      "End connection": "ends",
      "Flange rating": "rating",
      "Service code": "service"
     }
    }
   }
  },
  {
   "name": "flanged-joint",
   "title": "Flanged joint",
   "category": "piping",
   "description": "Complete bolted flange joint: two weld-neck raised-face flanges, a spiral-wound gasket with inner ring and colour-coded centring ring, Xylan-coated B7 stud bolts with two 2H nuts each, short bevelled pipe stubs and a joint-integrity tag. Any ASME B16.5 / B16.47 Series A size and class.",
   "import": "./piping/flanged-joint",
   "export": "FlangedJoint",
   "anchor": "inline",
   "standards": [
    "ASME B16.5",
    "ASME B16.47",
    "ASME B16.20",
    "ASME PCC-1",
    "ASTM A193 B7"
   ],
   "vendors": [
    "Weldbend",
    "Flexitallic"
   ],
   "tags": [
    "flange",
    "gasket",
    "bolting",
    "joint",
    "spool break"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "stub",
     "label": "Pipe stubs",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Joint tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "schedule": "40",
    "stub": 0.15,
    "tag": "J-101"
   },
   "ports": [
    {
     "id": "A",
     "label": "End A (weld end)",
     "position": [
      -0.2508,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B (weld end)",
     "position": [
      0.2508,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.502,
     0.317,
     0.317
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/flanged-joint.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "Two short parallel bars across the line (a flange pair), sometimes with a gap between them; at a nozzle only one bar is drawn against the equipment.",
    "notes": "Two bars with a filled or open paddle between them, or with a figure-8 drawn beside them on a short stem, is a spectacle blind or spade (not a plain joint); two bars with taps and an FE tag is an orifice flange pair. Spec breaks (class changes) are marked at a flange with the two class codes.",
    "datasheet": {
     "form": "Piping class (ASME B16.5 / B16.47 flanges, B16.20 gaskets)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Wall schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "blind-flange",
   "title": "Blind flange",
   "category": "piping",
   "description": "Blind flange closing a line end or a spare branch: raised-face blind with bleed plug and eyebolt, spiral-wound gasket, stud bolts with two nuts and the mating weld-neck flange on a bevelled stub. Port A is the blind face, so a line ending here bolts straight onto it.",
   "import": "./piping/blind-flange",
   "export": "BlindFlange",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B16.47",
    "ASME B16.20",
    "ASME PCC-1"
   ],
   "vendors": [
    "Weldbend",
    "Texas Flange"
   ],
   "tags": [
    "flange",
    "blind",
    "end closure",
    "isolation"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "schedule",
     "label": "Schedule",
     "type": "select",
     "options": [
      "10",
      "20",
      "40",
      "STD",
      "80",
      "XS",
      "160",
      "XXS",
      "10S",
      "40S",
      "80S"
     ]
    },
    {
     "key": "mating",
     "label": "Mating flange",
     "type": "bool"
    },
    {
     "key": "stub",
     "label": "Pipe stub",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Joint tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "schedule": "40",
    "mating": true,
    "stub": 0.2,
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Blind face",
     "position": [
      0.0023,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.364,
     0.378,
     0.317
    ],
    "center": [
     -0.119,
     0.03,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/blind-flange.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A line ending in a flange bar followed by a thicker solid bar (or a filled half-circle cap): a blinded end or spare connection.",
    "notes": "A single solid bar across the line between two flange bars is a spade / blind in the line; a figure-8 is a spectacle blind. A line ending with a plain dome is a pipe cap (welded), not a blind.",
    "datasheet": {
     "form": "Piping class (ASME B16.5 / B16.47)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Wall schedule": "schedule",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "spectacle-blind",
   "title": "Spectacle blind",
   "category": "piping",
   "description": "Figure-8 spectacle blind for positive isolation: solid paddle and spacer ring on a tie bar, thickness from the ASME B16.48 pressure formula, between two weld-neck flanges with spiral-wound gaskets, lengthened studs and jack screws. state swaps the paddle and spacer; the idle end shows a red (blind) or green (spacer) flash.",
   "import": "./piping/spectacle-blind",
   "export": "SpectacleBlind",
   "anchor": "inline",
   "standards": [
    "ASME B16.48",
    "ASME B16.5",
    "ASME B16.20",
    "ASME PCC-1"
   ],
   "vendors": [
    "Sweco Fab"
   ],
   "tags": [
    "isolation",
    "blind",
    "figure 8",
    "positive isolation"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "state",
     "label": "State",
     "type": "select",
     "options": [
      "closed",
      "open"
     ]
    },
    {
     "key": "flanges",
     "label": "Flanges",
     "type": "bool"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "state": "closed",
    "flanges": true
   },
   "ports": [
    {
     "id": "A",
     "label": "Face A",
     "position": [
      -0.0095,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Face B",
     "position": [
      0.0095,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.225,
     0.552,
     0.317
    ],
    "center": [
     0,
     0.117,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/spectacle-blind.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A figure-8 drawn across the line between two flange bars: one circle filled (solid blind) and one open (spacer ring). The filled half on the line means the line is blinded (normally closed); the open half on the line means it is open.",
    "tags": [
     "SB"
    ],
    "notes": "Note NO / NC (or SO / SC) beside it for the normal position. Many legends draw the figure-8 beside the flange pair on a short stem instead of across the line: the circle next to the stem is the half in the line (open ring = open, blank = closed), and the blank may be hatched or drawn as concentric circles. A single filled paddle is a spade; a single open ring is a spacer.",
    "datasheet": {
     "form": "Piping class / special item datasheet (ASME B16.48)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Normal position (NO / NC)": "state",
      "Include flanges": "flanges"
     }
    }
   }
  },
  {
   "name": "y-strainer",
   "title": "Y-strainer",
   "category": "piping",
   "description": "Flanged cast-steel Y-strainer: body with integral raised-face flanges, 45° screen leg pointing downstream, bolted screen cap with a quarter-turn blowdown valve, drain plug, cast flow arrows and nameplate. Face-to-face and screen-leg length follow typical vendor tables for class 150 / 300 (about 3 x NPS face-to-face at class 150), blow-off 1 in at NPS 2 up to 2 in from NPS 6.",
   "import": "./piping/y-strainer",
   "export": "YStrainer",
   "anchor": "inline",
   "standards": [
    "ASME B16.34",
    "ASME B16.5"
   ],
   "vendors": [
    "Eaton"
   ],
   "tags": [
    "strainer",
    "filter",
    "pump protection",
    "inline"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "mesh",
     "label": "Screen mesh",
     "type": "number",
     "min": 10,
     "max": 200,
     "step": 10
    },
    {
     "key": "blowdown",
     "label": "Blowdown valve",
     "type": "bool"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "mesh": 40,
    "blowdown": true,
    "body": "valveBody"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.254,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.254,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.805,
     0.708,
     0.418
    ],
    "center": [
     0.146,
     -0.195,
     0.05
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/y-strainer.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (piping)",
    "drawn": "A Y-shaped leg slanting down from the line with a dashed line inside it for the screen, sometimes tagged SP / Y-STR with a blow-down valve on the end of the leg.",
    "tags": [
     "SP",
     "STR"
    ],
    "isa": [
     "PDI"
    ],
    "notes": "A basket or temporary cone strainer is drawn as a box or cone in the line with a dashed screen. A PDI / PDT across it monitors blockage. ISA codes here: PDI = across.",
    "datasheet": {
     "form": "Special piping item datasheet (ASME B16.34)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Screen mesh": "mesh",
      "Blow-down valve": "blowdown"
     }
    }
   }
  },
  {
   "name": "basket-strainer",
   "title": "Basket strainer",
   "category": "piping",
   "description": "Fabricated single basket strainer: vertical shell about twice the line size with a 2:1 bottom head, side inlet and outlet nozzles that open into the body, a removable perforated basket, B16.5 body flange with a swing-bolt quick-opening cover, davit with lifting screw, cover vent valve, bottom drain valve, three legs on anchored base plates, dP gauge and nameplate. Face-to-face and nozzle heights follow typical fabricated-strainer GA tables.",
   "import": "./piping/basket-strainer",
   "export": "BasketStrainer",
   "anchor": "inline",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "ASME B31.3"
   ],
   "vendors": [
    "Rosedale Products",
    "Sure Flow Equipment",
    "Eaton (Hayward)"
   ],
   "tags": [
    "strainer",
    "filter",
    "pump protection",
    "quick opening",
    "inline"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Line size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "mesh",
     "label": "Mesh",
     "type": "number",
     "min": 10,
     "max": 200,
     "step": 10
    },
    {
     "key": "davit",
     "label": "Davit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 150,
    "mesh": 20,
    "davit": true,
    "tag": "STR-101",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.3365,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.3365,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.678,
     1.457,
     0.654
    ],
    "center": [
     0,
     -0.036,
     0.035
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/basket-strainer.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (strainer: body with a dashed screen)",
    "drawn": "A pot-shaped body in the line (inlet and outlet near the top) with a dashed U-shaped basket inside and a bolted cover on top; often a PDI / PDT across it.",
    "tags": [
     "SP",
     "STR"
    ],
    "isa": [
     "PDI",
     "PDT"
    ],
    "notes": "A Y-shaped leg is a y-strainer; a cone in the line is a temporary strainer. Twin (duplex) basket strainers are two pots with a changeover valve.",
    "datasheet": {
     "form": "Strainer datasheet (ASME VIII-1 / ASME B31.3)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Screen mesh": "mesh",
      "Cover davit": "davit",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pipe-support",
   "title": "Pipe support",
   "category": "piping",
   "description": "Pipe support on a steel T-post with anchored base plate, stiffeners and earthing boss. Types: resting T-shoe on a PTFE slide pad, guided shoe with bolted guide angles, anchor (line stops plus guides, welded), U-bolt on a wear pad, dummy leg welded to an elbow, and trunnion under a base elbow. Shoe height 100 mm (150 mm insulated), length 300 to 600 mm by size. height is the bottom-of-pipe elevation; set pipe to show the supported line.",
   "import": "./piping/pipe-support",
   "export": "PipeSupport",
   "anchor": "base",
   "standards": [
    "MSS SP-58",
    "ASME B31.3",
    "EN 10365"
   ],
   "vendors": [
    "Piping Technology & Products",
    "Øglænd System",
    "APP (Advanced Piping Products)"
   ],
   "tags": [
    "support",
    "shoe",
    "guide",
    "anchor",
    "line stop",
    "u-bolt",
    "dummy leg",
    "trunnion",
    "stanchion"
   ],
   "params": [
    {
     "key": "type",
     "label": "Type",
     "type": "select",
     "options": [
      "shoe",
      "guide",
      "anchor",
      "u-bolt",
      "dummy-leg",
      "trunnion"
     ]
    },
    {
     "key": "nps",
     "label": "Pipe size",
     "type": "nps",
     "min": 1,
     "max": 36
    },
    {
     "key": "height",
     "label": "Bottom of pipe",
     "type": "number",
     "min": 0.3,
     "max": 4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "pipe",
     "label": "Show pipe",
     "type": "bool"
    }
   ],
   "defaults": {
    "type": "shoe",
    "nps": 6,
    "height": 1,
    "insulated": false,
    "pipe": false
   },
   "ports": [],
   "bounds": {
    "size": [
     1.4,
     1.168,
     0.468
    ],
    "center": [
     0,
     0.584,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipe-support.svg",
    "standard": "Piping support convention (isometric / GA support marks); MSS SP-58",
    "drawn": "On isometrics and GAs: a mark at the support point with its type code (shoe, guide G, line stop LS, anchor A, dummy leg DL, trunnion) and number; in section, the pipe resting on a shoe on a steel member or post.",
    "notes": "Not on P&IDs. An anchor is often drawn as a cross on the pipe; a guide as two short bars either side; a shoe as a small rectangle under the pipe.",
    "datasheet": {
     "form": "Pipe support schedule (MSS SP-58 / ASME B31.3)",
     "fields": {
      "Support type": "type",
      "Pipe size": "nps",
      "Support height": "height",
      "Insulated line": "insulated"
     }
    }
   }
  },
  {
   "name": "sight-glass",
   "title": "Sight glass",
   "category": "piping",
   "description": "Flanged double-window sight flow indicator: hollow body with the flow bore open through, opposed borosilicate windows on gaskets in bolted square retainers, and a hinged stainless flapper that swings with flow. Face-to-face from typical vendor tables for class 150 / 300; integral raised-face flanges.",
   "import": "./piping/sight-glass",
   "export": "SightGlass",
   "anchor": "inline",
   "standards": [
    "ASME B16.5",
    "ASME B31.3"
   ],
   "vendors": [
    "L.J. Star",
    "Jacoby-Tarbox (Clark-Reliance)"
   ],
   "tags": [
    "sight glass",
    "flow indicator",
    "inline",
    "visual"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 8
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "indicator",
     "label": "Indicator",
     "type": "select",
     "options": [
      "flapper",
      "none"
     ]
    },
    {
     "key": "flow",
     "label": "Flow",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 150,
    "indicator": "flapper",
    "flow": 0.5,
    "body": "valveBody"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.1397,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.1397,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.284,
     0.229,
     0.229
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/sight-glass.svg",
    "standard": "ISO 10628-2 / ISA 5.1 (flow glass, FG)",
    "drawn": "A circle in the line between two flange bars, often with a small flapper or ball drawn inside, tagged FG (flow glass / sight flow indicator).",
    "tags": [
     "SG"
    ],
    "isa": [
     "FG"
    ],
    "notes": "A circle in the line tagged FG is a sight glass; an LG on a vessel is a level gauge; a circle with M is a mag meter or motor.",
    "datasheet": {
     "form": "Sight flow indicator datasheet (ASME B16.5 / B31.3)",
     "fields": {
      "Nominal size": "nps",
      "Flange rating": "rating",
      "Indicator": "indicator"
     }
    }
   }
  },
  {
   "name": "utility-station",
   "title": "Utility station",
   "category": "piping",
   "description": "Deck utility (hose) station on an anchored SHS post with a galvanised backing panel: plant air, utility water and nitrogen drops fed from overhead flanges, each with an isolation ball valve, check valve and a different downward-pointing hose coupling (claw, cam-and-groove, dedicated threaded nitrogen) so hoses cannot be cross-connected. ISO 14726 bands, service signs, asphyxiant warning, hose racks with coiled hoses, optional impact bollards.",
   "import": "./piping/utility-station",
   "export": "UtilityStation",
   "anchor": "base",
   "standards": [
    "ISO 14726",
    "ISO 3864",
    "ASME B31.3",
    "NORSOK L-002"
   ],
   "vendors": [
    "TESS",
    "Strahman Valves",
    "Spirax Sarco"
   ],
   "tags": [
    "utility",
    "hose station",
    "air",
    "water",
    "nitrogen",
    "deck"
   ],
   "params": [
    {
     "key": "air",
     "label": "Air",
     "type": "bool"
    },
    {
     "key": "water",
     "label": "Water",
     "type": "bool"
    },
    {
     "key": "nitrogen",
     "label": "Nitrogen",
     "type": "bool"
    },
    {
     "key": "supply",
     "label": "Supply elevation",
     "type": "number",
     "min": 2.1,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    },
    {
     "key": "bollards",
     "label": "Bollards",
     "type": "bool"
    }
   ],
   "defaults": {
    "air": true,
    "water": true,
    "nitrogen": true,
    "supply": 2.4,
    "tag": "US-01",
    "bollards": false
   },
   "ports": [
    {
     "id": "air",
     "label": "PLANT AIR supply",
     "position": [
      -0.17,
      2.4,
      0.13
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "water",
     "label": "UTILITY WATER supply",
     "position": [
      -0.05,
      2.4,
      0.13
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    },
    {
     "id": "nitrogen",
     "label": "NITROGEN supply",
     "position": [
      0.07,
      2.4,
      0.13
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     0.868,
     2.402,
     0.486
    ],
    "center": [
     0,
     1.201,
     0.031
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/utility-station.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (utility station / hose connections)",
    "drawn": "A group of utility drops (plant air UA, utility water UW, nitrogen N) each with an isolation valve, a check valve and a hose connection (small triangle or coupling) at the end, boxed or noted \"US-xx\" on the utility P&ID.",
    "tags": [
     "US",
     "UST"
    ],
    "notes": "Usually shown once in detail on a typical sheet and then as a small labelled circle or box at each location on layouts.",
    "datasheet": {
     "form": "Utility station schedule (NORSOK L-002, ISO 14726 colour codes)",
     "fields": {
      "Plant air": "air",
      "Utility water": "water",
      "Nitrogen": "nitrogen",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "gasket",
   "title": "Gasket",
   "category": "piping",
   "description": "Flange gasket sized for the NPS and class. Spiral-wound per ASME B16.20 with stainless inner ring, alternating metal and filler winding, and a centring ring sized to the bolt circle with the winding colour on its rim and filler stripes. Ring-type joint in octagonal or oval section on the R-ring pitch diameter. B16.21 compressed-fibre sheet ring inside the bolts, with an identification tab. Open through the bore; plane of the gasket is YZ.",
   "import": "./piping/gasket",
   "export": "Gasket",
   "anchor": "fitting",
   "standards": [
    "ASME B16.20",
    "ASME B16.21",
    "API 6A",
    "ASME B16.5"
   ],
   "vendors": [
    "Flexitallic"
   ],
   "tags": [
    "gasket",
    "spiral wound",
    "RTJ",
    "ring joint",
    "sheet",
    "flange"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "type",
     "label": "Type",
     "type": "select",
     "options": [
      "spiral-wound",
      "rtj",
      "sheet"
     ]
    },
    {
     "key": "winding",
     "label": "Winding",
     "type": "select",
     "options": [
      "316L",
      "304",
      "321",
      "alloy-625",
      "monel"
     ]
    },
    {
     "key": "filler",
     "label": "Filler",
     "type": "select",
     "options": [
      "graphite",
      "ptfe",
      "mica"
     ]
    },
    {
     "key": "ring",
     "label": "RTJ section",
     "type": "select",
     "options": [
      "octagonal",
      "oval"
     ]
    },
    {
     "key": "thickness",
     "label": "Sheet thickness",
     "type": "select",
     "options": [
      0.0015,
      0.003
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "type": "spiral-wound",
    "winding": "316L",
    "filler": "graphite",
    "ring": "octagonal",
    "thickness": 0.003
   },
   "ports": [],
   "bounds": {
    "size": [
     0.004,
     0.251,
     0.251
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gasket.svg",
    "standard": "Piping class item (ASME B16.20 / B16.21); not drawn on P&IDs",
    "drawn": "Not drawn on P&IDs; on isometrics and joint details it is the thin element between two flange faces (a filled strip in section), called up in the bill of materials by type (SW, RTJ, sheet).",
    "tags": [
     "GSK"
    ],
    "notes": "Type follows the piping class: spiral-wound for RF flanges, RTJ ring for ring-joint flanges (high pressure), sheet for FF / low-pressure utility.",
    "datasheet": {
     "form": "Piping class / gasket specification (ASME B16.20 / B16.21)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Gasket type": "type",
      "Winding material": "winding",
      "Filler": "filler",
      "Ring type (RTJ)": "ring",
      "Thickness": "thickness"
     }
    }
   }
  },
  {
   "name": "stud-bolt-set",
   "title": "Stud bolt set",
   "category": "piping",
   "description": "Complete stud-bolt set for one flanged joint: stud count, diameter and RF length from the ASME B16.5 bolting tables, threaded A193 B7 studs with chamfered ends and B7 end marks, two A194 2H heavy hex nuts each with washer face and 2H mark, set at a made-up joint grip so a few threads protrude. Coating: PTFE blue, hot-dip galvanised, black or zinc-nickel. Laid out on the bolt circle or in a row.",
   "import": "./piping/stud-bolt-set",
   "export": "StudBoltSet",
   "anchor": "fitting",
   "standards": [
    "ASME B16.5",
    "ASME B18.2.2",
    "ASTM A193 B7",
    "ASTM A194 2H",
    "ASME PCC-1"
   ],
   "vendors": [
    "Fabory"
   ],
   "tags": [
    "bolting",
    "stud bolt",
    "nuts",
    "flange",
    "fasteners"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Flange size",
     "type": "nps",
     "min": 0.5,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "coating",
     "label": "Coating",
     "type": "select",
     "options": [
      "ptfe-blue",
      "hot-dip",
      "black",
      "zinc-nickel"
     ]
    },
    {
     "key": "layout",
     "label": "Layout",
     "type": "select",
     "options": [
      "joint",
      "row"
     ]
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "coating": "ptfe-blue",
    "layout": "joint"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.127,
     0.292,
     0.297
    ],
    "center": [
     0,
     0,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/stud-bolt-set.svg",
    "standard": "Piping class item (ASME B16.5 bolting, ASTM A193 / A194); not drawn on P&IDs",
    "drawn": "Not drawn on P&IDs; in joint details, studs are lines through both flanges with a hex nut at each end, specified in the bill of materials by number, diameter and length.",
    "tags": [
     "STUD"
    ],
    "notes": "Quantity and size come from ASME B16.5 tables for the NPS and class; coating from the piping or coating specification.",
    "datasheet": {
     "form": "Piping class / bolting specification (ASME B16.5, ASTM A193 B7 / A194 2H)",
     "fields": {
      "Nominal size": "nps",
      "Pressure class": "rating",
      "Coating": "coating"
     }
    }
   }
  },
  {
   "name": "pipe-clamp",
   "title": "Pipe clamp",
   "category": "piping",
   "description": "Pipe clamps after MSS SP-58. Two-bolt clamp (Type 4): two formed straps with a load bolt above and a bolt below the pipe. Three-bolt clamp (Type 3): long upper ears with a load bolt and a spacer bolt, for heavier or insulated lines. Both hang on a weldless eye nut and threaded rod from a lug on a short beam. Riser clamp: two bent bars bolted across a vertical pipe with ears bearing on channel supports. Strap, bolt and rod sizes follow typical light-series tables.",
   "import": "./piping/pipe-clamp",
   "export": "PipeClamp",
   "anchor": "fitting",
   "standards": [
    "MSS SP-58",
    "MSS SP-69",
    "ASME B31.3"
   ],
   "vendors": [
    "Anvil International",
    "Piping Technology & Products"
   ],
   "tags": [
    "support",
    "hanger",
    "clamp",
    "riser clamp",
    "rod"
   ],
   "params": [
    {
     "key": "type",
     "label": "Type",
     "type": "select",
     "options": [
      "three-bolt",
      "two-bolt",
      "riser"
     ]
    },
    {
     "key": "nps",
     "label": "Pipe size",
     "type": "nps",
     "min": 1,
     "max": 30
    },
    {
     "key": "rod",
     "label": "Rod length",
     "type": "number",
     "min": 0.15,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "pipe",
     "label": "Show pipe",
     "type": "bool"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "painted"
     ]
    }
   ],
   "defaults": {
    "type": "three-bolt",
    "nps": 6,
    "rod": 0.6,
    "pipe": false,
    "finish": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.2,
     1.131,
     0.5
    ],
    "center": [
     0,
     0.435,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipe-clamp.svg",
    "standard": "Piping support convention (isometric / support detail); MSS SP-58 / SP-69",
    "drawn": "Not on P&IDs. On support drawings and isometrics a hanger is marked at the support point with its type (e.g. a rod hanger with a clamp, MSS type 3 or 4), and in detail the pipe circle is shown gripped by the clamp straps hanging from a rod.",
    "tags": [
     "HGR"
    ],
    "notes": "A clamp hanging on a rod is a hanger; a shoe on steel is a pipe-support. Riser clamps carry vertical pipe at floor penetrations.",
    "datasheet": {
     "form": "Pipe support schedule (MSS SP-58 / SP-69)",
     "fields": {
      "Clamp type": "type",
      "Pipe size": "nps",
      "Hanger rod length": "rod",
      "Finish": "finish"
     }
    }
   }
  },
  {
   "name": "gas-turbine-generator",
   "title": "Gas turbine generator (API 616)",
   "category": "rotating",
   "description": "Packaged industrial / aeroderivative gas turbine generator on a base frame with drip pan: acoustic enclosure with opening doors, louvres, roof ventilation fans, flame / heat / gas detectors, call points and an internal maintenance monorail. Roof inlet duct with a multi-stage filter house: weather hoods over a bird screen, vane separator, coalescer / pre-filter cells and final cartridges, anti-icing manifold, access platform. Exhaust collector, expansion joint, silencer and stack with sampling platform. Inside: exciter, generator with CACW cooler and terminal box, reduction gearbox, guarded couplings, inlet plenum with bell-mouth and the GT core with VSV rings and dual-fuel manifolds. Fuel gas skid, diesel duplex filter, lube console with fin-fan cooler and roof vent separator with flame trap, CO₂ cabinet and neutral earthing resistor. Size scales with `mw`.",
   "import": "./rotating/gas-turbine-generator",
   "export": "GasTurbineGenerator",
   "anchor": "base",
   "standards": [
    "API 616",
    "ISO 3977",
    "ISO 21789",
    "IEC 60034-3",
    "API 614",
    "ASME B16.5"
   ],
   "vendors": [
    "Solar Turbines",
    "Siemens Energy",
    "MAN Energy Solutions",
    "Centrax"
   ],
   "tags": [
    "gas turbine",
    "GTG",
    "power generation",
    "turbine",
    "generator",
    "package"
   ],
   "params": [
    {
     "key": "mw",
     "label": "Rating",
     "type": "number",
     "min": 1,
     "max": 60,
     "step": 1,
     "unit": "MW"
    },
    {
     "key": "fuel",
     "label": "Fuel",
     "type": "select",
     "options": [
      {
       "value": "gas",
       "label": "Fuel gas"
      },
      {
       "value": "dual",
       "label": "Dual fuel (gas / diesel)"
      }
     ]
    },
    {
     "key": "fuelNps",
     "label": "Fuel gas inlet",
     "type": "nps",
     "min": 1.5,
     "max": 6
    },
    {
     "key": "rating",
     "label": "Fuel gas class",
     "type": "rating",
     "options": [
      300,
      600,
      900
     ]
    },
    {
     "key": "stackHeight",
     "label": "Stack above roof",
     "type": "number",
     "min": 4,
     "max": 25,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "cutaway",
     "label": "Cutaway (+Z wall off)",
     "type": "bool"
    },
    {
     "key": "doorsOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mw": 25,
    "fuel": "dual",
    "fuelNps": 3,
    "rating": 600,
    "stackHeight": 10,
    "cutaway": false,
    "doorsOpen": false,
    "tag": "GT-8100A",
    "running": true
   },
   "ports": [
    {
     "id": "fuel-gas",
     "label": "Fuel gas",
     "position": [
      2.325,
      0.9,
      -2.625
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 3,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "diesel",
     "label": "Liquid fuel (diesel)",
     "position": [
      0.775,
      0.9,
      -2.625
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     16.871,
     16.055,
     5.136
    ],
    "center": [
     0.02,
     8.028,
     -0.078
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gas-turbine-generator.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (turbine) / IEC 60617 (generator)",
    "drawn": "Gas turbine drawn as a narrowing trapezoid (compressor), a small combustor box with the fuel line into it, and a widening trapezoid (turbine) with the exhaust leaving, coupled by the shaft to a circle with G (generator).",
    "tags": [
     "GT",
     "G"
    ],
    "notes": "On electrical single-line diagrams only the generator circle with G and ~ appears. A turbine coupled to a compressor instead of G is a turbine-driven compressor (centrifugal-compressor with driver gas-turbine). A box marked DE with G is a diesel generator.",
    "datasheet": {
     "form": "API 616 gas turbine datasheet (+ IEC 60034-3 generator)",
     "fields": {
      "Rated output": "mw",
      "Fuel system": "fuel",
      "Fuel gas connection size": "fuelNps",
      "Flange rating": "rating",
      "Exhaust stack height": "stackHeight",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "centrifugal-compressor",
   "title": "Centrifugal compressor package (API 617)",
   "category": "rotating",
   "description": "Gas compressor train on a common skid with walkways: barrel or horizontally split casing with dry gas seals, bearing housings and probes, suction / discharge nozzles up or down (down nozzles drop through deck openings), an anti-surge valve on a reducing tee off the discharge, a temporary suction strainer with dP gauge, dry gas seal panel and API 614 overhead rundown tank. Driver is a large induction motor (CACA cooler) with a speed-increasing gearbox and API 614 lube console, or a two-shaft gas turbine in its own acoustic enclosure with filter house, exhaust stack and fuel gas skid. Casing, motor and turbine size from `mw`.",
   "import": "./rotating/centrifugal-compressor",
   "export": "CentrifugalCompressor",
   "anchor": "base",
   "standards": [
    "API 617",
    "API 614",
    "API 692",
    "API 671",
    "API 613",
    "API 616",
    "IEC 60034",
    "ASME B16.5"
   ],
   "vendors": [
    "Baker Hughes",
    "Elliott Group",
    "Solar Turbines"
   ],
   "tags": [
    "compressor",
    "gas compression",
    "export compressor",
    "rotating",
    "package"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 3,
     "max": 20
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "mw",
     "label": "Driver power",
     "type": "number",
     "min": 0.5,
     "max": 40,
     "step": 0.5,
     "unit": "MW"
    },
    {
     "key": "casing",
     "label": "Casing",
     "type": "select",
     "options": [
      {
       "value": "barrel",
       "label": "Barrel (vertically split)"
      },
      {
       "value": "split",
       "label": "Horizontally split"
      }
     ]
    },
    {
     "key": "nozzles",
     "label": "Nozzles",
     "type": "select",
     "options": [
      "up",
      "down"
     ]
    },
    {
     "key": "driver",
     "label": "Driver",
     "type": "select",
     "options": [
      {
       "value": "motor",
       "label": "Motor + gearbox"
      },
      {
       "value": "gas-turbine",
       "label": "Gas turbine"
      }
     ]
    },
    {
     "key": "cutaway",
     "label": "Cutaway (GT enclosure)",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 12,
    "dischargeNps": 10,
    "rating": 600,
    "mw": 6.5,
    "casing": "barrel",
    "nozzles": "up",
    "driver": "motor",
    "cutaway": false,
    "doorsOpen": false,
    "tag": "K-2200",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      4.1723,
      3.3566,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      3.2389,
      3.3566,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "recycle",
     "label": "Anti-surge recycle",
     "position": [
      3.2389,
      2.7866,
      -1.4104
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     13.747,
     3.54,
     5.411
    ],
    "center": [
     -0.045,
     1.77,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/centrifugal-compressor.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Trapezoid (wide end = suction, narrow end = discharge) with the driver on the shaft: a circle with M for a motor, or a gas turbine drawn as a second, reversed trapezoid. Anti-surge recycle and a recycle valve usually loop from discharge back to suction.",
    "tags": [
     "K",
     "C"
    ],
    "notes": "Trapezoid = dynamic compressor. A trapezoid narrowing the other way, coupled to a generator or compressor, is a turbine (or an expander). A rectangle with a piston is a reciprocating compressor; two meshing rotors mean a screw compressor.",
    "datasheet": {
     "form": "API 617 centrifugal compressor datasheet",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Driver rated power": "mw",
      "Casing type": "casing",
      "Nozzle orientation": "nozzles",
      "Driver type": "driver",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "reciprocating-compressor",
   "title": "Reciprocating compressor (API 618)",
   "category": "rotating",
   "description": "Balanced-opposed process gas compressor on a skid with walkways: crankcase frame with 2, 4 or 6 throws, crosshead guides, two-compartment distance pieces, jacketed cylinders with suction and discharge valve covers and a clearance pocket, suction and discharge pulsation bottles with headers, discharge PSV, orifice plates at the bottle flanges, a temporary suction strainer, distance-piece vent and drain headers with an atmospheric vent and flame arrester, jacket cooling-water headers, crankcase breather, frame-mounted lube system and cylinder lubricator. Driven through a guarded flywheel and coupling by a TEFC motor (up to 1 MW) or a large box-frame motor. Cylinder, bottle and frame sizes follow `bore`.",
   "import": "./rotating/reciprocating-compressor",
   "export": "ReciprocatingCompressor",
   "anchor": "base",
   "standards": [
    "API 618",
    "API 11P",
    "IEC 60034",
    "ASME VIII (bottles)",
    "ASME B16.5"
   ],
   "vendors": [
    "Ariel",
    "Burckhardt Compression"
   ],
   "tags": [
    "compressor",
    "reciprocating",
    "gas lift",
    "booster",
    "rotating",
    "package"
   ],
   "params": [
    {
     "key": "throws",
     "label": "Throws",
     "type": "select",
     "options": [
      2,
      4,
      6
     ]
    },
    {
     "key": "bore",
     "label": "Cylinder bore",
     "type": "number",
     "min": 0.12,
     "max": 0.7,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 200,
     "max": 8000,
     "step": 50,
     "unit": "kW"
    },
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 3,
     "max": 16
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500,
      2500
     ]
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "throws": 4,
    "bore": 0.32,
    "kw": 1500,
    "suctionNps": 8,
    "dischargeNps": 6,
    "rating": 600,
    "tag": "K-3100",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      1.3402,
      4.354,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      4.5804,
      0.906,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     9.551,
     4.388,
     8.442
    ],
    "center": [
     -0.045,
     2.194,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/reciprocating-compressor.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Cylinder (rectangle) with a piston and rod inside, the rod running to a crank; suction usually into the top and discharge out of the bottom, with suction and discharge pulsation bottles drawn as small horizontal vessels on each nozzle.",
    "tags": [
     "K",
     "C"
    ],
    "notes": "Multi-stage machines show one cylinder per stage with interstage coolers and scrubbers between them. A trapezoid is a centrifugal compressor.",
    "datasheet": {
     "form": "API 618 reciprocating compressor datasheet",
     "fields": {
      "Number of throws": "throws",
      "Cylinder bore": "bore",
      "Driver rated power": "kw",
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "screw-compressor",
   "title": "Oil-injected screw compressor package (API 619)",
   "category": "rotating",
   "description": "Packaged rotary screw compressor for instrument air or gas boost: twin-rotor block with inlet (unloader) valve, TEFC two-pole motor and guarded coupling, horizontal oil separator on saddles with safety valve and minimum-pressure valve, combined oil cooler / aftercooler with fan, duplex oil filters, thermostatic valve and (air service) an intake filter housing. With `enclosure` it sits in an acoustic canopy with intake louvres, a cooling-air discharge grille, HMI and front doors that can be opened; without it, a free-standing control panel. Block, separator and cooler scale with `kw`.",
   "import": "./rotating/screw-compressor",
   "export": "ScrewCompressor",
   "anchor": "base",
   "standards": [
    "API 619",
    "ISO 1217",
    "ISO 8573-1",
    "IEC 60034",
    "ASME VIII (separator)",
    "ASME B16.5"
   ],
   "vendors": [
    "Howden",
    "Kirloskar Pneumatic",
    "Atlas Copco"
   ],
   "tags": [
    "compressor",
    "screw",
    "instrument air",
    "gas boost",
    "package",
    "rotating"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 30,
     "max": 1500,
     "step": 5,
     "unit": "kW"
    },
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      {
       "value": "air",
       "label": "Instrument / plant air"
      },
      {
       "value": "gas",
       "label": "Gas boost"
      }
     ]
    },
    {
     "key": "enclosure",
     "label": "Acoustic enclosure",
     "type": "bool"
    },
    {
     "key": "doorsOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 1,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 250,
    "service": "air",
    "enclosure": true,
    "doorsOpen": false,
    "inletNps": 6,
    "outletNps": 3,
    "rating": 300,
    "tag": "K-4600",
    "running": true
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Air intake",
     "position": [
      0.2998,
      2.5151,
      0.5643
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "vent"
    },
    {
     "id": "outlet",
     "label": "Compressed air outlet",
     "position": [
      1.3618,
      0.658,
      -1.4693
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     4.704,
     2.54,
     3.801
    ],
    "center": [
     0.04,
     1.27,
     0.406
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/screw-compressor.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Casing outline with two meshing rotors (two overlapping circles or intermeshing helices) inside, driver on the shaft. Packaged instrument-air or gas-boost units are usually shown inside a dashed package boundary with the oil separator and cooler.",
    "tags": [
     "K",
     "C"
    ],
    "notes": "Two rotors = rotary screw (or lobe) compressor. A trapezoid is centrifugal; a piston in a cylinder is reciprocating. Oil-free air packages (instrument-air-package) use the same compressor symbol inside a larger package.",
    "datasheet": {
     "form": "API 619 rotary-type positive displacement compressor datasheet",
     "fields": {
      "Driver rated power": "kw",
      "Service": "service",
      "Acoustic enclosure": "enclosure",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "diesel-generator",
   "title": "Diesel generator set (emergency / standby)",
   "category": "rotating",
   "description": "Turbocharged diesel generator set on a double-wall sub-base day tank: inline-6 or V12/V16/V20 engine with rocker covers, insulated exhaust manifolds, turbochargers and air cleaners, flywheel housing with starters, alternator with terminal box, front radiator with pusher fan, anti-vibration isolators, closed crankcase ventilation filter, batteries and controller. Exhaust rises through bellows to a silencer with a flanged outlet. `enclosure` puts it in an ISO 20 ft / 40 ft high-cube container with corrugated walls, sand-trap intake louvres with damper actuators, radiator discharge louvre, opening side doors, clean-agent fire suppression and the silencer on the roof. Engine, alternator and radiator size with `kw`.",
   "import": "./rotating/diesel-generator",
   "export": "DieselGenerator",
   "anchor": "base",
   "standards": [
    "ISO 8528",
    "IEC 60034-1",
    "ISO 3046",
    "ISO 668 (container)",
    "NFPA 110",
    "ASME B16.5"
   ],
   "vendors": [
    "Caterpillar",
    "Cummins",
    "mtu (Rolls-Royce Power Systems)",
    "Perkins"
   ],
   "tags": [
    "generator",
    "diesel",
    "emergency generator",
    "genset",
    "power",
    "rotating"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Rating",
     "type": "number",
     "min": 100,
     "max": 3000,
     "step": 50,
     "unit": "kWe"
    },
    {
     "key": "enclosure",
     "label": "Enclosure",
     "type": "select",
     "options": [
      {
       "value": "open",
       "label": "Open skid"
      },
      {
       "value": "container",
       "label": "ISO container"
      }
     ]
    },
    {
     "key": "doorsOpen",
     "label": "Doors open (container)",
     "type": "bool"
    },
    {
     "key": "fuelNps",
     "label": "Fuel connection",
     "type": "nps",
     "min": 0.5,
     "max": 2
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 1000,
    "enclosure": "open",
    "doorsOpen": false,
    "fuelNps": 1,
    "tag": "G-9310",
    "running": true
   },
   "ports": [
    {
     "id": "exhaust",
     "label": "Exhaust outlet",
     "position": [
      -0.9963,
      3.9828,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "rating": 150,
     "kind": "vent"
    },
    {
     "id": "fuel",
     "label": "Diesel supply",
     "position": [
      -1.225,
      0.25,
      -1.2
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     4.965,
     4.012,
     2.191
    ],
    "center": [
     -0.033,
     2.006,
     -0.121
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/diesel-generator.svg",
    "standard": "IEC 60617 (generator) / layout and P&ID convention for the engine",
    "drawn": "Rectangle for the diesel engine (marked D or DE) coupled to a circle with G and ~ for the alternator. On P&IDs it appears with its diesel (DF) supply line from a day tank and an exhaust line.",
    "tags": [
     "G",
     "EDG",
     "DG"
    ],
    "notes": "G with a turbine trapezoid is a gas-turbine-generator. DE coupled to a pump is a diesel-firewater-pump.",
    "datasheet": {
     "form": "Generating set datasheet (ISO 8528 / ISO 3046, NFPA 110)",
     "fields": {
      "Rated output (kWe)": "kw",
      "Enclosure": "enclosure",
      "Fuel connection size": "fuelNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "gas-turbine-compressor",
   "title": "Gas-turbine-driven compressor train",
   "category": "rotating",
   "description": "Mechanical-drive train: a two-shaft gas turbine in an acoustic enclosure (filter house with weather hoods and filter stages, exhaust silencer and stack, fuel gas skid, lube console with fin-fan cooler, internal monorail) driving an API 617 barrel or horizontally split centrifugal compressor through a guarded coupling, with anti-surge valve, suction strainer and dry gas seal panel. A preset of `centrifugal-compressor` with the gas-turbine driver.",
   "import": "./rotating/gas-turbine-compressor",
   "export": "GasTurbineCompressor",
   "anchor": "base",
   "standards": [
    "API 616",
    "API 617",
    "API 614",
    "API 692",
    "API 671",
    "ASME B16.5"
   ],
   "vendors": [
    "Solar Turbines",
    "Siemens Energy",
    "Baker Hughes"
   ],
   "tags": [
    "compressor",
    "gas turbine",
    "mechanical drive",
    "gas compression",
    "package",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 3,
     "max": 20
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "mw",
     "label": "Turbine power",
     "type": "number",
     "min": 2,
     "max": 40,
     "step": 0.5,
     "unit": "MW"
    },
    {
     "key": "casing",
     "label": "Casing",
     "type": "select",
     "options": [
      {
       "value": "barrel",
       "label": "Barrel (vertically split)"
      },
      {
       "value": "split",
       "label": "Horizontally split"
      }
     ]
    },
    {
     "key": "nozzles",
     "label": "Nozzles",
     "type": "select",
     "options": [
      "up",
      "down"
     ]
    },
    {
     "key": "cutaway",
     "label": "Cutaway (+Z wall off)",
     "type": "bool"
    },
    {
     "key": "doorsOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 16,
    "dischargeNps": 12,
    "rating": 600,
    "mw": 12,
    "casing": "barrel",
    "nozzles": "up",
    "cutaway": false,
    "doorsOpen": false,
    "tag": "K-2300",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      4.5542,
      3.6817,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 16,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      3.4888,
      3.6817,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "recycle",
     "label": "Anti-surge recycle",
     "position": [
      3.4888,
      3.0335,
      -1.5111
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "fuel-gas",
     "label": "Fuel gas",
     "position": [
      -6.2153,
      0.9,
      -2.75
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 3,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     15.286,
     10.834,
     5.99
    ],
    "center": [
     -0.328,
     5.417,
     0
    ]
   },
   "registryDependencies": [
    "core",
    "centrifugal-compressor"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gas-turbine-compressor.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "A gas turbine (narrowing trapezoid, combustor box with the fuel line, widening trapezoid) coupled by its shaft to a compressor trapezoid, wide end at suction; anti-surge recycle and blowdown lines around the compressor.",
    "tags": [
     "K",
     "C",
     "GT"
    ],
    "notes": "A compressor coupled to a motor circle with M is the motor-driven version (centrifugal-compressor). A turbine coupled to a G circle is a gas-turbine-generator.",
    "datasheet": {
     "form": "API 616 gas turbine + API 617 compressor datasheets",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Turbine rated power": "mw",
      "Casing type": "casing",
      "Nozzle orientation": "nozzles",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vertical-turbine-pump",
   "title": "Vertical turbine caisson pump (API 610 VS1)",
   "category": "rotating",
   "description": "Seawater lift / caisson pump: vertical TEFC motor on a windowed stool with a guarded rigid coupling, fabricated discharge head with side outlet, ARV and gauge on a soleplate, and the column, line shaft, bowls and suction bell hanging in a caisson below the deck (geometry goes below y = 0). Depth, stages, motor kW and discharge NPS drive the geometry; `cutaway` opens the caisson.",
   "import": "./rotating/vertical-turbine-pump",
   "export": "VerticalTurbinePump",
   "anchor": "base",
   "standards": [
    "API 610 (VS1)",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "Flowserve",
    "Ruhrpumpen"
   ],
   "tags": [
    "pump",
    "seawater lift",
    "caisson",
    "vertical",
    "rotating"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 30,
     "max": 2500,
     "step": 10,
     "unit": "kW"
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "depth",
     "label": "Caisson depth",
     "type": "number",
     "min": 3,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "caissonDiameter",
     "label": "Caisson OD",
     "type": "number",
     "min": 0.5,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "key": "cutaway",
     "label": "Cutaway caisson",
     "type": "bool"
    },
    {
     "key": "color",
     "label": "Head paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 400,
    "dischargeNps": 12,
    "rating": 150,
    "depth": 25,
    "caissonDiameter": 0.9,
    "stages": 3,
    "cutaway": false,
    "color": "#5f7487",
    "running": true
   },
   "ports": [
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.8143,
      0.7619,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 12,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.604,
     7.563,
     1.52
    ],
    "center": [
     0.042,
     -0.219,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vertical-turbine-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (vertical / caisson pump convention)",
    "drawn": "Pump set drawn vertically: motor (circle with M) on top, discharge head with a side outlet at deck level, and a long column hanging down into a caisson or sump with the pump bowls at the bottom, often below a sea-level mark.",
    "tags": [
     "P"
    ],
    "notes": "Seawater lift and firewater pumps on offshore platforms are this type. A diesel driver box instead of M means diesel-firewater-pump. Some legends draw only a pump circle with \"VS1\" or \"caisson\" written beside it.",
    "datasheet": {
     "form": "API 610 vertical pump datasheet (VS1)",
     "fields": {
      "Driver rated power": "kw",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Setting depth": "depth",
      "Caisson diameter": "caissonDiameter",
      "Number of stages": "stages",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "diesel-firewater-pump",
   "title": "Diesel firewater pump (NFPA 20)",
   "category": "rotating",
   "description": "Diesel-driven fire pump set in firewater red: engine with crankcase doors, turbocharger, residential exhaust silencer, bunded day tank with flame arrester and sight glass, A/B starter batteries and a fire pump controller. Engine jacket water is cooled by a heat exchanger fed from the pump discharge through a duplicated NFPA 20 cooling loop (valves, strainers, regulator, solenoid) to an open waste cone, or by a radiator. `pumpType` selects a vertical turbine caisson pump driven through a fan-cooled right-angle gear and guarded cardan shaft, or a horizontal split-case (BB1 double suction) pump with packed boxes, grease-lubricated bearings, air release valve and gauges on a common skid.",
   "import": "./rotating/diesel-firewater-pump",
   "export": "DieselFirewaterPump",
   "anchor": "base",
   "standards": [
    "NFPA 20",
    "API 610 (VS1 / BB1)",
    "ASME B16.5"
   ],
   "vendors": [
    "Pentair Fairbanks Nijhuis",
    "Framo",
    "Armstrong Fluid Technology",
    "Randolph (right-angle gear drives)"
   ],
   "tags": [
    "pump",
    "firewater",
    "fire pump",
    "diesel",
    "caisson",
    "safety",
    "rotating"
   ],
   "params": [
    {
     "key": "pumpType",
     "label": "Pump",
     "type": "select",
     "options": [
      {
       "value": "vertical",
       "label": "Vertical turbine (caisson)"
      },
      {
       "value": "split-case",
       "label": "Horizontal split-case"
      }
     ]
    },
    {
     "key": "kw",
     "label": "Engine power",
     "type": "number",
     "min": 100,
     "max": 2000,
     "step": 10,
     "unit": "kW"
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "suctionNps",
     "label": "Suction (split-case)",
     "type": "nps",
     "min": 4,
     "max": 18
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "depth",
     "label": "Caisson depth",
     "type": "number",
     "min": 3,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "caissonDiameter",
     "label": "Caisson OD",
     "type": "number",
     "min": 0.6,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "key": "cutaway",
     "label": "Cutaway caisson",
     "type": "bool"
    },
    {
     "key": "cooling",
     "label": "Engine cooling",
     "type": "select",
     "options": [
      {
       "value": "heat-exchanger",
       "label": "Heat exchanger (raw water)"
      },
      {
       "value": "radiator",
       "label": "Radiator"
      }
     ]
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "pumpType": "vertical",
    "kw": 750,
    "dischargeNps": 10,
    "suctionNps": 12,
    "rating": 150,
    "depth": 25,
    "caissonDiameter": 1,
    "stages": 3,
    "cutaway": false,
    "cooling": "heat-exchanger",
    "running": true
   },
   "ports": [
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.8516,
      0.7365,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 10,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     5.713,
     8.921,
     3.266
    ],
    "center": [
     -1.975,
     0.461,
     -0.253
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/diesel-firewater-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001; NFPA 20 fire pump",
    "drawn": "Pump symbol (or vertical caisson pump) coupled to a rectangle marked D, DE or \"diesel\" for the engine driver, on a firewater (FW) line feeding the ring main, often inside a dashed pump-house boundary.",
    "tags": [
     "P",
     "FWP"
    ],
    "notes": "Same pump circle as any centrifugal pump: the diesel driver box, the FW line service and the firewater pump title decide it. An electric firewater (jockey) pump has M instead of DE.",
    "datasheet": {
     "form": "Fire pump datasheet (NFPA 20, API 610 VS1 / BB1)",
     "fields": {
      "Pump type": "pumpType",
      "Driver rated power": "kw",
      "Discharge nozzle size": "dischargeNps",
      "Suction nozzle size": "suctionNps",
      "Flange rating": "rating",
      "Setting depth": "depth",
      "Caisson diameter": "caissonDiameter",
      "Number of stages": "stages",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "between-bearings-pump",
   "title": "Multistage pump (API 610 BB3)",
   "category": "rotating",
   "description": "Axially split multistage between-bearings pump: casing with stage bulges, back-to-back crossover and a heavy single row of studs with nuts on top of the horizontal split, side-side nozzles in the lower half (rotor lifts out without disturbing piping), casing vent and drain valves, seal chambers with API 682 Plan 23 seal coolers at both ends, bearing housings with X-Y probes, RTDs and ring-oil constant-level oilers (or pressure lube from the optional console), guarded spacer coupling and a 2-pole motor (HV with top air-to-air cooler from 1 MW) on a drain-rim baseplate. Stages, kW and nozzle sizes drive the length and frame.",
   "import": "./rotating/between-bearings-pump",
   "export": "BetweenBearingsPump",
   "anchor": "base",
   "standards": [
    "API 610 (BB3)",
    "API 614",
    "API 682",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "ITT Goulds",
    "Flowserve"
   ],
   "tags": [
    "pump",
    "multistage",
    "water injection",
    "pipeline",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 3,
     "max": 16
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500,
      2500
     ]
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 75,
     "max": 8000,
     "step": 25,
     "unit": "kW"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 2,
     "max": 14,
     "step": 1
    },
    {
     "key": "lubeConsole",
     "label": "Lube oil console",
     "type": "bool"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 8,
    "dischargeNps": 6,
    "rating": 900,
    "kw": 1500,
    "stages": 6,
    "casing": "machineryGreen",
    "lubeConsole": true,
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      1.3418,
      0.8347,
      0.8537
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 8,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.107,
      0.8347,
      0.8161
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 6,
     "rating": 900,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     7.572,
     1.74,
     1.967
    ],
    "center": [
     0.063,
     0.87,
     0.008
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/between-bearings-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Same centrifugal pump circle (tangential discharge, side suction), here with the driver drawn as a circle with M on the shaft. High-head water injection or export duty, often noted \"multistage\" or \"BB3\".",
    "tags": [
     "P"
    ],
    "notes": "The symbol does not show between-bearings or multistage construction; pick this component when the title, datasheet or duty says multistage / BB3 / high head (e.g. water injection, pipeline booster). Otherwise use centrifugal-pump.",
    "datasheet": {
     "form": "API 610 centrifugal pump datasheet (BB3)",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Driver rated power": "kw",
      "Number of stages": "stages",
      "Lube oil console (API 614)": "lubeConsole",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vertical-inline-pump",
   "title": "Vertical inline pump (API 610 OH3)",
   "category": "rotating",
   "description": "Overhung vertical inline pump with its own bearing bracket: horizontal volute casing with suction and discharge flanges on one centreline (X axis), casing foot on an anchored soleplate, casing vent and drain valves, cartridge seal with Plan 11 flush, grease-lubricated bearing housing with nipples and RTD, spacer coupling in a guarded motor stool and a vertical 2-pole IEC motor with drip canopy (cable entry to the back). Compact footprint; nozzle sizes and kW drive the geometry.",
   "import": "./rotating/vertical-inline-pump",
   "export": "VerticalInlinePump",
   "anchor": "base",
   "standards": [
    "API 610 (OH3)",
    "API 682 Plan 11",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "ITT Goulds"
   ],
   "tags": [
    "pump",
    "inline",
    "vertical",
    "transfer",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 1.5,
     "max": 12
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 1.5,
     "max": 10
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 2.2,
     "max": 400,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 4,
    "dischargeNps": 4,
    "rating": 300,
    "kw": 55,
    "casing": "machineryGreen",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      -0.4014,
      0.42,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.4014,
      0.42,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.853,
     2.332,
     0.764
    ],
    "center": [
     0,
     1.166,
     -0.252
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vertical-inline-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Pump circle with suction and discharge on the same straight centreline through the casing (in-line), and the motor drawn above it on a vertical shaft.",
    "tags": [
     "P"
    ],
    "notes": "Many legends draw it as the normal centrifugal pump circle; the in-line nozzles and vertical motor are the clue when shown. Confirm OH3 / \"vertical in-line\" on the datasheet.",
    "datasheet": {
     "form": "API 610 centrifugal pump datasheet (OH3)",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Driver rated power": "kw",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "reciprocating-pump",
   "title": "Plunger pump (API 674 triplex)",
   "category": "rotating",
   "description": "Horizontal single-acting plunger pump package on a structural skid: ribbed power frame with inspection covers, crosshead extensions under mesh guards, packed stuffing boxes, forged fluid end with plunger-bore and valve covers, suction and discharge manifolds with a suction stabiliser and a bladder pulsation dampener, relief valve back to suction, parallel-shaft gear reducer, guarded coupling and IEC motor. `plungers` gives a triplex or quintuplex; kW sizes the frame.",
   "import": "./rotating/reciprocating-pump",
   "export": "ReciprocatingPump",
   "anchor": "base",
   "standards": [
    "API 674",
    "API 618 (pulsation guidance)",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "Aldrich (Pleuger)"
   ],
   "tags": [
    "pump",
    "reciprocating",
    "positive displacement",
    "injection",
    "high pressure",
    "rotating"
   ],
   "params": [
    {
     "key": "plungers",
     "label": "Plungers",
     "type": "select",
     "options": [
      {
       "value": 3,
       "label": "Triplex"
      },
      {
       "value": 5,
       "label": "Quintuplex"
      }
     ]
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 15,
     "max": 1500,
     "step": 5,
     "unit": "kW"
    },
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 1.5,
     "max": 10
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 1,
     "max": 6
    },
    {
     "key": "suctionRating",
     "label": "Suction class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "rating",
     "label": "Discharge class",
     "type": "rating",
     "options": [
      600,
      900,
      1500,
      2500
     ]
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 4,
    "dischargeNps": 2,
    "suctionRating": 300,
    "rating": 1500,
    "kw": 250,
    "plungers": 3,
    "frame": "machineryGreen",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      2.1026,
      0.258,
      0.5491
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      2.1247,
      1.048,
      0.5491
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 1500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     4.605,
     1.508,
     2.13
    ],
    "center": [
     0.286,
     0.754,
     0.011
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/reciprocating-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Pump circle with a piston (a short thick bar) and rod inside, the rod leaving to a crank; suction in at the bottom and discharge out at the top, often with pulsation dampeners drawn as small domes on both lines.",
    "tags": [
     "P"
    ],
    "notes": "A piston, plunger or crank inside the circle marks positive displacement. An adjustable-stroke arrow through it means a metering pump. Legends vary: some use a rectangle with a piston instead of a circle.",
    "datasheet": {
     "form": "API 674 reciprocating pump datasheet",
     "fields": {
      "Number of plungers": "plungers",
      "Driver rated power": "kw",
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Suction flange rating": "suctionRating",
      "Discharge flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "metering-pump",
   "title": "Diaphragm metering pump (API 675)",
   "category": "rotating",
   "description": "Hydraulically actuated diaphragm metering pump for chemical injection: IEC motor on a C-face adapter, worm-gear housing with oil window and breather, micrometer stroke adjuster (the `stroke` setting moves the barrel), plunger housing and bolted diaphragm head with refill valve and rupture gauge, double-ball check valves with the suction flange facing down and the discharge flange facing up. Mounted on an anchored pedestal with the liquid end overhanging for the suction pipe.",
   "import": "./rotating/metering-pump",
   "export": "MeteringPump",
   "anchor": "base",
   "standards": [
    "API 675",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "Milton Roy"
   ],
   "tags": [
    "pump",
    "metering",
    "dosing",
    "chemical injection",
    "positive displacement",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 0.5,
     "max": 2
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 0.5,
     "max": 1.5
    },
    {
     "key": "suctionRating",
     "label": "Suction class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "rating",
     "label": "Discharge class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500,
      2500
     ]
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 0.37,
     "max": 15,
     "step": 0.01,
     "unit": "kW"
    },
    {
     "key": "stroke",
     "label": "Stroke setting",
     "type": "number",
     "min": 0,
     "max": 100,
     "step": 1,
     "unit": "%"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 1,
    "dischargeNps": 0.5,
    "suctionRating": 300,
    "rating": 1500,
    "kw": 1.5,
    "stroke": 60,
    "housing": "actuatorBlue",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      0.4654,
      0.1335,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 1,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.4654,
      0.8035,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 0.5,
     "rating": 1500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.151,
     0.824,
     0.52
    ],
    "center": [
     -0.04,
     0.412,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/metering-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Small pump circle with a curved diaphragm line inside and a diagonal arrow through it (adjustable capacity), on a chemical injection (CI) line, usually inside a chemical injection package boundary.",
    "tags": [
     "P"
    ],
    "notes": "The diagonal arrow (variable stroke) and the small CI / MI line size tell it from a centrifugal pump. Several identical heads in a row inside a dashed box = a chemical-injection-skid.",
    "datasheet": {
     "form": "API 675 controlled-volume pump datasheet",
     "fields": {
      "Suction connection size": "suctionNps",
      "Discharge connection size": "dischargeNps",
      "Suction flange rating": "suctionRating",
      "Discharge flange rating": "rating",
      "Driver rated power": "kw",
      "Stroke length setting": "stroke",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "electric-motor",
   "title": "Electric motor (IEC TEFC)",
   "category": "rotating",
   "description": "Foot-mounted totally enclosed fan-cooled cage induction motor (IM B3, IC411): finned frame, end shields with condensate drain plugs and regreasing nipples from frame 225, fan cowl with grille, feet on machined soleplates with anchor bolts, terminal box, lifting eyes, earth boss and a nameplate showing the IEC 60072 frame chosen from kW and poles. Optional anti-condensation heater box; above 1 MW it becomes an HV machine with a top air-to-air cooler (IC611). Shaft along +X; the shaft end and cooling fan turn when running.",
   "import": "./rotating/electric-motor",
   "export": "ElectricMotor",
   "anchor": "base",
   "standards": [
    "IEC 60034",
    "IEC 60072-1",
    "EN 50347"
   ],
   "vendors": [
    "WEG",
    "ABB"
   ],
   "tags": [
    "motor",
    "driver",
    "electrical",
    "rotating"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Rated power",
     "type": "number",
     "min": 0.37,
     "max": 5000,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "poles",
     "label": "Poles",
     "type": "select",
     "options": [
      2,
      4,
      6
     ]
    },
    {
     "key": "heater",
     "label": "Heater box",
     "type": "bool"
    },
    {
     "key": "terminalBox",
     "label": "Terminal box",
     "type": "select",
     "options": [
      "side",
      "top"
     ]
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 75,
    "poles": 4,
    "heater": true,
    "terminalBox": "side",
    "color": "#355f80",
    "running": true
   },
   "ports": [],
   "bounds": {
    "size": [
     1.132,
     0.629,
     0.671
    ],
    "center": [
     -0.009,
     0.314,
     0.027
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/electric-motor.svg",
    "standard": "IEC 60617 (motor) / ISA 5.1",
    "drawn": "Circle with M (IEC: M with 3~ underneath for a three-phase AC motor), drawn coupled to the driven machine on P&IDs and hanging from a feeder on single-line diagrams.",
    "tags": [
     "PM",
     "KM"
    ],
    "notes": "Circle with G is a generator. A circle with M on top of a valve stem is a motor actuator (MOV), not a separate motor. A circle with M inside a square is used by some legends for a motor-driven package.",
    "datasheet": {
     "form": "Electric motor datasheet (IEC 60034-1 / IEC 60072)",
     "fields": {
      "Rated power": "kw",
      "Number of poles": "poles",
      "Anti-condensation heater": "heater",
      "Terminal box position": "terminalBox",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "centrifugal-fan",
   "title": "Centrifugal fan (belt driven)",
   "category": "rotating",
   "description": "Single-width single-inlet centrifugal fan for HVAC and process extract: hollow spiral scroll (you see the backward-curved wheel through the bellmouth and down the outlet) with flanged side sheets, inspection door, drain, rotation arrow and nameplate; shaft in two regreasable pillow-block bearings on a pedestal; V-belt drive under a mesh guard; IEC motor on slide rails; steel base frame on open spring isolators; optional flexible duct connectors with companion flanges. Outlet up-blast or top-horizontal; wheel diameter and kW scale the set. Ports are duct flanges (kind utility, NPS = equivalent round duct).",
   "import": "./rotating/centrifugal-fan",
   "export": "CentrifugalFan",
   "anchor": "base",
   "standards": [
    "AMCA 99 (arrangement 9)",
    "ISO 13349",
    "IEC 60034 / 60072"
   ],
   "vendors": [
    "Novenco",
    "Hartzell"
   ],
   "tags": [
    "fan",
    "hvac",
    "ventilation",
    "blower",
    "rotating"
   ],
   "params": [
    {
     "key": "wheelDiameter",
     "label": "Wheel diameter",
     "type": "number",
     "min": 0.3,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 0.75,
     "max": 250,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "outlet",
     "label": "Outlet",
     "type": "select",
     "options": [
      {
       "value": "up",
       "label": "Up-blast"
      },
      {
       "value": "horizontal",
       "label": "Top horizontal"
      }
     ]
    },
    {
     "key": "flexible",
     "label": "Flexible connectors",
     "type": "bool"
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "wheelDiameter": 0.8,
    "kw": 15,
    "outlet": "up",
    "flexible": true,
    "color": "#8f9a9e",
    "running": true
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      0.863,
      1.092,
      -0.2156
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 23,
     "kind": "utility"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      0.185,
      2.042,
      -0.7836
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 16,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     1.646,
     2.047,
     2.139
    ],
    "center": [
     0.05,
     1.023,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/centrifugal-fan.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Circle (scroll) with a wide rectangular outlet duct leaving tangentially and curved blades or a hub drawn inside; inlet through the centre. Axial fans are drawn as a propeller (bow-tie) inside a circle or duct.",
    "tags": [
     "EF",
     "SF",
     "FN"
    ],
    "notes": "Looks like a pump but the outlet is a wide duct and it sits on HVAC ducting (often drawn double-line) rather than a pipe. Air cooler fans are part of air-cooled-exchanger.",
    "datasheet": {
     "form": "Fan datasheet (AMCA 99 / ISO 13349)",
     "fields": {
      "Impeller diameter": "wheelDiameter",
      "Motor rated power": "kw",
      "Discharge orientation": "outlet",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "progressive-cavity-pump",
   "title": "Progressive cavity pump",
   "category": "rotating",
   "description": "Horizontal progressive cavity pump in the bearing-housing layout: helical gear motor and guarded coupling on a drain-rim baseplate, finned bearing housing with seal, suction housing with top inlet flange, bolted inspection cover and drain, elastomer-lined stator clamped by four tie rods with a mid support, and a discharge housing with an axial outlet flange. Stages set the stator length; nozzle sizes set the housings.",
   "import": "./rotating/progressive-cavity-pump",
   "export": "ProgressiveCavityPump",
   "anchor": "base",
   "standards": [
    "API 676",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "NETZSCH"
   ],
   "tags": [
    "pump",
    "positive displacement",
    "progressive cavity",
    "viscous",
    "sludge",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 1,
     "max": 10
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 1,
     "max": 8
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 0.75,
     "max": 160,
     "step": 0.25,
     "unit": "kW"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 4,
    "dischargeNps": 3,
    "rating": 150,
    "kw": 11,
    "stages": 2,
    "casing": "actuatorBlue",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      0.2655,
      0.9532,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      1.7804,
      0.5185,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3.546,
     0.99,
     0.819
    ],
    "center": [
     0.063,
     0.495,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/progressive-cavity-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Rotary pump outline (a long rounded casing or circle) with a helical rotor drawn as a wavy line inside, suction into the top of the suction housing and discharge out of the end; driver on the shaft.",
    "tags": [
     "P"
    ],
    "notes": "Many legends use the general rotary PD pump symbol with \"PC\" or \"progressive cavity\" beside it. Used for viscous, sandy or shear-sensitive liquids (drains, sludge, crude transfer).",
    "datasheet": {
     "form": "API 676 rotary pump datasheet",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Driver rated power": "kw",
      "Number of stages": "stages",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "submersible-pump",
   "title": "Submersible caisson pump",
   "category": "rotating",
   "description": "Electric submersible seawater lift pump hung in a caisson: top plate bolted to the caisson flange with a long-radius discharge bend, air release valve, gauge, hypochlorite injection point and power-cable junction box; flanged riser stack in 6 m sections with centralisers and the clamped power cable; pump-motor unit with the pump below the motor, water rising through the shell around the motor, and a suction strainer at the bottom. Geometry goes below y = 0.",
   "import": "./rotating/submersible-pump",
   "export": "SubmersiblePump",
   "anchor": "base",
   "standards": [
    "API 610 (VS family, submersible)",
    "ASME B16.5",
    "ASME B16.9"
   ],
   "vendors": [
    "Framo"
   ],
   "tags": [
    "pump",
    "submersible",
    "seawater lift",
    "caisson",
    "rotating"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 30,
     "max": 3800,
     "step": 10,
     "unit": "kW"
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 6,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "depth",
     "label": "Caisson depth",
     "type": "number",
     "min": 5,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "caissonDiameter",
     "label": "Caisson OD",
     "type": "number",
     "min": 0.5,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "cutaway",
     "label": "Cutaway caisson",
     "type": "bool"
    },
    {
     "key": "color",
     "label": "Paint",
     "type": "color"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 300,
    "dischargeNps": 12,
    "rating": 150,
    "depth": 25,
    "caissonDiameter": 0.9,
    "cutaway": false,
    "color": "#5f7487"
   },
   "ports": [
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.9215,
      0.6213,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 12,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.711,
     8.087,
     1.52
    ],
    "center": [
     0.096,
     -2.956,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/submersible-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (caisson / submersible pump convention)",
    "drawn": "A pump hanging in a caisson below sea level with the motor (circle with M) BELOW the pump bowls at the bottom of the string, the discharge riser going up to the top plate and a power cable alongside.",
    "tags": [
     "P"
    ],
    "notes": "Motor at the bottom = submersible; motor on top of the deck = vertical-turbine-pump (line shaft). Some legends draw only a pump circle in the caisson with \"ESP\" or \"submersible\" written.",
    "datasheet": {
     "form": "Submersible pump datasheet (API 610 VS family)",
     "fields": {
      "Motor rated power": "kw",
      "Discharge size": "dischargeNps",
      "Flange rating": "rating",
      "Setting depth": "depth",
      "Caisson diameter": "caissonDiameter",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "centrifugal-pump",
   "title": "Centrifugal pump (API 610 OH2)",
   "category": "rotating",
   "description": "Overhung, centreline-mounted end-suction pump with volute casing, bearing housing, spacer coupling under a mesh guard and a TEFC motor on a drain-rim baseplate. Includes an API Plan 53A seal reservoir and a local control station. Motor frame from IEC 60072 for the rated power.",
   "import": "./rotating/centrifugal-pump",
   "export": "CentrifugalPump",
   "anchor": "base",
   "standards": [
    "API 610 (OH2)",
    "API 682 Plan 53A",
    "IEC 60034 / 60072",
    "ASME B16.5"
   ],
   "vendors": [
    "Flowserve",
    "Sulzer",
    "KSB",
    "Ruhrpumpen",
    "Baker Hughes",
    "ITT Goulds"
   ],
   "tags": [
    "pump",
    "export pump",
    "transfer",
    "rotating"
   ],
   "params": [
    {
     "key": "suctionNps",
     "label": "Suction",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "dischargeNps",
     "label": "Discharge",
     "type": "nps",
     "min": 1.5,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "kw",
     "label": "Motor power",
     "type": "number",
     "min": 5,
     "max": 1500,
     "step": 5,
     "unit": "kW"
    },
    {
     "key": "stages",
     "label": "Stages",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "baseLength",
     "label": "Baseplate length",
     "type": "number",
     "min": 1.6,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "baseWidth",
     "label": "Baseplate width",
     "type": "number",
     "min": 0.7,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "suctionNps": 6,
    "dischargeNps": 4,
    "rating": 300,
    "kw": 110,
    "stages": 1,
    "baseLength": 2.8,
    "baseWidth": 1.1,
    "casing": "machineryGreen",
    "running": true
   },
   "ports": [
    {
     "id": "suction",
     "label": "Suction",
     "position": [
      1.118,
      0.73,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "discharge",
     "label": "Discharge",
     "position": [
      0.532,
      1.33,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3,
     1.663,
     1.238
    ],
    "center": [
     0.025,
     0.832,
     0.013
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/centrifugal-pump.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Circle with the discharge leaving tangentially from the top, suction entering the centre from the side. Often a small triangle inside pointing to the discharge, and a base line or two short legs under it.",
    "tags": [
     "P"
    ],
    "notes": "P&IDs rarely show the API 610 type. OH2, OH3, BB3 and VS pumps can all appear as this circle: read the datasheet or the title (e.g. \"multistage\", \"vertical inline\", \"caisson\"). A circle with a piston or crank inside is a reciprocating pump; an arrow through the symbol means variable capacity (metering pump).",
    "datasheet": {
     "form": "API 610 centrifugal pump datasheet",
     "fields": {
      "Suction nozzle size": "suctionNps",
      "Discharge nozzle size": "dischargeNps",
      "Flange rating": "rating",
      "Driver rated power": "kw",
      "Number of stages": "stages",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "toxic-gas-detector",
   "title": "Toxic gas detector",
   "category": "safety",
   "description": "Electrochemical toxic gas transmitter: cast Ex d enclosure with screwed window cover, ppm display, status LED and magnetic-key calibration targets, sensor pointing down under a hollow weather cap with calibration nozzle and flared splash guard. gas sets the display range and the colour-coded sensor cap (H2S yellow, CO black, SO2 green, NH3 blue, Cl2 purple, O2 white; typical, not standardised). Black and yellow TOXIC GAS warning plate above. On a stanchion or wall plate with gland, cable and tag bracket.",
   "import": "./safety/toxic-gas-detector",
   "export": "ToxicGasDetector",
   "anchor": "base",
   "standards": [
    "IEC 60079-29-1",
    "EN 45544",
    "IEC 60079-1"
   ],
   "vendors": [
    "Dräger",
    "Honeywell"
   ],
   "tags": [
    "fire and gas",
    "gas detection",
    "toxic",
    "H2S",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "gas",
     "label": "Gas",
     "type": "select",
     "options": [
      "H2S",
      "CO",
      "SO2",
      "NH3",
      "Cl2",
      "O2"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.5,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "splashGuard",
     "label": "Splash guard",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "height": 1.5,
    "gas": "H2S",
    "splashGuard": true,
    "tag": "GDT-1101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     1.928,
     0.309
    ],
    "center": [
     -0.054,
     0.964,
     0.025
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/toxic-gas-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); ISA 5.1 AT tag",
    "drawn": "F&G layout: a gas-detector symbol (circle, sometimes a triangle) with T, TOX or the gas (H2S, CO, SO2) and the ppm set points written beside it; on C&E charts an AT bubble.",
    "tags": [
     "GDT",
     "GD",
     "TGD"
    ],
    "isa": [
     "AT",
     "AIT"
    ],
    "notes": "Same family as point-gas-detector: the gas name decides. Flammable detectors read % LEL; toxic detectors read ppm.",
    "datasheet": {
     "form": "Toxic gas detector datasheet (IEC 60079-29-1 / EN 45544)",
     "fields": {
      "Target gas": "gas",
      "Mounting": "mount",
      "Mounting height": "height",
      "Splash guard": "splashGuard",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "acoustic-gas-leak-detector",
   "title": "Ultrasonic gas leak detector",
   "category": "safety",
   "description": "Ultrasonic (acoustic) gas leak detector that hears the 25–100 kHz noise of a pressurised gas leak. 316 stainless Ex d housing with screwed cover, status window and side cable entries, on a swivel arm from a stanchion or wall plate. A single microphone points down in an open-cell foam windscreen under a hollow rain hood, with a self-test transducer; or array gives four sensors in slotted guard tubes. swivel turns the arm.",
   "import": "./safety/acoustic-gas-leak-detector",
   "export": "AcousticGasLeakDetector",
   "anchor": "base",
   "standards": [
    "IEC 60079-1",
    "IEC 60079-11",
    "ISA TR84.00.07"
   ],
   "vendors": [
    "Emerson (Incus)",
    "Det-Tronics"
   ],
   "tags": [
    "fire and gas",
    "gas detection",
    "ultrasonic",
    "acoustic",
    "leak",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.8,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "array",
     "label": "Four-sensor array",
     "type": "bool"
    },
    {
     "key": "swivel",
     "label": "Swivel",
     "type": "number",
     "min": -90,
     "max": 90,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "height": 2.5,
    "array": false,
    "swivel": 0,
    "tag": "GDU-2201"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     2.678,
     0.41
    ],
    "center": [
     -0.054,
     1.339,
     0.075
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/acoustic-gas-leak-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); ISA TR84.00.07 mapping practice",
    "drawn": "F&G layout: a detector symbol marked U, UGLD or AGLD with its detection radius (a dashed circle, typically 5–20 m) drawn around it; sound-wave arcs on some legends.",
    "tags": [
     "UGLD",
     "AGLD",
     "GD"
    ],
    "notes": "Large coverage circles centred on a detector are ultrasonic (acoustic); flame detectors show a cone; open-path detectors a beam line.",
    "datasheet": {
     "form": "Ultrasonic gas leak detector datasheet (IEC 60079-1 / -11)",
     "fields": {
      "Mounting": "mount",
      "Mounting height": "height",
      "Array head": "array",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hydrogen-detector",
   "title": "Hydrogen gas detector",
   "category": "safety",
   "description": "Fixed hydrogen detector for battery and UPS rooms, electrolysers and fuel-cell enclosures. Round Ex d head with screwed lid, lid tag, LED and side gland; catalytic sinter or MEMS sensor with PTFE membrane pointing down, inside a hollow collector cone with calibration spout to catch rising lighter-than-air gas. mount ceiling hangs it from a beam clamp and drop rod on a stainless angle bracket (origin on the ceiling); wall puts it on a wall plate near the ceiling.",
   "import": "./safety/hydrogen-detector",
   "export": "HydrogenDetector",
   "anchor": "fitting",
   "standards": [
    "IEC 60079-29-1",
    "IEC 60079-29-2",
    "IEC 60079-1",
    "IEC 62485-2"
   ],
   "vendors": [
    "Crowcon"
   ],
   "tags": [
    "fire and gas",
    "gas detection",
    "hydrogen",
    "battery room",
    "electrolyser",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "ceiling",
      "wall"
     ]
    },
    {
     "key": "drop",
     "label": "Drop rod",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Wall height",
     "type": "number",
     "min": 0.8,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "sensor",
     "label": "Sensor",
     "type": "select",
     "options": [
      "catalytic",
      "mems"
     ]
    },
    {
     "key": "collector",
     "label": "Collector cone",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "ceiling",
    "drop": 0.15,
    "height": 2.7,
    "sensor": "catalytic",
    "collector": true,
    "tag": "GDH-8401"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.222,
     0.428,
     0.132
    ],
    "center": [
     0.021,
     -0.214,
     -0.003
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hydrogen-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company)",
    "drawn": "F&G or HVAC layout: a gas-detector symbol with H2 written beside it, placed at the ceiling high point of battery rooms, UPS rooms and electrolyser enclosures; on C&E charts an AT bubble with the % LEL set points.",
    "tags": [
     "GDH",
     "GD"
    ],
    "isa": [
     "AT"
    ],
    "notes": "Hydrogen detectors sit at ceiling level (H2 is lighter than air); hydrocarbon point detectors in process areas are usually lower.",
    "datasheet": {
     "form": "Gas detector datasheet (IEC 60079-29-1; IEC 62485-2 battery rooms)",
     "fields": {
      "Mounting": "mount",
      "Drop rod length": "drop",
      "Mounting height": "height",
      "Sensor type": "sensor",
      "Collector cone": "collector",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "aspirating-smoke-detector",
   "title": "Aspirating smoke detector",
   "category": "safety",
   "description": "Very early warning aspirating smoke detector for E-houses, LERs and switchrooms. Wall-mounted unit with status LEDs, smoke bar graph and airflow display, four pipe inlets (unused ones plugged), exhaust stub and field cable. Red 25 mm ABS sampling pipe rises to pipeHeight, sweeps into a horizontal run of length per branch with labelled sampling holes every spacing, push-fit sockets every 3 m, wall clips and a drilled end cap. Pipes are hollow. branches 2 adds a run the other way.",
   "import": "./safety/aspirating-smoke-detector",
   "export": "AspiratingSmokeDetector",
   "anchor": "base",
   "standards": [
    "EN 54-20",
    "NFPA 72",
    "BS 5839-1"
   ],
   "vendors": [
    "Xtralis (VESDA)",
    "Honeywell"
   ],
   "tags": [
    "fire and gas",
    "smoke detection",
    "aspirating",
    "VESDA",
    "E-house",
    "LER",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "height",
     "label": "Unit height",
     "type": "number",
     "min": 0.8,
     "max": 2.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pipeHeight",
     "label": "Pipe height",
     "type": "number",
     "min": 2,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Run length",
     "type": "number",
     "min": 0.5,
     "max": 50,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "spacing",
     "label": "Hole spacing",
     "type": "number",
     "min": 0.3,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "branches",
     "label": "Branches",
     "type": "number",
     "min": 1,
     "max": 2,
     "step": 1
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 1.5,
    "pipeHeight": 3,
    "length": 8,
    "spacing": 2,
    "branches": 1,
    "tag": "ASD-9101"
   },
   "ports": [],
   "bounds": {
    "size": [
     3.38,
     2.595,
     0.215
    ],
    "center": [
     1.515,
     1.321,
     0.108
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/aspirating-smoke-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); EN 54-20",
    "drawn": "A detector box marked ASD (or VESDA) with a sampling pipe running across the ceiling plan and the sampling holes marked as dots or short ticks along it.",
    "tags": [
     "ASD",
     "SD",
     "VESDA"
    ],
    "notes": "A pipe line with sampling holes from a box = aspirating system; point smoke detectors are individual circles with S.",
    "datasheet": {
     "form": "Aspirating smoke detector design (EN 54-20)",
     "fields": {
      "Unit mounting height": "height",
      "Pipe height": "pipeHeight",
      "Pipe length": "length",
      "Hole spacing": "spacing",
      "Branches": "branches",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "beam-smoke-detector",
   "title": "Reflective beam smoke detector",
   "category": "safety",
   "description": "Reflective optical beam smoke detector for large open volumes such as warehouses, turbine halls and module roofs. Transceiver head (lens, alignment LEDs, pan/tilt yoke with adjuster knobs) at one end, cube-corner prism reflector at the other (one prism up to 50 m, a 2 × 2 array beyond), facing each other along X across separation. The head is cabled to a low-level controller with signal display and status LEDs. On walls or stanchions; beam draws the IR path.",
   "import": "./safety/beam-smoke-detector",
   "export": "BeamSmokeDetector",
   "anchor": "base",
   "standards": [
    "EN 54-12",
    "UL 268",
    "BS 5839-1"
   ],
   "vendors": [
    "Fire Fighting Enterprises (Fireray)",
    "Bosch"
   ],
   "tags": [
    "fire and gas",
    "smoke detection",
    "beam detector",
    "optical beam",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "pole"
     ]
    },
    {
     "key": "separation",
     "label": "Separation",
     "type": "number",
     "min": 5,
     "max": 100,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Beam height",
     "type": "number",
     "min": 2.2,
     "max": 25,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "beam",
     "label": "Show beam",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "wall",
    "separation": 30,
    "height": 4,
    "beam": false,
    "tag": "SDB-9201"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.014,
     3.13,
     0.2
    ],
    "center": [
     -0.007,
     1.595,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/beam-smoke-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); EN 54-12",
    "drawn": "A transceiver symbol at one end and a reflector (square with a cross) at the other, joined by a beam line (often double-headed or a pair of lines) across a large open space.",
    "tags": [
     "BSD",
     "SD"
    ],
    "notes": "Reflector at one end (no receiver electronics) = reflective beam smoke detector. A transmitter / receiver pair with a single beam on a process area is an open-path gas detector.",
    "datasheet": {
     "form": "Beam smoke detector datasheet (EN 54-12)",
     "fields": {
      "Mounting": "mount",
      "Beam length": "separation",
      "Mounting height": "height",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pa-loudspeaker",
   "title": "PA/GA horn loudspeaker",
   "category": "safety",
   "description": "Hazardous-area public address and general alarm horn loudspeaker. Ex d compression-driver housing with bolted flamepath flange, rear gland and stopping plug, rating plate and tap selector. style re-entrant gives a hollow round bell with a central phase reflector on vanes; flare gives a hollow rectangular exponential horn. Carried in a U-yoke with tilt knobs on a pan turntable and arm, on a stanchion or wall plate with field cable and tag bracket.",
   "import": "./safety/pa-loudspeaker",
   "export": "PaLoudspeaker",
   "anchor": "base",
   "standards": [
    "IEC 60079-1",
    "IEC 60079-7",
    "EN 54-24",
    "ISO 7240-24"
   ],
   "vendors": [
    "Industronic",
    "Zenitel"
   ],
   "tags": [
    "PAGA",
    "public address",
    "general alarm",
    "loudspeaker",
    "horn",
    "telecom",
    "F&G"
   ],
   "params": [
    {
     "key": "style",
     "label": "Horn",
     "type": "select",
     "options": [
      "re-entrant",
      "flare"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tilt",
     "label": "Tilt down",
     "type": "number",
     "min": -30,
     "max": 60,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "pan",
     "label": "Pan",
     "type": "number",
     "min": -90,
     "max": 90,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "power",
     "label": "Power tap",
     "type": "number",
     "min": 1,
     "max": 25,
     "step": 1,
     "unit": "W"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "style": "re-entrant",
    "mount": "pole",
    "height": 3,
    "tilt": 15,
    "pan": 0,
    "power": 25,
    "tag": "PA-3101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     3.158,
     0.603
    ],
    "center": [
     -0.054,
     1.579,
     0.171
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pa-loudspeaker.svg",
    "standard": "IEC 60617 (loudspeaker) / PA-GA layout convention",
    "drawn": "IEC loudspeaker: a small rectangle with a flared trumpet (trapezoid) opening from it, drawn at each speaker position on the PA/GA layout with its power tap (e.g. 15 W) and aiming direction.",
    "tags": [
     "SPK"
    ],
    "notes": "An alarm sounder is drawn as a bell or horn; a combined beacon and sounder is alarm-beacon. PA loudspeakers carry a wattage note.",
    "datasheet": {
     "form": "PA/GA loudspeaker datasheet (EN 54-24, IEC 60079-1)",
     "fields": {
      "Style": "style",
      "Mounting": "mount",
      "Mounting height": "height",
      "Aiming tilt": "tilt",
      "Aiming pan": "pan",
      "Power tap": "power",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "emergency-light",
   "title": "Ex emergency luminaire",
   "category": "safety",
   "description": "Hazardous-area emergency and escape-route luminaire with integral 3 h battery. style linear is a long LED fitting (GRP body, clear diffuser, stainless toggle clips, end caps with gland and stopping plug, green EM label, status LED and test switch) hung from two arms on a crossbar; length sets the body. style bulkhead is a cast oval bulkhead with gasketed glass dome and guard bars. lit switches the emissive lamp. On a stanchion or wall plate with cable and tag bracket.",
   "import": "./safety/emergency-light",
   "export": "EmergencyLight",
   "anchor": "base",
   "standards": [
    "IEC 60079-7",
    "IEC 60598-2-22",
    "EN 1838",
    "IEC 60079-0"
   ],
   "vendors": [
    "Eaton (CEAG)"
   ],
   "tags": [
    "emergency lighting",
    "escape lighting",
    "luminaire",
    "Ex",
    "escape route"
   ],
   "params": [
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "linear",
      "bulkhead"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "pole"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Length (linear)",
     "type": "number",
     "min": 0.5,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "style": "linear",
    "mount": "wall",
    "height": 2.6,
    "length": 0.9,
    "lit": true,
    "tag": "EL-9301"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.947,
     2.677,
     0.301
    ],
    "center": [
     -0.012,
     1.362,
     0.121
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/emergency-light.svg",
    "standard": "IEC 60617 luminaire / lighting layout convention (EN 1838)",
    "drawn": "Lighting layout: the luminaire outline (a long rectangle for a linear fitting, a circle for a bulkhead) with a filled mark, a cross or E for the emergency / self-contained battery version and the duration (e.g. 3 h) beside it.",
    "notes": "The filled mark or E distinguishes emergency fittings from normal luminaires on the same drawing. Escape signs are drawn separately (escape-sign).",
    "datasheet": {
     "form": "Emergency luminaire schedule (IEC 60598-2-22, EN 1838)",
     "fields": {
      "Style": "style",
      "Mounting": "mount",
      "Mounting height": "height",
      "Length": "length",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "escape-sign",
   "title": "Escape route and muster sign",
   "category": "safety",
   "description": "Escape-route signage to ISO 7010: emergency exit E001 (left hand) or E002 (right hand) with a supplementary direction arrow, or evacuation assembly point E007 (square, larger), each over a legend band. lighting internal gives an aluminium Ex sign box with a lit polycarbonate face, status LED, gland and cable; photoluminescent gives a riveted 2 mm aluminium plate with a glow-in-the-dark face. On a galvanised post or wall rails, with tag bracket.",
   "import": "./safety/escape-sign",
   "export": "EscapeSign",
   "anchor": "base",
   "standards": [
    "ISO 7010",
    "ISO 3864-1",
    "ISO 16069",
    "EN 1838"
   ],
   "vendors": [
    "Eaton (CEAG)",
    "Hazatex",
    "DENIOS"
   ],
   "tags": [
    "escape route",
    "exit sign",
    "muster point",
    "signage",
    "ISO 7010",
    "emergency lighting"
   ],
   "params": [
    {
     "key": "symbol",
     "label": "Symbol",
     "type": "select",
     "options": [
      "E001",
      "E002",
      "E007"
     ]
    },
    {
     "key": "arrow",
     "label": "Arrow",
     "type": "select",
     "options": [
      "left",
      "right",
      "up",
      "down",
      "none"
     ]
    },
    {
     "key": "lighting",
     "label": "Lighting",
     "type": "select",
     "options": [
      "internal",
      "photoluminescent"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "legend",
     "label": "Legend",
     "type": "text"
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "symbol": "E002",
    "arrow": "right",
    "lighting": "internal",
    "mount": "pole",
    "height": 2.2,
    "legend": "EXIT",
    "lit": true,
    "tag": "ES-0101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.418,
     2.376,
     0.264
    ],
    "center": [
     -0.029,
     1.188,
     0.002
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/escape-sign.svg",
    "standard": "ISO 7010 / ISO 3864-1 (safety signs), escape plan convention",
    "drawn": "On escape route plans: a small sign rectangle showing the ISO 7010 emergency exit or assembly point symbol with a direction arrow, at each change of direction along the escape route; route arrows drawn along the walkways.",
    "notes": "Only on escape and safety plans. Muster / assembly points use the square E007-type sign; exits use the rectangular sign with an arrow.",
    "datasheet": {
     "form": "Safety sign schedule (ISO 7010, ISO 3864-1, ISO 16069)",
     "fields": {
      "Sign symbol": "symbol",
      "Direction arrow": "arrow",
      "Lighting": "lighting",
      "Mounting": "mount",
      "Mounting height": "height",
      "Legend": "legend",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "emergency-telephone",
   "title": "Emergency telephone",
   "category": "safety",
   "description": "Hazardous-area emergency telephone: Ex d cast body with bolted cover, handset on its hook with perforated ear and mouth caps, armoured stainless cord, keypad, red emergency call button, ringer grille, gland and stopping plug. enclosure hood puts it in a hollow GRP acoustic hood (tapered sides, foam lining, open front and bottom; about 790 × 740 × 560 mm) on a stanchion or wall; booth puts it in a floor-standing open-front acoustic booth with roof light; none mounts the telephone alone. Red call beacon flashes when ringing; ISO 7010 E004 sign.",
   "import": "./safety/emergency-telephone",
   "export": "EmergencyTelephone",
   "anchor": "base",
   "standards": [
    "IEC 60079-1",
    "IEC 60079-0",
    "ISO 7010",
    "EN 54-23"
   ],
   "vendors": [
    "Storacall",
    "Gai-Tronics (Hubbell)",
    "Auer Signal",
    "Johnson Controls (Spector Lumenex)"
   ],
   "tags": [
    "telephone",
    "emergency telephone",
    "acoustic hood",
    "telecom",
    "PAGA",
    "Ex"
   ],
   "params": [
    {
     "key": "enclosure",
     "label": "Enclosure",
     "type": "select",
     "options": [
      "hood",
      "booth",
      "none"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "colour",
     "label": "Hood colour",
     "type": "select",
     "options": [
      "yellow",
      "red",
      "orange"
     ]
    },
    {
     "key": "height",
     "label": "Handset height",
     "type": "number",
     "min": 1,
     "max": 1.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "beacon",
     "label": "Beacon",
     "type": "bool"
    },
    {
     "key": "ringing",
     "label": "Ringing",
     "type": "bool"
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "enclosure": "hood",
    "mount": "pole",
    "colour": "yellow",
    "height": 1.5,
    "beacon": true,
    "ringing": true,
    "sign": true,
    "tag": "TEL-0201"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.8,
     2.105,
     0.737
    ],
    "center": [
     0,
     1.053,
     0.239
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/emergency-telephone.svg",
    "standard": "Telecom layout convention; ISO 7010 sign",
    "drawn": "Telecom or escape layout: a telephone symbol (box with a handset) at the phone position, labelled EMERGENCY or with its extension; booths and acoustic hoods noted.",
    "notes": "Only on telecom and escape layouts. A box with only a push-button is a manual call point.",
    "datasheet": {
     "form": "Telephone station datasheet (IEC 60079-1)",
     "fields": {
      "Enclosure": "enclosure",
      "Mounting": "mount",
      "Colour": "colour",
      "Mounting height": "height",
      "Ringing beacon": "beacon",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fire-hydrant",
   "title": "Pillar fire hydrant",
   "category": "safety",
   "description": "Dry-barrel pillar hydrant on an underground firewater main. Below grade: flanged horizontal inlet (port inlet, hollow bore), long-radius shoe on a foot and concrete thrust block, buried riser with drain into a gravel pocket. At grade: bolted breakaway flange. Above: red barrel with casting bands and reflective marker, two 2½\" brass hose outlets left and right and an optional 4½\" pumper outlet to the front, each with a chained cap and pentagon nut, bolted bonnet, weather shield and pentagon operating nut. bury sets the inlet depth.",
   "import": "./safety/fire-hydrant",
   "export": "FireHydrant",
   "anchor": "base",
   "standards": [
    "AWWA C502",
    "EN 14384",
    "NFPA 24",
    "ASME B16.5"
   ],
   "vendors": [
    "NAFFCO",
    "Mueller",
    "American Flow Control"
   ],
   "tags": [
    "firewater",
    "hydrant",
    "fire protection",
    "onshore",
    "underground"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Inlet size",
     "type": "nps",
     "min": 4,
     "max": 8
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "outlets",
     "label": "Outlets",
     "type": "number",
     "min": 2,
     "max": 3,
     "step": 1
    },
    {
     "key": "bury",
     "label": "Bury depth",
     "type": "number",
     "min": 0.6,
     "max": 2.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 150,
    "outlets": 3,
    "bury": 1.2,
    "tag": "FH-7101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Firewater inlet",
     "position": [
      -0.55,
      -1.2,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     0.879,
     2.602,
     0.519
    ],
    "center": [
     -0.135,
     -0.353,
     0.01
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fire-hydrant.svg",
    "standard": "F&G / safety layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); NFPA 24 / EN 14384",
    "drawn": "Fire-protection layouts: a hydrant symbol (a circle with outlet stubs, or a pillar with two side outlets) on the underground firewater main, tagged H or FH; on the firewater P&ID a branch off the ring with an isolation valve.",
    "tags": [
     "FH",
     "HYD"
    ],
    "notes": "A riser with a nozzle barrel is a fire monitor; a reel is a hose reel. Pillar hydrants are onshore; offshore uses hose stations and monitors on the ring main.",
    "datasheet": {
     "form": "Fire hydrant datasheet (AWWA C502 / EN 14384)",
     "fields": {
      "Inlet size": "nps",
      "Pressure class": "rating",
      "Outlets": "outlets",
      "Bury depth": "bury",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "deluge-nozzle",
   "title": "Deluge nozzle / sprinkler head",
   "category": "safety",
   "description": "Water-spray discharge head on a short flanged drop (port A at the weld-neck flange, forged reducing coupling to a ½\" NPT head, tie-wired tag). kind mv is an open medium-velocity nozzle with a hollow orifice and a slotted external deflector on two frame arms; hv a high-velocity conical nozzle with an open orifice and swirl vane; sprinkler a pendent glass-bulb sprinkler whose bulb colour follows temperature; water-mist a stainless head with nine micro-nozzles. spray draws the discharge cone at angle. Use kind, not type (reserved by Object3D).",
   "import": "./safety/deluge-nozzle",
   "export": "DelugeNozzle",
   "anchor": "fitting",
   "standards": [
    "NFPA 15",
    "NFPA 13",
    "EN 12259-1",
    "ISO 6182-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Tyco",
    "Reliable",
    "Marioff (HI-FOG)"
   ],
   "tags": [
    "firewater",
    "deluge",
    "spray nozzle",
    "sprinkler",
    "water mist",
    "fire protection"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "mv",
      "hv",
      "sprinkler",
      "water-mist"
     ]
    },
    {
     "key": "nps",
     "label": "Drop size",
     "type": "nps",
     "min": 0.75,
     "max": 2
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "drop",
     "label": "Drop length",
     "type": "number",
     "min": 0.12,
     "max": 1,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "angle",
     "label": "Spray angle",
     "type": "number",
     "min": 30,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "temperature",
     "label": "Bulb rating",
     "type": "number",
     "min": 57,
     "max": 182,
     "step": 1,
     "unit": "°C"
    },
    {
     "key": "spray",
     "label": "Show spray",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "mv",
    "nps": 1,
    "rating": 150,
    "drop": 0.2,
    "angle": 110,
    "temperature": 68,
    "spray": false,
    "tag": "DN-7201"
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      0,
      0.2,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 1,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     0.108,
     0.265,
     0.108
    ],
    "center": [
     0,
     0.084,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/deluge-nozzle.svg",
    "standard": "Fire-protection layout / isometric convention (NFPA 15 / NFPA 13)",
    "drawn": "On deluge layouts and isometrics: a short drop from the deluge pipe ending in a nozzle (small open cone or triangle) with its spray pattern; closed sprinkler heads are a circle with a dot. The nozzle type and K-factor are tabulated.",
    "tags": [
     "NZ"
    ],
    "notes": "Open nozzle (no bulb) = deluge; a sprinkler head (bulb) is drawn as a filled circle or circle with a dot. On P&IDs a deluge network is one line after the deluge valve with \"nozzles\" noted.",
    "datasheet": {
     "form": "Water-spray nozzle schedule (NFPA 15 / NFPA 13)",
     "fields": {
      "Head type": "kind",
      "Connection size": "nps",
      "Pressure class": "rating",
      "Drop length": "drop",
      "Spray angle": "angle",
      "Bulb temperature rating": "temperature",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "breathing-apparatus-cabinet",
   "title": "Breathing apparatus cabinet",
   "category": "safety",
   "description": "GRP storage cabinet for self-contained breathing apparatus, hollow with a gel-coat lining, moulded front flange, door seal, left-hand piano hinge, toggle latches and pull handle; the door carries a blue mandatory respiratory-protection sign and the tag. open swings the door to show the SCBA set: composite cylinder strapped to the backplate (valve down), harness and waist belt, pressure reducer, gauge hose and gauge, full-face mask with visor and demand valve. sets 2 widens it for a spare cylinder in a cradle. On wall cleats or a galvanised stand. Sizes follow typical single-set (≈548 × 816 × 344 mm) and set-plus-spare (≈835 × 937 × 347 mm) cabinets.",
   "import": "./safety/breathing-apparatus-cabinet",
   "export": "BreathingApparatusCabinet",
   "anchor": "base",
   "standards": [
    "EN 137",
    "ISO 7010",
    "SOLAS FSS Code ch. 3"
   ],
   "vendors": [
    "Survitec",
    "Viking Life-Saving Equipment"
   ],
   "tags": [
    "breathing apparatus",
    "SCBA",
    "BA",
    "H2S",
    "emergency response",
    "cabinet"
   ],
   "params": [
    {
     "key": "sets",
     "label": "Sets",
     "type": "number",
     "min": 1,
     "max": 2,
     "step": 1
    },
    {
     "key": "open",
     "label": "Door open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "stand"
     ]
    },
    {
     "key": "colour",
     "label": "Colour",
     "type": "select",
     "options": [
      "red",
      "orange"
     ]
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "sets": 1,
    "open": 0.8,
    "mount": "wall",
    "colour": "red",
    "sign": true,
    "tag": "BA-0301"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.595,
     0.816,
     0.897
    ],
    "center": [
     -0.024,
     1.308,
     0.449
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/breathing-apparatus-cabinet.svg",
    "standard": "Safety equipment layout convention; ISO 7010 sign",
    "drawn": "Safety equipment layouts: a cabinet rectangle with a BA mark or a cylinder outline, located at muster points, the CCR and H2S-risk areas, with the number of sets noted.",
    "tags": [
     "BA",
     "SCBA"
    ],
    "notes": "Only on safety equipment plans. A cabinet with a cross is a first-aid station; a cabinet with FE is an extinguisher.",
    "datasheet": {
     "form": "Safety equipment schedule (EN 137 / SOLAS FSS Code ch. 3)",
     "fields": {
      "Number of sets": "sets",
      "Mounting": "mount",
      "Colour": "colour",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "first-aid-station",
   "title": "First-aid station",
   "category": "safety",
   "description": "First-aid point: hollow green GRP cabinet with gel-coat lining, hinged door with a large white cross, FIRST AID legend, latches, handle and tag. open shows two shelves of green first-aid kits, eyewash bottles, foil blankets and gloves. stretcher adds a basket stretcher (orange shell, stainless rail frame, straps, bridle rings) stored upright on wall hooks with a deck shoe. ISO 7010 E003 first aid and E013 stretcher signs above. On wall cleats or a galvanised stand.",
   "import": "./safety/first-aid-station",
   "export": "FirstAidStation",
   "anchor": "base",
   "standards": [
    "ISO 7010",
    "ISO 3864-1",
    "BS 8599-1"
   ],
   "vendors": [
    "Viking Life-Saving Equipment (Jo Bird)",
    "SHM Group",
    "Dräger"
   ],
   "tags": [
    "first aid",
    "stretcher",
    "medical",
    "emergency response",
    "cabinet",
    "ISO 7010"
   ],
   "params": [
    {
     "key": "open",
     "label": "Door open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "stretcher",
     "label": "Stretcher",
     "type": "bool"
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "stand"
     ]
    },
    {
     "key": "sign",
     "label": "Signs",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "open": 0.7,
    "stretcher": true,
    "mount": "wall",
    "sign": true,
    "tag": "FA-0401"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.41,
     2.275,
     0.892
    ],
    "center": [
     0.385,
     1.138,
     0.446
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/first-aid-station.svg",
    "standard": "Safety equipment layout convention; ISO 7010 sign",
    "drawn": "Safety equipment layouts: a square with a cross (the first-aid sign) at the station, with a stretcher noted where provided.",
    "tags": [
     "FA"
    ],
    "notes": "Only on safety equipment plans. The cross outline tells it from other cabinets.",
    "datasheet": {
     "form": "Safety equipment schedule (ISO 7010, EN 13976 stretchers)",
     "fields": {
      "Stretcher": "stretcher",
      "Mounting": "mount",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "lifejacket-box",
   "title": "Lifejacket storage box",
   "category": "safety",
   "description": "Deck lifejacket chest at muster stations and lifeboat embarkation points. Hollow GRP body with gel-coat lining, rolled rim and drain plug on galvanised skids with bolted lashing lugs; hinged lid with downstand lip, hasps and staples, piano-hinge knuckles and two gas stays. open lifts the lid to show folded orange lifejackets with retro-reflective patches stacked in columns; capacity sets the number of jackets and the box length (typical: ≈1.18 m for 15, ≈1.48 m for 24). Lifejacket sign and tag on the front; orange or white gel coat.",
   "import": "./safety/lifejacket-box",
   "export": "LifejacketBox",
   "anchor": "base",
   "standards": [
    "SOLAS LSA Code 2.2",
    "IMO A.1116",
    "ISO 12402-2"
   ],
   "vendors": [
    "Viking Life-Saving Equipment (Jo Bird)",
    "Ocean Safety",
    "SHM Group"
   ],
   "tags": [
    "lifejacket",
    "muster",
    "life saving",
    "LSA",
    "storage",
    "GRP"
   ],
   "params": [
    {
     "key": "capacity",
     "label": "Lifejackets",
     "type": "number",
     "min": 6,
     "max": 60,
     "step": 1
    },
    {
     "key": "open",
     "label": "Lid open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "colour",
     "label": "Colour",
     "type": "select",
     "options": [
      "orange",
      "white"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "capacity": 24,
    "open": 0.6,
    "colour": "orange",
    "tag": "LJ-0501"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.57,
     1.605,
     0.834
    ],
    "center": [
     0,
     0.803,
     -0.005
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/lifejacket-box.svg",
    "standard": "Lifesaving appliance plan convention; SOLAS LSA Code, ISO 7010 sign",
    "drawn": "Escape and lifesaving plans: a box (rectangle) with a lifejacket outline or LJ mark at each muster station and lifeboat embarkation point, with the number of jackets stored written beside it.",
    "notes": "Only on lifesaving appliance plans. A ring is a lifebuoy (life-ring); a boat outline is a lifeboat.",
    "datasheet": {
     "form": "Lifesaving appliance schedule (SOLAS LSA Code 2.2)",
     "fields": {
      "Number of lifejackets": "capacity",
      "Colour": "colour",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fire-blanket",
   "title": "Fire blanket",
   "category": "safety",
   "description": "Wall-mounted fire blanket in a rigid red quick-release container: back plate, shell with printed FIRE BLANKET instructions and pictogram, open bottom slot showing the folded blanket, two black pull tapes with finger loops. size picks the 1.0, 1.2 or 1.8 × 1.2 m blanket and the container (typical rigid cases ≈177 × 203 × 46 mm for 1.2 m); red fire-equipment sign above and tag bracket below. On a wall plate or stanchion.",
   "import": "./safety/fire-blanket",
   "export": "FireBlanket",
   "anchor": "base",
   "standards": [
    "EN 1869",
    "BS 7944",
    "ISO 7010"
   ],
   "vendors": [
    "Firechief",
    "FireGuard"
   ],
   "tags": [
    "fire blanket",
    "manual firefighting",
    "galley",
    "fire protection"
   ],
   "params": [
    {
     "key": "size",
     "label": "Blanket",
     "type": "select",
     "options": [
      "1.0x1.0",
      "1.2x1.2",
      "1.8x1.2"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "wall",
      "pole"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.8,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "size": "1.2x1.2",
    "mount": "wall",
    "height": 1.5,
    "sign": true,
    "tag": "FB-0601"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.3,
     0.783,
     0.054
    ],
    "center": [
     0,
     1.435,
     0.027
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fire-blanket.svg",
    "standard": "Safety equipment layout convention; ISO 7010 sign",
    "drawn": "Safety equipment layouts: a small rectangle marked FB (fire blanket) on the wall of galleys, workshops and laboratories, sometimes with the pull tabs drawn below.",
    "tags": [
     "FB"
    ],
    "notes": "Only on safety equipment plans. FE marks an extinguisher; HR a hose reel.",
    "datasheet": {
     "form": "Safety equipment schedule (EN 1869)",
     "fields": {
      "Size": "size",
      "Mounting": "mount",
      "Mounting height": "height",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "point-gas-detector",
   "title": "Point gas detector",
   "category": "safety",
   "description": "Point gas detector in two real forms. ir: optical detector screwed horizontally into the side wall of an Ex d junction box (bolted lid, earth stud, gland and stopping plug), with perforated weather protection, a hollow sunshade/deluge hood and a remote gassing line to a capped calibration port. catalytic: Ex d transmitter with %LEL/ppm display and a down-pointing sinter head under a weather cap with calibration nozzle, plus an Ex d junction box. Free-standing stanchion or wall bracket; height sets the sensor elevation.",
   "import": "./safety/point-gas-detector",
   "export": "PointGasDetector",
   "anchor": "base",
   "standards": [
    "IEC 60079-29-1",
    "IEC 60079-29-2",
    "IEC 60079-1",
    "IEC 60079-14"
   ],
   "vendors": [
    "Honeywell",
    "Dräger",
    "MSA",
    "Det-Tronics"
   ],
   "tags": [
    "fire and gas",
    "gas detection",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.5,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "sensor",
     "label": "Sensor",
     "type": "select",
     "options": [
      "ir",
      "catalytic"
     ]
    },
    {
     "key": "gas",
     "label": "Gas (catalytic)",
     "type": "select",
     "options": [
      "CH4",
      "C3H8",
      "H2",
      "H2S",
      "CO"
     ]
    },
    {
     "key": "sunshade",
     "label": "Sunshade (IR)",
     "type": "bool"
    },
    {
     "key": "gassing",
     "label": "Remote gassing (IR)",
     "type": "bool"
    },
    {
     "key": "junction",
     "label": "Junction box (catalytic)",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "height": 1.2,
    "sensor": "ir",
    "gas": "CH4",
    "sunshade": true,
    "gassing": true,
    "junction": true,
    "tag": "GD-2101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.537,
     1.378,
     0.282
    ],
    "center": [
     0.031,
     0.689,
     0.011
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/point-gas-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); ISA 5.1 AT / GD tag",
    "drawn": "On F&G layouts: a circle (or hexagon / triangle on some legends) with G, GD or the gas (HC, H2S, H2) inside or beside it, placed at the detector position with its tag. On cause & effect and some P&IDs it is an AT / GD bubble with the gas and LEL set points written beside it.",
    "tags": [
     "GD",
     "GDH",
     "GDT"
    ],
    "isa": [
     "AT",
     "AE"
    ],
    "notes": "Point detectors are single symbols; open-path detectors are a pair joined by a beam line. Toxic (H2S, CO) detectors use the same symbol with the gas name; a separate toxic-gas-detector component covers electrochemical cells.",
    "datasheet": {
     "form": "Gas detector datasheet (IEC 60079-29-1 / -29-2)",
     "fields": {
      "Mounting": "mount",
      "Mounting height": "height",
      "Sensor type": "sensor",
      "Target gas": "gas",
      "Sunshade / deluge hood": "sunshade",
      "Integral junction box": "junction",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "flame-detector",
   "title": "IR3 flame detector",
   "category": "safety",
   "description": "Triple-IR flame detector in a red Ex d housing with three sensor windows, optical-integrity/BIT lamp and weather hood (hollow, closed edges), on a stainless ball-swivel mount. Default aim 20° down, as manufacturers advise 10–20° so rain runs off the window. One cable gland and one stopping plug, earth stud. Free-standing stanchion or wall bracket.",
   "import": "./safety/flame-detector",
   "export": "FlameDetector",
   "anchor": "base",
   "standards": [
    "EN 54-10",
    "FM 3260",
    "IEC 60079-1"
   ],
   "vendors": [
    "Det-Tronics",
    "Honeywell",
    "Spectrex",
    "MSA"
   ],
   "tags": [
    "fire and gas",
    "flame detection",
    "F&G",
    "detector"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.8,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tilt",
     "label": "Tilt down",
     "type": "number",
     "min": -10,
     "max": 70,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "pan",
     "label": "Pan",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "hood",
     "label": "Weather hood",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "height": 2.5,
    "tilt": 20,
    "pan": 0,
    "hood": true,
    "tag": "FD-2105"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     2.666,
     0.425
    ],
    "center": [
     -0.054,
     1.333,
     0.083
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/flame-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); cone of vision per NORSOK Z-001 / ISA TR84.00.07 mapping practice",
    "drawn": "A detector symbol (circle with F or FD, or a small triangle) with a wedge or cone drawn from it showing the field of view, aimed into the area it covers; the tilt angle is often written beside it.",
    "tags": [
     "FD",
     "IR3",
     "UV/IR"
    ],
    "isa": [
     "BE",
     "BT"
    ],
    "notes": "The cone of vision is the giveaway. A pair of symbols joined by a beam line is an open-path gas detector. ISA uses B (burner / combustion) for flame: BE / BT / BSH on some P&IDs.",
    "datasheet": {
     "form": "Flame detector datasheet (EN 54-10 / FM 3260)",
     "fields": {
      "Mounting": "mount",
      "Mounting height": "height",
      "Tilt (down)": "tilt",
      "Pan": "pan",
      "Weather hood": "hood",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "open-path-gas-detector",
   "title": "Open-path gas detector",
   "category": "safety",
   "description": "Line-of-sight IR gas detector pair: transmitter and receiver heads (stainless barrel, yellow hood, lens window, alignment sight) on pan/tilt mounts, facing each other along X. separation sets the path between the two stanchions; the beam can be drawn for coverage studies.",
   "import": "./safety/open-path-gas-detector",
   "export": "OpenPathGasDetector",
   "anchor": "base",
   "standards": [
    "IEC 60079-29-4",
    "EN 60079-29-4"
   ],
   "vendors": [
    "Honeywell",
    "Dräger",
    "Det-Tronics",
    "MSA"
   ],
   "tags": [
    "fire and gas",
    "gas detection",
    "open path",
    "beam",
    "F&G"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "separation",
     "label": "Path length",
     "type": "number",
     "min": 2,
     "max": 120,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Beam height",
     "type": "number",
     "min": 0.5,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "beam",
     "label": "Show beam",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "separation": 20,
    "height": 1,
    "beam": true,
    "tag": "OGD-1101"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.26,
     1.208,
     0.475
    ],
    "center": [
     0,
     0.604,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/open-path-gas-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); IEC 60079-29-4",
    "drawn": "Two symbols, a transmitter and a receiver, at the two ends of a straight dashed beam line across the area, often labelled OGD with the path length and LEL·m set points.",
    "tags": [
     "OGD",
     "OPGD",
     "GD"
    ],
    "isa": [
     "AT"
    ],
    "notes": "The beam line between a pair of symbols is the clue; a single symbol with a cone is a flame detector. Some legends draw an arrow from transmitter to receiver.",
    "datasheet": {
     "form": "Open-path gas detector datasheet (IEC 60079-29-4)",
     "fields": {
      "Mounting": "mount",
      "Path length": "separation",
      "Mounting height": "height",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "manual-call-point",
   "title": "Manual call point",
   "category": "safety",
   "description": "Ex d manual alarm call point with break-glass window, hinged lift flap, key-operated test facility, captive cover screws and status LED; one gland and two stopping plugs. kind fire gives the red fire-alarm point with an ISO 7010 sign; kind esd gives the yellow emergency-shutdown station with a hazard-bordered sign. On a stanchion or wall at 1.4 m.",
   "import": "./safety/manual-call-point",
   "export": "ManualCallPoint",
   "anchor": "base",
   "standards": [
    "EN 54-11",
    "ISO 7010",
    "IEC 60079-1"
   ],
   "vendors": [
    "Eaton MEDC",
    "E2S",
    "Kidde-Fenwal",
    "Johnson Controls (Tyco)",
    "Salwico"
   ],
   "tags": [
    "fire and gas",
    "MAC",
    "call point",
    "ESD",
    "push button",
    "F&G"
   ],
   "params": [
    {
     "key": "kind",
     "label": "Kind",
     "type": "select",
     "options": [
      "fire",
      "esd"
     ]
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.8,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kind": "fire",
    "mount": "pole",
    "height": 1.4,
    "sign": true,
    "tag": "MAC-201"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     1.688,
     0.272
    ],
    "center": [
     -0.054,
     0.844,
     0.006
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/manual-call-point.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); EN 54-11, ISO 7010 sign",
    "drawn": "A square with a filled circle (or a small square) in the middle, at the call point position on escape routes and exits, labelled MAC / MCP; ESD push-buttons use the same box marked ESD or with a different fill.",
    "tags": [
     "MAC",
     "MCP",
     "ESD PB"
    ],
    "isa": [
     "HS",
     "HAS"
    ],
    "notes": "NFPA-style US legends draw the pull station as a square with F or a hand. On P&IDs and C&E charts a manual call point is an HS bubble feeding the F&G logic.",
    "datasheet": {
     "form": "Manual call point datasheet (EN 54-11)",
     "fields": {
      "Type": "kind",
      "Mounting": "mount",
      "Mounting height": "height",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "alarm-beacon",
   "title": "Alarm beacon and sounder",
   "category": "safety",
   "description": "Ex d status or general-alarm (GA/PAGA) beacon with a guarded coloured lens on a shelf bracket, with an optional horn sounder on a stainless U-bracket below; each has a gland and a stopping plug in its second entry. colour picks the lens (red fire, amber gas, blue, green, white), flash sets the strobe rate; the lens is its own material so each beacon flashes independently.",
   "import": "./safety/alarm-beacon",
   "export": "AlarmBeacon",
   "anchor": "base",
   "standards": [
    "EN 54-23",
    "EN 54-3",
    "IEC 60079-1"
   ],
   "vendors": [
    "E2S",
    "Eaton MEDC",
    "Pfannenberg"
   ],
   "tags": [
    "fire and gas",
    "beacon",
    "sounder",
    "general alarm",
    "PAGA",
    "F&G"
   ],
   "params": [
    {
     "key": "colour",
     "label": "Colour",
     "type": "select",
     "options": [
      "red",
      "amber",
      "blue",
      "green",
      "white"
     ]
    },
    {
     "key": "sounder",
     "label": "Sounder",
     "type": "bool"
    },
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.8,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "flash",
     "label": "Flash rate",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 0.5,
     "unit": "Hz"
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "colour": "red",
    "sounder": true,
    "mount": "pole",
    "height": 2.5,
    "flash": 1,
    "lit": true,
    "tag": "XA-1101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.368,
     2.792,
     0.404
    ],
    "center": [
     -0.054,
     1.396,
     0.072
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/alarm-beacon.svg",
    "standard": "IEC 60617 (lamp, horn) / F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company)",
    "drawn": "On F&G and PA/GA layouts: a lamp symbol (circle with ×) with short light rays for the beacon, and a horn outline (trumpet) for the sounder, labelled with the colour and the GA / F&G status it shows.",
    "isa": [
     "XL",
     "XA",
     "YL"
    ],
    "notes": "Circle with × alone is a general lamp (lighting); the rays and colour note mark a status beacon. Sounders alone are a horn outline or a bell.",
    "datasheet": {
     "form": "Visual / audible alarm device datasheet (EN 54-23 / EN 54-3)",
     "fields": {
      "Lens colour": "colour",
      "Sounder": "sounder",
      "Mounting": "mount",
      "Mounting height": "height",
      "Flash rate": "flash",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "deluge-valve-skid",
   "title": "Deluge valve skid",
   "category": "safety",
   "description": "Deluge valve set in firewater red: clapper/diaphragm-type deluge valve with bolted cover between locked-open OS&Y isolation valves. Trim: priming line with ball valve, strainer, restriction orifice and check valve; water-supply and priming-chamber gauges; solenoid release and manual release to a tundish; alarm line with pressure switch, alarm test valve and automatic drain; main drain and a system drain/test valve. Open flanged bores; UPN skid with U-bolted supports.",
   "import": "./safety/deluge-valve-skid",
   "export": "DelugeValveSkid",
   "anchor": "base",
   "standards": [
    "NFPA 15",
    "EN 12259-9",
    "ASME B16.5",
    "ASME B16.10"
   ],
   "vendors": [
    "Johnson Controls (Tyco)",
    "Viking",
    "HD Fire"
   ],
   "tags": [
    "firewater",
    "deluge",
    "fire protection",
    "valve set",
    "skid"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 3,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "isolation",
     "label": "Isolation valves",
     "type": "bool"
    },
    {
     "key": "frame",
     "label": "Skid frame",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 150,
    "isolation": true,
    "frame": true,
    "tag": "DV-1101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Firewater inlet",
     "position": [
      -1.1754,
      0.918,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Deluge outlet",
     "position": [
      1.1754,
      0.918,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     2.551,
     1.788,
     0.9
    ],
    "center": [
     0,
     0.894,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/deluge-valve-skid.svg",
    "standard": "ISO 10628-2 valves + NFPA 15 / NFPA 170 deluge convention",
    "drawn": "On the firewater P&ID: a deluge valve (valve body with a solenoid release box, tagged DV / XV) between two locked-open (LO) isolation valves, feeding a dry deluge pipe network drawn to the nozzles; often inside a dashed skid boundary.",
    "tags": [
     "DV"
    ],
    "isa": [
     "XV",
     "XY",
     "PSL"
    ],
    "notes": "Look for the firewater (FW) line, the LO marks and the dry pipe downstream. A plain ESDV on a process line is esd-valve. Some legends draw the deluge valve as a check-valve body with a clapper. ISA codes here: XY = solenoid; PSL = trip.",
    "datasheet": {
     "form": "Deluge valve datasheet (NFPA 15 / EN 12259-9)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Isolation valves": "isolation",
      "Skid frame": "frame",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fire-monitor",
   "title": "Fire monitor",
   "category": "safety",
   "description": "Fixed firewater monitor on a red riser: flanged side inlet with open bore, long-radius elbow on a dummy-leg foot plate, low-point drain, locked-open OS&Y isolation valve, optional inline water-powered oscillator (flanged both ends, drive housing with speed and arc controls, manual override), slewing turret with lock handwheels, elevating gooseneck (80° up to 15° down) and hollow fog nozzle with bumper and tiller.",
   "import": "./safety/fire-monitor",
   "export": "FireMonitor",
   "anchor": "base",
   "standards": [
    "EN 15767",
    "NFPA 15",
    "ASME B16.5",
    "ASME B16.9"
   ],
   "vendors": [
    "Akron Brass",
    "Elkhart Brass",
    "Chemguard",
    "Delta Fire"
   ],
   "tags": [
    "firewater",
    "monitor",
    "fire protection",
    "deluge",
    "foam"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Riser size",
     "type": "nps",
     "min": 3,
     "max": 8
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "height",
     "label": "Monitor flange height",
     "type": "number",
     "min": 1.2,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "slew",
     "label": "Slew",
     "type": "number",
     "min": -180,
     "max": 180,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "elevation",
     "label": "Elevation",
     "type": "number",
     "min": -15,
     "max": 80,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "oscillating",
     "label": "Oscillator",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 150,
    "height": 1.5,
    "slew": 0,
    "elevation": 20,
    "oscillating": true,
    "tag": "FM-7101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Firewater inlet",
     "position": [
      -0.4024,
      0.35,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.968,
     2.573,
     1.169
    ],
    "center": [
     0.061,
     1.287,
     0.1
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fire-monitor.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); NFPA 170-style fire protection symbol",
    "drawn": "On fire-protection layouts: a riser with a swivel (small circle) and a tapered nozzle barrel, sometimes with an arc showing the throw or the oscillation sector; on the firewater P&ID it is a branch off the ring main with an LO isolation valve and FM / MON tag.",
    "tags": [
     "FM",
     "MON"
    ],
    "notes": "A hose reel shows a drum with coiled hose; a hydrant is a riser with outlets and no barrel. Foam monitors are the same symbol with a foam (AFFF) supply.",
    "datasheet": {
     "form": "Fire monitor datasheet (EN 15767 / NFPA 15)",
     "fields": {
      "Inlet size": "nps",
      "Pressure class": "rating",
      "Riser height": "height",
      "Oscillating": "oscillating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hose-reel",
   "title": "Fire hose reel",
   "category": "safety",
   "description": "EN 671-1 swinging fire hose reel: 25 mm semi-rigid hose (hoseLength, typically 30 m) wound on a hollow drum with a spoked front cheek, jet/spray shut-off nozzle in its holder, isolating ball valve and swivel feed through the axle, flanged inlet with open bore. style open puts it on a red pedestal with an ISO 7010 sign; style cabinet puts it in a glazed red cabinet on a galvanised stand.",
   "import": "./safety/hose-reel",
   "export": "HoseReel",
   "anchor": "base",
   "standards": [
    "EN 671-1",
    "ISO 7010",
    "ASME B16.5"
   ],
   "vendors": [
    "Angus Fire",
    "NAFFCO",
    "Vigil"
   ],
   "tags": [
    "firewater",
    "hose reel",
    "fire protection",
    "manual firefighting"
   ],
   "params": [
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "open",
      "cabinet"
     ]
    },
    {
     "key": "nps",
     "label": "Supply",
     "type": "nps",
     "min": 1,
     "max": 2
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "hoseLength",
     "label": "Hose length",
     "type": "number",
     "min": 20,
     "max": 60,
     "step": 5,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "style": "open",
    "nps": 1.5,
    "rating": 150,
    "hoseLength": 30,
    "tag": "HR-7101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Firewater inlet",
     "position": [
      -0.42,
      0.4,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 1.5,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.801,
     1.69,
     0.697
    ],
    "center": [
     -0.036,
     0.845,
     0.198
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hose-reel.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company)",
    "drawn": "Circle with a smaller concentric circle (the drum) and the hose leaving to a nozzle, labelled HR; on the firewater P&ID a small branch off the ring main with a ball valve and HR tag.",
    "tags": [
     "HR",
     "FHR"
    ],
    "notes": "Concentric circles = reel. A riser with a nozzle barrel is a fire monitor; a box with letters FE or a cylinder outline is an extinguisher.",
    "datasheet": {
     "form": "Fire hose reel datasheet (EN 671-1)",
     "fields": {
      "Reel style": "style",
      "Inlet size": "nps",
      "Pressure class": "rating",
      "Hose length": "hoseLength",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "safety-shower",
   "title": "Safety shower and eyewash",
   "category": "safety",
   "description": "Combination emergency shower and eyewash in safety green: column on a floor flange with flanged potable-water inlet, stay-open shower valve with triangular pull rod, perforated shower head, eyewash bowl with twin capped heads and push flag, foot treadle, flow switch, green alarm lamp and ISO 7010 E012 sign. headHeight is limited to the ANSI Z358.1 range.",
   "import": "./safety/safety-shower",
   "export": "SafetyShower",
   "anchor": "base",
   "standards": [
    "ANSI Z358.1",
    "EN 15154-1",
    "EN 15154-2",
    "ISO 7010"
   ],
   "vendors": [
    "Hughes Safety Showers",
    "Bradley"
   ],
   "tags": [
    "safety shower",
    "eyewash",
    "first aid",
    "utilities",
    "potable water"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Supply",
     "type": "nps",
     "min": 1,
     "max": 2
    },
    {
     "key": "headHeight",
     "label": "Shower head height",
     "type": "number",
     "min": 2.08,
     "max": 2.44,
     "step": 0.02,
     "unit": "m"
    },
    {
     "key": "foot",
     "label": "Foot treadle",
     "type": "bool"
    },
    {
     "key": "alarm",
     "label": "Alarm lamp",
     "type": "bool"
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 1.25,
    "rating": 150,
    "headHeight": 2.2,
    "foot": true,
    "alarm": true,
    "sign": true,
    "tag": "SS-9001"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Potable water inlet",
     "position": [
      -0.3,
      0.35,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 1.25,
     "rating": 150,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     0.566,
     2.86,
     0.865
    ],
    "center": [
     -0.033,
     1.43,
     0.303
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/safety-shower.svg",
    "standard": "Layout plan convention; ISO 7010 sign; ANSI Z358.1",
    "drawn": "On layouts: a shower head (dome) on a pipe with spray lines and an eyewash bowl, or a box marked SS / EW with the ISO 7010 green sign; on utility P&IDs a small potable-water branch ending in an SS tag.",
    "tags": [
     "SS",
     "EW",
     "SSEW"
    ],
    "notes": "Placed near chemical injection, battery rooms and laboratories. A box marked EW alone is a standalone eyewash.",
    "datasheet": {
     "form": "Emergency shower and eyewash datasheet (ANSI Z358.1 / EN 15154)",
     "fields": {
      "Inlet size": "nps",
      "Shower head height": "headHeight",
      "Foot treadle": "foot",
      "Flow alarm": "alarm",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fire-extinguisher",
   "title": "Fire extinguishers",
   "category": "safety",
   "description": "EN 3 fire extinguishers with red bodies and agent colour zones (dry powder blue, CO2 black with discharge horn, foam cream), front instruction label, valve head with squeeze lever, safety pin, gauge and hose. unit portable-bracket hangs one on a neck cradle and strap on a post or wall; cabinet stands them in a red GRP cabinet with glazed or solid door; wheeled puts a 25–150 kg unit on a trolley. capacity (kg) sets the cylinder size; an ISO 7010 F001 sign is included.",
   "import": "./safety/fire-extinguisher",
   "export": "FireExtinguisher",
   "anchor": "base",
   "standards": [
    "EN 3-7",
    "EN 1866-1",
    "ISO 7010",
    "NFPA 10"
   ],
   "vendors": [
    "Penta",
    "CGS",
    "NAFFCO",
    "Gloria",
    "Kidde"
   ],
   "tags": [
    "fire extinguisher",
    "portable",
    "wheeled",
    "manual firefighting",
    "cabinet"
   ],
   "params": [
    {
     "key": "unit",
     "label": "Unit",
     "type": "select",
     "options": [
      "portable-bracket",
      "cabinet",
      "wheeled"
     ]
    },
    {
     "key": "agent",
     "label": "Agent",
     "type": "select",
     "options": [
      "dry-powder",
      "co2",
      "foam"
     ]
    },
    {
     "key": "capacity",
     "label": "Capacity",
     "type": "number",
     "min": 1,
     "max": 150,
     "step": 1,
     "unit": "kg"
    },
    {
     "key": "count",
     "label": "Count (cabinet)",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 1
    },
    {
     "key": "door",
     "label": "Cabinet door",
     "type": "select",
     "options": [
      "glazed",
      "solid"
     ]
    },
    {
     "key": "mount",
     "label": "Bracket mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "sign",
     "label": "Sign",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "unit": "cabinet",
    "agent": "dry-powder",
    "capacity": 9,
    "count": 2,
    "door": "glazed",
    "mount": "pole",
    "sign": true,
    "tag": "EXT-12"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.7,
     1.047,
     0.345
    ],
    "center": [
     0,
     0.523,
     0.158
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fire-extinguisher.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company); ISO 7010 safety sign",
    "drawn": "On fire-protection layouts: a small extinguisher outline or a triangle / square with the agent letters (DP, CO2, FOAM) and size (e.g. 9 kg); wheeled units are marked W or with wheels.",
    "tags": [
     "EXT"
    ],
    "notes": "Legends vary a lot; read the letters for the agent and capacity. Not shown on P&IDs.",
    "datasheet": {
     "form": "Portable extinguisher schedule (EN 3-7 / NFPA 10)",
     "fields": {
      "Unit": "unit",
      "Agent": "agent",
      "Capacity": "capacity",
      "Quantity": "count",
      "Cabinet door": "door",
      "Mounting": "mount",
      "ISO 7010 sign": "sign",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "windsock",
   "title": "Windsock",
   "category": "safety",
   "description": "Helideck windsock on a tilting galvanised mast: gusseted base plate with anchors, hinge with pivot and locking bolts, swivel head with mouth hoop and internal floodlight (or two external floodlights), red obstruction lamp, and a hollow banded sock (1.2 m colour/white/colour by default, 5 bands when longer) that droops in light air and stands out from about 12 m/s. windFrom turns the head downwind; flutter animates it.",
   "import": "./safety/windsock",
   "export": "Windsock",
   "anchor": "base",
   "standards": [
    "ICAO Annex 14 Vol II",
    "CAP 437",
    "FAA AC 150/5345-27"
   ],
   "vendors": [
    "Orga",
    "Signalight"
   ],
   "tags": [
    "windsock",
    "helideck",
    "wind",
    "aviation",
    "muster"
   ],
   "params": [
    {
     "key": "height",
     "label": "Mast height",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "windFrom",
     "label": "Wind from",
     "type": "number",
     "min": 0,
     "max": 360,
     "step": 5,
     "unit": "°"
    },
    {
     "key": "windSpeed",
     "label": "Wind speed",
     "type": "number",
     "min": 0,
     "max": 25,
     "step": 0.5,
     "unit": "m/s"
    },
    {
     "key": "length",
     "label": "Sock length",
     "type": "number",
     "min": 1.2,
     "max": 3.6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "colour",
     "label": "Colour",
     "type": "select",
     "options": [
      "orange",
      "red"
     ]
    },
    {
     "key": "lighting",
     "label": "Lighting",
     "type": "select",
     "options": [
      "internal",
      "external"
     ]
    },
    {
     "key": "lit",
     "label": "Lit",
     "type": "bool"
    },
    {
     "key": "flutter",
     "label": "Flutter",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 4,
    "windFrom": 270,
    "windSpeed": 8,
    "length": 1.2,
    "lit": true,
    "lighting": "internal",
    "colour": "orange",
    "flutter": true,
    "tag": "WS-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.869,
     4.665,
     0.456
    ],
    "center": [
     0.735,
     2.332,
     0.026
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/windsock.svg",
    "standard": "Layout plan convention; CAP 437 / ICAO Annex 14 helideck marking",
    "drawn": "On helideck and platform layouts: a mast with a truncated cone (the sock) streaming from it, sometimes only a small circle at the mast position labelled WS.",
    "notes": "Located clear of the helideck obstacle-free sector, visible from the approach. Not shown on P&IDs.",
    "datasheet": {
     "form": "Helideck windsock specification (CAP 437 / ICAO Annex 14 Vol II)",
     "fields": {
      "Mast height": "height",
      "Sock length": "length",
      "Colour": "colour",
      "Lighting": "lighting",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "heat-detector",
   "title": "Heat detector",
   "category": "safety",
   "description": "Ex d fixed-temperature / rate-of-rise heat detector: red flameproof head with finned sensing element inside a guard cage, alarm LED, gland and stopping plug, rating on the tag. mount ceiling hangs it under steel on a beam clamp and drop rod (origin on the underside of the steel, head below); mount wall puts it under a stainless shelf bracket.",
   "import": "./safety/heat-detector",
   "export": "HeatDetector",
   "anchor": "fitting",
   "standards": [
    "EN 54-5",
    "IEC 60079-1"
   ],
   "vendors": [
    "Eaton Crouse-Hinds",
    "Autronica",
    "Patol",
    "Honeywell"
   ],
   "tags": [
    "fire and gas",
    "heat detection",
    "F&G",
    "detector",
    "enclosed module"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "ceiling",
      "wall"
     ]
    },
    {
     "key": "drop",
     "label": "Drop / height",
     "type": "number",
     "min": 0.12,
     "max": 3,
     "step": 0.02,
     "unit": "m"
    },
    {
     "key": "rating",
     "label": "Rating",
     "type": "number",
     "min": 57,
     "max": 182,
     "step": 1,
     "unit": "°C"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "ceiling",
    "drop": 0.3,
    "rating": 78,
    "tag": "HD-2101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.181,
     0.477,
     0.152
    ],
    "center": [
     0.016,
     -0.22,
     -0.026
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/heat-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company)",
    "drawn": "Circle (or square on NFPA-style legends) with H or HD, placed on the ceiling plan of enclosed modules or near specific equipment (turbine hoods, battery rooms); fixed-temperature or rate-of-rise noted beside it.",
    "tags": [
     "HD"
    ],
    "isa": [
     "TSH",
     "TAH"
    ],
    "notes": "Letters inside the circle distinguish detector types: H heat, S smoke, F flame, G gas. On some P&IDs heat detection is a TSH bubble or a fusible-plug loop on the instrument air.",
    "datasheet": {
     "form": "Heat detector datasheet (EN 54-5)",
     "fields": {
      "Mounting": "mount",
      "Drop rod length": "drop",
      "Rated temperature": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "smoke-detector",
   "title": "Smoke detector",
   "category": "safety",
   "description": "Optical (photoelectric) smoke detector for enclosed rooms (LER, CCR, accommodation): white head with smoke entry vents on a mounting base and steel conduit back box, remote indicator LED, conduit and stopping plug. Origin on the ceiling; drop > 0 hangs it under steel on a beam clamp and rod.",
   "import": "./safety/smoke-detector",
   "export": "SmokeDetector",
   "anchor": "fitting",
   "standards": [
    "EN 54-7"
   ],
   "vendors": [
    "Autronica",
    "Apollo",
    "Hochiki"
   ],
   "tags": [
    "fire and gas",
    "smoke detection",
    "F&G",
    "detector",
    "building"
   ],
   "params": [
    {
     "key": "drop",
     "label": "Drop",
     "type": "number",
     "min": 0,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "alarm",
     "label": "Alarm LED",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "drop": 0,
    "alarm": false,
    "tag": "SD-9101"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.267,
     0.101,
     0.362
    ],
    "center": [
     0.071,
     -0.049,
     -0.119
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/smoke-detector.svg",
    "standard": "F&G layout convention (NFPA 170 / ISO 7240-style plan symbols; legends vary by company)",
    "drawn": "Circle (or square) with S or SD on the ceiling plan of enclosed rooms: LER, CCR, accommodation and HVAC ducts (duct detectors marked D).",
    "tags": [
     "SD"
    ],
    "notes": "Same family as the heat detector: read the letter. BS-style legends draw a smoke detector as a circle with S; NFPA-style may use a square or SD in a circle.",
    "datasheet": {
     "form": "Smoke detector datasheet (EN 54-7)",
     "fields": {
      "Drop rod length": "drop",
      "Remote indicator LED": "alarm",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "life-ring",
   "title": "Lifebuoy station",
   "category": "safety",
   "description": "SOLAS lifebuoy (730 mm OD, 440 mm ID, 2.5–4 kg class) in orange with four retro-reflective bands, festooned grab line and stencilled name, on stainless hooks with a quick-release strap; buoyant lifeline coiled below, optional self-activating light and smoke signal on its own bracket, lifebuoy sign and tag. On a stanchion or rail/wall bracket.",
   "import": "./safety/life-ring",
   "export": "LifeRing",
   "anchor": "base",
   "standards": [
    "SOLAS LSA Code 2.1",
    "IMO Res. A.1116(30)",
    "ISO 7010"
   ],
   "vendors": [
    "LALIZAS",
    "Dräger",
    "Viking Life-Saving Equipment"
   ],
   "tags": [
    "lifesaving",
    "lifebuoy",
    "man overboard",
    "muster"
   ],
   "params": [
    {
     "key": "mount",
     "label": "Mount",
     "type": "select",
     "options": [
      "pole",
      "wall"
     ]
    },
    {
     "key": "height",
     "label": "Buoy centre height",
     "type": "number",
     "min": 0.9,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "signal",
     "label": "Light & smoke signal",
     "type": "bool"
    },
    {
     "key": "name",
     "label": "Name",
     "type": "text"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "mount": "pole",
    "height": 1.3,
    "signal": true,
    "name": "ALPHA PDQ",
    "tag": "LB-01"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.969,
     2.008,
     0.36
    ],
    "center": [
     0.098,
     1.004,
     0.05
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/life-ring.svg",
    "standard": "Layout plan convention (lifesaving appliance plan); SOLAS LSA Code, ISO 7010 sign",
    "drawn": "On escape and lifesaving appliance plans: a ring (two concentric circles) with four bands, at each lifebuoy station; a light or smoke signal is marked L / S beside it.",
    "notes": "Only on escape / lifesaving plans, never on P&IDs.",
    "datasheet": {
     "form": "Lifesaving appliance schedule (SOLAS LSA Code 2.1)",
     "fields": {
      "Mounting": "mount",
      "Mounting height": "height",
      "Light / smoke signal": "signal",
      "Station name": "name",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "deck-module",
   "title": "Offshore deck module",
   "category": "structure",
   "description": "Offshore topsides deck section: primary girders (HEB or welded plate girders) on the leg lines with fin-plate connections and web stiffeners, IPE secondaries, 12 mm deck plate with grated drain gutters and 3\" drain outlets through liquid-seal pots (ports drain-1…n, flange faces pointing down) or bar grating, coaming, ISO 14122 guard rail with self-closing gated openings, escape-route markings, CHS legs with node cans and chevron bracing below, and stub columns up to a stacked module. Walking surface: top of the floor at y = 0, so equipment placed at y = 0 sits on it. Girders and legs go below (leg foot at y = -legHeight, to sit on a jacket at y = 0); stack another module at y = upperDeckAt with legHeight: 0 (otherwise its legs run down through this floor).",
   "import": "./structure/deck-module",
   "export": "DeckModule",
   "anchor": "base",
   "standards": [
    "ISO 19902",
    "ISO 14122-3",
    "EN 10365",
    "NORSOK N-004",
    "NORSOK C-001"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "deck",
    "topsides",
    "module",
    "platform",
    "offshore",
    "floor"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length (X)",
     "type": "number",
     "min": 6,
     "max": 80,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width (Z)",
     "type": "number",
     "min": 4,
     "max": 60,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "floor",
     "label": "Floor",
     "type": "select",
     "options": [
      "plate",
      "grating"
     ]
    },
    {
     "key": "primary",
     "label": "Primary girders",
     "type": "select",
     "options": [
      "HEB 500",
      "HEB 600",
      "HEB 800",
      "HEB 1000",
      "W36x300",
      "PG 1200",
      "PG 1600",
      "PG 2000"
     ]
    },
    {
     "key": "secondary",
     "label": "Secondary beams",
     "type": "select",
     "options": [
      "IPE 200",
      "IPE 240",
      "IPE 300",
      "IPE 360",
      "IPE 400",
      "HEA 300"
     ]
    },
    {
     "key": "secondarySpacing",
     "label": "Secondary pitch",
     "type": "number",
     "min": 0.6,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "legs",
     "label": "Legs",
     "type": "select",
     "options": [
      4,
      6,
      8
     ]
    },
    {
     "key": "legSpanX",
     "label": "Leg spacing X",
     "type": "number",
     "min": 4,
     "max": 70,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "legSpanZ",
     "label": "Leg spacing Z",
     "type": "number",
     "min": 3,
     "max": 50,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "legHeight",
     "label": "Leg height below",
     "type": "number",
     "min": 0,
     "max": 20,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "legDiameter",
     "label": "Leg OD",
     "type": "number",
     "min": 0.6,
     "max": 2.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "upperDeckAt",
     "label": "Upper deck at (0 = none)",
     "type": "number",
     "min": 0,
     "max": 15,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "column",
     "label": "Stub columns",
     "type": "select",
     "options": [
      "HEB 300",
      "HEB 400",
      "HEB 500",
      "HEB 600"
     ]
    },
    {
     "key": "handrails",
     "label": "Handrails",
     "type": "bool"
    },
    {
     "key": "railMinX",
     "label": "Rail −X",
     "type": "bool"
    },
    {
     "key": "railMaxX",
     "label": "Rail +X",
     "type": "bool"
    },
    {
     "key": "railMinZ",
     "label": "Rail −Z",
     "type": "bool"
    },
    {
     "key": "railMaxZ",
     "label": "Rail +Z",
     "type": "bool"
    },
    {
     "key": "drains",
     "label": "Drain gutters",
     "type": "bool"
    },
    {
     "key": "markings",
     "label": "Markings",
     "type": "bool"
    }
   ],
   "defaults": {
    "length": 24,
    "width": 16,
    "floor": "plate",
    "primary": "HEB 600",
    "secondary": "IPE 300",
    "secondarySpacing": 1.5,
    "legs": 4,
    "legSpanX": 16,
    "legSpanZ": 12,
    "legHeight": 6,
    "legDiameter": 1.5,
    "upperDeckAt": 0,
    "column": "HEB 400",
    "handrails": true,
    "railMinX": true,
    "railMaxX": true,
    "railMinZ": true,
    "railMaxZ": true,
    "openings": [
     {
      "side": "maxX",
      "at": 0,
      "width": 1,
      "gate": true
     }
    ],
    "drains": true,
    "markings": true
   },
   "ports": [
    {
     "id": "drain-1",
     "label": "Deck drain 1",
     "position": [
      -9.925,
      -0.912,
      -7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-2",
     "label": "Deck drain 2",
     "position": [
      -9.925,
      -0.912,
      7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-3",
     "label": "Deck drain 3",
     "position": [
      -4,
      -0.912,
      -7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-4",
     "label": "Deck drain 4",
     "position": [
      -4,
      -0.912,
      7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-5",
     "label": "Deck drain 5",
     "position": [
      4,
      -0.912,
      -7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-6",
     "label": "Deck drain 6",
     "position": [
      4,
      -0.912,
      7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-7",
     "label": "Deck drain 7",
     "position": [
      9.925,
      -0.912,
      -7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    },
    {
     "id": "drain-8",
     "label": "Deck drain 8",
     "position": [
      9.925,
      -0.912,
      7.54
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     24,
     7.124,
     16
    ],
    "center": [
     0,
     -2.438,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/deck-module.svg",
    "standard": "Layout plan convention (structural / plot plan drawings); ISO 19902",
    "drawn": "Plan view: the deck outline with dash-dot structural grid lines (rows and columns, e.g. A–D and 1–6) and circles at the jacket leg positions; deck elevations (EL +28.000 TOS) written in the corners.",
    "notes": "Not on P&IDs. Equipment layouts use this outline as the background; the grid labels locate equipment. A smaller framed rectangle with bracing is a module-frame.",
    "datasheet": {
     "form": "Structural design basis / deck framing drawing (ISO 19902, NORSOK N-004)",
     "fields": {
      "Deck length": "length",
      "Deck width": "width",
      "Floor type": "floor",
      "Primary girder": "primary",
      "Secondary beam": "secondary",
      "Secondary spacing": "secondarySpacing",
      "Number of legs": "legs",
      "Leg spacing X": "legSpanX",
      "Leg spacing Z": "legSpanZ",
      "Leg diameter": "legDiameter"
     }
    }
   }
  },
  {
   "name": "pipe-rack",
   "title": "Pipe rack",
   "category": "structure",
   "description": "Multi-tier steel pipe rack: HEB portal bents (posts with base plates, anchor bolts and cap plates, tier beams on bolted end plates, knee braces), IPE longitudinal struts on fin plates, X-braced bays, an optional top tier with two ladder cable trays and an optional cantilevered grating walkway with handrails, self-closing gate and caged ladder. Base plates sit on y = 0; the rack runs along X. Pipes rest on the tier beams: bottom of pipe = tier top of steel (firstTier + i × tierSpacing, or tierElevations); the walkway grating is 30 mm above the top pipe tier.",
   "import": "./structure/pipe-rack",
   "export": "PipeRack",
   "anchor": "base",
   "standards": [
    "EN 10365",
    "ISO 14122-2/3/4",
    "PIP STC01015",
    "IEC 61537"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "pipe rack",
    "pipe bridge",
    "rack",
    "steel",
    "cable tray",
    "walkway"
   ],
   "params": [
    {
     "key": "bays",
     "label": "Bays",
     "type": "number",
     "min": 1,
     "max": 20,
     "step": 1
    },
    {
     "key": "bayLength",
     "label": "Bay length",
     "type": "number",
     "min": 3,
     "max": 9,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "tiers",
     "label": "Pipe tiers",
     "type": "number",
     "min": 1,
     "max": 4,
     "step": 1
    },
    {
     "key": "firstTier",
     "label": "First tier TOS",
     "type": "number",
     "min": 2,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tierSpacing",
     "label": "Tier spacing",
     "type": "number",
     "min": 1.2,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "post",
     "label": "Posts",
     "type": "select",
     "options": [
      "HEB 200",
      "HEB 240",
      "HEB 300",
      "HEB 400",
      "W10x49",
      "W12x65"
     ]
    },
    {
     "key": "beam",
     "label": "Tier beams",
     "type": "select",
     "options": [
      "HEB 160",
      "HEB 200",
      "HEB 240",
      "HEB 300",
      "W8x31",
      "W10x49"
     ]
    },
    {
     "key": "strut",
     "label": "Struts",
     "type": "select",
     "options": [
      "IPE 160",
      "IPE 200",
      "IPE 240",
      "HEA 200"
     ]
    },
    {
     "key": "bracing",
     "label": "Bracing",
     "type": "bool"
    },
    {
     "key": "cableTray",
     "label": "Cable-tray tier",
     "type": "bool"
    },
    {
     "key": "walkway",
     "label": "Walkway",
     "type": "bool"
    }
   ],
   "defaults": {
    "bays": 4,
    "bayLength": 6,
    "width": 6,
    "tiers": 2,
    "firstTier": 4.5,
    "tierSpacing": 2,
    "tierElevations": [],
    "post": "HEB 300",
    "beam": "HEB 200",
    "strut": "IPE 200",
    "bracing": true,
    "cableTray": true,
    "walkway": true
   },
   "ports": [],
   "bounds": {
    "size": [
     25.544,
     8.1,
     7.42
    ],
    "center": [
     0.452,
     4.05,
     0.46
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pipe-rack.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (rack cross-section)",
    "drawn": "Cross-section: a portal frame (two posts and one or more tier beams) with the pipes drawn as circles resting on each tier; in plan, two parallel lines with the bent positions marked across them and the pipes as lines along the rack.",
    "notes": "Not on P&IDs (lines there are schematic). Cable trays on the top tier appear as narrow rectangles. A single post with arms is a cable-tray support.",
    "datasheet": {
     "form": "Pipe rack design drawing (PIP STC01015)",
     "fields": {
      "Number of bays": "bays",
      "Bay length": "bayLength",
      "Rack width": "width",
      "Number of tiers": "tiers",
      "First tier elevation": "firstTier",
      "Tier spacing": "tierSpacing",
      "Post section": "post",
      "Tier beam section": "beam"
     }
    }
   }
  },
  {
   "name": "stair",
   "title": "Stair (ISO 14122-3)",
   "category": "structure",
   "description": "Straight steel stair after ISO 14122-3: UPN channel stringers with level-cut feet on anchored cleats, bar-grating treads with yellow chequer nosings and bolted end plates, even risers near 180 mm with the going set by the pitch, an intermediate landing on posts for every 3 m of rise, and handrails with knee rails on both sides. Foot (first riser) at the origin on y = 0, climbing along +X; the upper floor edge is at x = run = (round(rise/0.18) − 1) × going per flight, plus landingLength per intermediate landing. Optional free-standing top landing.",
   "import": "./structure/stair",
   "export": "Stair",
   "anchor": "base",
   "standards": [
    "ISO 14122-3",
    "EN ISO 14122-1",
    "NORSOK C-001",
    "OSHA 1910.25"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "stair",
    "stairs",
    "access",
    "escape route",
    "treads"
   ],
   "params": [
    {
     "key": "rise",
     "label": "Rise",
     "type": "number",
     "min": 0.6,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Clear width",
     "type": "number",
     "min": 0.6,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "angle",
     "label": "Pitch",
     "type": "number",
     "min": 30,
     "max": 45,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "stringer",
     "label": "Stringers",
     "type": "select",
     "options": [
      "UPN 160",
      "UPN 180",
      "UPN 200",
      "UPN 240"
     ]
    },
    {
     "key": "landingLength",
     "label": "Landing length",
     "type": "number",
     "min": 0.8,
     "max": 2,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "topLanding",
     "label": "Top landing",
     "type": "bool"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "painted"
     ]
    }
   ],
   "defaults": {
    "rise": 3,
    "width": 1,
    "angle": 35,
    "stringer": "UPN 200",
    "landingLength": 1,
    "topLanding": false,
    "finish": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     8.317,
     5.636,
     1.27
    ],
    "center": [
     3.834,
     2.806,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/stair.svg",
    "standard": "Layout plan convention (structural / plot plan drawings); ISO 14122-3",
    "drawn": "Plan view: a rectangle filled with parallel tread lines and an arrow along it labelled UP (or DN), often with a break line half-way.",
    "notes": "Rungs at close spacing with a circle around them is a caged ladder seen in plan. Not on P&IDs."
   }
  },
  {
   "name": "ladder",
   "title": "Caged ladder (ISO 14122-4)",
   "category": "structure",
   "description": "Fixed steel ladder after ISO 14122-4: 65 × 12 flat-bar stiles at 450 mm, Ø25 rungs at 300 mm, stiles extended 1.1 m above the landing, a safety cage (hoops from 2.3 m, five vertical bars) and stand-off brackets. A single flight is used up to 10 m of climb; above that the climb is split into staggered flights of at most 6 m with bracketed rest platforms. Optional top landing on posts with handrails and a self-closing gate. Foot at the origin on y = 0; rungs in the plane z = 0 with the climber and cage on +Z; the structure face and the landing are at z ≤ −0.2, the landing walking surface at y = height.",
   "import": "./structure/ladder",
   "export": "Ladder",
   "anchor": "base",
   "standards": [
    "ISO 14122-4",
    "EN ISO 14122-1",
    "NORSOK C-001",
    "OSHA 1910.23"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "ladder",
    "caged ladder",
    "access",
    "rest platform"
   ],
   "params": [
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 1,
     "max": 20,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "cage",
     "label": "Cage",
     "type": "bool"
    },
    {
     "key": "landing",
     "label": "Top landing",
     "type": "bool"
    },
    {
     "key": "landingDepth",
     "label": "Landing depth",
     "type": "number",
     "min": 0.8,
     "max": 2.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "painted"
     ]
    }
   ],
   "defaults": {
    "height": 4.5,
    "cage": true,
    "landing": true,
    "landingDepth": 1.2,
    "finish": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     1.42,
     5.624,
     2.184
    ],
    "center": [
     0,
     2.812,
     -0.368
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/ladder.svg",
    "standard": "Layout plan convention (structural / plot plan drawings); ISO 14122-4",
    "drawn": "Elevation: two stiles with rungs and hoops of the safety cage; in plan, a short pair of lines with a semicircle (the cage) against the platform edge, labelled LADDER.",
    "notes": "A stair has an inclined flight with an UP arrow; a ladder is vertical. Not on P&IDs."
   }
  },
  {
   "name": "access-platform",
   "title": "Access platform",
   "category": "structure",
   "description": "Free-standing elevated access platform for valves and instruments: SHS legs on anchored base plates with gussets, X-braced faces, a channel-framed bar-grating deck with ISO 14122 guard rail and toe plates, and access by a caged ladder on the +Z face (self-closing gate, staggered flights with rest platforms above 10 m) or by a straight ISO 14122-3 stair arriving at the −X edge. Base plates on y = 0; walking surface (top of grating) at y = height; the stair, when chosen, extends beyond x = −length/2.",
   "import": "./structure/access-platform",
   "export": "AccessPlatform",
   "anchor": "base",
   "standards": [
    "ISO 14122-2",
    "ISO 14122-3",
    "ISO 14122-4",
    "EN 10210"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "platform",
    "access",
    "valve platform",
    "walkway",
    "ladder",
    "stair"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length (X)",
     "type": "number",
     "min": 1.2,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width (Z)",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.6,
     "max": 15,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "access",
     "label": "Access",
     "type": "select",
     "options": [
      "ladder",
      "stair",
      "none"
     ]
    },
    {
     "key": "leg",
     "label": "Legs",
     "type": "select",
     "options": [
      "SHS 100x100x6.3",
      "SHS 150x150x8",
      "SHS 200x200x10",
      "HEB 160",
      "HEB 200"
     ]
    },
    {
     "key": "frame",
     "label": "Frame",
     "type": "select",
     "options": [
      "UPN 160",
      "UPN 200",
      "UPN 240"
     ]
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "painted"
     ]
    }
   ],
   "defaults": {
    "length": 3,
    "width": 2,
    "height": 3,
    "access": "ladder",
    "leg": "SHS 150x150x8",
    "frame": "UPN 200",
    "finish": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     3.05,
     4.124,
     2.949
    ],
    "center": [
     0,
     2.062,
     0.449
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/access-platform.svg",
    "standard": "Layout plan convention (structural / plot plan drawings); ISO 14122-2",
    "drawn": "Plan view: a rectangle (often partly hatched to show grating) with the leg positions marked at the corners and the ladder or stair access drawn at one edge, labelled with its top-of-grating elevation (TOG EL +…).",
    "notes": "On P&IDs an access platform is sometimes noted beside a valve as \"accessible from platform\", not drawn. A larger outline with grid lines is a deck-module.",
    "datasheet": {
     "form": "Platform / access structure drawing (ISO 14122-2/3/4)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Top of grating height": "height",
      "Access": "access",
      "Leg section": "leg",
      "Frame section": "frame"
     }
    }
   }
  },
  {
   "name": "jacket",
   "title": "Offshore steel jacket",
   "category": "structure",
   "description": "Fixed steel jacket substructure (4, 6 or 8 legs): hollow battered tubular legs with node cans, horizontal frames, X or K braced faces with oversized brace stubs and crossing cans, conductor guide framing with funnelled sleeves, risers clamped to the +X face with a splash-zone sheath, a seabed bend and top flanges (ports riser-1…n), a boat landing with bumpers, grating and ladder on +Z, barge bumpers on the corner legs through the splash zone, stand-off anodes, mudmats and yellow sea-level marker rings. Origin is the top of the jacket legs at y = 0 and the structure extends below it: mean sea level at y = −airGap, seabed at y = −(airGap + waterDepth). A deck-module with legHeight h placed at y = h sits on it when its leg spacing matches spanX / spanZ.",
   "import": "./structure/jacket",
   "export": "Jacket",
   "anchor": "base",
   "standards": [
    "ISO 19902",
    "API RP 2A-WSD",
    "DNV-RP-B401",
    "NORSOK N-004"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "jacket",
    "substructure",
    "offshore",
    "platform",
    "conductors",
    "risers",
    "boat landing"
   ],
   "params": [
    {
     "key": "legs",
     "label": "Legs",
     "type": "select",
     "options": [
      4,
      6,
      8
     ]
    },
    {
     "key": "waterDepth",
     "label": "Water depth",
     "type": "number",
     "min": 15,
     "max": 180,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "airGap",
     "label": "Top above MSL",
     "type": "number",
     "min": 8,
     "max": 35,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "spanX",
     "label": "Leg spacing X (top)",
     "type": "number",
     "min": 8,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "spanZ",
     "label": "Leg spacing Z (top)",
     "type": "number",
     "min": 8,
     "max": 40,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "batter",
     "label": "Batter (1 : n)",
     "type": "number",
     "min": 6,
     "max": 20,
     "step": 1
    },
    {
     "key": "legDiameter",
     "label": "Leg OD",
     "type": "number",
     "min": 0.9,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "bracing",
     "label": "Face bracing",
     "type": "select",
     "options": [
      "X",
      "K"
     ]
    },
    {
     "key": "conductors",
     "label": "Conductors",
     "type": "number",
     "min": 0,
     "max": 12,
     "step": 1
    },
    {
     "key": "risers",
     "label": "Risers",
     "type": "number",
     "min": 0,
     "max": 4,
     "step": 1
    },
    {
     "key": "riserNps",
     "label": "Riser size",
     "type": "nps",
     "min": 4,
     "max": 24
    },
    {
     "key": "riserRating",
     "label": "Riser class",
     "type": "rating"
    },
    {
     "key": "boatLanding",
     "label": "Boat landing",
     "type": "bool"
    },
    {
     "key": "anodes",
     "label": "Anodes",
     "type": "bool"
    },
    {
     "key": "seaLevelMarker",
     "label": "Sea-level rings",
     "type": "bool"
    }
   ],
   "defaults": {
    "legs": 4,
    "waterDepth": 60,
    "airGap": 20,
    "spanX": 16,
    "spanZ": 12,
    "batter": 10,
    "legDiameter": 1.5,
    "bracing": "X",
    "conductors": 6,
    "risers": 2,
    "riserNps": 12,
    "riserRating": 600,
    "boatLanding": true,
    "anodes": true,
    "seaLevelMarker": true
   },
   "ports": [
    {
     "id": "riser-1",
     "label": "Riser 1 top",
     "position": [
      9.4,
      0,
      -0.8
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "riser-2",
     "label": "Riser 2 top",
     "position": [
      9.4,
      0,
      0.8
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     48.769,
     80.245,
     31.9
    ],
    "center": [
     6.434,
     -40.018,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/jacket.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (structural elevation); ISO 19902 / API RP 2A",
    "drawn": "Elevation: a tapering (battered) frame from the seabed up to the deck with horizontal levels and X or K bracing, the sea level drawn as a wave line and the mudline at the bottom; in plan, circles at the leg positions.",
    "notes": "Not on P&IDs. Risers and conductors are drawn along the jacket face; the deck above is deck-module.",
    "datasheet": {
     "form": "Jacket structural drawing / design basis (ISO 19902, API RP 2A-WSD)",
     "fields": {
      "Number of legs": "legs",
      "Water depth": "waterDepth",
      "Air gap": "airGap",
      "Leg spacing X (top)": "spanX",
      "Leg spacing Z (top)": "spanZ",
      "Leg batter": "batter",
      "Leg diameter": "legDiameter",
      "Bracing pattern": "bracing",
      "Conductors": "conductors",
      "Risers": "risers",
      "Riser size": "riserNps",
      "Riser rating": "riserRating"
     }
    }
   }
  },
  {
   "name": "bridge",
   "title": "Platform link bridge",
   "category": "structure",
   "description": "Bridge-linked platform walkway: two Warren through-trusses (hollow CHS or HEB with bolted node gussets), IPE cross beams and channel stringers carrying bar grating, top cross struts with X laterals and walkway lights, bottom plan bracing, ISO 14122 handrails on both edges, outriggers with a ladder cable tray on +Z and a pipe shelf on −Z, a pinned bearing at −X and a guided PTFE / stainless sliding bearing at +X with a hinged transition flap over the expansion gap (it extends past x = +length/2 and rests 2 mm above y = 0 on the next deck). Walkway top at y = 0, spanning x = −length/2 … +length/2 along X; the bearing masonry plates sit about 0.5 m below the walkway at x = ±(length/2 − 0.25) and must rest on the platform steel.",
   "import": "./structure/bridge",
   "export": "Bridge",
   "anchor": "base",
   "standards": [
    "EN 1993-2",
    "ISO 14122-2",
    "EN 1337 (bearings)",
    "NORSOK N-004"
   ],
   "vendors": [
    "Fabricated to project specification",
    "Fluorocarbon (bearings)",
    "mageba (bearings)"
   ],
   "tags": [
    "bridge",
    "link bridge",
    "truss",
    "walkway",
    "bridge-linked platform"
   ],
   "params": [
    {
     "key": "length",
     "label": "Span",
     "type": "number",
     "min": 8,
     "max": 100,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Walkway width",
     "type": "number",
     "min": 0.8,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Truss depth",
     "type": "number",
     "min": 2.4,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "truss",
     "label": "Members",
     "type": "select",
     "options": [
      "chs",
      "heb"
     ]
    },
    {
     "key": "cableTrays",
     "label": "Cable tray",
     "type": "bool"
    },
    {
     "key": "pipeShelf",
     "label": "Pipe shelf",
     "type": "bool"
    },
    {
     "key": "lights",
     "label": "Lights",
     "type": "bool"
    }
   ],
   "defaults": {
    "length": 40,
    "width": 1.5,
    "depth": 3.2,
    "truss": "chs",
    "cableTrays": true,
    "pipeShelf": true,
    "lights": true
   },
   "ports": [],
   "bounds": {
    "size": [
     40.553,
     3.744,
     4.814
    ],
    "center": [
     0.203,
     1.36,
     -0.225
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/bridge.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (structural elevation)",
    "drawn": "Elevation: two horizontal chords joined by a zig-zag Warren truss, with a pinned support (triangle) at one end and a sliding support (roller circle) at the other; in plan, two parallel lines between the platform outlines labelled with the bridge name.",
    "notes": "On P&IDs a bridge appears only as off-page arrows \"via bridge to RP\" on lines that cross it. The sliding end is what lets the platforms move relative to each other.",
    "datasheet": {
     "form": "Bridge structural drawing (EN 1993-2)",
     "fields": {
      "Span": "length",
      "Walkway width": "width",
      "Truss depth": "depth",
      "Truss type": "truss",
      "Cable trays": "cableTrays",
      "Pipe shelf": "pipeShelf",
      "Walkway lights": "lights"
     }
    }
   }
  },
  {
   "name": "helideck",
   "title": "Offshore helideck (CAP 437)",
   "category": "structure",
   "description": "Octagonal 1D offshore helideck after CAP 437: extruded aluminium plank deck with perimeter gutter, white perimeter line, yellow TD/PM circle (0.5D inner, 1 m wide), white H (4 × 3 m, crossbar on the obstacle-free sector bisector at +X), black/white OFS chevron, D-value, maximum-mass box and installation name, green perimeter lights at ≤ 3 m, yellow TD/PM circle lights, 1.5 m perimeter safety netting (≈ 9 cm mesh) rising outboard to, but not above, deck level, and a tie-down grid, two access routes (grating link through the net, landing and stair to y = 0 on ±Z), and a steel grillage on four braced CHS legs with knee struts to the cantilevers, base plates and anchor bolts. Leg base plates on y = 0; landing surface at y = height.",
   "import": "./structure/helideck",
   "export": "Helideck",
   "anchor": "base",
   "standards": [
    "CAP 437 (8th ed.)",
    "NORSOK C-004",
    "ISO 19901-3",
    "ICAO Annex 14 Vol II"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "helideck",
    "helipad",
    "heliport",
    "offshore",
    "aviation"
   ],
   "params": [
    {
     "key": "dValue",
     "label": "D-value",
     "type": "number",
     "min": 12,
     "max": 30,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Deck height",
     "type": "number",
     "min": 1.5,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "maxMass",
     "label": "Max mass",
     "type": "number",
     "min": 3,
     "max": 30,
     "step": 0.1,
     "unit": "t"
    },
    {
     "key": "installation",
     "label": "Installation name",
     "type": "text"
    },
    {
     "key": "netting",
     "label": "Safety net",
     "type": "bool"
    },
    {
     "key": "lights",
     "label": "Lights",
     "type": "bool"
    },
    {
     "key": "access",
     "label": "Stair access (±Z)",
     "type": "bool"
    }
   ],
   "defaults": {
    "dValue": 20.88,
    "height": 4.5,
    "maxMass": 12.8,
    "installation": "ALPHA",
    "netting": true,
    "lights": true,
    "access": true
   },
   "ports": [],
   "bounds": {
    "size": [
     24.373,
     5.636,
     27.08
    ],
    "center": [
     0,
     2.806,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/helideck.svg",
    "standard": "Layout plan convention (structural / plot plan drawings); CAP 437 markings",
    "drawn": "Plan view: an octagon (or circle) with the touchdown / positioning circle and the letter H at the centre, the D-value and maximum mass written on it, plus the obstacle-free sector chevron.",
    "notes": "The H in a circle on an octagon is unambiguous. The helicopter refuelling package and the windsock are separate items around it.",
    "datasheet": {
     "form": "Helideck design specification (CAP 437)",
     "fields": {
      "D-value": "dValue",
      "Deck height": "height",
      "Maximum allowable mass": "maxMass",
      "Installation name": "installation",
      "Perimeter netting": "netting",
      "Lighting": "lights"
     }
    }
   }
  },
  {
   "name": "steel-column",
   "title": "Steel column",
   "category": "structure",
   "description": "Structural column of any EN / AISC section (H, I, SHS or CHS): base plate with anchor bolts, washers and nuts on a non-shrink grout bed and optional concrete pedestal, base stiffeners and a welded cap plate. Footprint centre at the origin; the pedestal (or base plate) bottom is on y = 0 and the cap plate top is at y = height, so a steel-beam with topOfSteel = height + its depth rests on it.",
   "import": "./structure/steel-column",
   "export": "SteelColumn",
   "anchor": "base",
   "standards": [
    "EN 10365",
    "EN 10210",
    "AISC 360",
    "EN 1993-1-8",
    "AISC Design Guide 1"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "column",
    "post",
    "steel",
    "base plate",
    "anchor bolts"
   ],
   "params": [
    {
     "key": "section",
     "label": "Section",
     "type": "select",
     "options": [
      "HEB 200",
      "HEB 300",
      "HEB 400",
      "HEA 300",
      "IPE 300",
      "W12x65",
      "W14x90",
      "SHS 200x200x10",
      "SHS 300x300x12.5",
      "CHS 323.9x12.5",
      "CHS 406.4x16"
     ]
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.5,
     "max": 20,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "web",
     "label": "Web along",
     "type": "select",
     "options": [
      "x",
      "z"
     ]
    },
    {
     "key": "pedestal",
     "label": "Pedestal",
     "type": "number",
     "min": 0,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "plate",
     "label": "Base plate",
     "type": "number",
     "min": 0.015,
     "max": 0.08,
     "step": 0.005,
     "unit": "m"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "painted",
      "galvanised"
     ]
    }
   ],
   "defaults": {
    "section": "HEB 300",
    "height": 4,
    "web": "x",
    "pedestal": 0.3,
    "plate": 0.03,
    "finish": "painted"
   },
   "ports": [],
   "bounds": {
    "size": [
     0.8,
     4,
     0.8
    ],
    "center": [
     0,
     2,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/steel-column.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (structural plan / section)",
    "drawn": "Plan view at a grid intersection: the column section (an H or I shape, a square for SHS, a circle for CHS) on a square base plate with anchor bolt circles, tagged with its section size.",
    "notes": "Not on P&IDs. On framing plans columns sit on the dash-dot grid; a beam is drawn as a single line between them with its section written along it.",
    "datasheet": {
     "form": "Structural member schedule (EN 10365 / AISC 360)",
     "fields": {
      "Section": "section",
      "Height": "height",
      "Web orientation": "web",
      "Pedestal height": "pedestal",
      "Base plate size": "plate",
      "Finish": "finish"
     }
    }
   }
  },
  {
   "name": "steel-beam",
   "title": "Steel beam",
   "category": "structure",
   "description": "Structural beam of any EN / AISC section or welded plate girder (PG <depth>) along X from −length/2 to +length/2 with bolted extended end plates or fin plates, bearing stiffeners at the ends and a stiffener pair at mid-span. The top flange (top of steel) is at y = topOfSteel; the default sits the beam on the ground.",
   "import": "./structure/steel-beam",
   "export": "SteelBeam",
   "anchor": "base",
   "standards": [
    "EN 10365",
    "AISC 360",
    "EN 1993-1-8"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "beam",
    "girder",
    "steel",
    "end plate",
    "fin plate"
   ],
   "params": [
    {
     "key": "section",
     "label": "Section",
     "type": "select",
     "options": [
      "IPE 200",
      "IPE 300",
      "IPE 400",
      "IPE 600",
      "HEA 300",
      "HEB 300",
      "HEB 600",
      "W16x67",
      "W24x146",
      "UPN 300",
      "PG 1200"
     ]
    },
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 0.5,
     "max": 30,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "topOfSteel",
     "label": "Top of steel",
     "type": "number",
     "min": 0,
     "max": 30,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "connection",
     "label": "Connection",
     "type": "select",
     "options": [
      "end-plate",
      "fin-plate",
      "none"
     ]
    },
    {
     "key": "stiffeners",
     "label": "Stiffeners",
     "type": "bool"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "painted",
      "galvanised"
     ]
    }
   ],
   "defaults": {
    "section": "IPE 300",
    "length": 6,
    "topOfSteel": 0.3,
    "connection": "end-plate",
    "stiffeners": true,
    "finish": "painted"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.052,
     0.33,
     0.17
    ],
    "center": [
     0,
     0.15,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/steel-beam.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (structural elevation / framing plan)",
    "drawn": "Elevation: two parallel flange lines with end plates (or fin plates) at each end; on framing plans a single thick line between columns with the section (e.g. IPE 300, TOS EL +28.000) written along it.",
    "notes": "Not on P&IDs. A beam drawn thicker on a plan is usually a primary girder.",
    "datasheet": {
     "form": "Structural member schedule (EN 10365 / AISC 360)",
     "fields": {
      "Section": "section",
      "Length": "length",
      "Top of steel": "topOfSteel",
      "Connection": "connection",
      "Stiffeners": "stiffeners",
      "Finish": "finish"
     }
    }
   }
  },
  {
   "name": "grating-panel",
   "title": "Bar grating panel",
   "category": "structure",
   "description": "Welded / pressure-locked steel bar grating panel modelled bar by bar: bearing bars along X at the set pitch (30 × 3 mm at 30 mm by default), cross bars at 100 mm, edge banding, optional 100 mm kick plates on the long edges and saddle clips at the corners. Bottom on y = 0, walking surface at y = depth, centred on the origin; the bearing bars span along X.",
   "import": "./structure/grating-panel",
   "export": "GratingPanel",
   "anchor": "base",
   "standards": [
    "EN ISO 14122-2",
    "BS 4592-1",
    "ANSI/NAAMM MBG 531"
   ],
   "vendors": [
    "Lionweld Kennedy"
   ],
   "tags": [
    "grating",
    "floor",
    "walkway",
    "kick plate",
    "open mesh"
   ],
   "params": [
    {
     "key": "length",
     "label": "Span (X)",
     "type": "number",
     "min": 0.2,
     "max": 3,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width (Z)",
     "type": "number",
     "min": 0.1,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "depth",
     "label": "Bar depth",
     "type": "select",
     "options": [
      0.025,
      0.03,
      0.04,
      0.05
     ]
    },
    {
     "key": "pitch",
     "label": "Bar pitch",
     "type": "select",
     "options": [
      0.02,
      0.03,
      0.034
     ]
    },
    {
     "key": "kickPlates",
     "label": "Kick plates",
     "type": "bool"
    },
    {
     "key": "clips",
     "label": "Saddle clips",
     "type": "bool"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "galvanised",
      "painted"
     ]
    }
   ],
   "defaults": {
    "length": 1,
    "width": 1,
    "depth": 0.03,
    "pitch": 0.03,
    "kickPlates": false,
    "clips": true,
    "finish": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     1,
     0.041,
     1
    ],
    "center": [
     0,
     0.021,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/grating-panel.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (floor plan hatch)",
    "drawn": "Plan view: an area filled with close parallel lines (the bearing bar direction), sometimes a cross-hatch, with the panel outline; solid plate is drawn plain or with a checker-plate hatch.",
    "notes": "Only on structural and layout drawings. The hatch direction shows the span direction of the bearing bars.",
    "datasheet": {
     "form": "Grating schedule (EN ISO 14122-2 / ANSI/NAAMM MBG 531)",
     "fields": {
      "Panel length": "length",
      "Panel width": "width",
      "Bearing bar depth": "depth",
      "Bearing bar pitch": "pitch",
      "Kick plates": "kickPlates",
      "Finish": "finish"
     }
    }
   }
  },
  {
   "name": "handrail",
   "title": "Handrail run (ISO 14122-3)",
   "category": "structure",
   "description": "Straight guard-rail run after ISO 14122-3: Ø48.3 mm posts at ≤ 1.5 m on base plates with four anchors, Ø42.4 top rail at 1.1 m, knee rail, 100 mm toe plate, optional end returns towards −Z and a self-closing spring-hinged gate at the +X end. Origin at the centre of the run on the walking surface (y = 0); the run lies along X at z = 0 with the walkway on the −Z side.",
   "import": "./structure/handrail",
   "export": "Handrail",
   "anchor": "base",
   "standards": [
    "ISO 14122-3",
    "EN ISO 14122-1",
    "NORSOK C-001",
    "OSHA 1910.29"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "handrail",
    "guard rail",
    "railing",
    "gate",
    "toe plate"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 0.5,
     "max": 30,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Height",
     "type": "number",
     "min": 0.9,
     "max": 1.2,
     "step": 0.01,
     "unit": "m"
    },
    {
     "key": "gate",
     "label": "Gate",
     "type": "bool"
    },
    {
     "key": "gateWidth",
     "label": "Gate width",
     "type": "number",
     "min": 0.5,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "returns",
     "label": "End returns",
     "type": "number",
     "min": 0,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "toePlate",
     "label": "Toe plate",
     "type": "bool"
    },
    {
     "key": "finish",
     "label": "Finish",
     "type": "select",
     "options": [
      "painted",
      "galvanised"
     ]
    }
   ],
   "defaults": {
    "length": 6,
    "height": 1.1,
    "gate": true,
    "gateWidth": 0.7,
    "returns": 0.3,
    "toePlate": true,
    "finish": "painted"
   },
   "ports": [],
   "bounds": {
    "size": [
     6.12,
     1.124,
     0.42
    ],
    "center": [
     0,
     0.562,
     -0.15
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/handrail.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (elevation); ISO 14122-3",
    "drawn": "Elevation: top rail and knee rail on posts with a toe plate at the bottom; on plans a line just inside the deck or platform edge with small post marks (or crosses), and a gate drawn as a short swing arc.",
    "notes": "On plans it looks like a wall line; the post marks and the location at the edge identify it. Not on P&IDs.",
    "datasheet": {
     "form": "Guard-rail detail (ISO 14122-3)",
     "fields": {
      "Length": "length",
      "Rail height": "height",
      "Self-closing gate": "gate",
      "Gate width": "gateWidth",
      "End returns": "returns",
      "Toe plate": "toePlate",
      "Finish": "finish"
     }
    }
   }
  },
  {
   "name": "cable-tray",
   "title": "Cable tray run",
   "category": "structure",
   "description": "Ladder-type cable tray run after IEC 61537: 1 to 6 stacked trays (C-section side rails, rungs at 300 mm, splice plates at 3 m, copper earth bonding jumpers, laid cables at a set fill) on floor-standing 41 × 41 strut posts with gusseted cantilever arms, base plates and anchors, floor braces and an optional top cover. Run along X centred on the origin; posts on y = 0 on the −Z side; the lowest rungs at y = elevation, tiers every tierSpacing.",
   "import": "./structure/cable-tray",
   "export": "CableTray",
   "anchor": "base",
   "standards": [
    "IEC 61537",
    "NEMA VE 1",
    "NEMA VE 2"
   ],
   "vendors": [
    "Niedax"
   ],
   "tags": [
    "cable tray",
    "cable ladder",
    "electrical",
    "support",
    "strut"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length",
     "type": "number",
     "min": 1,
     "max": 30,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width",
     "type": "select",
     "options": [
      0.15,
      0.3,
      0.45,
      0.6,
      0.75,
      0.9
     ]
    },
    {
     "key": "tiers",
     "label": "Tiers",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "tierSpacing",
     "label": "Tier spacing",
     "type": "number",
     "min": 0.2,
     "max": 0.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "elevation",
     "label": "Lowest tier",
     "type": "number",
     "min": 0.2,
     "max": 4,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "supportSpacing",
     "label": "Support spacing",
     "type": "number",
     "min": 1,
     "max": 3,
     "step": 0.25,
     "unit": "m"
    },
    {
     "key": "fill",
     "label": "Cable fill",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "cover",
     "label": "Top cover",
     "type": "bool"
    },
    {
     "key": "material",
     "label": "Material",
     "type": "select",
     "options": [
      "galvanised",
      "stainless"
     ]
    }
   ],
   "defaults": {
    "length": 6,
    "width": 0.6,
    "tiers": 3,
    "tierSpacing": 0.3,
    "elevation": 0.6,
    "supportSpacing": 2,
    "fill": 0.6,
    "cover": false,
    "material": "galvanised"
   },
   "ports": [],
   "bounds": {
    "size": [
     6,
     1.456,
     0.8
    ],
    "center": [
     0,
     0.728,
     -0.04
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cable-tray.svg",
    "standard": "Electrical layout convention; IEC 61537",
    "drawn": "Cross-section: stacked open trays (U-channels) on cantilever arms from a post; on cable routing plans two parallel lines with the tray width and level (e.g. 600 W, TOT EL +3.2) and short diagonals or rung marks.",
    "notes": "Only on electrical and instrument layouts. Two parallel lines with rungs in plan can be confused with a ladder; trays run along routes and carry width notes.",
    "datasheet": {
     "form": "Cable tray schedule (IEC 61537 / NEMA VE 1)",
     "fields": {
      "Run length": "length",
      "Tray width": "width",
      "Number of tiers": "tiers",
      "Tier spacing": "tierSpacing",
      "Elevation": "elevation",
      "Support spacing": "supportSpacing",
      "Cover": "cover",
      "Material": "material"
     }
    }
   }
  },
  {
   "name": "caisson",
   "title": "Deck-hung caisson",
   "category": "structure",
   "description": "Deck-hung caisson for seawater lift, produced-water disposal or open-drain sump service: large-bore hollow pipe hung off a gusseted collar on the deck, blind top cover with lifting lug, padded side inlet (port inlet) and a vent nozzle (port vent), guide clamps with stand-off brackets back to jacket steel at −Z, stand-off anodes and a slotted open bottom. Origin on the caisson axis at deck level (y = 0); it rises stickUp above the deck and hangs `length` below it (intended, like a jacket).",
   "import": "./structure/caisson",
   "export": "Caisson",
   "anchor": "base",
   "standards": [
    "ISO 19902",
    "NORSOK P-001",
    "ASME B16.5",
    "DNV-RP-B401"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "caisson",
    "seawater lift",
    "disposal caisson",
    "drain caisson",
    "offshore"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Caisson size",
     "type": "nps",
     "min": 12,
     "max": 48
    },
    {
     "key": "length",
     "label": "Length below deck",
     "type": "number",
     "min": 3,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "stickUp",
     "label": "Stick-up",
     "type": "number",
     "min": 0.9,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "ventNps",
     "label": "Vent",
     "type": "nps",
     "min": 1,
     "max": 6
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "guideSpacing",
     "label": "Guide spacing",
     "type": "number",
     "min": 2,
     "max": 20,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "anodes",
     "label": "Anodes",
     "type": "bool"
    }
   ],
   "defaults": {
    "nps": 24,
    "length": 25,
    "stickUp": 1.4,
    "inletNps": 6,
    "ventNps": 2,
    "rating": 150,
    "guideSpacing": 8,
    "anodes": true
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      0.4939,
      0.65,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "vent",
     "label": "Vent",
     "position": [
      -0.4685,
      1.15,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "vent"
    }
   ],
   "bounds": {
    "size": [
     1.11,
     26.57,
     2
    ],
    "center": [
     0,
     -11.715,
     -0.445
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/caisson.svg",
    "standard": "ISO 10628-2 / P&ID convention for deck-hung caissons",
    "drawn": "A long vertical pipe or open-bottom vessel hanging from the deck through the sea-level line, with the inlet or pump column entering at the top; labelled as seawater lift, firewater, disposal or sump caisson.",
    "notes": "Pumps drawn inside it are vertical-turbine-pump or diesel-firewater-pump. A riser is a pipe line (with ESDV) that continues to a subsea pipeline, not an open-ended caisson.",
    "datasheet": {
     "form": "Caisson datasheet / structural drawing (NORSOK P-001, ISO 19902)",
     "fields": {
      "Caisson size": "nps",
      "Length": "length",
      "Stick-up above deck": "stickUp",
      "Inlet nozzle size": "inletNps",
      "Vent nozzle size": "ventNps",
      "Flange rating": "rating",
      "Guide spacing": "guideSpacing",
      "Anodes": "anodes"
     }
    }
   }
  },
  {
   "name": "module-frame",
   "title": "Equipment module frame",
   "category": "structure",
   "description": "Lift-installed topsides equipment module frame: HEB base frame with IPE secondaries on fin plates, 12 mm deck plate and 150 mm drip coaming, set-down stools, HEB columns with stiffeners, roof frame with optional plated roof and guard rail, CHS X-bracing on the end faces and end bays, and four lift padeyes with cheek plates on the corner columns. Stools stand on y = 0; the floor (walking surface) is at y = 0.15 + base depth + 0.012 (0.662 m with HEB 500) and the roof top of steel is `height` above the floor.",
   "import": "./structure/module-frame",
   "export": "ModuleFrame",
   "anchor": "base",
   "standards": [
    "ISO 19901-6 (lifting)",
    "DNV-ST-N001",
    "NORSOK N-004",
    "EN 10365"
   ],
   "vendors": [
    "Fabricated to project specification"
   ],
   "tags": [
    "module",
    "skid",
    "frame",
    "topsides",
    "lift",
    "padeye"
   ],
   "params": [
    {
     "key": "length",
     "label": "Length (X)",
     "type": "number",
     "min": 3,
     "max": 40,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Width (Z)",
     "type": "number",
     "min": 2.5,
     "max": 20,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Floor to roof",
     "type": "number",
     "min": 2.5,
     "max": 12,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "base",
     "label": "Base frame",
     "type": "select",
     "options": [
      "HEB 300",
      "HEB 400",
      "HEB 500",
      "HEB 600",
      "HEB 800"
     ]
    },
    {
     "key": "post",
     "label": "Columns",
     "type": "select",
     "options": [
      "HEB 240",
      "HEB 300",
      "HEB 400"
     ]
    },
    {
     "key": "roofBeam",
     "label": "Roof beams",
     "type": "select",
     "options": [
      "HEB 240",
      "HEB 300",
      "HEB 400"
     ]
    },
    {
     "key": "roofDeck",
     "label": "Roof deck",
     "type": "bool"
    },
    {
     "key": "bracing",
     "label": "Bracing",
     "type": "bool"
    },
    {
     "key": "padeyes",
     "label": "Padeyes",
     "type": "bool"
    }
   ],
   "defaults": {
    "length": 12,
    "width": 6,
    "height": 5,
    "base": "HEB 500",
    "post": "HEB 300",
    "roofBeam": "HEB 300",
    "roofDeck": true,
    "bracing": true,
    "padeyes": true
   },
   "ports": [],
   "bounds": {
    "size": [
     12.3,
     6.796,
     6.2
    ],
    "center": [
     0,
     3.398,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/module-frame.svg",
    "standard": "Layout plan convention (structural / plot plan drawings) (structural elevation); ISO 19901-6 lifting",
    "drawn": "Elevation: a rectangular frame with intermediate floor and X-bracing on the faces, padeyes at the top corners; on plot plans a module boundary rectangle with its tag and weight.",
    "notes": "On P&IDs a module or package boundary is a dash-dot rectangle around the equipment it carries.",
    "datasheet": {
     "form": "Module structural drawing / weight report (ISO 19901-6, DNV-ST-N001)",
     "fields": {
      "Length": "length",
      "Width": "width",
      "Height": "height",
      "Base frame section": "base",
      "Column section": "post",
      "Roof beam section": "roofBeam",
      "Roof deck": "roofDeck",
      "Bracing": "bracing",
      "Padeyes": "padeyes"
     }
    }
   }
  },
  {
   "name": "shell-and-tube-exchanger",
   "title": "Shell-and-tube exchanger",
   "category": "thermal",
   "description": "TEMA shell-and-tube exchanger on fixed and sliding saddles: AES (removable channel, floating head with shell cover), AEU (U-tube), BEM (fixed tubesheet bonnets with expansion bellows) or AKT (kettle reboiler with eccentric cone). Bolted girth flanges with full studding, channel cover davit, shell and channel nozzles, vents, drains and nameplate. Shells can be stacked two high in series with bolted stacking saddles and nozzle-to-nozzle interconnects.",
   "import": "./thermal/shell-and-tube-exchanger",
   "export": "ShellAndTubeExchanger",
   "anchor": "base",
   "standards": [
    "TEMA 10th ed.",
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "API 660"
   ],
   "vendors": [
    "API Heat Transfer (Basco)",
    "Shuangliang Eco-Energy"
   ],
   "tags": [
    "exchanger",
    "cooler",
    "heater",
    "reboiler",
    "kettle",
    "TEMA"
   ],
   "params": [
    {
     "key": "tema",
     "label": "TEMA type",
     "type": "select",
     "options": [
      "AES",
      "AEU",
      "BEM",
      "AKT"
     ]
    },
    {
     "key": "diameter",
     "label": "Shell ID",
     "type": "number",
     "min": 0.3,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Tube length",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "passes",
     "label": "Tube passes",
     "type": "select",
     "options": [
      1,
      2,
      4,
      6
     ]
    },
    {
     "key": "stacked",
     "label": "Shells stacked",
     "type": "select",
     "options": [
      1,
      2
     ]
    },
    {
     "key": "elevation",
     "label": "Shell bottom",
     "type": "number",
     "min": 0.5,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Shell design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "shellNps",
     "label": "Shell nozzles",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "tubeNps",
     "label": "Tube nozzles",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "tema": "AES",
    "diameter": 0.9,
    "length": 6,
    "passes": 2,
    "stacked": 1,
    "elevation": 0.9,
    "pressure": 20,
    "rating": 300,
    "shellNps": 8,
    "tubeNps": 6,
    "insulated": false,
    "tag": "E-100",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "shell-in",
     "label": "Shell inlet",
     "position": [
      -2.6425,
      2.0313,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "shell-out",
     "label": "Shell outlet",
     "position": [
      2.3068,
      0.6887,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "tube-in",
     "label": "Tube inlet",
     "position": [
      -3.6,
      0.7014,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "tube-out",
     "label": "Tube outlet",
     "position": [
      -3.6,
      2.0186,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     8.294,
     2.396,
     1.434
    ],
    "center": [
     -0.005,
     1.198,
     0.025
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/shell-and-tube-exchanger.svg",
    "standard": "ISO 10628-2 / PIP PIC001; TEMA type designation",
    "drawn": "Horizontal shell (long rectangle or capsule) with the channel head at one end and the tube bundle drawn as a line or U inside; tube-side nozzles on the channel, shell-side nozzles on the shell. Many legends draw a circle with a zig-zag through it, or two interlocking circles, for any exchanger, with the TEMA type (AES, AEU, BEM, AKT) written beside it.",
    "tags": [
     "E",
     "HX"
    ],
    "notes": "The tag letter E and the TEMA type confirm it. A shell with an enlarged dome and a weir is a kettle (AKT). A box with a fan is an air cooler; a frame with many plates is a plate exchanger; two pipes with a return bend is a hairpin.",
    "datasheet": {
     "form": "TEMA shell-and-tube heat exchanger specification sheet (API 660)",
     "fields": {
      "TEMA type": "tema",
      "Shell inside diameter": "diameter",
      "Tube length": "length",
      "Tube passes": "passes",
      "Shells (stacked)": "stacked",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Shell-side nozzle size": "shellNps",
      "Tube-side nozzle size": "tubeNps",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "air-cooled-exchanger",
   "title": "Air-cooled exchanger (fin-fan)",
   "category": "thermal",
   "description": "API 661 air-cooled heat exchanger: finned-tube bundles with plug-type or bolted cover-plate box headers, galvanised plenums and fan rings, forced- or induced-draft fans with V-belt drives, vertical TEFC motors, belt guards and vibration switches, optional top louvres. Column structure with bracing, header walkways with handrails and caged ladders, inlet and outlet manifolds across the bays. Fans spin while running.",
   "import": "./thermal/air-cooled-exchanger",
   "export": "AirCooledExchanger",
   "anchor": "base",
   "standards": [
    "API 661 / ISO 13706",
    "ASME B16.5",
    "ISO 14122",
    "IEC 60072"
   ],
   "vendors": [
    "Chart Industries (Hudson Products, Smithco, Air-X-Changers)"
   ],
   "tags": [
    "air cooler",
    "fin-fan",
    "ACHE",
    "cooler",
    "condenser"
   ],
   "params": [
    {
     "key": "bays",
     "label": "Bays",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "fansPerBay",
     "label": "Fans per bay",
     "type": "select",
     "options": [
      1,
      2,
      3
     ]
    },
    {
     "key": "tubeLength",
     "label": "Tube length",
     "type": "number",
     "min": 4,
     "max": 15,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "bayWidth",
     "label": "Bay width",
     "type": "number",
     "min": 1.5,
     "max": 4.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "rows",
     "label": "Tube rows",
     "type": "number",
     "min": 3,
     "max": 10,
     "step": 1
    },
    {
     "key": "draft",
     "label": "Draft",
     "type": "select",
     "options": [
      "forced",
      "induced"
     ]
    },
    {
     "key": "height",
     "label": "Bundle elevation",
     "type": "number",
     "min": 3,
     "max": 10,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "passes",
     "label": "Tube passes",
     "type": "select",
     "options": [
      1,
      2
     ]
    },
    {
     "key": "louvres",
     "label": "Louvres",
     "type": "bool"
    },
    {
     "key": "header",
     "label": "Header type",
     "type": "select",
     "options": [
      "plug",
      "cover-plate"
     ]
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 3,
     "max": 24
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 3,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "kw",
     "label": "Motor per fan",
     "type": "number",
     "min": 7.5,
     "max": 75,
     "step": 0.5,
     "unit": "kW"
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "bays": 2,
    "fansPerBay": 2,
    "tubeLength": 9.1,
    "bayWidth": 3,
    "rows": 6,
    "draft": "forced",
    "height": 4.5,
    "passes": 2,
    "louvres": true,
    "header": "plug",
    "inletNps": 10,
    "outletNps": 8,
    "rating": 300,
    "kw": 30,
    "running": true,
    "tag": "E-200",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet manifold",
     "position": [
      -4.71,
      5.7123,
      3.7
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 10,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet manifold",
     "position": [
      -4.71,
      3.8174,
      3.7
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     11.84,
     5.935,
     8.345
    ],
    "center": [
     0,
     2.967,
     0.803
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/air-cooled-exchanger.svg",
    "standard": "ISO 10628-2 / PIP PIC001; API 661",
    "drawn": "Rectangle (the finned-tube bundle, often with a zig-zag tube line inside) with a fan below it (forced draft) or above it (induced draft), drawn as a propeller or bow-tie on a shaft to a motor (circle with M); louvres as a row of slanted lines over the bundle.",
    "tags": [
     "E",
     "EA",
     "AC"
    ],
    "notes": "The fan with its motor tells it from a shell-and-tube exchanger. The number of bays and fans is written beside it (e.g. 2 bays × 2 fans).",
    "datasheet": {
     "form": "API 661 / ISO 13706 air-cooled heat exchanger datasheet",
     "fields": {
      "Number of bays": "bays",
      "Fans per bay": "fansPerBay",
      "Tube length": "tubeLength",
      "Bay width": "bayWidth",
      "Tube rows": "rows",
      "Draft type": "draft",
      "Tube passes": "passes",
      "Louvres": "louvres",
      "Header type": "header",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Flange rating": "rating",
      "Fan motor power": "kw",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "plate-heat-exchanger",
   "title": "Plate heat exchanger",
   "category": "thermal",
   "description": "Gasketed plate-and-frame exchanger: fixed frame plate on feet carrying all four flanged connections, a pack of pressed stainless plates with gaskets, movable pressure plate rolling on the top carrying bar, bottom guide bar, end support column, side tightening bolts with bearing boxes at the heads, long nuts and protective thread sleeves. The plate count sets the pack and frame length; the connection size sets the plate size.",
   "import": "./thermal/plate-heat-exchanger",
   "export": "PlateHeatExchanger",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "EN 13445",
    "ASME B16.5",
    "API 662 / ISO 15547-1"
   ],
   "vendors": [
    "Alfa Laval",
    "Danfoss",
    "API Heat Transfer (Schmidt)"
   ],
   "tags": [
    "exchanger",
    "PHE",
    "plate",
    "gasketed",
    "cooler"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Connections",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "plates",
     "label": "Plates",
     "type": "number",
     "min": 20,
     "max": 600,
     "step": 10
    },
    {
     "key": "pitch",
     "label": "Plate pitch",
     "type": "number",
     "min": 0.0025,
     "max": 0.006,
     "step": 0.0001,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 150,
    "plates": 160,
    "pitch": 0.0036,
    "tag": "E-300",
    "paint": "motorPaint"
   },
   "ports": [
    {
     "id": "hot-in",
     "label": "Hot side inlet",
     "position": [
      -0.9169,
      1.8459,
      0.1759
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "hot-out",
     "label": "Hot side outlet",
     "position": [
      -0.9169,
      0.5142,
      0.1759
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "cold-in",
     "label": "Cold side inlet",
     "position": [
      -0.9169,
      0.5142,
      -0.1758
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "cold-out",
     "label": "Cold side outlet",
     "position": [
      -0.9169,
      1.8459,
      -0.1758
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.73,
     2.27,
     0.905
    ],
    "center": [
     -0.077,
     1.135,
     0.01
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/plate-heat-exchanger.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Rectangle (the plate pack) crossed by several parallel lines (the plates), between a fixed frame plate and a pressure plate, with all four connections on the fixed frame end; some legends draw a box with a diagonal zig-zag.",
    "tags": [
     "E",
     "HX",
     "PHE"
    ],
    "notes": "Many parallel lines inside a compact box = plate exchanger. A solid block with channels is a PCHE.",
    "datasheet": {
     "form": "Plate heat exchanger datasheet (API 662 / ISO 15547-1)",
     "fields": {
      "Connection size": "nps",
      "Flange rating": "rating",
      "Number of plates": "plates",
      "Plate pitch": "pitch",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "flare-boom",
   "title": "Flare boom",
   "category": "thermal",
   "description": "Offshore inclined flare boom: tapered tubular box truss pinned at the root with rear legs, the flare header running up the boom axis to a vertical flare tip with windshield, retention ring and pilots, pilot gas lines along the chord, an inclined access way with treads and rails, a grated tip platform with obstruction lights. Origin at the boom root on the deck; the boom rises along +X. Optional animated flame.",
   "import": "./thermal/flare-boom",
   "export": "FlareBoom",
   "anchor": "base",
   "standards": [
    "API 521",
    "API 537",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Zeeco",
    "Himech Equipments"
   ],
   "tags": [
    "flare",
    "boom",
    "relief",
    "offshore",
    "flare tip"
   ],
   "params": [
    {
     "key": "length",
     "label": "Boom length",
     "type": "number",
     "min": 20,
     "max": 110,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "angle",
     "label": "Inclination",
     "type": "number",
     "min": 20,
     "max": 70,
     "step": 1,
     "unit": "°"
    },
    {
     "key": "headerNps",
     "label": "Flare header",
     "type": "nps",
     "min": 8,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "pilots",
     "label": "Pilots",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "lit",
     "label": "Flame",
     "type": "bool"
    },
    {
     "key": "flameHeight",
     "label": "Flame length",
     "type": "number",
     "min": 2,
     "max": 40,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "length": 50,
    "angle": 40,
    "headerNps": 24,
    "rating": 150,
    "pilots": 3,
    "lit": false,
    "flameHeight": 12,
    "tag": "FL-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Flare header inlet",
     "position": [
      -3.2838,
      2.4533,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 24,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     42.563,
     40.292,
     3.65
    ],
    "center": [
     17.955,
     20.146,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/flare-boom.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (flare tip) / layout convention for the boom",
    "drawn": "On the flare P&ID: the flare header ending at a flare tip symbol (a short stack with a flame outline on top), with pilot gas and ignition lines; on layouts an inclined boom outline from the platform edge to the tip.",
    "notes": "Inclined boom = offshore flare boom; a vertical stack from grade is a flare-stack. A stack with no flame symbol is a cold vent.",
    "datasheet": {
     "form": "Flare system datasheet (API 537, API 521 radiation)",
     "fields": {
      "Boom length": "length",
      "Boom angle": "angle",
      "Header size": "headerNps",
      "Flange rating": "rating",
      "Number of pilots": "pilots",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "flare-stack",
   "title": "Flare stack",
   "category": "thermal",
   "description": "Onshore elevated flare: riser on a concrete plinth, self-supported (flared base shell with anchor chairs), derrick-supported (three-leg lattice tower with riser guides) or guyed. Molecular (or internal velocity) purge seal, flare tip with windshield and pilots, pilot and ignition lines from a grade-level ignition panel, caged ladders in ISO 14122 flights with rest platforms, top platform, aviation lights and day-marking bands. Optional animated flame.",
   "import": "./thermal/flare-stack",
   "export": "FlareStack",
   "anchor": "base",
   "standards": [
    "API 521",
    "API 537",
    "ASME B16.5",
    "ISO 14122",
    "ICAO Annex 14"
   ],
   "vendors": [
    "Zeeco",
    "Argo Flare"
   ],
   "tags": [
    "flare",
    "stack",
    "relief",
    "onshore",
    "flare tip"
   ],
   "params": [
    {
     "key": "height",
     "label": "Tip height",
     "type": "number",
     "min": 15,
     "max": 120,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "support",
     "label": "Support",
     "type": "select",
     "options": [
      "self",
      "derrick",
      "guyed"
     ]
    },
    {
     "key": "headerNps",
     "label": "Riser / header",
     "type": "nps",
     "min": 6,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "pilots",
     "label": "Pilots",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "seal",
     "label": "Purge seal",
     "type": "select",
     "options": [
      "molecular",
      "velocity"
     ]
    },
    {
     "key": "lit",
     "label": "Flame",
     "type": "bool"
    },
    {
     "key": "flameHeight",
     "label": "Flame length",
     "type": "number",
     "min": 2,
     "max": 40,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 40,
    "support": "derrick",
    "headerNps": 24,
    "rating": 150,
    "pilots": 3,
    "seal": "molecular",
    "lit": false,
    "flameHeight": 12,
    "tag": "FS-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Flare header inlet",
     "position": [
      -0.8074,
      1.6,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 24,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     8.398,
     40.239,
     7.367
    ],
    "center": [
     0,
     20.111,
     -1.111
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/flare-stack.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (flare tip)",
    "drawn": "A tall vertical stack with a flame outline at the tip and the flare header entering at the base, often with the molecular or velocity seal drawn as a bulge below the tip and pilot lines alongside.",
    "notes": "With a flame at the top it is a flare; without one it is a cold vent stack. A ground flare is a box or fence enclosure with burners.",
    "datasheet": {
     "form": "Flare system datasheet (API 537, API 521)",
     "fields": {
      "Stack height": "height",
      "Support type": "support",
      "Header size": "headerNps",
      "Flange rating": "rating",
      "Number of pilots": "pilots",
      "Purge seal type": "seal",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "fired-heater",
   "title": "Fired heater (vertical cylindrical)",
   "category": "thermal",
   "description": "API 560 vertical-cylindrical process heater: radiant casing on legs with buckstays, stiffener rings, sight and access doors; upward-firing floor burners with windboxes, air registers, a fuel gas ring and a grade-level burner management panel; snuffing-steam ring, explosion doors, draft-gauge tappings; breeching, convection section with bolted header-box covers and rotary sootblowers, external crossovers into the radiant section, transition hood, damper and open lined stack. Platforms at the sight doors, roof and damper with caged ladders.",
   "import": "./thermal/fired-heater",
   "export": "FiredHeater",
   "anchor": "base",
   "standards": [
    "API 560 / ISO 13705",
    "API 535",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Thermax",
    "Struthers Wells"
   ],
   "tags": [
    "heater",
    "furnace",
    "fired",
    "reboiler",
    "hot oil"
   ],
   "params": [
    {
     "key": "diameter",
     "label": "Radiant diameter",
     "type": "number",
     "min": 2.5,
     "max": 10,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "radiantHeight",
     "label": "Radiant height",
     "type": "number",
     "min": 5,
     "max": 20,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "stackHeight",
     "label": "Stack height",
     "type": "number",
     "min": 5,
     "max": 40,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "burners",
     "label": "Burners",
     "type": "number",
     "min": 1,
     "max": 16,
     "step": 1
    },
    {
     "key": "passes",
     "label": "Coil passes",
     "type": "select",
     "options": [
      1,
      2,
      4
     ]
    },
    {
     "key": "nps",
     "label": "Process nozzles",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 4.5,
    "radiantHeight": 9,
    "stackHeight": 14,
    "burners": 6,
    "passes": 2,
    "nps": 6,
    "rating": 600,
    "tag": "H-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Process inlet (convection)",
     "position": [
      -2.025,
      15.3737,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Process outlet (radiant)",
     "position": [
      -2.4737,
      3.3,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "fuel",
     "label": "Fuel gas",
     "position": [
      0,
      1.05,
      -2.85
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 300,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     8.208,
     30.483,
     8.25
    ],
    "center": [
     0.746,
     15.114,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/fired-heater.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (furnace)",
    "drawn": "A box (radiant section) with a zig-zag process coil inside, burners drawn as small flames or triangles at the floor, a tapering convection section and a stack on top; the fuel gas line goes to the burners.",
    "tags": [
     "H"
    ],
    "notes": "Zig-zag coil inside a firebox with burners = fired heater. An electric heater has a resistance element and a terminal box; a TEG reboiler is a horizontal capsule with a fire tube.",
    "datasheet": {
     "form": "API 560 / ISO 13705 fired heater datasheet",
     "fields": {
      "Radiant section diameter": "diameter",
      "Radiant height": "radiantHeight",
      "Stack height": "stackHeight",
      "Number of burners": "burners",
      "Number of passes": "passes",
      "Coil connection size": "nps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vent-stack",
   "title": "Cold vent stack",
   "category": "thermal",
   "description": "Atmospheric cold vent: flanged inlet turning up through a long-radius elbow with a low-point drain, riser with flanged spools, end-of-line deflagration arrester (element housing, insect screen and weather hood) or a plain open tip, day-marking bands and an obstruction light. Self-supported, three-leg braced tower or guyed; an access platform and caged ladder serve the arrestor on taller stacks.",
   "import": "./thermal/vent-stack",
   "export": "VentStack",
   "anchor": "base",
   "standards": [
    "API 521",
    "ISO 16852",
    "API 2000",
    "ICAO Annex 14",
    "ISO 14122"
   ],
   "vendors": [
    "Protego",
    "Storagetech"
   ],
   "tags": [
    "vent",
    "cold vent",
    "stack",
    "flame arrestor",
    "relief"
   ],
   "params": [
    {
     "key": "height",
     "label": "Tip height",
     "type": "number",
     "min": 4,
     "max": 40,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300
     ]
    },
    {
     "key": "support",
     "label": "Support",
     "type": "select",
     "options": [
      "self",
      "braced",
      "guyed"
     ]
    },
    {
     "key": "arrestor",
     "label": "Flame arrestor",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 15,
    "nps": 8,
    "rating": 150,
    "support": "braced",
    "arrestor": true,
    "tag": "VS-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Vent inlet",
     "position": [
      -0.8016,
      0.9,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     2.428,
     15,
     3.26
    ],
    "center": [
     0,
     7.5,
     0.255
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vent-stack.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (vent to atmosphere, flame arrester)",
    "drawn": "A line turning up into an open-ended stack with an arrow or \"to atmosphere\" at the top, often with a flame arrester (box with parallel lines) at or near the tip; labelled VENT or VS-.",
    "tags": [
     "VS"
    ],
    "notes": "No flame symbol: a cold vent. An open-ended small-bore line ending in a goose-neck or \"TO ATM\" is just a vent connection, not a stack.",
    "datasheet": {
     "form": "Vent stack datasheet (API 521 dispersion, ISO 16852 flame arrester)",
     "fields": {
      "Stack height": "height",
      "Stack size": "nps",
      "Flange rating": "rating",
      "Support type": "support",
      "Flame arrester": "arrestor",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "electric-heater",
   "title": "Electric process heater",
   "category": "thermal",
   "description": "Flanged immersion electric heater in a horizontal pressure shell on fixed and sliding saddles: body flange with the element tubesheet flange and full studding, finned standoff, Ex d terminal enclosure with bolted cover, cable glands, element thermocouples and an auxiliary over-temperature sensor box, process inlet and outlet, vent, drain, PSV, thermowells and a local junction box. Rated power sets the shell size and length.",
   "import": "./thermal/electric-heater",
   "export": "ElectricHeater",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "IEC 60079-1",
    "IEC 60079-7",
    "ASME B16.5"
   ],
   "vendors": [
    "Chromalox",
    "Exheat"
   ],
   "tags": [
    "heater",
    "electric",
    "immersion",
    "gas heater",
    "Ex d"
   ],
   "params": [
    {
     "key": "kw",
     "label": "Power",
     "type": "number",
     "min": 50,
     "max": 3000,
     "step": 50,
     "unit": "kW"
    },
    {
     "key": "nps",
     "label": "Process nozzles",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "elevation",
     "label": "Shell bottom",
     "type": "number",
     "min": 0.4,
     "max": 2,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "kw": 600,
    "nps": 6,
    "rating": 300,
    "pressure": 30,
    "elevation": 0.7,
    "insulated": false,
    "tag": "EH-100",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Process inlet",
     "position": [
      -1.3095,
      1.4686,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Process outlet",
     "position": [
      2.1641,
      1.4686,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     5.435,
     1.526,
     1.386
    ],
    "center": [
     -0.038,
     0.763,
     -0.267
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/electric-heater.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / IEC 60617 heating element",
    "drawn": "A horizontal shell with a resistance element (zig-zag) drawn inside it and a terminal box on the flange end; the power supply comes from a thyristor controller and the process inlet and outlet are on the shell.",
    "tags": [
     "H",
     "EH"
    ],
    "notes": "The zig-zag element plus a terminal box tells it from a shell-and-tube exchanger. On P&IDs a TIC with a TY / thyristor box and a high-temperature trip (TSHH on the element) usually accompanies it.",
    "datasheet": {
     "form": "Electric process heater datasheet (IEC 60079-7 / ASME VIII-1)",
     "fields": {
      "Rated power": "kw",
      "Nozzle size": "nps",
      "Flange rating": "rating",
      "Design pressure": "pressure",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "hairpin-exchanger",
   "title": "Hairpin (double-pipe) exchanger",
   "category": "thermal",
   "description": "Double-pipe hairpin exchanger: two shell legs stacked one above the other, bolted return-bend housing enclosing the inner U-bend, front nozzle heads carrying the shell-side nozzles, closure blinds with packed glands where the inner pipe leaves, tube-side flanged ends, shell inlet and outlet nozzles, vent and drain, and clamp stands with U-bolts.",
   "import": "./thermal/hairpin-exchanger",
   "export": "HairpinExchanger",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "TEMA",
    "ASME B16.5"
   ],
   "vendors": [
    "Koch Heat Transfer (Brown Fintube)"
   ],
   "tags": [
    "exchanger",
    "hairpin",
    "double pipe",
    "cooler"
   ],
   "params": [
    {
     "key": "shellNps",
     "label": "Shell pipe",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "tubeNps",
     "label": "Inner pipe",
     "type": "nps",
     "min": 1,
     "max": 8
    },
    {
     "key": "length",
     "label": "Leg length",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "elevation",
     "label": "Lower leg bottom",
     "type": "number",
     "min": 0.4,
     "max": 2,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "shellNps": 6,
    "tubeNps": 3,
    "length": 6,
    "rating": 300,
    "elevation": 0.7,
    "tag": "E-400",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "shell-in",
     "label": "Shell inlet",
     "position": [
      -2.6723,
      1.4896,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "shell-out",
     "label": "Shell outlet",
     "position": [
      -2.6723,
      0.4562,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "tube-in",
     "label": "Tube inlet",
     "position": [
      -3.4206,
      0.7841,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "tube-out",
     "label": "Tube outlet",
     "position": [
      -3.4206,
      1.1616,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     6.8,
     1.515,
     0.48
    ],
    "center": [
     -0.046,
     0.757,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/hairpin-exchanger.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Two parallel horizontal pipes (the legs) joined by a return bend at one end, an inner pipe shown running through both, tube-side connections at the open ends and shell-side nozzles on each leg.",
    "tags": [
     "E",
     "HX"
    ],
    "notes": "The U-shaped double-pipe outline tells it from a shell-and-tube (single shell with a channel). Stacked hairpins in series are drawn as several hairpins joined by short lines.",
    "datasheet": {
     "form": "Double-pipe exchanger datasheet (TEMA / ASME VIII-1)",
     "fields": {
      "Outer pipe size": "shellNps",
      "Inner pipe size": "tubeNps",
      "Leg length": "length",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "printed-circuit-heat-exchanger",
   "title": "Printed-circuit heat exchanger (PCHE)",
   "category": "thermal",
   "description": "Compact diffusion-bonded heat exchanger: stacked chemically etched plates bonded into solid stainless core blocks (bond lines visible), blocks welded side by side, half-pipe headers welded over the channel openings with flanged nozzles (hot side on the ends, cold side on the face), blinded maintenance nozzles, lifting lugs and a bolted support frame. Typical for high-pressure gas cooling, dew-pointing and compression offshore.",
   "import": "./thermal/printed-circuit-heat-exchanger",
   "export": "PrintedCircuitHeatExchanger",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Heatric (Parker)",
    "Alfa Laval"
   ],
   "tags": [
    "exchanger",
    "PCHE",
    "compact",
    "diffusion bonded",
    "high pressure"
   ],
   "params": [
    {
     "key": "blocks",
     "label": "Core blocks",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "length",
     "label": "Block length",
     "type": "number",
     "min": 0.5,
     "max": 3,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "width",
     "label": "Block width",
     "type": "number",
     "min": 0.3,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Block height",
     "type": "number",
     "min": 0.3,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "hotNps",
     "label": "Hot nozzles",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "coldNps",
     "label": "Cold nozzles",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "blocks": 2,
    "length": 1.6,
    "width": 0.6,
    "height": 0.6,
    "hotNps": 6,
    "coldNps": 4,
    "rating": 900,
    "elevation": 0.6,
    "tag": "E-500"
   },
   "ports": [
    {
     "id": "hot-in",
     "label": "Hot side inlet",
     "position": [
      -1.1723,
      0.9,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "hot-out",
     "label": "Hot side outlet",
     "position": [
      1.1723,
      0.9,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "cold-in",
     "label": "Cold side inlet",
     "position": [
      0.6343,
      0.9,
      0.9064
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "cold-out",
     "label": "Cold side outlet",
     "position": [
      -0.6343,
      0.9,
      0.9064
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     2.412,
     1.336,
     1.885
    ],
    "center": [
     0,
     0.668,
     -0.003
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/printed-circuit-heat-exchanger.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (generic exchanger box); no specific PCHE symbol",
    "drawn": "Usually a generic heat-exchanger box or rectangle with crossing flow lines and four nozzles (hot side on the ends, cold side on the faces), tagged E- and noted \"PCHE\" or \"compact / diffusion-bonded\".",
    "tags": [
     "E",
     "HX"
    ],
    "notes": "There is no standard PCHE symbol: rely on the note or the datasheet. Common in gas dehydration, compression aftercooling and dew-point control where space is tight.",
    "datasheet": {
     "form": "Compact heat exchanger datasheet (ASME VIII-1)",
     "fields": {
      "Number of core blocks": "blocks",
      "Block length": "length",
      "Block width": "width",
      "Block height": "height",
      "Hot-side nozzle size": "hotNps",
      "Cold-side nozzle size": "coldNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "cooling-tower",
   "title": "Cooling tower (induced draft, counterflow)",
   "category": "thermal",
   "description": "Onshore mechanical-draft counterflow cooling tower in a row of cells: concrete cold-water basin with outlet sump, FRP-clad casing on a column frame, louvred air inlets on the long sides, fan deck with handrails, velocity-recovery fan stacks, axial fans on right-angle gearboxes driven through a drive shaft by motors outside the stacks, vibration switches and oil-level lines, hot-water riser and distribution header with a valve per cell, make-up and overflow, and caged ladders with a rest platform. Fans spin while running.",
   "import": "./thermal/cooling-tower",
   "export": "CoolingTower",
   "anchor": "base",
   "standards": [
    "CTI STD-201",
    "CTI ATC-105",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "SPX Cooling Tech (Marley)",
    "Hamon",
    "Enexio",
    "EVAPCO",
    "Baltimore Aircoil"
   ],
   "tags": [
    "cooling tower",
    "cooling water",
    "evaporative",
    "utilities"
   ],
   "params": [
    {
     "key": "cells",
     "label": "Cells",
     "type": "number",
     "min": 1,
     "max": 8,
     "step": 1
    },
    {
     "key": "cellSize",
     "label": "Cell size",
     "type": "number",
     "min": 4,
     "max": 18,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "deckHeight",
     "label": "Fan deck height",
     "type": "number",
     "min": 6,
     "max": 18,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "inletHeight",
     "label": "Air inlet height",
     "type": "number",
     "min": 1.5,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "kw",
     "label": "Motor per fan",
     "type": "number",
     "min": 15,
     "max": 250,
     "step": 5,
     "unit": "kW"
    },
    {
     "key": "inletNps",
     "label": "Hot water inlet",
     "type": "nps",
     "min": 6,
     "max": 48
    },
    {
     "key": "outletNps",
     "label": "Cold water outlet",
     "type": "nps",
     "min": 6,
     "max": 48
    },
    {
     "key": "running",
     "label": "Running",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "cells": 2,
    "cellSize": 9,
    "deckHeight": 10,
    "inletHeight": 3.2,
    "kw": 110,
    "inletNps": 20,
    "outletNps": 24,
    "rating": 150,
    "running": true,
    "tag": "CT-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Hot water inlet",
     "position": [
      -11.5,
      1.2,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 20,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Cold water outlet",
     "position": [
      11,
      0.555,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 24,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     22.581,
     11.95,
     10.462
    ],
    "center": [
     -0.248,
     5.975,
     0.431
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cooling-tower.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "A box (or tapering hyperbolic outline for natural draft) with a fan stack on top (propeller in a short cylinder), the hot-water distribution near the top, crossed lines for the fill, air inlets low on the sides and the cold-water basin at the bottom.",
    "tags": [
     "CT",
     "E"
    ],
    "notes": "The fan on top plus fill and basin tell it from an air-cooled exchanger (tube bundle, no water basin). Onshore only.",
    "datasheet": {
     "form": "Cooling tower datasheet (CTI STD-201 / ATC-105)",
     "fields": {
      "Cells": "cells",
      "Cell size": "cellSize",
      "Fan deck height": "deckHeight",
      "Hot-water inlet height": "inletHeight",
      "Fan motor power": "kw",
      "Inlet size": "inletNps",
      "Outlet size": "outletNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "gate-valve",
   "title": "Gate valve",
   "category": "valves",
   "description": "Flanged RF gate valve with a flexible wedge, oval bolted bonnet, packing gland with gland studs, outside screw & yoke with a greased yoke sleeve, and a rising stem. Handwheel, or bevel gear with a stem protector. The bore is open right through; `open` lifts the wedge and stem through the full stroke. Face-to-face from ASME B16.10 for the selected class.",
   "import": "./valves/gate-valve",
   "export": "GateValve",
   "anchor": "inline",
   "standards": [
    "API 600",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [
    "Velan"
   ],
   "tags": [
    "isolation",
    "manual",
    "block valve"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "handwheel",
      "gear"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "operator": "handwheel",
    "open": 1,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.2017,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.2017,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.403,
     1.127,
     0.342
    ],
    "center": [
     0,
     0.405,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/gate-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Two triangles meeting at their points (bow-tie) across the line, unfilled. A short stem with a T on top marks the handwheel; a gear operator is sometimes drawn as a small box on the stem.",
    "tags": [
     "HV",
     "XV (manual)"
    ],
    "notes": "A filled dot at the centre means globe; a circle means ball; a bar through the centre means butterfly. A fully black bow-tie is the same valve normally closed (NC). LO / CSO / LC / CSC written beside it are locked or car-sealed positions, not a different valve.",
    "datasheet": {
     "form": "Valve datasheet (API 600 / ASME B16.34)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "ball-valve",
   "title": "Ball valve",
   "category": "valves",
   "description": "Flanged RF ball valve. Floating two-piece body with a wrench lever for small sizes, trunnion-mounted three-piece side-entry body with sealant fittings, trunnion cover, lifting lugs and a worm gear for larger sizes. Full or reduced bore; the ported ball is visible down the bore and turns with `open`.",
   "import": "./valves/ball-valve",
   "export": "BallValve",
   "anchor": "inline",
   "standards": [
    "API 6D",
    "ISO 17292",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5",
    "ISO 5211"
   ],
   "vendors": [
    "Cameron (SLB)",
    "Bray",
    "Fluitek",
    "Smith-Cooper (Sharpe)",
    "Bola-Tek"
   ],
   "tags": [
    "isolation",
    "quarter-turn",
    "block valve",
    "manual"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "bore",
     "label": "Bore",
     "type": "select",
     "options": [
      "full",
      "reduced"
     ]
    },
    {
     "key": "mounting",
     "label": "Ball",
     "type": "select",
     "options": [
      "auto",
      "floating",
      "trunnion"
     ]
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "auto",
      "lever",
      "gear"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 300,
    "bore": "full",
    "mounting": "auto",
    "operator": "auto",
    "open": 1,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.1524,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.1524,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.542,
     0.334,
     0.268
    ],
    "center": [
     0.119,
     0.033,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/ball-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Bow-tie across the line with an open circle at the centre where the triangle points meet. Manual valves may show a stem with a T or a lever.",
    "tags": [
     "HV"
    ],
    "notes": "Open circle = ball; filled dot = globe; plain bow-tie = gate. The same body under a square actuator with an S or a fail-close note is an ESDV / SDV / XV (esd-valve). Some legends write FB / RB beside it for full or reduced bore.",
    "datasheet": {
     "form": "Ball valve datasheet (API 6D / ISO 17292)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Bore": "bore",
      "Ball mounting": "mounting",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "esd-valve",
   "title": "Emergency shutdown valve (ESDV)",
   "category": "valves",
   "description": "Full-bore trunnion ball valve with a spring-return scotch-yoke actuator (pneumatic cylinder, spring cartridge, jackscrew override) in safety yellow. Fail-close. Carries a limit switch box with a turning open/closed indicator, solenoid valve, quick-exhaust valve, air filter-regulator with gauge and stainless tubing. `open` turns the ball and the indicator.",
   "import": "./valves/esd-valve",
   "export": "EsdValve",
   "anchor": "inline",
   "standards": [
    "API 6D",
    "ISO 14313",
    "IEC 61508 / 61511",
    "ASME B16.10",
    "ASME B16.5",
    "ISO 5211"
   ],
   "vendors": [
    "Emerson Bettis",
    "Cameron (SLB)"
   ],
   "tags": [
    "esdv",
    "shutdown",
    "safety",
    "actuated",
    "fail-close",
    "SIS"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 600,
    "open": 1,
    "body": "valveBody",
    "actuator": "actuatorYellow",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.2794,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.2794,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.543,
     0.892,
     0.419
    ],
    "center": [
     0.063,
     0.236,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/esd-valve.svg",
    "standard": "ISA 5.1 (actuator) on an ISO 10628-2 ball valve body; IEC 61511 SIS final element",
    "drawn": "Ball-valve bow-tie (circle at the centre) under a rectangular spring-return piston actuator, usually with a small box marked S (solenoid) on the actuator and \"FC\" beside the body. The tag bubble reads ESDV, SDV or XV.",
    "tags": [
     "ESDV",
     "SDV",
     "XV",
     "SSV"
    ],
    "isa": [
     "ESDV",
     "SDV",
     "XV",
     "ZSO",
     "ZSC"
    ],
    "notes": "Same symbol with FO and tag BDV is a blowdown valve. A dome actuator means a control valve; a circle with M means an MOV. Limit switches (ZSO / ZSC) and the SOV are accessories of this valve, not separate items. Some legends draw a gate body instead of a ball; the ESDV tag decides.",
    "datasheet": {
     "form": "Actuated on/off valve datasheet (API 6D / ISO 14313 + actuator sheet, IEC 61508 SIL data)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "blowdown-valve",
   "title": "Blowdown valve (BDV)",
   "category": "valves",
   "description": "Depressuring valve: full-bore trunnion ball valve with a red spring-return scotch-yoke actuator that fails open, normally closed. Same accessories as the ESDV: limit switch box, solenoid, quick exhaust, filter-regulator and tubing. `open` turns the ball and the indicator.",
   "import": "./valves/blowdown-valve",
   "export": "BlowdownValve",
   "anchor": "inline",
   "standards": [
    "API 6D",
    "API 521",
    "IEC 61508 / 61511",
    "ASME B16.10",
    "ASME B16.5",
    "ISO 5211"
   ],
   "vendors": [
    "Emerson Bettis",
    "Cameron (SLB)"
   ],
   "tags": [
    "bdv",
    "blowdown",
    "depressuring",
    "safety",
    "actuated",
    "fail-open"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 900,
    "open": 0,
    "body": "valveBody",
    "actuator": "actuatorRed",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.2286,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.2286,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.352,
     0.728,
     0.345
    ],
    "center": [
     0.056,
     0.195,
     -0.002
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/blowdown-valve.svg",
    "standard": "ISA 5.1 (actuator) on an ISO 10628-2 ball valve body; API 521 depressuring",
    "drawn": "Actuated ball valve like an ESDV (rectangular spring-return actuator, solenoid box) but marked FO, usually drawn black-filled or marked NC because it is normally closed. It sits on a line from the vessel or compressor to the flare header, often followed by a restriction orifice (RO).",
    "tags": [
     "BDV"
    ],
    "isa": [
     "BDV",
     "XV",
     "ZSO",
     "ZSC"
    ],
    "notes": "Tell it from an ESDV by the FO mark, the flare (FL / BD) line it sits on and the BDV tag. The restriction orifice downstream is drawn as a pair of short bars across the line (like an orifice plate) tagged RO.",
    "datasheet": {
     "form": "Blowdown valve datasheet (API 6D + actuator sheet, API 521 depressuring case)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "control-valve",
   "title": "Control valve (globe)",
   "category": "valves",
   "description": "Flanged globe control valve with a multi-spring diaphragm actuator on a two-leg cast yoke. Includes a digital valve positioner with gauges, an air filter-regulator with gauge and bowl, stainless tubing to the diaphragm casing, a stem connector with travel pointer and scale. `open` lifts the stem through the rated travel. Face-to-face per ISA 75.08.01.",
   "import": "./valves/control-valve",
   "export": "ControlValve",
   "anchor": "inline",
   "standards": [
    "IEC 60534",
    "ISA 75.08.01",
    "ASME B16.34",
    "ASME B16.5"
   ],
   "vendors": [
    "Emerson Fisher"
   ],
   "tags": [
    "control",
    "throttling",
    "actuated",
    "positioner",
    "globe"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Travel",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 300,
    "open": 0.6,
    "body": "valveBody",
    "actuator": "actuatorBlue",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.184,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.184,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.458,
     0.953,
     0.458
    ],
    "center": [
     0,
     0.323,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/control-valve.svg",
    "standard": "ISA 5.1 / ISO 10628-2 (control valve with diaphragm actuator)",
    "drawn": "Bow-tie body with a stem up to a dome (half circle on a flat base): the spring-diaphragm actuator. A tag bubble such as LV, PV, FV, TV, PCV, LCV, FCV, TCV sits next to it, often with FC / FO / FL and a bypass globe valve drawn around it.",
    "tags": [
     "CV"
    ],
    "isa": [
     "LV",
     "PV",
     "FV",
     "TV",
     "PCV",
     "LCV",
     "FCV",
     "TCV",
     "HCV",
     "PDV"
    ],
    "notes": "Dome = diaphragm actuator (control valve). A rectangle = piston actuator (usually on/off: ESDV / SDV / XV / BDV). A circle with M = MOV. A self-acting regulator (PCV with no signal line, impulse line to the pipe) uses the same body with a sensing line instead of a positioner signal.",
    "datasheet": {
     "form": "Control valve specification sheet (IEC 60534-7 / ISA-75.25 / ISA-TR20.00.01)",
     "fields": {
      "Body size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pressure-safety-valve",
   "title": "Pressure safety valve (PSV)",
   "category": "valves",
   "description": "Flanged spring-loaded relief valve with an angle body, bolted bonnet, closed or open-yoke spring housing with exposed coil, screwed cap with seal wire, optional packed lifting lever and bellows vent. Inlet and outlet sizes, classes and centre-to-face dimensions come from API 526 for the orifice letter and inlet class. Origin at the body centre; inlet faces down, outlet faces +X.",
   "import": "./valves/pressure-safety-valve",
   "export": "PressureSafetyValve",
   "anchor": "fitting",
   "standards": [
    "API 526",
    "API 520",
    "ASME VIII UG-125",
    "ASME B16.5"
   ],
   "vendors": [
    "Emerson Crosby"
   ],
   "tags": [
    "psv",
    "relief",
    "safety",
    "overpressure",
    "prv"
   ],
   "params": [
    {
     "key": "orifice",
     "label": "Orifice",
     "type": "select",
     "options": [
      "D",
      "E",
      "F",
      "G",
      "H",
      "J",
      "K",
      "L",
      "M",
      "N",
      "P",
      "Q",
      "R",
      "T"
     ]
    },
    {
     "key": "inletRating",
     "label": "Inlet class",
     "type": "rating"
    },
    {
     "key": "bonnet",
     "label": "Bonnet",
     "type": "select",
     "options": [
      "closed",
      "open"
     ]
    },
    {
     "key": "lever",
     "label": "Lifting lever",
     "type": "bool"
    },
    {
     "key": "bellows",
     "label": "Balanced bellows",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "orifice": "J",
    "inletRating": 300,
    "bonnet": "closed",
    "lever": false,
    "bellows": false,
    "body": "valveBody",
    "color": "actuatorRed",
    "tag": ""
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      0,
      -0.1365,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      0.1651,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 150,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     0.27,
     0.698,
     0.229
    ],
    "center": [
     0.03,
     0.212,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pressure-safety-valve.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / ISA 5.1",
    "drawn": "Angle body: one triangle pointing up from the inlet below and one pointing in from the outlet on the side, meeting at a right angle, with a zig-zag spring rising from the meeting point to a short cap line. The set pressure and orifice letter (e.g. 3K4, set 42 barg) are written beside it.",
    "tags": [
     "PSV",
     "PRV",
     "TSV",
     "RV"
    ],
    "isa": [
     "PSV",
     "PRV",
     "TSV",
     "PSE"
    ],
    "notes": "The spring zig-zag tells it from a check valve or a plain angle valve. A rupture disc (PSE) is drawn as a curved disc between flanges with no spring. Size code like 3K4 means 3\" inlet, K orifice, 4\" outlet. The outlet line goes to the flare header (FL / RV) or to atmosphere; on a pilot-operated PSV a small pilot box is drawn beside the spring. ISA codes here: PSE = rupture disc.",
    "datasheet": {
     "form": "Pressure relief valve datasheet (API 526 / API 520, ISA-TR20.00.01 form)",
     "fields": {
      "Orifice letter": "orifice",
      "Inlet flange rating": "inletRating",
      "Bonnet": "bonnet",
      "Lifting lever": "lever",
      "Balanced bellows": "bellows",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "globe-valve",
   "title": "Globe valve",
   "category": "valves",
   "description": "Flanged RF globe valve with a bulb body, seat-bridge bulge, bolted bonnet, outside screw & yoke and a rising stem under a non-rising handwheel (bevel gear from NPS 10). Cast flow arrow, drain plug and nameplate. Face-to-face from ASME B16.10 for the class; `open` lifts the stem by the disc lift.",
   "import": "./valves/globe-valve",
   "export": "GlobeValve",
   "anchor": "inline",
   "standards": [
    "API 623",
    "BS 1873",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [
    "Velan"
   ],
   "tags": [
    "throttling",
    "manual",
    "isolation",
    "globe"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 16
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "auto",
      "handwheel",
      "gear"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 300,
    "operator": "auto",
    "open": 1,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.1778,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.1778,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.356,
     0.649,
     0.324
    ],
    "center": [
     0,
     0.184,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/globe-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Bow-tie across the line with a solid black dot at the centre where the triangles meet, and a handwheel stem with a T. Often found as the bypass around a control valve or as a throttling valve.",
    "tags": [
     "HV",
     "HCV"
    ],
    "notes": "Solid dot = globe; open circle = ball; plain bow-tie = gate. A bow-tie with a dome actuator is a control valve, which is a globe body too: the actuator decides.",
    "datasheet": {
     "form": "Globe valve datasheet (API 623 / BS 1873 / ASME B16.34)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "swing-check-valve",
   "title": "Swing check valve",
   "category": "valves",
   "description": "Flanged RF swing check valve with a long body, disc chamber and oval bolted cover with lifting eye, hinge-pin bosses with plugs on both sides, cast flow arrow, drain plug and nameplate. Optional external lever and counterweight on the hinge shaft that swings with `open`. Face-to-face from ASME B16.10.",
   "import": "./valves/swing-check-valve",
   "export": "SwingCheckValve",
   "anchor": "inline",
   "standards": [
    "API 6D",
    "BS 1868",
    "API 594",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [
    "Fluitek",
    "Delta Pacific Valve"
   ],
   "tags": [
    "check",
    "non-return",
    "backflow"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "counterweight",
     "label": "Counterweight",
     "type": "bool"
    },
    {
     "key": "open",
     "label": "Disc open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "counterweight": false,
    "open": 0,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.2222,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.2223,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.444,
     0.405,
     0.323
    ],
    "center": [
     0,
     0.044,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/swing-check-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Bow-tie with one triangle filled black (the downstream half) and often a small arrow showing the free-flow direction. Some legends draw a single triangle pointing at a bar instead.",
    "tags": [
     "CHV",
     "NRV"
    ],
    "notes": "P&IDs rarely distinguish swing, dual-plate and piston checks: read the valve code in the line class or the valve datasheet. Flow is allowed in the direction the arrow (or the open triangle) points.",
    "datasheet": {
     "form": "Check valve datasheet (API 6D / BS 1868 / ASME B16.34)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Lever and counterweight": "counterweight",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "dual-plate-check-valve",
   "title": "Dual-plate check valve (wafer)",
   "category": "valves",
   "description": "API 594 Type A wafer check valve: a short body centred by the flange studs, two half plates on a central hinge pin with a stop pin, retainer plugs, lifting eye, nameplate and flow arrow. `open` swings the plates up to about 80°. Set `companionFlanges` to draw the pipe flanges, gaskets and through-studs around it; leave it off inside a plant, where the line supplies them.",
   "import": "./valves/dual-plate-check-valve",
   "export": "DualPlateCheckValve",
   "anchor": "inline",
   "standards": [
    "API 594 Type A",
    "ASME B16.34",
    "ASME B16.5"
   ],
   "vendors": [
    "Crane (DuoChek)",
    "Stockham"
   ],
   "tags": [
    "check",
    "non-return",
    "wafer",
    "backflow"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Plates open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "companionFlanges",
     "label": "Companion flanges",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 6,
    "rating": 300,
    "open": 0,
    "companionFlanges": false,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.049,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.049,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.544,
     0.345,
     0.317
    ],
    "center": [
     0,
     0.014,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/dual-plate-check-valve.svg",
    "standard": "ISO 14617-8 non-return symbol / PIP PIC001",
    "drawn": "Non-return symbol (a triangle pointing at a bar across the line) squeezed between two flange marks, because the wafer body sits between the pipe flanges. Many legends just use the general check-valve bow-tie with one half filled.",
    "tags": [
     "CHV",
     "NRV"
    ],
    "notes": "Wafer-type (API 594) is usually only visible from the valve code or a \"W\" / \"DP\" note. Treat any check-valve symbol on a line ≥ NPS 3 in water or gas service with a wafer valve code as this component; otherwise use swing-check-valve.",
    "datasheet": {
     "form": "Wafer check valve datasheet (API 594 Type A)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "butterfly-valve",
   "title": "Butterfly valve",
   "category": "valves",
   "description": "Butterfly valve in four styles: concentric rubber-lined wafer (centring ears) or lug body (tapped lugs at every bolt), double-flanged, or metal-seated triple-offset with an offset disc. Notch-plate lever or worm gear with position indicator; the disc turns with `open`. Wafer and lug lengths from API 609 Category B; flanged lengths typical ISO 5752 series 13. `companionFlanges` draws the pipe flanges around wafer and lug bodies.",
   "import": "./valves/butterfly-valve",
   "export": "ButterflyValve",
   "anchor": "inline",
   "standards": [
    "API 609",
    "ISO 5752",
    "EN 593",
    "ASME B16.34",
    "ASME B16.5",
    "ISO 5211"
   ],
   "vendors": [
    "Bray",
    "Emerson Vanessa"
   ],
   "tags": [
    "quarter-turn",
    "isolation",
    "throttling",
    "utility",
    "wafer",
    "TOV"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 3,
     "max": 48
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      150,
      300,
      600
     ]
    },
    {
     "key": "style",
     "label": "Style",
     "type": "select",
     "options": [
      "wafer",
      "lug",
      "double-flanged",
      "triple-offset"
     ]
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "auto",
      "lever",
      "gear"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "companionFlanges",
     "label": "Companion flanges",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 8,
    "rating": 150,
    "style": "wafer",
    "operator": "auto",
    "open": 1,
    "companionFlanges": false,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.0285,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.0285,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.644,
     0.401,
     0.36
    ],
    "center": [
     0.08,
     0.061,
     0.04
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/butterfly-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Bow-tie with a straight bar through the centre at right angles to the line (the disc), often with a dot at its middle. Older legends draw two vertical lines with a diagonal between them.",
    "tags": [
     "HV",
     "BFV"
    ],
    "notes": "Bar through the centre = butterfly; circle = ball; filled dot = globe; two close parallel bars = knife gate. Common in seawater, cooling and firewater lines.",
    "datasheet": {
     "form": "Butterfly valve datasheet (API 609 / ISO 5752 / EN 593)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Body style": "style",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "plug-valve",
   "title": "Plug valve (lubricated)",
   "category": "valves",
   "description": "Short-pattern lubricated taper plug valve with a tall cast plug chamber, bolted top cover and gland, bottom cover with adjusting screw, stop lugs, sealant (lubricant) fitting on the stem, flow arrow and nameplate. Square-head wrench up to NPS 6 and a worm gear above; `open` turns the wrench or indicator a quarter turn.",
   "import": "./valves/plug-valve",
   "export": "PlugValve",
   "anchor": "inline",
   "standards": [
    "API 599",
    "API 6D",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [
    "Flowserve Nordstrom"
   ],
   "tags": [
    "quarter-turn",
    "isolation",
    "manual",
    "sour service",
    "plug"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 1,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "auto",
      "wrench",
      "gear"
     ]
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 4,
    "rating": 300,
    "operator": "auto",
    "open": 1,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.1524,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.1524,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.802,
     0.389,
     0.254
    ],
    "center": [
     0.249,
     0.049,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/plug-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Bow-tie with a small rectangle (the plug) at the centre where the triangles meet; manual plug valves show a wrench or T on the stem.",
    "tags": [
     "HV"
    ],
    "notes": "Legends vary: some draw a plug valve as a bow-tie with a filled triangle-in-circle, others as a ball valve with \"P\" or \"PLUG\". Check the legend; the valve code in the line class confirms it.",
    "datasheet": {
     "form": "Plug valve datasheet (API 599 / API 6D)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "motor-operated-valve",
   "title": "Motor-operated valve (MOV)",
   "category": "valves",
   "description": "Flanged wedge-gate valve with bolted bonnet and yoke carrying a multi-turn electric actuator: gearcase, motor housing, display window and local selector / control knobs, terminal box with cable glands, side handwheel with hand/auto lever, stem cover tube with sight slot. `open` raises the stem through the gate stroke.",
   "import": "./valves/motor-operated-valve",
   "export": "MotorOperatedValve",
   "anchor": "inline",
   "standards": [
    "API 600",
    "ISO 5210",
    "IEC 60034",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [
    "Rotork",
    "Velan"
   ],
   "tags": [
    "mov",
    "actuated",
    "electric",
    "isolation",
    "gate"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 8,
    "rating": 300,
    "open": 1,
    "body": "valveBody",
    "actuator": "actuatorRed",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.2095,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.2096,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 300,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.806,
     1.782,
     0.551
    ],
    "center": [
     -0.048,
     0.7,
     0.061
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/motor-operated-valve.svg",
    "standard": "ISA 5.1 (electric motor actuator) on an ISO 10628-2 gate body",
    "drawn": "Valve bow-tie with a stem to a circle containing M: the electric motor actuator. The tag bubble is usually MOV, XV or HV, and the valve fails in place (FL / FAI).",
    "tags": [
     "MOV",
     "XV"
    ],
    "isa": [
     "MOV",
     "XV",
     "HV",
     "ZSO",
     "ZSC"
    ],
    "notes": "Circle with M = motor actuator; dome = diaphragm (control valve); rectangle = piston or spring-return (ESDV / BDV). A square with \"M\" is used by some legends for the same thing.",
    "datasheet": {
     "form": "Valve datasheet (API 600) + electric actuator datasheet (ISO 5210 / IEC 60034)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "needle-valve",
   "title": "Needle valve (instrument)",
   "category": "valves",
   "description": "Small-bore instrument needle valve: forged stainless bar-stock body with integral RF flanges, union bonnet, panel nut, packing nut, rising stem and T-bar handle with colour cap, bleed plug and stamped tag. `open` lifts the needle stem. NPS 1/2 to 1.",
   "import": "./valves/needle-valve",
   "export": "NeedleValve",
   "anchor": "inline",
   "standards": [
    "ASME B16.34",
    "MSS SP-99",
    "ASME B16.5"
   ],
   "vendors": [
    "Parker Hannifin",
    "Hoke"
   ],
   "tags": [
    "instrument",
    "needle",
    "small-bore",
    "isolation",
    "root valve"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "select",
     "options": [
      0.5,
      0.75,
      1
     ]
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 0.5,
    "rating": 600,
    "open": 1,
    "body": "stainless",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.0605,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.0605,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 0.5,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.121,
     0.136,
     0.095
    ],
    "center": [
     0,
     0.021,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/needle-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Small bow-tie on an instrument, sample, vent or drain line (NPS 1 and below) with a stem ending in a pointed needle at the seat; often unlabelled, next to a gauge or transmitter.",
    "tags": [
     "HV"
    ],
    "notes": "Usually drawn smaller than line valves and attached to instrument tubing. Many P&IDs show instrument root and manifold valves only as a generic small gate symbol, or not at all; treat them as detail unless asked.",
    "datasheet": {
     "form": "Instrument valve datasheet (MSS SP-99 / ASME B16.34)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "check-valve-piston",
   "title": "Piston (lift) check valve",
   "category": "valves",
   "description": "Globe-pattern lift check valve: bulb body with seat-bridge bulge, oval bolted cover with a domed piston guide and centre plug, lifting eye on larger sizes, cast flow arrow, drain plug and nameplate. Used on small-bore and high-pressure lines where a swing check would chatter. Globe face-to-face from ASME B16.10.",
   "import": "./valves/check-valve-piston",
   "export": "CheckValvePiston",
   "anchor": "inline",
   "standards": [
    "BS 1868",
    "API 602",
    "ASME B16.34",
    "ASME B16.10",
    "ASME B16.5"
   ],
   "vendors": [],
   "tags": [
    "check",
    "non-return",
    "lift check",
    "piston"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 0.5,
     "max": 12
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 2,
    "rating": 600,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "Inlet",
     "position": [
      -0.146,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "Outlet",
     "position": [
      0.146,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.292,
     0.204,
     0.165
    ],
    "center": [
     0,
     0.013,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/check-valve-piston.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Check-valve bow-tie (downstream half filled, flow arrow) with the globe-pattern dot at the centre on some legends; on most P&IDs it is drawn exactly like any check valve.",
    "tags": [
     "CHV",
     "NRV"
    ],
    "notes": "Identify it from the valve code (lift / piston check, usually small-bore or high-pressure, NPS 2 and below) rather than the symbol. Swing and dual-plate checks use the same base symbol.",
    "datasheet": {
     "form": "Check valve datasheet (BS 1868 / API 602 / ASME B16.34)",
     "fields": {
      "Size": "nps",
      "Pressure class": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "knife-gate-valve",
   "title": "Knife gate valve",
   "category": "valves",
   "description": "One-piece lug-type knife gate valve: thin body drilled through for the flange studs, bevelled stainless gate plate that rises out through a packing gland into a two-post yoke, rising stem and handwheel. The bore is open right through; `open` lifts the gate. Face-to-face typical MSS SP-81. For slurry, produced sand and utility service.",
   "import": "./valves/knife-gate-valve",
   "export": "KnifeGateValve",
   "anchor": "inline",
   "standards": [
    "MSS SP-81",
    "ASME B16.34",
    "ASME B16.5 drilling"
   ],
   "vendors": [
    "DeZURIK",
    "Orbinox",
    "Mueller (Pratt)"
   ],
   "tags": [
    "isolation",
    "slurry",
    "knife gate",
    "manual"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Size",
     "type": "nps",
     "min": 2,
     "max": 36
    },
    {
     "key": "open",
     "label": "Open",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 8,
    "rating": 150,
    "open": 1,
    "body": "valveBody",
    "tag": ""
   },
   "ports": [
    {
     "id": "A",
     "label": "End A",
     "position": [
      -0.035,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "B",
     "label": "End B",
     "position": [
      0.035,
      0,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.472,
     1.173,
     0.471
    ],
    "center": [
     0.001,
     0.415,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/knife-gate-valve.svg",
    "standard": "ISO 10628-2 / ISO 14617-8 / PIP PIC001",
    "drawn": "Gate-valve bow-tie with a thin slab (two close parallel bars) drawn through the centre, standing proud of the body, and a handwheel stem.",
    "tags": [
     "HV"
    ],
    "notes": "Legends vary: some show a knife gate as a plain gate bow-tie with \"KG\" written beside it. A single bar through the centre is a butterfly. Typical in slurry, sand, drain and low-pressure water service.",
    "datasheet": {
     "form": "Knife gate valve datasheet (MSS SP-81)",
     "fields": {
      "Size": "nps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "horizontal-separator",
   "title": "Horizontal separator",
   "category": "vessels",
   "description": "Horizontal 3-phase or 2-phase separator, or knock-out drum, on Zick saddles (one sliding). 2:1 ellipsoidal heads with real nozzle openings, water boot, inlet deflector, calming baffle, weir plate, mesh pad and vortex breaker inside, level bridle with magnetic gauge and GWR transmitter, blinded vent and drain, davit manway, earth boss and a top access platform with caged ladder. Shell wall from ASME VIII-1 UG-27 for the design pressure.",
   "import": "./vessels/horizontal-separator",
   "export": "HorizontalSeparator",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "API 12J",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "SLB (Cameron)",
    "Cimarron"
   ],
   "tags": [
    "separator",
    "three-phase",
    "KO drum",
    "flare drum",
    "production"
   ],
   "params": [
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "3-phase",
      "2-phase",
      "ko-drum"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 0.8,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 3,
     "max": 24,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "elevation",
     "label": "Shell bottom",
     "type": "number",
     "min": 0.8,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "gasNps",
     "label": "Gas outlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "liquidNps",
     "label": "Liquid outlet",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "platform",
     "label": "Top platform",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "service": "3-phase",
    "diameter": 2.4,
    "length": 8,
    "elevation": 1.8,
    "pressure": 40,
    "rating": 600,
    "inletNps": 10,
    "gasNps": 8,
    "liquidNps": 6,
    "waterNps": 4,
    "psvNps": 3,
    "insulated": false,
    "platform": true,
    "tag": "V-100",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -4.8987,
      3.04,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "gas",
     "label": "Gas outlet",
     "position": [
      3.2,
      4.5197,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "liquid",
     "label": "Oil outlet",
     "position": [
      3.2,
      1.5763,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 6,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "water",
     "label": "Water outlet",
     "position": [
      2.4,
      1.305,
      -0.5679
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 4,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "psv",
     "label": "PSV",
     "position": [
      -0.8,
      4.4689,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 3,
     "rating": 600,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     10.107,
     5.551,
     3.003
    ],
    "center": [
     0.117,
     2.776,
     0.258
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/horizontal-separator.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Horizontal capsule (rectangle with semi-elliptical ends). A 3-phase separator shows a weir plate inside and a water boot below; a 2-phase separator a mesh pad at the gas outlet; a KO drum is plain.",
    "tags": [
     "V",
     "D",
     "VA",
     "VD"
    ],
    "notes": "Vertical capsule = vertical-separator. Long capsule with closure door at one end = pig-launcher. A horizontal capsule with filter elements and a lower sump barrel = filter-separator.",
    "datasheet": {
     "form": "Pressure vessel datasheet (ASME VIII-1; API 12J)",
     "fields": {
      "Service": "service",
      "Inside diameter": "diameter",
      "Length T/T": "length",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Gas outlet size": "gasNps",
      "Liquid outlet size": "liquidNps",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "vertical-separator",
   "title": "Vertical separator / scrubber",
   "category": "vessels",
   "description": "Vertical two-phase separator or gas scrubber on a skirt (access opening, pipe sleeves, base ring, anchor chairs) or pipe legs. 2:1 heads, UG-27 shell wall, conforming nozzle pads, mist-eliminator manway with davit, level bridle with magnetic gauge and GWR transmitter, bottom outlet routed out through the skirt, ring platforms with caged ladders and a top davit. Inside: vane-type inlet distributor, mesh pad on a support ring and a vortex breaker, seen through the open nozzle bores.",
   "import": "./vessels/vertical-separator",
   "export": "VerticalSeparator",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "API 12J",
    "ASME B16.5",
    "ISO 14122"
   ],
   "vendors": [
    "Sulzer",
    "NOV"
   ],
   "tags": [
    "separator",
    "scrubber",
    "knock-out",
    "two-phase",
    "compression"
   ],
   "params": [
    {
     "key": "support",
     "label": "Support",
     "type": "select",
     "options": [
      "skirt",
      "legs"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 0.6,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 2,
     "max": 14,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "gasNps",
     "label": "Gas outlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "liquidNps",
     "label": "Liquid outlet",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "platform",
     "label": "Platforms",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 1.8,
    "height": 5.5,
    "pressure": 40,
    "rating": 600,
    "inletNps": 10,
    "gasNps": 8,
    "liquidNps": 4,
    "psvNps": 3,
    "drainNps": 2,
    "support": "skirt",
    "insulated": false,
    "platform": true,
    "tag": "V-200",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -1.1887,
      4.85,
      0
     ],
     "direction": [
      -1,
      0,
      -1.2246467991473532e-16
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "gas",
     "label": "Gas outlet",
     "position": [
      0,
      8.3197,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "liquid",
     "label": "Liquid outlet",
     "position": [
      1.138,
      1.3476,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "psv",
     "label": "PSV",
     "position": [
      0,
      8.2046,
      -0.465
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 3,
     "rating": 600,
     "kind": "relief"
    },
    {
     "id": "vent",
     "label": "Vent",
     "position": [
      -0.4027,
      8.1952,
      0.2325
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "vent"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      0.5548,
      1.3476,
      -0.9609
     ],
     "direction": [
      0.5000000000000001,
      0,
      -0.8660254037844386
     ],
     "nps": 2,
     "rating": 600,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     4.48,
     9.535,
     3.919
    ],
    "center": [
     0.28,
     4.767,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/vertical-separator.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Vertical capsule (tall rectangle with elliptical heads) with a mesh pad or vane pack drawn as a hatched band near the top, gas outlet at the top, inlet on the side and liquid outlet at the bottom; scrubbers are tall and slim.",
    "tags": [
     "V",
     "D",
     "VG",
     "VD"
    ],
    "notes": "A taller capsule with trays or packing is a column; one with cartridges and a tube sheet is a cartridge filter. Scrubbers, KO drums and inlet separators all use this symbol: the internals and service decide.",
    "datasheet": {
     "form": "Pressure vessel datasheet (ASME VIII-1; API 12J)",
     "fields": {
      "Support": "support",
      "Inside diameter": "diameter",
      "Height T/T": "height",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Gas outlet size": "gasNps",
      "Liquid outlet size": "liquidNps",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "column",
   "title": "Trayed / packed column",
   "category": "vessels",
   "description": "Tall trayed or packed column such as a TEG contactor, amine absorber or condensate stabiliser. Skirt with access openings, UG-27 shell, a davit manway per section plus the sump, feed, reflux, reboiler-return and overhead nozzles, P/T gauges per section, sump level bridle, ring platforms at every manway and at most 6 m apart with alternating caged ladders, and a top davit. Fireproofed skirt, lifting trunnions and a tailing lug; sieve trays with downcomers or packed beds with distributors inside.",
   "import": "./vessels/column",
   "export": "Column",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "ISO 14122",
    "API 12GDU",
    "API 2218"
   ],
   "vendors": [],
   "tags": [
    "column",
    "tower",
    "contactor",
    "absorber",
    "stabiliser",
    "TEG",
    "amine"
   ],
   "params": [
    {
     "key": "internals",
     "label": "Internals",
     "type": "select",
     "options": [
      "trayed",
      "packed"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 0.6,
     "max": 5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 6,
     "max": 50,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "sections",
     "label": "Sections",
     "type": "number",
     "min": 1,
     "max": 6,
     "step": 1
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "feedNps",
     "label": "Feed",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "overheadNps",
     "label": "Overhead",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "bottomsNps",
     "label": "Bottoms",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "refluxNps",
     "label": "Reflux",
     "type": "nps",
     "min": 1,
     "max": 12
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "fireproofing",
     "label": "Skirt fireproofing",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 1.5,
    "height": 18,
    "sections": 2,
    "internals": "trayed",
    "pressure": 70,
    "rating": 600,
    "feedNps": 8,
    "overheadNps": 8,
    "bottomsNps": 4,
    "refluxNps": 3,
    "reboilerNps": 8,
    "psvNps": 3,
    "insulated": false,
    "fireproofing": true,
    "tag": "T-300",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "feed",
     "label": "Feed",
     "position": [
      -1.0347,
      12.73,
      0
     ],
     "direction": [
      -1,
      0,
      -1.2246467991473532e-16
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "overhead",
     "label": "Overhead vapour",
     "position": [
      0,
      21.6097,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "reflux",
     "label": "Reflux / lean solvent",
     "position": [
      -0.8521,
      20.5,
      -0.4919
     ],
     "direction": [
      -0.8660254037844387,
      0,
      -0.49999999999999994
     ],
     "nps": 3,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "reboiler",
     "label": "Reboiler return",
     "position": [
      -0.5173,
      4.66,
      -0.8961
     ],
     "direction": [
      -0.4999999999999998,
      0,
      -0.8660254037844387
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "bottoms",
     "label": "Bottoms",
     "position": [
      1.003,
      2.2576,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "psv",
     "label": "PSV",
     "position": [
      0,
      21.5026,
      -0.3975
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 3,
     "rating": 600,
     "kind": "relief"
    },
    {
     "id": "vent",
     "label": "Vent",
     "position": [
      -0.3442,
      21.4932,
      0.1988
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "vent"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      0.4873,
      2.2576,
      -0.8439
     ],
     "direction": [
      0.5000000000000001,
      0,
      -0.8660254037844386
     ],
     "nps": 2,
     "rating": 600,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     4.087,
     22.925,
     3.65
    ],
    "center": [
     0.219,
     11.462,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/column.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Tall vertical capsule with trays drawn as short horizontal lines alternating from the left and right walls (segmental trays), or a section with crossed diagonals for packing; overhead at the top, bottoms at the bottom, feed and reflux on the side.",
    "tags": [
     "T",
     "C",
     "V"
    ],
    "notes": "Alternating tray lines or an X-crossed packed bed = column (TEG contactor, absorber, stabiliser). A shorter vessel with only a mesh pad is a vertical-separator.",
    "datasheet": {
     "form": "Column / tower datasheet (ASME VIII-1; tray or packing sheet)",
     "fields": {
      "Internals": "internals",
      "Inside diameter": "diameter",
      "Height T/T": "height",
      "Number of sections": "sections",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Feed nozzle size": "feedNps",
      "Overhead nozzle size": "overheadNps",
      "Bottoms nozzle size": "bottomsNps",
      "Reflux nozzle size": "refluxNps",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "filter-separator",
   "title": "Gas filter-separator",
   "category": "vessels",
   "description": "Horizontal two-stage gas filter-separator: coalescing filter section and vane section in the upper barrel, one liquid sump barrel per stage with its own downcomer, level gauge and drain, and a davit-hinged quick-opening closure with locking band, handwheel and pressure-warning lock for element change-out. Saddles, sump level gauges, PDI across the elements, nameplate and lifting lugs.",
   "import": "./vessels/filter-separator",
   "export": "FilterSeparator",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "API 12J"
   ],
   "vendors": [
    "Parker (PECO)"
   ],
   "tags": [
    "filter",
    "filter-separator",
    "coalescer",
    "fuel gas",
    "gas treatment"
   ],
   "params": [
    {
     "key": "diameter",
     "label": "Barrel inside diameter",
     "type": "number",
     "min": 0.3,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Barrel length",
     "type": "number",
     "min": 1.5,
     "max": 10,
     "step": 0.25,
     "unit": "m"
    },
    {
     "key": "sumpDiameter",
     "label": "Sump inside diameter",
     "type": "number",
     "min": 0.2,
     "max": 0.8,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 5,
     "max": 200,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 2,
     "max": 24
    },
    {
     "key": "drainNps",
     "label": "Drains",
     "type": "nps",
     "min": 1,
     "max": 4
    },
    {
     "key": "insulated",
     "label": "Insulated",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 0.9,
    "length": 4.5,
    "sumpDiameter": 0.4,
    "pressure": 90,
    "rating": 600,
    "inletNps": 8,
    "outletNps": 8,
    "drainNps": 2,
    "psvNps": 2,
    "insulated": false,
    "tag": "F-100",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -1.35,
      2.4252,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      1.62,
      2.4252,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 8,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "drain-1",
     "label": "Drain, filter section",
     "position": [
      -0.5799,
      0.3,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "drain"
    },
    {
     "id": "drain-2",
     "label": "Drain, vane section",
     "position": [
      1.0701,
      0.3,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "drain"
    },
    {
     "id": "psv",
     "label": "PSV",
     "position": [
      0.27,
      2.365,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     5.348,
     2.459,
     1.435
    ],
    "center": [
     -0.164,
     1.229,
     0.128
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/filter-separator.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Horizontal vessel with filter elements (dashed vertical lines) in the first section, a vane or mesh pack in the second, a smaller liquid sump barrel below joined by downcomers, and a quick-opening closure (thick bar) at the filter end.",
    "tags": [
     "V",
     "F",
     "S"
    ],
    "notes": "The second barrel underneath and the filter elements tell it from a horizontal separator. A vertical housing with cartridges is a cartridge-filter.",
    "datasheet": {
     "form": "Filter-separator datasheet (ASME VIII-1; API 12J)",
     "fields": {
      "Inside diameter": "diameter",
      "Length T/T": "length",
      "Sump diameter": "sumpDiameter",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Drain size": "drainNps",
      "Insulation": "insulated",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "cartridge-filter",
   "title": "Cartridge filter / coalescer housing",
   "category": "vessels",
   "description": "Vertical cartridge filter or coalescer housing on pipe legs. Davit-hinged top closure: hinged swing-bolt cover, quick-opening locking-band door with pressure-warning lock, or a bolted body flange, all with a davit lifting screw. Inlet below the tube sheet and outlet above it, PDI with isolation valves across the elements, vent and drain, nameplate and earth boss. Also covers basket strainers and filter housings.",
   "import": "./vessels/cartridge-filter",
   "export": "CartridgeFilter",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5"
   ],
   "vendors": [
    "Facet (Parker)",
    "Parker Velcon",
    "Ergil"
   ],
   "tags": [
    "filter",
    "cartridge",
    "coalescer",
    "filter housing",
    "quick-opening closure"
   ],
   "params": [
    {
     "key": "closure",
     "label": "Closure",
     "type": "select",
     "options": [
      "swing-bolt",
      "quick-opening",
      "bolted"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 0.2,
     "max": 1.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 0.6,
     "max": 3.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 150,
     "step": 1,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 1,
     "max": 16
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 1,
     "max": 16
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 0.6,
    "height": 1.6,
    "pressure": 20,
    "rating": 300,
    "inletNps": 4,
    "outletNps": 4,
    "closure": "swing-bolt",
    "tag": "F-200",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -0.4939,
      1.02,
      0
     ],
     "direction": [
      -1,
      0,
      -1.2246467991473532e-16
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      0.4939,
      2.018,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "vent",
     "label": "Vent",
     "position": [
      0,
      2.25,
      -0.47
     ],
     "direction": [
      6.123233995736766e-17,
      0,
      -1
     ],
     "nps": 1,
     "rating": 300,
     "kind": "vent"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      0,
      0.45,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 1,
     "rating": 300,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     1.038,
     3.04,
     1.033
    ],
    "center": [
     0,
     1.52,
     0.026
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/cartridge-filter.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (filter: vessel with a dashed filter medium line)",
    "drawn": "Vertical housing on legs with a tube sheet line and the cartridges as dashed lines (or a single dashed line across for the filter medium), a quick-opening or bolted closure at the top, and a PDI / PDT across inlet and outlet.",
    "tags": [
     "F",
     "V"
    ],
    "isa": [
     "PDI",
     "PDT"
    ],
    "notes": "ISO and PIP draw any filter as a vessel crossed by a dashed line; coalescers add \"COALESCER\". A horizontal vessel with a sump barrel is a filter-separator; a Y in the line is a y-strainer.",
    "datasheet": {
     "form": "Filter / coalescer datasheet (ASME VIII-1)",
     "fields": {
      "Closure type": "closure",
      "Inside diameter": "diameter",
      "Height T/T": "height",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "storage-tank",
   "title": "Atmospheric storage tank (API 650)",
   "category": "vessels",
   "description": "API 650 vertical cylindrical tank on a concrete ringwall. Shell courses sized by the one-foot method, with stepped thicknesses, horizontal and staggered vertical seams, a self-supporting cone (1:6) or dome roof with lap seams, top curb angle and an intermediate wind girder where the shell exceeds the stable height. Spiral stairway, roof landing and perimeter handrail, walkway to the gauge hatch, radar gauge, PV breather and emergency vents, shell and roof manways, product band and tag stencil. Optional fire protection: foam chambers with foam makers and risers, and a shell cooling spray ring.",
   "import": "./vessels/storage-tank",
   "export": "StorageTank",
   "anchor": "base",
   "standards": [
    "API 650",
    "API 2000",
    "NFPA 11",
    "NFPA 15",
    "ISO 14122",
    "ISO 14726"
   ],
   "vendors": [
    "Superior Tank",
    "Angus Fire (foam / spray systems)"
   ],
   "tags": [
    "tank",
    "storage",
    "atmospheric",
    "crude",
    "diesel",
    "water"
   ],
   "params": [
    {
     "key": "roof",
     "label": "Roof",
     "type": "select",
     "options": [
      "cone",
      "dome"
     ]
    },
    {
     "key": "diameter",
     "label": "Diameter",
     "type": "number",
     "min": 3,
     "max": 60,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Shell height",
     "type": "number",
     "min": 2.4,
     "max": 24,
     "step": 0.2,
     "unit": "m"
    },
    {
     "key": "gravity",
     "label": "Specific gravity",
     "type": "number",
     "min": 0.6,
     "max": 1.3,
     "step": 0.05
    },
    {
     "key": "productColor",
     "label": "Product band",
     "type": "color"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 36
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 2,
     "max": 36
    },
    {
     "key": "drainNps",
     "label": "Drain",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "fireProtection",
     "label": "Foam + cooling ring",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 12,
    "height": 10,
    "roof": "cone",
    "productColor": "#7A4A24",
    "inletNps": 8,
    "outletNps": 8,
    "drainNps": 3,
    "gravity": 0.9,
    "fireProtection": true,
    "tag": "TK-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -5.0841,
      0.9,
      3.56
     ],
     "direction": [
      -0.819152044288992,
      0,
      0.5735764363510458
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      -3.56,
      0.8,
      -5.0841
     ],
     "direction": [
      -0.5735764363510458,
      0,
      -0.819152044288992
     ],
     "nps": 8,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      0.5382,
      0.55,
      6.1514
     ],
     "direction": [
      0.08715574274765789,
      0,
      0.9961946980917455
     ],
     "nps": 3,
     "rating": 150,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     13.918,
     11.66,
     13.401
    ],
    "center": [
     0.098,
     5.83,
     -0.169
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/storage-tank.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Flat-bottomed vertical rectangle on grade with a shallow cone (triangle) or dome roof, inlet near the top, outlet near the bottom; floating-roof tanks show the roof as a line inside the shell. Breather / PVRV and emergency vents sit on the roof.",
    "tags": [
     "T",
     "TK"
    ],
    "notes": "Flat bottom on grade = atmospheric tank (API 650); a capsule with elliptical heads = pressure vessel. A circle on legs is a sphere.",
    "datasheet": {
     "form": "API 650 storage tank datasheet",
     "fields": {
      "Roof type": "roof",
      "Diameter": "diameter",
      "Shell height": "height",
      "Specific gravity": "gravity",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Drain size": "drainNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "spherical-tank",
   "title": "LPG sphere",
   "category": "vessels",
   "description": "Pressurised LPG / butane storage sphere on tangent equator legs. UG-27(d) shell with orange-peel plate seams, concrete-fireproofed legs on pedestals, offset diagonal tie rods with turnbuckles, top and bottom polar manways, bottom inlet and outlet, radar gauge, twin API 526 PSVs into a relief header, top platform, a straight stair tangent to the shell continuing as a curved stair over the top, and a deluge riser with a spray ring.",
   "import": "./vessels/spherical-tank",
   "export": "SphericalTank",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "API 2510",
    "API 526",
    "NFPA 15",
    "ISO 14122"
   ],
   "vendors": [
    "CB&I (McDermott) Hortonsphere",
    "Fabtank"
   ],
   "tags": [
    "sphere",
    "LPG",
    "butane",
    "pressure storage",
    "Horton sphere"
   ],
   "params": [
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 6,
     "max": 25,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 30,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "legs",
     "label": "Legs (0 = auto)",
     "type": "number",
     "min": 0,
     "max": 16,
     "step": 1
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 2,
     "max": 16
    },
    {
     "key": "fireproofing",
     "label": "Leg fireproofing",
     "type": "bool"
    },
    {
     "key": "deluge",
     "label": "Deluge ring",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 14,
    "pressure": 17,
    "rating": 300,
    "inletNps": 6,
    "outletNps": 6,
    "psvNps": 6,
    "legs": 0,
    "fireproofing": true,
    "deluge": true,
    "tag": "TK-500"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      1.2124,
      1.8419,
      -0.7
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      -1.2124,
      1.8419,
      0.7
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 6,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "psv",
     "label": "Relief header",
     "position": [
      1.5,
      16.2697,
      0.42
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     18,
     17.25,
     29.236
    ],
    "center": [
     1.399,
     8.572,
     7.017
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/spherical-tank.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "A circle standing on legs that touch it at the equator, with top and bottom nozzles; often with a water-spray (deluge) ring drawn around it.",
    "tags": [
     "T",
     "TK",
     "V"
    ],
    "notes": "Circle on legs = sphere. A circle on its own in a line could be a pump or an instrument bubble: check for legs and size.",
    "datasheet": {
     "form": "Pressure storage datasheet (ASME VIII-1 / API 2510)",
     "fields": {
      "Diameter": "diameter",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Number of legs": "legs",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Leg fireproofing": "fireproofing",
      "Deluge ring": "deluge",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "air-receiver",
   "title": "Air / nitrogen receiver",
   "category": "vessels",
   "description": "Vertical instrument-air, plant-air or nitrogen receiver on pipe legs or a slotted base ring. 2:1 heads, UG-27 shell, inlet low and outlet high on opposite sides, elliptical inspection manway with yoke and nut, API 526 PSV on the top head, pressure gauge with siphon and isolation valve, timer auto-drain, lifting lugs, nameplate and earth boss. Also suits accumulators and buffer vessels.",
   "import": "./vessels/air-receiver",
   "export": "AirReceiver",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "API 526"
   ],
   "vendors": [
    "Man Tank"
   ],
   "tags": [
    "receiver",
    "instrument air",
    "nitrogen",
    "accumulator",
    "utilities"
   ],
   "params": [
    {
     "key": "support",
     "label": "Support",
     "type": "select",
     "options": [
      "legs",
      "base-ring"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 0.4,
     "max": 2.5,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 0.8,
     "max": 6,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 3,
     "max": 40,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 1,
     "max": 8
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 1,
     "max": 8
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 0.9,
    "height": 2,
    "pressure": 11,
    "rating": 150,
    "inletNps": 2,
    "outletNps": 2,
    "support": "legs",
    "tag": "V-4700",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -0.6215,
      1.313,
      0
     ],
     "direction": [
      -1,
      0,
      -1.2246467991473532e-16
     ],
     "nps": 2,
     "rating": 150,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      0.6215,
      2.593,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 150,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.284,
     3.792,
     1.105
    ],
    "center": [
     0,
     1.896,
     0.092
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/air-receiver.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Plain vertical capsule on legs with no internals, inlet low on one side, outlet high on the other, a PSV on top and an auto-drain at the bottom, on the instrument-air or nitrogen system.",
    "tags": [
     "V",
     "D",
     "VA"
    ],
    "isa": [
     "PT",
     "PI",
     "PSV"
    ],
    "notes": "An empty vertical vessel on an IA / UA / N2 line is a receiver; with a mesh pad and liquid outlet it is a vertical-separator.",
    "datasheet": {
     "form": "Pressure vessel datasheet (ASME VIII-1)",
     "fields": {
      "Support": "support",
      "Inside diameter": "diameter",
      "Height T/T": "height",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "desander",
   "title": "Wellhead cyclonic desander",
   "category": "vessels",
   "description": "Skid-mounted wellhead desander: a liner housing with tangential inlet, cone and bolted cover with the overflow outlet on top, dual isolation gate valves down to a 2:1-head sand accumulator, sand dump valve and elbow to a flanged sand outlet, flush-water and depressuring connections, pressure gauge, and a lifting frame with support beams, bracing and padeyes. The housing and accumulator walls follow UG-27 for the design pressure.",
   "import": "./vessels/desander",
   "export": "Desander",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "ASME B16.5",
    "API 6A (flange class equivalent)",
    "DNV 2.7-1"
   ],
   "vendors": [
    "NOV",
    "Expro",
    "Hunting"
   ],
   "tags": [
    "desander",
    "sand",
    "cyclone",
    "wellhead",
    "solids"
   ],
   "params": [
    {
     "key": "diameter",
     "label": "Accumulator ID",
     "type": "number",
     "min": 0.3,
     "max": 1.2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "height",
     "label": "Accumulator T/T",
     "type": "number",
     "min": 0.8,
     "max": 3.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 20,
     "max": 700,
     "step": 10,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "sandNps",
     "label": "Sand outlet",
     "type": "nps",
     "min": 2,
     "max": 4
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 0.6,
    "height": 1.8,
    "pressure": 250,
    "rating": 1500,
    "inletNps": 4,
    "outletNps": 4,
    "sandNps": 3,
    "tag": "V-N230",
    "paint": "equipmentPaint"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet (tangential)",
     "position": [
      -0.3903,
      6.2617,
      0.0928
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 4,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Overflow outlet",
     "position": [
      0,
      6.8749,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "sand",
     "label": "Sand dump",
     "position": [
      0.4643,
      0.4614,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 3,
     "rating": 1500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     1.732,
     7.329,
     1.647
    ],
    "center": [
     0,
     3.665,
     0.003
    ]
   },
   "registryDependencies": [
    "core",
    "gate-valve"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/desander.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (cyclone)",
    "drawn": "A cyclone (short cylinder over an inverted cone) with a tangential inlet on the side and the overflow out of the top, the underflow dropping through two isolation valves into a sand accumulator vessel below that is dumped periodically.",
    "tags": [
     "V",
     "DS",
     "X"
    ],
    "isa": [
     "PDT",
     "LT",
     "XV"
    ],
    "notes": "A cone over an accumulator on a well stream = desander. Produced-water hydrocyclones are horizontal multi-liner vessels without the accumulator. ISA codes here: LT = sand; XV = dump.",
    "datasheet": {
     "form": "Desander datasheet (ASME VIII-1; API 6A-class end connections)",
     "fields": {
      "Liner housing diameter": "diameter",
      "Height": "height",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet size": "inletNps",
      "Outlet size": "outletNps",
      "Sand dump size": "sandNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "bullet-tank",
   "title": "LPG bullet tank",
   "category": "vessels",
   "description": "Horizontal pressurised LPG / propane storage (bullet) on a fixed and a sliding saddle. Hemispherical or 2:1 heads with real nozzle openings, top liquid inlet and vapour balance, bottom liquid outlet and drain, two davit manways, twin API 526 PSVs into a relief header, magnetic-flap level bridle with transmitter, pressure and temperature gauges, top walkway with caged ladder, deluge spray headers with riser, earth bosses and nameplate.",
   "import": "./vessels/bullet-tank",
   "export": "BulletTank",
   "anchor": "base",
   "standards": [
    "ASME BPVC VIII-1",
    "API 2510",
    "API 526",
    "NFPA 58",
    "ISO 14122"
   ],
   "vendors": [
    "DNOW",
    "Jianshen"
   ],
   "tags": [
    "bullet",
    "LPG",
    "propane",
    "pressure storage",
    "horizontal tank"
   ],
   "params": [
    {
     "key": "heads",
     "label": "Heads",
     "type": "select",
     "options": [
      "hemispherical",
      "2:1"
     ]
    },
    {
     "key": "diameter",
     "label": "Inside diameter",
     "type": "number",
     "min": 1.2,
     "max": 4.5,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "length",
     "label": "Tangent to tangent",
     "type": "number",
     "min": 5,
     "max": 40,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "pressure",
     "label": "Design pressure",
     "type": "number",
     "min": 5,
     "max": 30,
     "step": 0.5,
     "unit": "barg"
    },
    {
     "key": "rating",
     "label": "Nozzle class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "outletNps",
     "label": "Outlet",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "vapourNps",
     "label": "Vapour",
     "type": "nps",
     "min": 2,
     "max": 8
    },
    {
     "key": "deluge",
     "label": "Deluge",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "diameter": 3,
    "length": 16,
    "pressure": 17.5,
    "rating": 300,
    "heads": "hemispherical",
    "inletNps": 4,
    "outletNps": 4,
    "vapourNps": 3,
    "psvNps": 6,
    "deluge": true,
    "tag": "V-600"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Liquid inlet",
     "position": [
      -4.8,
      4.6359,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Liquid outlet",
     "position": [
      -2.88,
      1.2141,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 4,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "vapour",
     "label": "Vapour balance",
     "position": [
      4.8,
      4.6292,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 3,
     "rating": 300,
     "kind": "process"
    },
    {
     "id": "psv",
     "label": "Relief header",
     "position": [
      1.35,
      4.7658,
      -0.45
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 150,
     "kind": "relief"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      2.88,
      1.2301,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 2,
     "rating": 300,
     "kind": "drain"
    }
   ],
   "bounds": {
    "size": [
     19.775,
     5.694,
     3.791
    ],
    "center": [
     0.363,
     2.847,
     0.368
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/bullet-tank.svg",
    "standard": "ISO 10628-2 / PIP PIC001",
    "drawn": "Horizontal capsule with hemispherical or 2:1 heads standing on two saddles, liquid inlet and vapour balance on top and liquid outlet at the bottom; a deluge ring or water-spray line is often drawn around it.",
    "tags": [
     "V",
     "T",
     "TK"
    ],
    "notes": "A horizontal capsule with no internals or boot in LPG / NGL storage service is a bullet; separators show a weir, boot or mesh pad. Spheres are circles on legs.",
    "datasheet": {
     "form": "Pressure storage datasheet (ASME VIII-1 / API 2510 / NFPA 58)",
     "fields": {
      "Head type": "heads",
      "Diameter": "diameter",
      "Length T/T": "length",
      "Design pressure": "pressure",
      "Flange rating": "rating",
      "Inlet nozzle size": "inletNps",
      "Outlet nozzle size": "outletNps",
      "Vapour nozzle size": "vapourNps",
      "Deluge ring": "deluge",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "slug-catcher",
   "title": "Finger-type slug catcher",
   "category": "vessels",
   "description": "Pipeline-terminal finger slug catcher built from line pipe: an inlet header splits the flow into parallel upper separation fingers, downcomers drop liquid into sloped storage fingers below, gas risers at the end of the separation fingers join a gas header, and the low end of the storage fingers runs into a liquid header. Every tee is a real opening. Concrete sleepers with pipe shoes, steel portals, girth welds every 12 m.",
   "import": "./vessels/slug-catcher",
   "export": "SlugCatcher",
   "anchor": "base",
   "standards": [
    "ASME B31.8",
    "ASME B16.5",
    "ASME B36.10"
   ],
   "vendors": [],
   "tags": [
    "slug catcher",
    "finger",
    "pipeline",
    "terminal",
    "inlet facilities"
   ],
   "params": [
    {
     "key": "fingers",
     "label": "Fingers",
     "type": "number",
     "min": 2,
     "max": 10,
     "step": 1
    },
    {
     "key": "fingerNps",
     "label": "Finger size",
     "type": "nps",
     "min": 16,
     "max": 48
    },
    {
     "key": "length",
     "label": "Storage length",
     "type": "number",
     "min": 12,
     "max": 120,
     "step": 2,
     "unit": "m"
    },
    {
     "key": "slope",
     "label": "Fall",
     "type": "number",
     "min": 0,
     "max": 3,
     "step": 0.1,
     "unit": "%"
    },
    {
     "key": "rating",
     "label": "Flange class",
     "type": "rating"
    },
    {
     "key": "inletNps",
     "label": "Inlet",
     "type": "nps",
     "min": 8,
     "max": 42
    },
    {
     "key": "gasNps",
     "label": "Gas outlet",
     "type": "nps",
     "min": 6,
     "max": 36
    },
    {
     "key": "liquidNps",
     "label": "Liquid outlet",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "fingers": 4,
    "fingerNps": 36,
    "length": 36,
    "slope": 1,
    "inletNps": 24,
    "gasNps": 20,
    "liquidNps": 10,
    "rating": 600,
    "tag": "SC-100"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -2.1335,
      3.019,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 24,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "gas",
     "label": "Gas outlet",
     "position": [
      13.486,
      5.076,
      5.6146
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 20,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "liquid",
     "label": "Liquid outlet",
     "position": [
      37.9335,
      1.057,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     40.165,
     5.482,
     10.51
    ],
    "center": [
     17.889,
     2.741,
     0.411
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/slug-catcher.svg",
    "standard": "ISO 10628-2 / PIP PIC001 (pipeline terminal)",
    "drawn": "An inlet header splitting into several parallel, slightly sloped long pipes (fingers), with gas risers from the top of the fingers to a gas header and the liquid draining to a liquid header at the low end.",
    "tags": [
     "V"
    ],
    "isa": [
     "LT",
     "PT"
    ],
    "notes": "Parallel sloped fingers between headers identify a finger slug catcher; a vessel-type slug catcher is drawn as a large horizontal separator.",
    "datasheet": {
     "form": "Slug catcher datasheet (ASME B31.8)",
     "fields": {
      "Number of fingers": "fingers",
      "Finger size": "fingerNps",
      "Finger length": "length",
      "Slope": "slope",
      "Flange rating": "rating",
      "Inlet size": "inletNps",
      "Gas outlet size": "gasNps",
      "Liquid outlet size": "liquidNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "christmas-tree",
   "title": "Christmas tree (surface, API 6A)",
   "category": "wellhead",
   "description": "Surface wellhead and christmas tree on a conductor: casing head, tubing head spool with annulus valves and SCSSV control-line exit, tubing-head adapter, manual lower master, hydraulic SSV upper master with a heat-sensitive lock-open (fusible) device, studded cross, swab valve and tree cap with EUE lift thread, needle valve and gauge. Spools carry secondary-seal test ports and lockdown screws. The production wing carries a hydraulic wing valve, flow tee with THP gauge and an angle choke whose outlet turns into a B16.5 flowline flange; the kill wing has a manual valve and crossover. API 6B/6BX flanges and gate lengths scale with pressure rating and bore.",
   "import": "./wellhead/christmas-tree",
   "export": "ChristmasTree",
   "anchor": "base",
   "standards": [
    "API 6A",
    "API 6B / 6BX",
    "API 14D (SSV)",
    "ASME B16.5"
   ],
   "vendors": [
    "SLB (Cameron)",
    "Weatherford",
    "Baker Hughes (Vetco Gray)",
    "Sentry Wellhead Systems"
   ],
   "tags": [
    "wellhead",
    "xmas tree",
    "SSV",
    "choke",
    "producer",
    "injector"
   ],
   "params": [
    {
     "key": "pressureRating",
     "label": "Working pressure",
     "type": "select",
     "options": [
      {
       "value": 5000,
       "label": "5,000 psi"
      },
      {
       "value": 10000,
       "label": "10,000 psi"
      }
     ]
    },
    {
     "key": "bore",
     "label": "Tree bore",
     "type": "select",
     "options": [
      {
       "value": 2.0625,
       "label": "2-1/16\""
      },
      {
       "value": 2.5625,
       "label": "2-9/16\""
      },
      {
       "value": 3.125,
       "label": "3-1/8\" (3-1/16\" at 10k)"
      },
      {
       "value": 4.0625,
       "label": "4-1/16\""
      }
     ]
    },
    {
     "key": "wellType",
     "label": "Well type",
     "type": "select",
     "options": [
      "producer",
      "gas",
      "injector"
     ]
    },
    {
     "key": "wellheadHeight",
     "label": "Wellhead height",
     "type": "number",
     "min": 0.5,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "flowlineNps",
     "label": "Flowline",
     "type": "nps",
     "min": 2,
     "max": 6
    },
    {
     "key": "flowlineRating",
     "label": "Flowline class",
     "type": "rating",
     "options": [
      900,
      1500,
      2500
     ]
    },
    {
     "key": "choke",
     "label": "Choke opening",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "pressureRating": 5000,
    "bore": 3.125,
    "wellType": "producer",
    "wellheadHeight": 1.1,
    "flowlineNps": 4,
    "flowlineRating": 1500,
    "choke": 0.5,
    "tag": "XT-101"
   },
   "ports": [
    {
     "id": "production",
     "label": "Production outlet",
     "position": [
      1.4309,
      1.931,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 4,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "kill",
     "label": "Kill wing",
     "position": [
      -0.7363,
      2.4847,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 2,
     "rating": 1500,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     2.281,
     4.163,
     1.399
    ],
    "center": [
     0.379,
     1.582,
     0.101
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/christmas-tree.svg",
    "standard": "ISO 10628-2 / PIP PIC001 valves; API 6A / API RP 14C wellhead conventions",
    "drawn": "A vertical run of valves above the wellhead: lower master (manual), upper master (SSV, with an actuator box), a cross with the production wing valve (often actuated) and the choke (bow-tie with a diagonal arrow) on the side, and the swab valve and tree cap on top. The SCSSV is shown below the wellhead as a valve with a control-line note.",
    "tags": [
     "XT",
     "W",
     "WH"
    ],
    "isa": [
     "SSV",
     "USV",
     "SCSSV",
     "XV",
     "PT",
     "TT"
    ],
    "notes": "A single vertical valve stack with a side wing and choke is a tree; a stack of boxes with rams is a BOP; a stack of spools with only annulus outlets is the wellhead housing. Injector trees have the wing on the injection line with the flow arrow into the well. ISA codes here: XV = wing.",
    "datasheet": {
     "form": "Wellhead and christmas tree datasheet (API 6A: PSL, PR, temperature and material class)",
     "fields": {
      "Rated working pressure": "pressureRating",
      "Tree bore": "bore",
      "Well type": "wellType",
      "Flowline size": "flowlineNps",
      "Flowline flange rating": "flowlineRating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "choke-valve",
   "title": "Wellhead choke (API 6A)",
   "category": "wellhead",
   "description": "Angle-body wellhead choke: forged block body with side inlet and bottom outlet, hammer-nut bonnet with three lugs, stem position indicator and handwheel, an electro-hydraulic stepping actuator, or a positive (fixed bean) blanking cap. API 6B/6BX end flanges sized from bore and working pressure; the 5,000 psi 6B bolt pattern matches ASME Class 1500, which is the class the ports report (10,000 psi reports Class 2500, the closest).",
   "import": "./wellhead/choke-valve",
   "export": "ChokeValve",
   "anchor": "fitting",
   "standards": [
    "API 6A",
    "API 6B / 6BX"
   ],
   "vendors": [
    "SLB (Cameron)",
    "WOM (Worldwide Oilfield Machine)",
    "Weatherford"
   ],
   "tags": [
    "choke",
    "flow control",
    "wellhead",
    "adjustable",
    "positive"
   ],
   "params": [
    {
     "key": "bore",
     "label": "Inlet bore",
     "type": "select",
     "options": [
      {
       "value": 2.0625,
       "label": "2-1/16\""
      },
      {
       "value": 2.5625,
       "label": "2-9/16\""
      },
      {
       "value": 3.125,
       "label": "3-1/8\" (3-1/16\" at 10k)"
      },
      {
       "value": 4.0625,
       "label": "4-1/16\""
      }
     ]
    },
    {
     "key": "outletBore",
     "label": "Outlet bore",
     "type": "select",
     "options": [
      {
       "value": 2.0625,
       "label": "2-1/16\""
      },
      {
       "value": 2.5625,
       "label": "2-9/16\""
      },
      {
       "value": 3.125,
       "label": "3-1/8\" (3-1/16\" at 10k)"
      },
      {
       "value": 4.0625,
       "label": "4-1/16\""
      }
     ]
    },
    {
     "key": "pressureRating",
     "label": "Working pressure",
     "type": "select",
     "options": [
      {
       "value": 5000,
       "label": "5,000 psi"
      },
      {
       "value": 10000,
       "label": "10,000 psi"
      }
     ]
    },
    {
     "key": "operator",
     "label": "Operator",
     "type": "select",
     "options": [
      "handwheel",
      "actuator",
      "positive"
     ]
    },
    {
     "key": "opening",
     "label": "Opening",
     "type": "number",
     "min": 0,
     "max": 1,
     "step": 0.05
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "bore": 3.125,
    "outletBore": 3.125,
    "pressureRating": 5000,
    "operator": "handwheel",
    "opening": 0.5,
    "tag": "HCV-101"
   },
   "ports": [
    {
     "id": "inlet",
     "label": "Inlet",
     "position": [
      -0.2126,
      0,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 3,
     "rating": 1500,
     "kind": "process"
    },
    {
     "id": "outlet",
     "label": "Outlet",
     "position": [
      0,
      -0.2526,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 3,
     "rating": 1500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     0.719,
     0.419,
     0.268
    ],
    "center": [
     0.114,
     -0.076,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/choke-valve.svg",
    "standard": "ISO 10628-2 / PIP PIC001 valves; API 6A / API RP 14C wellhead conventions (adjustable choke: valve body with a diagonal arrow)",
    "drawn": "An angle-body valve (side inlet, bottom outlet) or an in-line bow-tie with a diagonal arrow through it meaning adjustable restriction; a fixed (positive) choke has no arrow and a bean size note. Tagged HCV, PCV, FCV or CK.",
    "tags": [
     "CK",
     "HCV",
     "FCV",
     "PCV"
    ],
    "isa": [
     "HCV",
     "HV",
     "FV",
     "PV"
    ],
    "notes": "The diagonal arrow = variable choke. An angle body with a spring is a PSV, not a choke. A globe control valve with a dome actuator can also do choking duty; then it is control-valve.",
    "datasheet": {
     "form": "Choke valve datasheet (API 6A)",
     "fields": {
      "Inlet bore": "bore",
      "Outlet bore": "outletBore",
      "Rated working pressure": "pressureRating",
      "Operator": "operator",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "production-manifold",
   "title": "Production / test manifold",
   "category": "wellhead",
   "description": "Skid-mounted production and test manifold. Each well slot has a flanged inlet with a dual-plate check valve that rises, crosses over both headers and drops into each through a gear-operated full-bore ball valve, so the well can be diverted to production or test; the slot lined up to test shows the valve indicators swapped. Headers are weld-capped at one end and flanged at the other, on saddle supports, with riser and header gauges and transmitters, guides and a run support portal. (A multiport selector valve is the compact alternative to this valve-per-header layout.)",
   "import": "./wellhead/production-manifold",
   "export": "ProductionManifold",
   "anchor": "base",
   "standards": [
    "ASME B31.3",
    "ASME B16.5",
    "ASME B16.9",
    "API 6D"
   ],
   "vendors": [
    "Emerson (Bettis)",
    "Metalfab"
   ],
   "tags": [
    "manifold",
    "header",
    "test",
    "diverter",
    "well slots"
   ],
   "params": [
    {
     "key": "slots",
     "label": "Well slots",
     "type": "number",
     "min": 1,
     "max": 12,
     "step": 1
    },
    {
     "key": "pitch",
     "label": "Slot pitch",
     "type": "number",
     "min": 0.8,
     "max": 1.6,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "productionNps",
     "label": "Production header",
     "type": "nps",
     "min": 4,
     "max": 16
    },
    {
     "key": "testNps",
     "label": "Test header",
     "type": "nps",
     "min": 3,
     "max": 10
    },
    {
     "key": "inletNps",
     "label": "Slot inlet",
     "type": "nps",
     "min": 2,
     "max": 6
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "testSlot",
     "label": "Slot on test",
     "type": "number",
     "min": 0,
     "max": 12,
     "step": 1
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "slots": 6,
    "pitch": 1,
    "productionNps": 10,
    "testNps": 6,
    "inletNps": 4,
    "rating": 900,
    "testSlot": 2,
    "tag": "M-1000"
   },
   "ports": [
    {
     "id": "slot-1",
     "label": "Well slot 1",
     "position": [
      -2.6,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "slot-2",
     "label": "Well slot 2",
     "position": [
      -1.6,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "slot-3",
     "label": "Well slot 3",
     "position": [
      -0.6,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "slot-4",
     "label": "Well slot 4",
     "position": [
      0.4,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "slot-5",
     "label": "Well slot 5",
     "position": [
      1.4,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "slot-6",
     "label": "Well slot 6",
     "position": [
      2.4,
      0.658,
      1.75
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 4,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "production",
     "label": "Production header outlet",
     "position": [
      4.05,
      0.758,
      -0.6
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 10,
     "rating": 900,
     "kind": "process"
    },
    {
     "id": "test",
     "label": "Test header outlet",
     "position": [
      4.05,
      0.758,
      0.15
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 6,
     "rating": 900,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     7.793,
     2.108,
     2.984
    ],
    "center": [
     0.196,
     1.054,
     0.292
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/production-manifold.svg",
    "standard": "ISO 10628-2 / PIP PIC001 valves; API 6A / API RP 14C wellhead conventions",
    "drawn": "Two (or three) parallel headers, production and test, with each well flowline arriving through a check valve and branching to every header through its own valve, so one well can be routed to test while the rest go to production.",
    "tags": [
     "M",
     "MF"
    ],
    "notes": "The repeating slot pattern (one inlet, one valve per header) is the signature. A single header with branches is just a header pipe. Test header size is usually smaller; HP / LP headers may both be present.",
    "datasheet": {
     "form": "Manifold datasheet (ASME B31.3, API 6D valves)",
     "fields": {
      "Number of well slots": "slots",
      "Slot pitch": "pitch",
      "Production header size": "productionNps",
      "Test header size": "testNps",
      "Inlet size": "inletNps",
      "Flange rating": "rating",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "pig-launcher",
   "title": "Pig launcher / receiver",
   "category": "wellhead",
   "description": "Pig trap for launching or receiving pigs: oversized major barrel, reducer (eccentric flat-bottom on launchers, concentric on receivers), minor barrel with pig signaller and a full-bore trap valve, clamp-ring quick-opening closure with pressure-warning screw and key interlock, kicker (launcher) or bypass (receiver) nozzle with valve, vent, drain, thermal-relief PSV and a balance line with valve to pressurise both sides of the pig, adjustable saddle supports. The barrel is one to two sizes over the line; `closureOpen` swings the door on its hinge. The `service` prop picks launcher or receiver (named so to avoid the reserved `type`).",
   "import": "./wellhead/pig-launcher",
   "export": "PigLauncher",
   "anchor": "base",
   "standards": [
    "API 6D",
    "ASME VIII-1",
    "ASME B31.4 / B31.8",
    "ASME B16.5",
    "API 526"
   ],
   "vendors": [
    "GD Engineering (Celeros FT)",
    "T.D. Williamson",
    "EMT",
    "Sweco Fab"
   ],
   "tags": [
    "pigging",
    "launcher",
    "receiver",
    "pig trap",
    "pipeline"
   ],
   "params": [
    {
     "key": "service",
     "label": "Service",
     "type": "select",
     "options": [
      "launcher",
      "receiver"
     ]
    },
    {
     "key": "nps",
     "label": "Pipeline size",
     "type": "nps",
     "min": 4,
     "max": 36
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating",
     "options": [
      300,
      600,
      900,
      1500
     ]
    },
    {
     "key": "length",
     "label": "Major barrel length",
     "type": "number",
     "min": 1.2,
     "max": 8,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "elevation",
     "label": "Axis height",
     "type": "number",
     "min": 0.7,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "kickerNps",
     "label": "Kicker / bypass",
     "type": "nps",
     "min": 2,
     "max": 12
    },
    {
     "key": "closureOpen",
     "label": "Closure open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "service": "launcher",
    "nps": 10,
    "rating": 600,
    "length": 3.2,
    "elevation": 1.1,
    "kickerNps": 4,
    "closureOpen": false,
    "tag": "L-110"
   },
   "ports": [
    {
     "id": "mainline",
     "label": "Mainline",
     "position": [
      -2.5305,
      1.0746,
      0
     ],
     "direction": [
      -1,
      0,
      0
     ],
     "nps": 10,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "kicker",
     "label": "Kicker inlet",
     "position": [
      1.7964,
      1.9017,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 4,
     "rating": 600,
     "kind": "process"
    },
    {
     "id": "vent",
     "label": "Vent",
     "position": [
      2.0807,
      1.7335,
      0
     ],
     "direction": [
      0,
      1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "vent"
    },
    {
     "id": "drain",
     "label": "Drain",
     "position": [
      1.9004,
      0.4665,
      0
     ],
     "direction": [
      0,
      -1,
      0
     ],
     "nps": 2,
     "rating": 600,
     "kind": "drain"
    },
    {
     "id": "psv",
     "label": "PSV outlet",
     "position": [
      0.5007,
      1.535,
      -0.1206
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 150,
     "kind": "relief"
    }
   ],
   "bounds": {
    "size": [
     5.179,
     2.056,
     1.594
    ],
    "center": [
     0.021,
     1.028,
     -0.134
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/pig-launcher.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / API 6D pig trap convention",
    "drawn": "An oversized barrel with a quick-opening closure (thick bar) at one end, a reducer to the pipeline size, the trap (isolation) valve on the pipeline, and a kicker (or bypass) line from the barrel round the trap valve; a pig signaller (XI / ZS) on the line. Receivers are drawn the same way, mirrored.",
    "tags": [
     "L",
     "PL",
     "SCR"
    ],
    "isa": [
     "XI",
     "ZS",
     "PI"
    ],
    "notes": "The closure plus reducer plus kicker line is unmistakable. A plain horizontal capsule is a vessel. Launcher or receiver is decided by flow direction.",
    "datasheet": {
     "form": "Pig trap datasheet (ASME VIII-1 / ASME B31.4 / B31.8)",
     "fields": {
      "Service": "service",
      "Pipeline size": "nps",
      "Flange rating": "rating",
      "Barrel length": "length",
      "Centreline elevation": "elevation",
      "Kicker size": "kickerNps",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "bop-stack",
   "title": "BOP stack (surface)",
   "category": "wellhead",
   "description": "Surface blowout preventer stack on a casing head: single ram, drilling spool, double ram and annular preventer, with bolted bonnets, operating cylinders and ram locks along X. The drilling spool carries the choke (+Z) and kill (-Z) lines, each with a manual gate and a hydraulic HCR valve and a crossover to a B16.5 flange. Hydraulic hoses run from a junction plate to every function, inside a yellow handling frame with padeyes. Body proportions are typical for a 13-5/8\" 10k stack and scale with bore and pressure.",
   "import": "./wellhead/bop-stack",
   "export": "BopStack",
   "anchor": "base",
   "standards": [
    "API 16A",
    "API 53",
    "API 6A",
    "API 6B / 6BX",
    "API 16D"
   ],
   "vendors": [
    "SLB (Cameron)",
    "Baker Hughes (Hydril)"
   ],
   "tags": [
    "BOP",
    "well control",
    "drilling",
    "ram",
    "annular",
    "HCR"
   ],
   "params": [
    {
     "key": "bore",
     "label": "Bore",
     "type": "select",
     "options": [
      {
       "value": 11,
       "label": "11\""
      },
      {
       "value": 13.625,
       "label": "13-5/8\""
      },
      {
       "value": 18.75,
       "label": "18-3/4\""
      },
      {
       "value": 21.25,
       "label": "21-1/4\""
      }
     ]
    },
    {
     "key": "pressureRating",
     "label": "Working pressure",
     "type": "select",
     "options": [
      {
       "value": 5000,
       "label": "5,000 psi"
      },
      {
       "value": 10000,
       "label": "10,000 psi"
      },
      {
       "value": 15000,
       "label": "15,000 psi"
      }
     ]
    },
    {
     "key": "handlingFrame",
     "label": "Handling frame",
     "type": "bool"
    },
    {
     "key": "closed",
     "label": "Rams closed",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "bore": 13.625,
    "pressureRating": 10000,
    "handlingFrame": true,
    "closed": false,
    "tag": "BOP-100"
   },
   "ports": [
    {
     "id": "choke",
     "label": "Choke line",
     "position": [
      0,
      2.006,
      1.891
     ],
     "direction": [
      0,
      0,
      1
     ],
     "nps": 3,
     "rating": 2500,
     "kind": "process"
    },
    {
     "id": "kill",
     "label": "Kill line",
     "position": [
      0,
      2.006,
      -1.6413
     ],
     "direction": [
      0,
      0,
      -1
     ],
     "nps": 2,
     "rating": 2500,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     3.929,
     6.462,
     3.6
    ],
    "center": [
     0,
     2.831,
     0.129
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/bop-stack.svg",
    "standard": "ISO 10628-2 / PIP PIC001 valves; API 6A / API RP 14C wellhead conventions; API 16A / API 53 BOP schematic",
    "drawn": "A vertical stack of boxes: the annular preventer on top (tapered or rounded), ram preventers (rectangles with rams drawn from both sides, labelled pipe / blind / shear), and a drilling spool with the choke and kill lines and their valves leaving each side.",
    "tags": [
     "BOP"
    ],
    "notes": "Rams drawn as boxes with side rams distinguish a BOP from a christmas tree (bow-tie valves). Only on drilling or well-control schematics, not process P&IDs.",
    "datasheet": {
     "form": "BOP stack datasheet (API 16A / API 53)",
     "fields": {
      "Bore": "bore",
      "Rated working pressure": "pressureRating",
      "Handling frame": "handlingFrame",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "riser",
   "title": "Riser top section",
   "category": "wellhead",
   "description": "Export or import riser where it reaches the topsides. Below the deck (y < 0, down to `length`) the coated riser runs through split jacket clamps on brackets and splash-zone sheathing placed from `airGap`. At the deck a forged hang-off collar sits on beams; above it come a monolithic insulating joint, the riser ESDV (full-bore ball valve with a fail-close spring-return actuator) and a riser pressure gauge and transmitter, and a 5D piggable bend to a horizontal B16.5 topside flange.",
   "import": "./wellhead/riser",
   "export": "Riser",
   "anchor": "base",
   "standards": [
    "API RP 2RD",
    "API 6D",
    "ASME B31.4 / B31.8",
    "ASME B16.5",
    "ISO 13623"
   ],
   "vendors": [
    "Subsea Energy Solutions (hang-off clamps)"
   ],
   "tags": [
    "riser",
    "export",
    "ESDV",
    "insulating joint",
    "pipeline",
    "hang-off"
   ],
   "params": [
    {
     "key": "nps",
     "label": "Riser size",
     "type": "nps",
     "min": 4,
     "max": 36
    },
    {
     "key": "rating",
     "label": "Class",
     "type": "rating"
    },
    {
     "key": "length",
     "label": "Length below deck",
     "type": "number",
     "min": 2,
     "max": 80,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "airGap",
     "label": "Deck above MSL",
     "type": "number",
     "min": 8,
     "max": 40,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "esdv",
     "label": "Riser ESDV",
     "type": "bool"
    },
    {
     "key": "insulatingJoint",
     "label": "Insulating joint",
     "type": "bool"
    },
    {
     "key": "run",
     "label": "Topside run",
     "type": "number",
     "min": 0.5,
     "max": 4,
     "step": 0.1,
     "unit": "m"
    },
    {
     "key": "tag",
     "label": "ESDV tag",
     "type": "text"
    }
   ],
   "defaults": {
    "nps": 12,
    "rating": 600,
    "length": 20,
    "airGap": 18,
    "esdv": true,
    "insulatingJoint": true,
    "run": 1.2,
    "tag": "ESDV-R101"
   },
   "ports": [
    {
     "id": "topside",
     "label": "Topside flange",
     "position": [
      2.9808,
      4.3727,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 12,
     "rating": 600,
     "kind": "process"
    }
   ],
   "bounds": {
    "size": [
     4.421,
     9.652,
     1.509
    ],
    "center": [
     0.808,
     -0.174,
     0.054
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/riser.svg",
    "standard": "ISO 10628-2 / PIP PIC001 / pipeline P&ID convention",
    "drawn": "The topsides line turning down through the deck to sea level and below, with the riser ESDV (actuated valve with an S box) above the deck, an insulating joint (two close bars with a gap) and an off-page note \"to / from subsea pipeline\"; the sea level is often drawn as a wave line.",
    "isa": [
     "ESDV",
     "PT",
     "TT"
    ],
    "notes": "An open-ended pipe hanging into the sea (pump or sump) is a caisson. Pipeline pig traps sit just upstream on the topsides.",
    "datasheet": {
     "form": "Riser design basis / line list (API RP 2RD, ISO 13623)",
     "fields": {
      "Riser size": "nps",
      "Flange rating": "rating",
      "Length below deck": "length",
      "Air gap": "airGap",
      "Topsides ESDV": "esdv",
      "Insulating joint": "insulatingJoint",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "wellhead-control-panel",
   "title": "Wellhead control panel (WHCP)",
   "category": "wellhead",
   "description": "Skid-mounted hydraulic wellhead control panel. A stainless cabinet with louvres and a canopy holds one control module per well (SCSSV and SSV gauges, pilot relay block, selector valves, trip / reset buttons), supply / HP / LP header gauges, the hydraulic reservoir with sight glass, two air-driven pumps, an electric pump and filters, all tubed to a bulkhead plate. The side carries an ESD push-button, fusible-loop and hi/lo pilot connections and an air filter-regulator. An open rack beside it carries nitrogen-precharged bladder accumulators. The double doors swing open with `doorsOpen`. No ports: the outputs are 1/4\"–1/2\" control tubing.",
   "import": "./wellhead/wellhead-control-panel",
   "export": "WellheadControlPanel",
   "anchor": "base",
   "standards": [
    "API 6A",
    "API 14D",
    "API RP 14C",
    "ISO 10418",
    "IEC 60079"
   ],
   "vendors": [
    "SLB",
    "NOV (Texas Oil Tools)",
    "Sysargus"
   ],
   "tags": [
    "WHCP",
    "hydraulic",
    "SSV",
    "SCSSV",
    "control panel",
    "accumulator"
   ],
   "params": [
    {
     "key": "wells",
     "label": "Well modules",
     "type": "number",
     "min": 1,
     "max": 12,
     "step": 1
    },
    {
     "key": "accumulators",
     "label": "Accumulators",
     "type": "number",
     "min": 2,
     "max": 12,
     "step": 1
    },
    {
     "key": "doorsOpen",
     "label": "Doors open",
     "type": "bool"
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "wells": 6,
    "accumulators": 6,
    "doorsOpen": true,
    "tag": "X-N270"
   },
   "ports": [],
   "bounds": {
    "size": [
     3.607,
     2.38,
     1.804
    ],
    "center": [
     -0.143,
     1.19,
     0.202
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/wellhead-control-panel.svg",
    "standard": "ISA 5.1 (panel; hydraulic signal lines marked L) / API RP 14C",
    "drawn": "A rectangle (local panel) labelled WHCP with hydraulic signal lines (marked with L) running to each well's SCSSV, SSV and wing valve actuators, and an ESD / fusible-loop input.",
    "tags": [
     "X",
     "WHCP"
    ],
    "notes": "One hydraulic line per actuator per well. A box with only one hydraulic supply line is an HPU (hydraulic power unit), not the WHCP.",
    "datasheet": {
     "form": "Wellhead control panel datasheet (API RP 14C / ISO 10418)",
     "fields": {
      "Number of wells": "wells",
      "Number of accumulators": "accumulators",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "drilling-derrick",
   "title": "Platform drilling derrick",
   "category": "wellhead",
   "description": "Modular platform drilling rig on skid beams: braced substructure, drill floor with rotary table, mousehole, bell nipple and flowline, and a four-leg lattice derrick with K and X bracing, an inverted-V V-door, a racking board with fingers and racked stands, and a crown block with gin pole and aviation lights. It also carries the drawworks with its drill line, top-drive guide rails, a travelling block and top drive positioned by `topDrive`, a standpipe and rotary hose, the driller's cabin, and a V-door pipe ramp down to the catwalk.",
   "import": "./wellhead/drilling-derrick",
   "export": "DrillingDerrick",
   "anchor": "base",
   "standards": [
    "API 4F",
    "API 8C",
    "API 7K",
    "ISO 18647",
    "ISO 14122"
   ],
   "vendors": [
    "MH Pyramid (NOV)",
    "Loadmaster Universal Rigs",
    "STI Group"
   ],
   "tags": [
    "drilling",
    "derrick",
    "rig",
    "top drive",
    "drill floor"
   ],
   "params": [
    {
     "key": "height",
     "label": "Derrick height",
     "type": "number",
     "min": 25,
     "max": 60,
     "step": 1,
     "unit": "m"
    },
    {
     "key": "floorSize",
     "label": "Drill floor",
     "type": "number",
     "min": 9,
     "max": 16,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "floorHeight",
     "label": "Floor height",
     "type": "number",
     "min": 4,
     "max": 12,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "topDrive",
     "label": "Top drive height",
     "type": "number",
     "min": 3,
     "max": 50,
     "step": 0.5,
     "unit": "m"
    },
    {
     "key": "stands",
     "label": "Racked stands",
     "type": "number",
     "min": 0,
     "max": 48,
     "step": 2
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "height": 43,
    "floorSize": 13,
    "floorHeight": 8,
    "topDrive": 15,
    "stands": 24,
    "tag": "DR-100"
   },
   "ports": [],
   "bounds": {
    "size": [
     36.174,
     56.17,
     13
    ],
    "center": [
     10.513,
     28.085,
     0
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/drilling-derrick.svg",
    "standard": "Layout plan / elevation convention; API 4F",
    "drawn": "Elevation: a tall tapering lattice tower on a box substructure with the drill floor line between them and the crown block on top; in plan, the rig footprint rectangle with the well centre(s) marked as circles and slot numbers.",
    "tags": [
     "DR",
     "RIG"
    ],
    "notes": "Never on process P&IDs except as a tie-in box (mud, cement, utilities). The BOP and wellhead below the floor are separate items.",
    "datasheet": {
     "form": "Drilling structure datasheet (API 4F)",
     "fields": {
      "Derrick height": "height",
      "Drill floor size": "floorSize",
      "Drill floor height": "floorHeight",
      "Tag number": "tag"
     }
    }
   }
  },
  {
   "name": "wellhead-housing",
   "title": "Wellhead (casing head and spools)",
   "category": "wellhead",
   "description": "Surface wellhead without a tree, on a conductor and landing plate. It has a casing head plus casing and tubing head spools (one to three sections by height), studded annulus outlets with gate valves, B16.5 crossovers and gauges on one side and VR-plugged blind outlets on the other, hanger lockdown screws, secondary-seal test ports and the SCSSV control-line exit. The top is either a blind flange with a bleed valve and gauge, or an open ring-joint face ready for a tree or BOP. The `annulus-*` ports are numbered from the tubing head down.",
   "import": "./wellhead/wellhead-housing",
   "export": "WellheadHousing",
   "anchor": "base",
   "standards": [
    "API 6A",
    "API 6B / 6BX",
    "ASME B16.5"
   ],
   "vendors": [
    "Sentry Wellhead Systems",
    "Baker Hughes (Vetco Gray)",
    "SLB (Cameron)"
   ],
   "tags": [
    "wellhead",
    "casing head",
    "tubing head",
    "spool",
    "annulus"
   ],
   "params": [
    {
     "key": "pressureRating",
     "label": "Working pressure",
     "type": "select",
     "options": [
      {
       "value": 5000,
       "label": "5,000 psi"
      },
      {
       "value": 10000,
       "label": "10,000 psi"
      }
     ]
    },
    {
     "key": "wellheadHeight",
     "label": "Height",
     "type": "number",
     "min": 0.5,
     "max": 2,
     "step": 0.05,
     "unit": "m"
    },
    {
     "key": "top",
     "label": "Top",
     "type": "select",
     "options": [
      "blind",
      "open"
     ]
    },
    {
     "key": "tag",
     "label": "Tag",
     "type": "text"
    }
   ],
   "defaults": {
    "pressureRating": 5000,
    "wellheadHeight": 1.1,
    "top": "blind",
    "tag": "WH-101"
   },
   "ports": [
    {
     "id": "annulus-a",
     "label": "A annulus",
     "position": [
      0.7735,
      0.8381,
      0
     ],
     "direction": [
      1,
      0,
      0
     ],
     "nps": 2,
     "rating": 1500,
     "kind": "utility"
    },
    {
     "id": "annulus-b",
     "label": "B annulus",
     "position": [
      0.5469,
      0.2838,
      -0.5469
     ],
     "direction": [
      0.7071067811865476,
      0,
      -0.7071067811865476
     ],
     "nps": 2,
     "rating": 1500,
     "kind": "utility"
    }
   ],
   "bounds": {
    "size": [
     1.298,
     2.036,
     1.195
    ],
    "center": [
     0.149,
     0.518,
     -0.028
    ]
   },
   "registryDependencies": [
    "core"
   ],
   "pid": {
    "symbol": "https://deck-twin-library.demoareeb.workers.dev/symbols/wellhead-housing.svg",
    "standard": "ISO 10628-2 / PIP PIC001 valves; API 6A / API RP 14C wellhead conventions",
    "drawn": "A stack of rectangles (casing head at the bottom, casing and tubing head spools above) on the conductor, each with side annulus outlets carrying gate valves and gauges; a blind flange or tree adapter on top.",
    "tags": [
     "WH",
     "W"
    ],
    "isa": [
     "PI",
     "PT"
    ],
    "notes": "Only annulus side outlets and no wing / choke means a wellhead without a tree (suspended well, or below a BOP). With a valve stack and choke on top it is a christmas-tree. ISA codes here: PI = annulus; PT = annulus.",
    "datasheet": {
     "form": "Wellhead datasheet (API 6A)",
     "fields": {
      "Rated working pressure": "pressureRating",
      "Top connection": "top",
      "Tag number": "tag"
     }
    }
   }
  }
 ]
}