# Panel System — Trace Atlas (D-2026-08-16-557)

Trace atlas for `system.panel-system`. Maps every public method to the file that implements it and the call sites that consume it.

## Public methods

| Method | Defined in | Consumed by |
|---|---|---|
| `PanelSystem.createPanel(spec)` | `runtime/panel-system.js` | `runtime/edge-panel/edge-panel.js` (mount), `runtime/index.js` (boot), all module entrypoints that spawn a panel |
| `PanelSystem.destroyPanel(id)` | `runtime/panel-system.js` | panels self-destruct on close; cleanup hooks |
| `PanelSystem.float(id)` | `runtime/panel-system.js` | panel chrome (drag-to-float) |
| `PanelSystem.pin(id, edge)` | `runtime/panel-system.js` | panel chrome (pin button) |
| `PanelSystem.dock(id, edge)` | `runtime/panel-system.js` | panel chrome (drop into dock zone) |
| `PanelSystem.minimize(id)` | `runtime/panel-system.js` | pill button, panel minimize button (gated by Pro Mode lock) |
| `PanelSystem.maximize(id)` | `runtime/panel-system.js` | panel maximize button |
| `PanelSystem.resize(id, opts)` | `runtime/panel-system.js` | panel chrome (drag edges) |
| `PanelSystem.list()` | `runtime/panel-system.js` | debug, history surface |
| `PanelSystem.on(event, cb)` | `runtime/panel-system.js` | module subscriptions |
| `PanelSystem.collapse(id)` | `runtime/panel-system.js` | Edge Panel auto-hide, panel close behaviour |

## Events emitted

- `panel:created`, `panel:destroyed`
- `panel:float`, `panel:pin`, `panel:dock`
- `panel:minimize`, `panel:maximize`, `panel:resize`
- `panel:focus`, `panel:blur`
- `panel:state-change`

## Mobile 45% rule

When `window.innerWidth < 600` AND a panel is pinned L or R, the panel reveals at 45% of viewport width (capped at 600px). Implemented in `PanelSystem.pin()`.

## Pro Mode lock

When `operatingMode === 'pro'`, `PanelSystem.minimize()` returns `{ ok: false, reason: 'pro_mode_locked' }` and emits NO event. UI: minimize button greyed out + tooltip "Panels cannot minimise in Pro Mode". Implemented in `runtime/panel-system.js` `minimize()`.
