# Bellows droid

A soft-shell pneumatic pod: a pleated dome that inflates and settles on a volume-conserving profile, carrying its lens pods and vent with it.

> 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/bellows-droid.json
```

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

## Notes

- The shell is the mechanism: there are no joints. Height and radius are tied so radius squared times height never changes, which is the volume of the solid of revolution up to the profile's fixed shape factor — filling it makes it taller and narrower.
- One geometry, four cameras. The silhouette is the convex hull of the projected surface, which is exact for a convex solid of revolution; the pleats are meridians on that same surface and are drawn only while they face you. A body of revolution has the same outline from the front and the side — what changes off-axis is which pleats you see and whether there is a face to see at all.
- Solved: the volume-conserving profile, the projection, the hidden-line pass on the pleats and the panels. Illustrated: the crown gather and the pleat twist, which are shaped to read rather than derived from a fold pattern. There is no pressure, material, or fold-count model.
- An original soft-robotics archetype. The vent is a vent and the patches beside it are louvred intakes, not a face.

## Usage

```tsx
import { BellowsDroid } from "@/components/ui/bellows-droid"

<BellowsDroid inflation={0.8} pleats={7} aperture="iris" interactive />
```

## Props

| name | type | default | description |
| --- | --- | --- | --- |
| `view` | `"plan" | "front" | "profile" | "iso"` | `"front"` | Where the camera stands. One pod, four projections: straight down, straight on, side elevation, or three-quarter from above. |
| `inflation` | `number` | — | Controlled fill, 0 flat and wide to 1 full and tall. Omit and the bellows runs itself. |
| `behavior` | `"breathe" | "settle" | "startle" | "static"` | `"breathe"` | Breathe is a slow sine; settle fills over three quarters of the cycle and dumps in the last quarter; startle sits full and loses most of it twice a cycle. |
| `speed` | `number` | `0.28` | Breaths 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` | `false` | The crown is the handle: drag it up and down, or focus it and use the arrows. Release eases back into the behaviour at the shell's own fill rate. |
| `onInflationChange` | `(inflation: number) => void` | — | Fires on every drag and key press, in controlled mode too. |
| `pleats` | `number` | `7` | Seams gathered into the crown, clamped to 4..12. |
| `optics` | `"pair" | "single" | "none"` | `"pair"` | Lens pods set through the shell. They ride it: filling the pod lifts them and brings them together. |
| `aperture` | `"grille" | "iris" | "none"` | `"grille"` | The vent between the optics. It opens with the shell, because it is what the bellows breathes through. |
| `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/bellows-droid.tsx`
