diff --git a/TODO-css-improvements.md b/TODO-css-improvements.md deleted file mode 100644 index 8b76e40..0000000 --- a/TODO-css-improvements.md +++ /dev/null @@ -1,116 +0,0 @@ -# TODO - -## IMPORTANT: Remove WLED naming throughout the app - -- [ ] Rename all references to "WLED" in user-facing strings, class names, module names, config keys, file paths, and documentation -- [ ] The app is **LedGrab** — not tied to WLED specifically. WLED is just one of many supported output protocols -- [ ] Audit: i18n keys, page titles, tray labels, installer text, pyproject.toml description, README, CLAUDE.md, context files, API docs -- [ ] Rename `wled_controller` package → decide on new package name (e.g. `ledgrab`) -- [ ] Update import paths, entry points, config references, build scripts, Docker, CI/CD -- [ ] **Migration required** if renaming storage paths or config keys (see data migration policy in CLAUDE.md) - ---- - -## Donation / Open-Source Banner - -- [x] Add a persistent but dismissible banner or notification in the dashboard UI informing users that the project is open-source and under active development, and that donations are highly appreciated -- [x] Include a link to the donation page (GitHub Sponsors, Ko-fi, or similar — decide on platform) -- [x] Remember dismissal in localStorage so it doesn't reappear every session -- [x] Add i18n keys for the banner text (`en.json`, `ru.json`, `zh.json`) -- [ ] Configure `DONATE_URL` and `REPO_URL` constants in `donation.ts` once platform is chosen - ---- - -# Color Strip Source Improvements - -## New Source Types - -- [x] **`weather`** — Weather-reactive ambient: maps weather conditions (rain, snow, clear, storm) to colors/animations via API -- [ ] **`music_sync`** — Beat-synced patterns: BPM detection, energy envelope, drop detection (higher-level than raw `audio`) -- [ ] **`math_wave`** — Mathematical wave generator: user-defined sine/triangle/sawtooth expressions, superposition -- [ ] **`text_scroll`** — Scrolling text marquee: bitmap font rendering, static text or RSS/API data source *(delayed)* - -### Discuss: `home_assistant` - -Need to research HAOS communication options first (WebSocket API, REST API, MQTT, etc.) before deciding scope. - -### Deferred - -- `image` — Static image sampler *(not now)* -- `clock` — Time display *(not now)* - -## Improvements to Existing Sources - -### `effect` (now 12 types) - -- [x] Add effects: rain, comet, bouncing ball, fireworks, sparkle rain, lava lamp, wave interference -- [x] Custom palette support: user-defined [[pos,R,G,B],...] stops via JSON textarea - -### `gradient` - -- [x] Noise-perturbed gradient: value noise displacement on stop positions (`noise_perturb` animation type) -- [x] Gradient hue rotation: `hue_rotate` animation type — preserves S/V, rotates H -- [x] Easing functions between stops: linear, ease_in_out (smoothstep), step, cubic - -### `audio` - -- [x] New audio source type: band extractor (bass/mid/treble split) — responsibility of audio source layer, not CSS -- [ ] Peak hold indicator: global option on audio source (not per-mode), configurable decay time - -### `daylight` - -- [x] Longitude support for accurate solar position (NOAA solar equations) -- [x] Season awareness (day-of-year drives sunrise/sunset via solar declination) - -### `candlelight` - -- [x] Wind simulation: correlated flicker bursts across all candles (wind_strength 0.0-2.0) -- [x] Candle type presets: taper (steady), votive (flickery), bonfire (chaotic) — applied at render time -- [x] Wax drip effect: localized brightness dips with fade-in/fade-out recovery - -### `composite` - -- [ ] Allow nested composites (with cycle detection) -- [x] More blend modes: overlay, soft light, hard light, difference, exclusion -- [x] Per-layer LED range masks (optional start/end/reverse on each composite layer) - -### `notification` - -- [x] Chase effect (light bounces across strip with glowing tail) -- [x] Gradient flash (bright center fades to edges, exponential decay) -- [x] Queue priority levels (color_override = high priority, interrupts current) - -### `api_input` - -- [x] ~~Crossfade transition~~ — won't do: external client owns temporal transitions; crossfading on our side would double-smooth -- [x] Interpolation when incoming LED count differs from strip count (linear/nearest/none modes) -- [x] Last-write-wins from any client — already the default behavior (push overwrites buffer) - -## Architectural / Pipeline - -### Processing Templates (CSPT) - -- [x] HSL shift filter (hue rotation + lightness adjustment) -- [x] ~~Color temperature filter~~ — already exists as `color_correction` -- [x] Contrast filter -- [x] ~~Saturation filter~~ — already exists -- [x] ~~Pixelation filter~~ — already exists as `pixelate` -- [x] Temporal blur filter (blend frames over time) - -### Transition Engine - -Needs deeper design discussion. Likely a new entity type `ColorStripSourceTransition` that defines how source switches happen (crossfade, wipe, etc.). Interacts with automations when they switch a target's active source. - -### Deferred - -- Global BPM sync *(not sure)* -- Recording/playback *(not now)* -- Source preview in editor modal *(not needed — overlay preview on devices is sufficient)* - ---- - -## Remaining Open Discussion - -1. ~~**`home_assistant` source** — Need to research HAOS communication protocols first~~ **DONE** — WebSocket API chosen, connection layer + automation condition + UI implemented -2. **Transition engine** — Design as `ColorStripSourceTransition` entity: what transition types? (crossfade, wipe, dissolve?) How does a target reference its transition config? How do automations trigger it? -3. **Home Assistant output targets** — Investigate casting LED colors TO Home Assistant lights (reverse direction). Use HA `light.turn_on` service call with `rgb_color` via WebSocket API. Could enable: ambient lighting on HA-controlled bulbs (Hue, WLED via HA, Zigbee lights), room-by-room color sync, whole-home ambient scenes. Need to research: rate limiting (don't spam HA with 30fps updates), grouping multiple lights, brightness/color_temp mapping, transition parameter support. diff --git a/TODO-release.md b/TODO-release.md new file mode 100644 index 0000000..495af0a --- /dev/null +++ b/TODO-release.md @@ -0,0 +1,20 @@ +# TODO + +## IMPORTANT: Remove WLED naming throughout the app + +- [ ] Rename all references to "WLED" in user-facing strings, class names, module names, config keys, file paths, and documentation +- [ ] The app is **LedGrab** — not tied to WLED specifically. WLED is just one of many supported output protocols +- [ ] Audit: i18n keys, page titles, tray labels, installer text, pyproject.toml description, README, CLAUDE.md, context files, API docs +- [ ] Rename `wled_controller` package → decide on new package name (e.g. `ledgrab`) +- [ ] Update import paths, entry points, config references, build scripts, Docker, CI/CD +- [ ] **Migration required** if renaming storage paths or config keys (see data migration policy in CLAUDE.md) + +--- + +## Donation / Open-Source Banner + +- [x] Add a persistent but dismissible banner or notification in the dashboard UI informing users that the project is open-source and under active development, and that donations are highly appreciated +- [x] Include a link to the donation page (GitHub Sponsors, Ko-fi, or similar — decide on platform) +- [x] Remember dismissal in localStorage so it doesn't reappear every session +- [x] Add i18n keys for the banner text (`en.json`, `ru.json`, `zh.json`) +- [ ] Configure `DONATE_URL` and `REPO_URL` constants in `donation.ts` once platform is chosen diff --git a/contexts/frontend.md b/contexts/frontend.md index 4135f39..5a236e3 100644 --- a/contexts/frontend.md +++ b/contexts/frontend.md @@ -96,6 +96,20 @@ Both widgets hide the native `` dropdowns per row. Each row should be a styled card with: + +- An icon (from `getDeviceTypeIcon()` / `getXxxIcon()`) showing the entity type +- The entity name and metadata (LED count, type, etc.) +- SVG icon buttons for reorder (chevron-up/down) and remove (trash) +- A click handler that opens `EntityPalette.pick()` to change the selection +- `data-*` attributes to store the selected value (not hidden `