Add audio sources as first-class entities, add mapped CSS type, simplify target editor for mapped sources

- Audio sources moved to separate tab with dedicated CRUD API, store, and editor modal
- New "mapped" color strip source type: assigns different CSS sources to distinct LED sub-ranges (zones)
- Mapped stream runtime with per-zone sub-streams, auto-sizing, hot-update support
- Target editor auto-collapses segments UI when mapped CSS is selected
- Delete protection for CSS sources referenced by mapped zones
- Compact header/footer layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 23:35:58 +03:00
parent 199039326b
commit 9efb08acb6
28 changed files with 1729 additions and 153 deletions

View File

@@ -2,8 +2,8 @@ header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 0 10px;
margin-bottom: 10px;
padding: 8px 0 6px;
margin-bottom: 6px;
position: relative;
z-index: 100;
}
@@ -11,11 +11,11 @@ header {
.header-title {
display: flex;
align-items: center;
gap: 10px;
gap: 8px;
}
h1 {
font-size: 2rem;
font-size: 1.25rem;
color: var(--primary-text-color);
}
@@ -28,7 +28,7 @@ h2 {
.server-info {
display: flex;
align-items: center;
gap: 15px;
gap: 8px;
}
.header-link {
@@ -57,7 +57,7 @@ h2 {
}
.status-badge {
font-size: 1.5rem;
font-size: 1rem;
animation: pulse 2s infinite;
}
@@ -156,12 +156,12 @@ h2 {
.theme-toggle {
background: var(--card-bg);
border: 1px solid var(--border-color);
padding: 6px 12px;
padding: 4px 8px;
border-radius: 4px;
cursor: pointer;
font-size: 1.2rem;
font-size: 1rem;
transition: transform 0.2s;
margin-left: 10px;
margin-left: 0;
}
.theme-toggle:hover {
@@ -170,14 +170,14 @@ h2 {
/* Footer */
.app-footer {
margin-top: 20px;
padding: 15px 0;
margin-top: 12px;
padding: 6px 0;
text-align: center;
}
.footer-content {
color: var(--text-secondary);
font-size: 0.9rem;
font-size: 0.75rem;
}
.footer-content p {
@@ -203,7 +203,7 @@ h2 {
@media (max-width: 768px) {
header {
flex-direction: column;
gap: 15px;
gap: 8px;
text-align: center;
}
}