# Lineman

The three-point stance as a four-contact stance: the hand on the turf carries load, and the flat back is the column pitch that being down there implies.

> 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/gridiron-lineman.json
```

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

## Notes

- Solved: the legs, feet and pelvis are solveSkeleton from skeleton-kinematics — the same solver robot-skeleton ships. The arms come out of the gait's swing and are solved to their own targets, because in this stance they are doing two different jobs.
- The flat back is not typed in. stancePitch bisects for the column pitch that leaves the shoulder exactly one arm's length from the hand on the turf, on the same column the drawing uses.
- The feet are staggered by freezing the walk solver at a cycle fraction where one foot has just landed and the other is still on its toe — a real sample of the gait rather than a second pose table.
- Illustrated: the helmet, facemask, shoulder yoke and pads. Nothing about them is load-bearing, and none of it is a team, a livery or a person.
- No contact, no opponent and no ground reaction. The hand load is a share the stance declares, not a force anything computed.

## Usage

```tsx
import { GridironLineman } from "@/components/ui/gridiron-lineman"

<GridironLineman behavior="snap" number="74" />

// Controlled, or a snap you can work by hand.
<GridironLineman stance="two-point" fire={0.6} padLevel={0.9} />
<GridironLineman interactive onFireChange={setFire} />
```

## Props

| name | type | default | description |
| --- | --- | --- | --- |
| `view` | `"plan" | "front" | "profile" | "iso"` | `"profile"` | Where the camera stands. One machine, four projections: straight down, straight on, side elevation, or three-quarter from above. |
| `fire` | `number` | — | Controlled: 0 down in the stance, 1 at full extension. Supplying it stops the loop. |
| `behavior` | `"snap" | "drive" | "pull" | "set" | "static"` | `"snap"` | What it does when fire is not supplied. A snap is the whole sequence; drive and pull hold its middle open. |
| `stance` | `"three-point" | "two-point" | "set" | "upright"` | `"three-point"` | Only the three-point stance puts a hand down, and only that one carries load on it. |
| `padLevel` | `number` | `0.5` | How low it plays, 0 to 1: a deeper crouch and more lean off one number. |
| `mask` | `"cage" | "bar" | "shield"` | `"cage"` | Facemask style. Bars only — no livery, no markings. |
| `number` | `string` | `""` | Two characters on the chest plate. Your string; nobody real's. |
| `speed` | `number` | `0.4` | 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. |
| `offset` | `number` | `0` | Seconds of offset, so a line of them does not fire together. |
| `interactive` | `boolean` | `false` | Drag across to work the snap by hand; arrow keys step it. |
| `onFireChange` | `(fire: number) => void` | — | How far out of the stance, throughout a drag or a key press. |
| `showGround` | `boolean` | `true` | Draw the contact shadow. |
| `label` | `string` | — | Caption below the readout. |
| `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. |
| `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/gridiron-lineman.tsx`
