# LedGrab · Entity Card · v2 (dashboard convergence)

01 Output zone CH · SIGNAL
LED · CH-01
Living Room Strip
192.168.1.42 · WLED v0.14 · RGB
FPS
59.7
PIXELS
144
LAT
8ms
Bright
198
PATCHED · OUT-1
LED · CH-02
Bedroom Halo
10.0.4.18 · Adalight 921k
FPS
— —
PIXELS
60
ERR
14
Connection refused · 2h 14m ago
OFFLINE
HA · LIGHT
Hue Bedside Lamp
light.bedside_lamp · color_temp 2700K
Source · Cinematic Brightness · Outdoor temp
STANDBY
02 Input zone CH · CYAN CH · MAGENTA
SCREEN · IN
Cinematic Capture
Display 2 · MSS · BGRA
REGION
3840×1080
TARGET
60fps
Pre-process · Cinematic CSPT Letterbox crop
STANDBY
FFT · IN
Spotify Loopback
WASAPI · 48 kHz · stereo
PEAK
-6.2dB
BANDS
32
CPU
3.1%
bass mids highs
STREAMING
VALUE · HA
Outdoor temp
sensor.outdoor_temp · linear · clamped
NOW
14.7°
RANGE
8 — 22
TICK
2s
Bound to · brightness
POLLING
03 Logic zone CH · VIOLET CH · AMBER
AUTO · 07
Movie Night
Plex playing · 21:00 — 23:30
21:00 — 23:30 + Plex playing →
Cinema scene
ARMED
SCN · 04
Sunset Warmth
4 targets · captured 21 Apr · used by 2 automations
Warm tungsten cast on every fixture for a 19:00 unwind. Recapture re-snapshots all targets in their current colors.
PRESET
CLK · MASTER
Master Tempo
Square · 1/16 sub · drift ±0.3ms
BPM
110.0
PHASE
0.42
SUB
1/16
TICKING
GAME · CSGO
Counter-Strike 2
GSI · port 3456 · 12 mapped events
flash defuse round-end +9 more
LISTENING · 12s ago
04 Templates & assets
TPL · CAPTURE
Desktop · 60 fps · region
MSS · 3 keys configured · used by 5 sources
crop→ downsample→ gamma→ color-correct
TEMPLATE
STRIP · MAPPED
Cinema map · 144 px
Letterbox · smooth 0.35
Display 2 CSPT · 4 filters
MAPPING
PALETTE · G-08
Aurora BUILTIN
5 stops · HSL space · loop
5 STOPS · LOOP
Used in 3 strips
PRESET
ASSET · IMG
cosmic-loop-001.png
PNG · 1920×1080 · 412 KB
READY

## How v2 maps to the dashboard

- Same shell, same classes. `.module` mirrors `.dashboard-target:has(.mod-head)` down to padding and the always-on left stripe at 0.6→1.0 opacity.
- Inline `.mod-badge` replaces my v1 top rail. Channel-tinted mono caps pill at the top-left of `.mod-id` — exactly the dashboard pattern, no extra band needed.
- `.mod-leds` recessed cluster next to the title — multiple dots in a hairline bezel, real-hardware feel. Single LED card-types use one dot in the same bezel.
- Numerics use `var(--font-display)`. Big Shoulders Display, 2rem, 800-weight, tabular-nums. Already bundled in `fonts/big-shoulders-display-latin.woff2` and only used on dashboard + perf cards today.
- `.mod-patch` footer label on every card: `PATCHED · OUT-1`, `STREAMING`, `OFFLINE`, `STANDBY`, `ARMED`, `PRESET`, `READY`. Channel-colored dot on the left, mono caps state label — the strongest "this is rack hardware" cue.
- `.mod-btn` with text labels for primary/secondary actions in the footer (`START` / `STOP` / `EDIT`). Tertiary square `.mod-btn-icon` variant for settings.
- Card-color is identity, not an action. A 10px `.mod-badge__color` dot leads every `.mod-badge` — channel-tinted by default, fills with the user's picked color when overridden. Click to open the picker. Lives with the type label it tints, not in a destructive cluster.
- Single overflow menu (kebab) replaces the v2.0 corner huddle. Always visible at 0.34 opacity, brightens on card-hover. Click to open `Duplicate` / `Hide card` / ─── / `Delete`. One control, isolated, touch-and-keyboard accessible — and easily extended (Move to section, Export) without re-cramping the corner.
- Why this works: destructive actions are no longer adjacent to cosmetic ones (no more "delete next to color picker"); the menu groups management actions semantically; the corner reads as quiet metadata instead of a row of buttons; every interaction is discoverable without hover.
- Properties unify. `.card-meta` + `.stream-card-prop` → single `.chip` system with three modifiers: default, `.chip--link` for crosslinks, `.chip--tag` for tag pills, `.chip--err` for error states. Filter chains use chips + `.chain-arrow` separators.
- Three body slots compose every card type: `.mod-metrics` (numeric readouts) · `.mod-chips` (qualitative metadata, crosslinks, filter chains) · `.mod-preview` (gradient strip / asset thumb / live LED preview). Plus optional `.mod-fader` (LED targets) and `.mod-desc` (descriptions).

## v1 → v2 specifics

- Dropped the 32px top rail band → moved to inline `.mod-badge` at top-left.
- Mono LCD-style readouts → display-font instrument readouts at 2rem 800.
- Single status dot → `.mod-leds` 1–3 LED bezel.
- Square icon-only footer buttons → `.mod-btn` with text labels for state-changing actions; icon variant kept for settings/edit only.
- Added `.mod-patch` footer indicator on every card.
- Restored the corner bracket (idle) and the running signal-flow animation.
- Corner cluster killed. The "swatch + hide + delete" huddle is gone. Color is now a 10px identity dot inside the badge; hide and delete moved into a single overflow menu.
- Field cleanup: paper-grain overlay removed (dashboard cards don't use it; not part of the established language).

## Implementation footprint

- CSS: the `.mod-*` rules already exist in `dashboard.css`. The entity-card variant just needs `.card:has(.mod-head)` / `.template-card:has(.mod-head)` selectors that copy `.dashboard-target:has(.mod-head)`'s padding/layout — or alias all three to a shared `.module` class.
- JS: `wrapCard()` in `card-colors.ts` already handles the wrapper, color stripe, and corner actions. Add an optional second signature: `wrapCard({ mod: { badge, name, meta, leds, metrics, chips, preview, fader, patch, primaryAction } })` that emits the dashboard markup. Existing `content/actions` path stays for incremental migration.
- Per feature: each `create*Card()` swaps its hand-rolled `.card-header` + `.card-subtitle` + `.stream-card-props` for the structured `mod` options. Localised, low-risk, can ship one card type per PR.
- Cards.css cleanup: remove the `[data-has-color="1"], .card-running` gate on the `::before` stripe so the channel signal becomes ambient. Single line change.