{
    "effectName": "Adjust",
    "canvasMode": true,
    "properties": [
        {
            "id": "Action",
            "label": "Adjustment",
            "description": "The type of channel value adjustment to apply. Options include adding/scaling values, clamping to min/max/range, shifting with wrap, excluding a range, or reversing brightness.",
            "type": "enum",
            "controlType": "choice",
            "options": [
                "None",
                "Adjust By Value",
                "Adjust By Percentage",
                "Set Minimum",
                "Set Maximum",
                "Set Range",
                "Shift With Wrap By Value",
                "Prevent Range",
                "Reverse"
            ],
            "default": "None"
        },
        {
            "id": "Value1",
            "label": "Value 1",
            "description": "Primary adjustment value. Its meaning depends on the action: offset amount for Adjust By Value, percentage for Adjust By Percentage, minimum for Set Minimum, or lower bound for Set Range.",
            "type": "int",
            "controlType": "spin",
            "default": 0,
            "min": -255,
            "max": 255,
            "dynamicLabel": {
                "property": "Action",
                "map": {
                    "None": "Unused:",
                    "Adjust By Value": "Adjust by:",
                    "Adjust By Percentage": "Adjust by:",
                    "Set Minimum": "Minimum:",
                    "Set Maximum": "Maximum:",
                    "Set Range": "Minimum:",
                    "Shift With Wrap By Value": "Shift by:",
                    "Prevent Range": "Minimum:",
                    "Reverse": "Unused:"
                },
                "defaultLabel": "Value 1"
            }
        },
        {
            "id": "Value2",
            "label": "Value 2",
            "description": "Secondary adjustment value used by actions that require a range, such as Set Range and Prevent Range, where it defines the upper bound.",
            "type": "int",
            "controlType": "spin",
            "default": 0,
            "min": -255,
            "max": 255,
            "dynamicLabel": {
                "property": "Action",
                "map": {
                    "Set Range": "Maximum:",
                    "Prevent Range": "Maximum:"
                },
                "defaultLabel": "Unused:"
            }
        },
        {
            "id": "NthChannel",
            "label": "Nth Channel",
            "description": "Apply the adjustment to every Nth channel. A value of 1 adjusts every channel, 2 adjusts every other channel, 3 every third, etc.",
            "type": "int",
            "controlType": "spin",
            "default": 1,
            "min": 1,
            "max": 32
        },
        {
            "id": "StartingAt",
            "label": "Starting At",
            "description": "The first channel number (1-based) to begin applying the adjustment. Channels before this position are left unchanged.",
            "type": "int",
            "controlType": "spin",
            "default": 1,
            "min": 1,
            "max": 100
        },
        {
            "id": "Count",
            "label": "Count",
            "description": "Maximum number of channels to adjust. A value of 0 means adjust all matching channels with no limit.",
            "type": "int",
            "controlType": "spin",
            "default": 0,
            "min": 0,
            "max": 10000
        }
    ],
    "visibilityRules": [
        {
            "when": {
                "property": "Action",
                "oneOf": [
                    "None",
                    "Reverse"
                ]
            },
            "disable": [
                "Value1"
            ]
        },
        {
            "when": {
                "property": "Action",
                "oneOf": [
                    "Set Range",
                    "Prevent Range"
                ]
            },
            "enable": [
                "Value2"
            ]
        }
    ]
}
