Add static color for simple devices, change auto-shutdown to auto-restore

- Add `static_color` capability to Adalight provider with `set_color()` method
- Add `static_color` field to Device model, DeviceState, and API schemas
- Add GET/PUT `/devices/{id}/color` API endpoints
- Change auto-shutdown behavior: restore device to idle state instead of
  powering off (WLED uses snapshot/restore, Adalight sends static color
  or black frame)
- Rename `_auto_shutdown_device_if_idle` to `_restore_device_idle_state`
- Add inline color picker on device cards for devices with static_color
- Add auto_shutdown toggle to device settings modal
- Update labels from "Auto Shutdown" to "Auto Restore" (en + ru)
- Remove backward-compat KC aliases from ProcessorManager
- Align card action buttons to bottom with flex column layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-18 13:42:05 +03:00
parent fc779eef39
commit d6cf45c873
13 changed files with 349 additions and 48 deletions

View File

@@ -231,6 +231,8 @@ section {
padding: 12px 20px 20px;
position: relative;
transition: transform 0.2s, box-shadow 0.2s;
display: flex;
flex-direction: column;
}
.card:hover {
@@ -739,6 +741,40 @@ section {
pointer-events: none;
}
/* Static color picker — inline in card-subtitle */
.static-color-control {
display: inline-flex;
align-items: center;
gap: 4px;
}
.static-color-picker {
width: 22px;
height: 18px;
padding: 0;
border: 1px solid var(--border-color);
border-radius: 3px;
cursor: pointer;
background: none;
vertical-align: middle;
}
.btn-clear-color {
background: none;
border: none;
color: #777;
font-size: 0.75rem;
cursor: pointer;
padding: 0 2px;
line-height: 1;
border-radius: 3px;
transition: color 0.2s;
}
.btn-clear-color:hover {
color: var(--danger-color);
}
.section-header {
display: flex;
align-items: center;
@@ -779,6 +815,54 @@ ul.section-tip li {
margin-bottom: 15px;
}
.settings-toggle-group {
display: flex;
flex-direction: column;
}
.settings-toggle {
position: relative;
display: inline-block;
width: 34px;
height: 18px;
cursor: pointer;
margin-top: 4px;
}
.settings-toggle input {
opacity: 0;
width: 0;
height: 0;
}
.settings-toggle-slider {
position: absolute;
inset: 0;
background: var(--border-color);
border-radius: 9px;
transition: background 0.2s;
}
.settings-toggle-slider::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 14px;
height: 14px;
background: white;
border-radius: 50%;
transition: transform 0.2s;
}
.settings-toggle input:checked + .settings-toggle-slider {
background: var(--primary-color);
}
.settings-toggle input:checked + .settings-toggle-slider::after {
transform: translateX(16px);
}
label {
display: block;
margin-bottom: 5px;