Remove all migration logic, scroll tutorial targets into view, mock URL uses device ID

- Remove legacy migration code: profiles→automations key fallbacks, segments array
  fallback, standby_interval compat, profile_id compat, wled→led type mapping,
  legacy calibration field, audio CSS migration, default template migration,
  loadTargets alias, wled sub-tab mapping
- Scroll tutorial step targets into view when off-screen
- Mock device URL changed from mock://{led_count} to mock://{device_id},
  hide mock URL badge on device cards

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 18:31:41 +03:00
parent 39b31aec34
commit 0eb0f44ddb
12 changed files with 26 additions and 172 deletions
@@ -75,7 +75,7 @@ class AutomationSnapshot:
@classmethod
def from_dict(cls, data: dict) -> "AutomationSnapshot":
return cls(
automation_id=data.get("automation_id", data.get("profile_id", "")),
automation_id=data.get("automation_id", ""),
enabled=data.get("enabled", True),
)
@@ -118,7 +118,7 @@ class ScenePreset:
color=data.get("color", "#4fc3f7"),
targets=[TargetSnapshot.from_dict(t) for t in data.get("targets", [])],
devices=[DeviceBrightnessSnapshot.from_dict(d) for d in data.get("devices", [])],
automations=[AutomationSnapshot.from_dict(a) for a in data.get("automations", data.get("profiles", []))],
automations=[AutomationSnapshot.from_dict(a) for a in data.get("automations", [])],
order=data.get("order", 0),
created_at=datetime.fromisoformat(data.get("created_at", datetime.utcnow().isoformat())),
updated_at=datetime.fromisoformat(data.get("updated_at", datetime.utcnow().isoformat())),