# Console

The persistent docked control strip at the app frame's bottom edge — not a media player but the app's hands. Six zones: identity, transport+commit, the board, panic, level, status. Exactly ONE per product.

Install: `npx candlelight-ds add console`

Category: instrument · Grammar: G2, G5, G6, G7

## Use when

The app shell's one console slot — dock it at the frame's bottom edge the way you mount nav. Whatever your product's running thing is lives here.

## Don't use when

Anywhere else. A second 'footer' component is a failing test. Per-surface controls belong to the surface.

## States

- running (identity + glow)
- empty (teaches, in voice)
- identity hidden (width yields)
- board compressed
- board scrolling

## Keyboard

- `?` — opens the surface's generated key map (ConsoleHelpKey)

## Traps (shipped once — do not re-learn)

- Two strips that 'look the same' but share no code will drift within a month — this law exists because it happened. The component warns in dev when two consoles mount.

## Acceptance tests

- The one-instrument test: exactly one implementation, imported by every posture; the store is shared. (Dev warning fires on a second mount.)
- The glance test: from any surface, one glance at the bottom edge answers what is running, is it healthy, how do I stop it.
- The navigation test: nothing in the console navigates away while something is live.
- The honesty test: every printed key fires; every control that can't act sits dark rather than lying.
- The panic test: STOP is reachable in one click from every surface, wears danger, never moves between postures.
- The empty test: with nothing running the console still teaches, in voice, and the commit key shows what's staged.

## Files

- components/instruments/Console.tsx

npm dependencies: @candlelight-ds/tokens, clsx, tailwind-merge

Rendered twin: https://candlelight-docs.vercel.app/components/console · Full spec: https://candlelight-docs.vercel.app/spec.md
