# BindableFloat — Universal Value Source Binding ## ALL PHASES COMPLETE ### Phase 1: Core Infrastructure - [x] `storage/bindable.py` — BindableFloat dataclass + `bfloat()` extraction helper - [x] WledOutputTarget, HALightOutputTarget, HALightMapping — brightness/transition - [x] All 15 CSS source types — smoothing, sensitivity, intensity, scale, speed, etc. - [x] API schemas + routes updated - [x] output_target_store create/update - [x] processor_manager add_target / add_ha_light_target ### Phase 2: Runtime Resolution - [x] WledTargetProcessor — BindableFloat brightness, acquire/release value streams - [x] HALightTargetProcessor — BindableFloat brightness + transition - [x] All CSS streams use `bfloat()` to extract static values from BindableFloat properties - [x] scene_activator — brightness_changed flag - [x] ColorStripStream base class — `resolve()`, `set_value_stream()`, `remove_value_stream()` - [x] ColorStripStreamManager — `_bind_value_streams()` / `_release_value_streams()` on acquire/release - [x] All stream hot loops call `self.resolve(prop, static)` for dynamic runtime binding - [x] KeyColorsColorStripStream — fixed to inherit from ColorStripStream ### Phase 3: Frontend - [x] TypeScript BindableFloat type + `bindableValue()` / `bindableSourceId()` helpers - [x] targets.ts, ha-light-targets.ts, color-strips.ts — save/load/display - [x] Graph connections — value source edges for ALL bindable CSS properties - [x] Graph layout — edge creation for CSS + target bindable properties - [x] custom_components/select.py — HA integration backward compat ### Phase 4: BindableScalarWidget - [x] `core/bindable-scalar.ts` — reusable widget (slider + VS picker toggle) - [x] CSS styles (`.bindable-toggle`, `.bindable-slider-row`, `.bindable-vs-row`) - [x] All 11 CSS editor sliders converted (smoothing, sensitivity, intensity, scale, speed, wind, temp_influence, timeout) - [x] HTML templates updated with container divs