# Pylon droid

A deployable survey pylon: stowed it is a sharp triangular plate with every limb folded inside its own outline, and one deploy number stands it up on a tripod with its apex cap lifted off a lit core.

> For the complete index, see [llms.txt](https://robocn.dev/llms.txt). A Markdown version of any page is available by appending `.md` to its URL or by sending an `Accept: text/markdown` header.

## Install

```bash
bunx --bun shadcn@latest add https://robocn.dev/r/pylon-droid.json
```

Registry item: `pylon-droid` · [`https://robocn.dev/r/pylon-droid.json`](https://robocn.dev/r/pylon-droid.json)

## Notes

- Front elevation is the view it is drawn in, because the plate is the machine and the plate faces you. The faces and their panel detail ride the elevation plane and go edge-on in profile, which is what a plate seen from the side does; the plate solid off that axis is the convex hull of its two faces, which is exact for a prism.
- Stowed, every limb is inside the triangle: the legs fold until the knee lands on the hypotenuse, the aft strut lies up the back face, and the cap sits shut on the core. The limbs are drawn behind the plate, so solid shows the bare outline and outline and wire show the stowed mechanism through it.
- The legs are solved — two-link law of cosines, the knee breaking outward in stowage as much as in stance, an out-of-reach foot clamped onto the leg rather than failing — and the strut's planted angle is acos(-(hinge + rise) / strut) rather than a tuned number.
- Illustrated, not simulated: the mast is a rail pair rather than a modelled screw, the waist loom is a curve, and there is no mass, balance or ground reaction anywhere. It stands; it does not walk.
- An original archetype — a survey pylon that stands itself up — named for the job. No franchise, no logo, no paint scheme.

## Usage

```tsx
import { PylonDroid } from "@/components/ui/pylon-droid"

<PylonDroid behavior="deploy" stance="wide" onDeployChange={setDeploy} />

// Or hold it wherever you want it — controlled always wins.
<PylonDroid deploy={0.35} view="iso" />
```

## Props

| name | type | default | description |
| --- | --- | --- | --- |
| `view` | `"plan" | "front" | "profile" | "iso"` | `"front"` | Where the camera stands. One pylon, four projections: straight down, straight on, side elevation, or three-quarter from above. |
| `deploy` | `number` | — | 0 stowed flat, 1 standing. Supplying it stops the loop. It is the whole machine: the chassis rise, the leg solve, the strut swing and the cap lift all come off this one number. |
| `behavior` | `"deploy" | "survey" | "stow" | "static"` | `"deploy"` | Deploy stands up, holds the station and sits back down; survey stays up breathing and panning; stow lies dormant on the deck. |
| `speed` | `number` | `0.22` | Deployment cycles per second. |
| `animate` | `boolean` | `true` | Off parks the machine at phase and stops rendering. A reduced-motion preference does the same. |
| `paused` | `boolean` | `false` | Freeze where it stands. |
| `phase` | `number` | `0` | Seconds of offset, so a row of machines breaks step. |
| `interactive` | `boolean` | `true` | Drag it up and down to raise it, or use the arrow keys; Home stows it and End stands it up. Release eases it back into the behaviour. |
| `onDeployChange` | `(deploy: number) => void` | — | The deployment a drag or a key moved it to, reported in controlled mode too. |
| `stance` | `"narrow" | "wide"` | `"narrow"` | How far out the feet plant once it is standing. Wide is five units further, which is as far as the legs reach. |
| `look` | `Vec2 | null` | `null` | Controlled optic aim in −1..1; overrides pointer tracking. |
| `track` | `boolean` | `true` | The apex optic follows the page pointer while look is null. |
| `variant` | `"solid" | "outline" | "blueprint" | "wire"` | `"solid"` | How the machine is painted. Geometry never changes between variants. |
| `size` | `"xs" | "sm" | "md" | "lg" | "xl" | number` | `"md"` | Rendered width in pixels, or a step on the scale. |
| `showGround` | `boolean` | `true` | Draw the contact line or shadow beneath the droid. |
| `signal` | `"idle" | "ready" | "warning"` | — | Status-lamp state using neutral, accent, or shell colour; each component documents its visual default in the demo. |
| `label` | `string` | — | Optional technical caption under the drawing. |
| `color` | `string` | `var(--robot-shell)` | Body panels — the colour the machine reads as. |
| `accent` | `string` | `var(--robot-accent)` | Status colour: tip light, live tool, readouts. |
| `metal` | `string` | `var(--robot-metal)` | Bare machined parts: collars, bolts, tool bodies. |
| `dark` | `string` | `var(--robot-dark)` | Cast joints, base, shadow side. |
| `palette` | `Partial<RobotPalette>` | — | Override any subset of roles at once, including glow and grid. |

## Source

- `src/components/ui/pylon-droid.tsx`
