# Hound

A boxy companion tracker with no legs at all: a wedge chassis on a concealed drive, and a head carried out in front of it on a concertina neck that one attention number runs.

> 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/robot-hound.json
```

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

## Notes

- Side elevation is the view it is drawn in. The chassis and the head are solids in world units — the chassis a frustum between two footprints, the head a box that pitches and yaws — so every angle is that one model projected: the head's outline is the hull of its own eight corners, and the ear dishes, the eye and the collar ribs are circles sampled in their own planes, which is why they are ellipses from anywhere else.
- Attention is the whole machine: the same number runs the collar out, lifts the nose, pricks and splays the ear dishes, raises the probe and lights the visor. The collar's ribs are rings on the live axis between the deck and the head, so their spacing is the extension rather than a drawn pleat, and the probe telescopes rather than bending — three sections of falling diameter with visible collars.
- Where it is looking is independent of how alert it is, so it can notice you from a stow: look and the pointer turn the head on the end of the collar without moving the collar.
- Illustrated, not simulated. There is no drive model, traction, mass or antenna pattern; the rollers turn on the clock rather than on any travel, and the hound detects nothing — the visor lights because attention told it to.
- An original archetype — a boxy companion tracker — not a character. The keypad is a keypad and carries no markings from a film.

## Usage

```tsx
import { RobotHound } from "@/components/ui/robot-hound"

<RobotHound behavior="seek" ears="dish" probe="whip" onAttentionChange={setAttention} />
```

## Props

| name | type | default | description |
| --- | --- | --- | --- |
| `view` | `"plan" | "front" | "profile" | "iso"` | `"profile"` | Where the camera stands. One hound, four projections: straight down, straight on, side elevation, or three-quarter from above. |
| `attention` | `number` | — | How alert it is, 0 stowed to 1 up on the scent. Supplying it stops the loop; the neck, head, ears, probe and visor all ride it either way. |
| `behavior` | `"seek" | "alert" | "idle" | "static"` | `"seek"` | Seek casts the head the full width of the ground ahead of it; alert holds the head up with a tremor; idle settles it back onto its skirt. |
| `speed` | `number` | `0.3` | Cycles per second: one cast of the head, one breath of the idle. |
| `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 up and down to bring its head up, or use the arrow keys; Home stows it and End puts it on the scent. Release eases it back into the behaviour. |
| `onAttentionChange` | `(attention: number) => void` | — | The attention a drag or a key moved it to, reported in controlled mode too. |
| `look` | `Vec2 | null` | `null` | Controlled head aim in −1..1; overrides pointer tracking. The head turns without changing its posture. |
| `track` | `boolean` | `true` | The head turns to the page pointer while look is null. |
| `ears` | `"dish" | "vane" | "none"` | `"dish"` | The pair of sensor pods on the back of the head: splayed dishes, flat vanes, or nothing. |
| `probe` | `"whip" | "mast" | "none"` | `"whip"` | The boom off the tail: a telescoping whip with a bulb, a rigid mast with a cross arm, or nothing. |
| `keys` | `number` | `4` | Keypad columns across the deck, clamped to 3–8. Three rows either way. |
| `skirt` | `"flared" | "straight"` | `"flared"` | A chassis that flares out to the floor, or straight sides. |
| `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/robot-hound.tsx`
