Replace all emoji icons with Lucide SVGs, add accent color picker

- Replace all emoji characters across WebUI with inline Lucide SVG icons
  for cross-platform consistency (icon paths in icon-paths.js)
- Add accent color picker popover with 9 preset colors + custom picker,
  persisted to localStorage, updates all CSS custom properties
- Remove subtab separator line for cleaner look
- Color badge icons with accent color for visual pop
- Remove processing badge from target cards
- Fix hardcoded #4CAF50 in FPS labels and active badges to use CSS vars
- Replace CSS content emoji (▶) with pure CSS triangle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 16:14:18 +03:00
parent efb6cf7ce6
commit c262ec0775
39 changed files with 634 additions and 311 deletions

View File

@@ -3,6 +3,8 @@
"app.version": "Version:",
"app.api_docs": "API Documentation",
"theme.toggle": "Toggle theme",
"accent.title": "Accent color",
"accent.custom": "Custom",
"locale.change": "Change language",
"auth.login": "Login",
"auth.logout": "Logout",
@@ -21,7 +23,7 @@
"auth.please_login": "Please login to view",
"auth.session_expired": "Your session has expired or the API key is invalid. Please login again.",
"displays.title": "Available Displays",
"displays.layout": "\uD83D\uDDA5\uFE0F Displays",
"displays.layout": "Displays",
"displays.information": "Display Information",
"displays.legend.primary": "Primary Display",
"displays.legend.secondary": "Secondary Display",
@@ -44,7 +46,7 @@
"displays.picker.adb_connect.error": "Failed to connect device",
"displays.picker.adb_disconnect": "Disconnect",
"displays.picker.no_android": "No Android devices found. Connect via USB or enter IP above.",
"templates.title": "\uD83D\uDCC4 Engine Templates",
"templates.title": "Engine Templates",
"templates.description": "Capture templates define how the screen is captured. Each template uses a specific capture engine (MSS, DXcam, WGC) with custom settings. Assign templates to devices for optimal performance.",
"templates.loading": "Loading templates...",
"templates.empty": "No capture templates configured",
@@ -77,7 +79,7 @@
"templates.test.display.select": "Select display...",
"templates.test.duration": "Capture Duration (s):",
"templates.test.border_width": "Border Width (px):",
"templates.test.run": "\uD83E\uDDEA Run",
"templates.test.run": "Run",
"templates.test.running": "Running test...",
"templates.test.results.preview": "Full Capture Preview",
"templates.test.results.borders": "Border Extraction",
@@ -97,7 +99,7 @@
"templates.test.error.no_engine": "Please select a capture engine",
"templates.test.error.no_display": "Please select a display",
"templates.test.error.failed": "Test failed",
"devices.title": "\uD83D\uDCA1 Devices",
"devices.title": "Devices",
"devices.add": "Add New Device",
"devices.loading": "Loading devices...",
"devices.none": "No devices configured",
@@ -180,7 +182,7 @@
"device.tip.calibrate": "Calibrate LED positions, direction, and coverage",
"device.tip.webui": "Open the device's built-in web interface for advanced configuration",
"device.tip.add": "Click here to add a new LED device",
"settings.title": "Device Settings",
"settings.title": "Settings",
"settings.general.title": "General Settings",
"settings.capture.title": "Capture Settings",
"settings.capture.saved": "Capture settings updated",
@@ -285,12 +287,12 @@
"section.filter.reset": "Clear filter",
"section.expand_all": "Expand all sections",
"section.collapse_all": "Collapse all sections",
"streams.title": "\uD83D\uDCFA Sources",
"streams.title": "Sources",
"streams.description": "Sources define the capture pipeline. A raw source captures from a display using a capture template. A processed source applies postprocessing to another source. Assign sources to devices.",
"streams.group.raw": "Screen Capture",
"streams.group.processed": "Processed",
"streams.group.audio": "Audio",
"streams.section.streams": "\uD83D\uDCFA Sources",
"streams.section.streams": "Sources",
"streams.add": "Add Source",
"streams.add.raw": "Add Screen Capture",
"streams.add.processed": "Add Processed Source",
@@ -322,11 +324,11 @@
"streams.error.required": "Please fill in all required fields",
"streams.error.delete": "Failed to delete source",
"streams.test.title": "Test Source",
"streams.test.run": "🧪 Run",
"streams.test.run": "Run",
"streams.test.running": "Testing source...",
"streams.test.duration": "Capture Duration (s):",
"streams.test.error.failed": "Source test failed",
"postprocessing.title": "\uD83D\uDCC4 Filter Templates",
"postprocessing.title": "Filter Templates",
"postprocessing.description": "Processing templates define image filters and color correction. Assign them to processed picture sources for consistent postprocessing across devices.",
"postprocessing.add": "Add Filter Template",
"postprocessing.edit": "Edit Filter Template",
@@ -363,7 +365,7 @@
"postprocessing.test.error.no_stream": "Please select a source",
"postprocessing.test.error.failed": "Processing template test failed",
"device.button.stream_selector": "Source Settings",
"device.stream_settings.title": "📺 Source Settings",
"device.stream_settings.title": "Source Settings",
"device.stream_selector.label": "Source:",
"device.stream_selector.hint": "Select a source that defines what this device captures and processes",
"device.stream_selector.none": "-- No source assigned --",
@@ -388,13 +390,13 @@
"streams.validate_image.validating": "Validating...",
"streams.validate_image.valid": "Image accessible",
"streams.validate_image.invalid": "Image not accessible",
"targets.title": "Targets",
"targets.title": "Targets",
"targets.description": "Targets bridge color strip sources to output devices. Each target references a device and a color strip source.",
"targets.subtab.wled": "LED",
"targets.subtab.led": "LED",
"targets.section.devices": "💡 Devices",
"targets.section.color_strips": "🎞️ Color Strip Sources",
"targets.section.targets": "Targets",
"targets.section.devices": "Devices",
"targets.section.color_strips": "Color Strip Sources",
"targets.section.targets": "Targets",
"targets.section.specific_settings": "Specific Settings",
"targets.add": "Add Target",
"targets.edit": "Edit Target",
@@ -444,7 +446,7 @@
"targets.metrics.frames": "Frames",
"targets.metrics.errors": "Errors",
"targets.subtab.key_colors": "Key Colors",
"targets.section.key_colors": "🎨 Key Colors Targets",
"targets.section.key_colors": "Key Colors Targets",
"kc.add": "Add Key Colors Target",
"kc.edit": "Edit Key Colors Target",
"kc.name": "Target Name:",
@@ -476,9 +478,9 @@
"kc.colors.none": "No colors extracted yet",
"kc.test": "Test",
"kc.test.error": "Test failed",
"targets.section.pattern_templates": "📄 Pattern Templates",
"pattern.add": "📄 Add Pattern Template",
"pattern.edit": "📄 Edit Pattern Template",
"targets.section.pattern_templates": "Pattern Templates",
"pattern.add": "Add Pattern Template",
"pattern.edit": "Edit Pattern Template",
"pattern.name": "Template Name:",
"pattern.name.placeholder": "My Pattern Template",
"pattern.description_label": "Description (optional):",
@@ -513,7 +515,7 @@
"overlay.stopped": "Overlay visualization stopped",
"overlay.error.start": "Failed to start overlay",
"overlay.error.stop": "Failed to stop overlay",
"dashboard.title": "📊 Dashboard",
"dashboard.title": "Dashboard",
"dashboard.section.targets": "Targets",
"dashboard.section.running": "Running",
"dashboard.section.stopped": "Stopped",
@@ -532,10 +534,9 @@
"dashboard.perf.gpu": "GPU",
"dashboard.perf.unavailable": "unavailable",
"dashboard.poll_interval": "Refresh interval",
"profiles.title": "\uD83D\uDCCB Profiles",
"profiles.title": "Profiles",
"profiles.empty": "No profiles configured. Create one to automate target activation.",
"profiles.add": "\uD83D\uDCCB Add Profile",
"profiles.add": "Add Profile",
"profiles.edit": "Edit Profile",
"profiles.delete.confirm": "Delete profile \"{name}\"?",
"profiles.name": "Name:",
@@ -549,7 +550,7 @@
"profiles.conditions": "Conditions:",
"profiles.conditions.hint": "Rules that determine when this profile activates",
"profiles.conditions.add": "Add Condition",
"profiles.conditions.empty": "No conditions \u2014 profile is always active when enabled",
"profiles.conditions.empty": "No conditions profile is always active when enabled",
"profiles.condition.always": "Always",
"profiles.condition.always.hint": "Profile activates immediately when enabled and stays active. Use this to auto-start targets on server startup.",
"profiles.condition.application": "Application",
@@ -597,9 +598,8 @@
"aria.previous": "Previous",
"aria.next": "Next",
"aria.hint": "Show hint",
"color_strip.add": "🎞️ Add Color Strip Source",
"color_strip.edit": "🎞️ Edit Color Strip Source",
"color_strip.add": "Add Color Strip Source",
"color_strip.edit": "Edit Color Strip Source",
"color_strip.name": "Name:",
"color_strip.name.placeholder": "Wall Strip",
"color_strip.picture_source": "Picture Source:",
@@ -786,7 +786,6 @@
"color_strip.palette.aurora": "Aurora",
"color_strip.palette.sunset": "Sunset",
"color_strip.palette.ice": "Ice",
"audio_source.title": "Audio Sources",
"audio_source.group.multichannel": "Multichannel",
"audio_source.group.mono": "Mono",
@@ -829,14 +828,12 @@
"audio_source.test.beat": "Beat",
"audio_source.test.connecting": "Connecting...",
"audio_source.test.error": "Audio test failed",
"audio_template.test": "Test",
"audio_template.test.title": "Test Audio Template",
"audio_template.test.device": "Audio Device:",
"audio_template.test.device.hint": "Select which audio device to capture from during the test",
"audio_template.test.run": "🧪 Run",
"audio_template.title": "🎵 Audio Templates",
"audio_template.test.run": "Run",
"audio_template.title": "Audio Templates",
"audio_template.add": "Add Audio Template",
"audio_template.edit": "Edit Audio Template",
"audio_template.name": "Template Name:",
@@ -857,9 +854,8 @@
"audio_template.error.engines": "Failed to load audio engines",
"audio_template.error.required": "Please fill in all required fields",
"audio_template.error.delete": "Failed to delete audio template",
"streams.group.value": "Value Sources",
"value_source.group.title": "🔢 Value Sources",
"value_source.group.title": "Value Sources",
"value_source.add": "Add Value Source",
"value_source.edit": "Edit Value Source",
"value_source.name": "Name:",
@@ -947,7 +943,6 @@
"targets.protocol": "Protocol:",
"targets.protocol.hint": "DDP sends pixels via fast UDP (recommended for most setups). HTTP uses the JSON API — slower but reliable, limited to ~500 LEDs.",
"targets.protocol.serial": "Serial",
"search.open": "Search (Ctrl+K)",
"search.placeholder": "Search entities... (Ctrl+K)",
"search.loading": "Loading...",
@@ -963,8 +958,6 @@
"search.group.pattern_templates": "Pattern Templates",
"search.group.audio": "Audio Sources",
"search.group.value": "Value Sources",
"settings.title": "Settings",
"settings.backup.label": "Backup Configuration",
"settings.backup.hint": "Download all configuration (devices, targets, streams, templates, profiles) as a single JSON file.",
"settings.backup.button": "Download Backup",
@@ -979,7 +972,6 @@
"settings.restore.restarting": "Server is restarting...",
"settings.restore.restart_timeout": "Server did not respond. Please refresh the page manually.",
"settings.button.close": "Close",
"settings.auto_backup.label": "Auto-Backup",
"settings.auto_backup.hint": "Automatically create periodic backups of all configuration. Old backups are pruned when the maximum count is reached.",
"settings.auto_backup.enable": "Enable auto-backup",
@@ -990,7 +982,6 @@
"settings.auto_backup.save_error": "Failed to save auto-backup settings",
"settings.auto_backup.last_backup": "Last backup",
"settings.auto_backup.never": "Never",
"settings.saved_backups.label": "Saved Backups",
"settings.saved_backups.hint": "Auto-backup files stored on the server. Download to save locally, or delete to free space.",
"settings.saved_backups.empty": "No saved backups",