Add CSPT entity, processed CSS source type, reverse filter, and UI improvements

- Add Color Strip Processing Template (CSPT) entity: reusable filter chains
  for 1D LED strip postprocessing (backend, storage, API, frontend CRUD)
- Add "processed" color strip source type that wraps another CSS source and
  applies a CSPT filter chain (dataclass, stream, schema, modal, cards)
- Add Reverse filter for strip LED order reversal
- Add CSPT and processed CSS nodes/edges to visual graph editor
- Add CSPT test preview WS endpoint with input source selection
- Add device settings CSPT template selector (add + edit modals with hints)
- Use icon grids for palette quantization preset selector in filter lists
- Use EntitySelect for template references and test modal source selectors
- Fix filters.css_filter_template.desc missing localization
- Fix icon grid cell height inequality (grid-auto-rows: 1fr)
- Rename "Processed" subtab to "Processing Templates"
- Localize all new strings (en/ru/zh)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 02:16:59 +03:00
parent 7e78323c9c
commit 294d704eb0
72 changed files with 2992 additions and 1416 deletions

View File

@@ -198,6 +198,8 @@
"device.gamesense.peripheral.mousepad.desc": "Mousepad edge lighting zones",
"device.gamesense.peripheral.indicator": "Indicator",
"device.gamesense.peripheral.indicator.desc": "OLED/LED status indicator",
"device.css_processing_template": "Strip Processing Template:",
"device.css_processing_template.hint": "Default processing template applied to all color strip outputs on this device",
"device.dmx_protocol": "DMX Protocol:",
"device.dmx_protocol.hint": "Art-Net uses UDP port 6454, sACN (E1.31) uses UDP port 5568",
"device.dmx_protocol.artnet.desc": "UDP unicast, port 6454",
@@ -417,6 +419,7 @@
"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.css_processing": "Processing Templates",
"streams.group.color_strip": "Color Strips",
"streams.group.audio": "Audio",
"streams.section.streams": "Sources",
@@ -485,12 +488,16 @@
"filters.color_correction.desc": "White balance and color temperature",
"filters.filter_template": "Filter Template",
"filters.filter_template.desc": "Embed another processing template",
"filters.css_filter_template": "Strip Filter Template",
"filters.css_filter_template.desc": "Embed another strip processing template",
"filters.frame_interpolation": "Frame Interpolation",
"filters.frame_interpolation.desc": "Blend between frames for smoother output",
"filters.noise_gate": "Noise Gate",
"filters.noise_gate.desc": "Suppress small color changes below threshold",
"filters.palette_quantization": "Palette Quantization",
"filters.palette_quantization.desc": "Reduce colors to a limited palette",
"filters.reverse": "Reverse",
"filters.reverse.desc": "Reverse the LED order in the strip",
"postprocessing.description_label": "Description (optional):",
"postprocessing.description_placeholder": "Describe this template...",
"postprocessing.created": "Template created successfully",
@@ -506,6 +513,21 @@
"postprocessing.test.running": "Testing processing template...",
"postprocessing.test.error.no_stream": "Please select a source",
"postprocessing.test.error.failed": "Processing template test failed",
"css_processing.title": "Strip Processing Templates",
"css_processing.add": "Add Strip Processing Template",
"css_processing.edit": "Edit Strip Processing Template",
"css_processing.name": "Template Name:",
"css_processing.name_placeholder": "My Strip Processing Template",
"css_processing.description_label": "Description (optional):",
"css_processing.description_placeholder": "Describe this template...",
"css_processing.created": "Strip processing template created",
"css_processing.updated": "Strip processing template updated",
"css_processing.deleted": "Strip processing template deleted",
"css_processing.delete.confirm": "Are you sure you want to delete this strip processing template?",
"css_processing.error.required": "Please fill in all required fields",
"css_processing.error.load": "Error loading strip processing template",
"css_processing.error.delete": "Error deleting strip processing template",
"css_processing.error.clone_failed": "Failed to clone strip processing template",
"device.button.stream_selector": "Source Settings",
"device.stream_settings.title": "Source Settings",
"device.stream_selector.label": "Source:",
@@ -1027,6 +1049,14 @@
"color_strip.candlelight.num_candles.hint": "How many independent candle sources along the strip. Each flickers with its own pattern.",
"color_strip.candlelight.speed": "Flicker Speed:",
"color_strip.candlelight.speed.hint": "Speed of the flicker animation. Higher values produce faster, more restless flames.",
"color_strip.type.processed": "Processed",
"color_strip.type.processed.desc": "Apply a processing template to another source",
"color_strip.type.processed.hint": "Wraps an existing color strip source and pipes its output through a filter chain.",
"color_strip.processed.input": "Input Source:",
"color_strip.processed.input.hint": "The color strip source whose output will be processed",
"color_strip.processed.template": "Processing Template:",
"color_strip.processed.template.hint": "Filter chain to apply to the input source output",
"color_strip.processed.error.no_input": "Please select an input source",
"color_strip.composite.layers": "Layers:",
"color_strip.composite.layers.hint": "Stack multiple color strip sources. First layer is the bottom, last is the top. Each layer can have its own blend mode and opacity.",
"color_strip.composite.add_layer": "+ Add Layer",
@@ -1043,6 +1073,7 @@
"color_strip.composite.opacity": "Opacity",
"color_strip.composite.brightness": "Brightness",
"color_strip.composite.brightness.none": "— None —",
"color_strip.composite.processing": "Processing",
"color_strip.composite.enabled": "Enabled",
"color_strip.composite.error.min_layers": "At least 1 layer is required",
"color_strip.composite.error.no_source": "Each layer must have a source selected",
@@ -1182,6 +1213,7 @@
"streams.group.value": "Value Sources",
"streams.group.sync": "Sync Clocks",
"tree.group.picture": "Picture",
"tree.group.strip": "Color Strip",
"tree.group.utility": "Utility",
"value_source.group.title": "Value Sources",
"value_source.select_type": "Select Value Source Type",