{
    "effectName": "Ripple",
    "properties": [
        {
            "id": "Ripple_Draw_Style",
            "label": "Draw Style",
            "type": "enum",
            "controlType": "choice",
            "options": [
                "Old",
                "Lines Inward",
                "Lines Outward",
                "Lines Both",
                "Lines Inward Ripple",
                "Lines Outward Ripple",
                "Lines Both Ripple",
                "Solid Inward",
                "Solid Outward",
                "Solid Both",
                "Solid Inward Ripple",
                "Solid Outward Ripple",
                "Solid Both Ripple",
                "Highlight Inward",
                "Highlight Outward",
                "Highlight Both",
                "Highlight Inward Ripple",
                "Highlight Outward Ripple",
                "Highlight Both Ripple"
            ],
            "default": "Old",
            "lockable": true,
            "description": "Rendering style and direction for the ripple waves. Lines draw outlines only, Solid fills the shapes, and Highlight emphasizes edges. Inward/Outward/Both controls the wave direction, and Ripple variants add repeated wave pulses."
        },
        {
            "id": "Ripple_Object_To_Draw",
            "label": "Object",
            "type": "enum",
            "controlType": "choice",
            "options": [
                "Circle",
                "Square",
                "Triangle",
                "Star",
                "Polygon",
                "Heart",
                "Tree",
                "Candy Cane",
                "Snow Flake",
                "Crucifix",
                "Present",
                "SVG"
            ],
            "default": "Circle",
            "lockable": true,
            "description": "Shape of the ripple waves expanding from the center. Choose from geometric shapes, holiday objects, or load a custom SVG outline."
        },
        {
            "id": "Ripple_SVG",
            "label": "SVG",
            "type": "file",
            "controlType": "custom",
            "default": "",
            "fileFilter": "*.svg",
            "fileMessage": "Choose a SIMPLE svg file",
            "description": "Path to a simple SVG file whose outline is used as the ripple shape when Object is set to SVG."
        },
        {
            "id": "Ripple_Movement",
            "label": "Movement",
            "type": "enum",
            "controlType": "choice",
            "options": [
                "Explode",
                "Implode",
                "None"
            ],
            "default": "Explode",
            "lockable": true,
            "description": "Controls whether ripple waves expand outward (Explode), contract inward (Implode), or remain stationary (None) over the effect duration."
        },
        {
            "id": "Ripple_Scale",
            "label": "Scale",
            "type": "int",
            "controlType": "slider",
            "default": 100,
            "min": 0,
            "max": 500,
            "valueCurve": true,
            "lockable": true,
            "description": "Overall size of the ripple pattern as a percentage. Values above 100 expand the ripples beyond the model boundaries."
        },
        {
            "id": "Ripple_Outline",
            "label": "Outline",
            "type": "float",
            "controlType": "slider",
            "default": 1.0,
            "divisor": 10,
            "valueCurve": true,
            "lockable": true,
            "min": 0,
            "max": 100,
            "description": "Thickness of each ripple line. Higher values draw wider ripple bands; lower values produce thinner outlines."
        },
        {
            "id": "Ripple_Thickness",
            "label": "Ripples",
            "type": "int",
            "controlType": "slider",
            "default": 3,
            "min": 1,
            "max": 100,
            "valueCurve": true,
            "lockable": true,
            "description": "Number of concentric ripple rings displayed simultaneously. More ripples create a denser wave pattern."
        },
        {
            "id": "Ripple_Spacing",
            "label": "Spacing",
            "type": "float",
            "controlType": "slider",
            "default": 1.0,
            "divisor": 10,
            "valueCurve": true,
            "lockable": true,
            "min": 1,
            "max": 400,
            "description": "Distance between consecutive ripple rings. Larger values spread the rings farther apart."
        },
        {
            "id": "Ripple_Cycles",
            "label": "Cycle Cnt",
            "type": "float",
            "controlType": "slider",
            "default": 1.0,
            "divisor": 10,
            "valueCurve": true,
            "min": 0,
            "max": 300,
            "description": "Number of complete ripple animation cycles over the effect duration. Higher values repeat the expand/contract motion more times."
        },
        {
            "id": "RIPPLE_POINTS",
            "label": "Points",
            "type": "int",
            "controlType": "slider",
            "default": 5,
            "min": 3,
            "max": 8,
            "lockable": true,
            "description": "Number of points for star, polygon, and snowflake shapes. Only applies when one of those shapes is selected."
        },
        {
            "id": "Ripple_Rotation",
            "label": "Rotation",
            "type": "int",
            "controlType": "slider",
            "default": 0,
            "min": -360,
            "max": 360,
            "valueCurve": true,
            "lockable": true,
            "description": "Rotates the ripple shape by this many degrees. Useful for orienting non-circular shapes like triangles or stars."
        },
        {
            "id": "Ripple_Twist",
            "label": "Twist",
            "type": "float",
            "controlType": "slider",
            "default": 0.0,
            "divisor": 10,
            "valueCurve": true,
            "lockable": true,
            "min": -450,
            "max": 450,
            "description": "Applies increasing rotation to each successive ripple ring, creating a spiral twist effect. Positive and negative values twist in opposite directions."
        },
        {
            "id": "Ripple_XC",
            "label": "X Center",
            "type": "int",
            "controlType": "slider",
            "default": 0,
            "min": -100,
            "max": 100,
            "valueCurve": true,
            "description": "Horizontal position of the ripple center as a percentage offset from the model center."
        },
        {
            "id": "Ripple_YC",
            "label": "Y Center",
            "type": "int",
            "controlType": "slider",
            "default": 0,
            "min": -100,
            "max": 100,
            "valueCurve": true,
            "description": "Vertical position of the ripple center as a percentage offset from the model center."
        },
        {
            "id": "Ripple_Velocity",
            "label": "Velocity",
            "type": "float",
            "controlType": "slider",
            "default": 0.0,
            "divisor": 10,
            "valueCurve": true,
            "lockable": true,
            "min": 0,
            "max": 300,
            "description": "Speed at which the ripple center moves across the model in the specified direction. Zero keeps the center stationary."
        },
        {
            "id": "Ripple_Direction",
            "label": "Direction",
            "type": "int",
            "controlType": "slider",
            "default": 0,
            "min": -360,
            "max": 360,
            "valueCurve": true,
            "lockable": true,
            "description": "Angle in degrees that the ripple center travels when velocity is non-zero. 0 is right, 90 is up, etc."
        },
        {
            "id": "Ripple3D",
            "label": "3D",
            "type": "bool",
            "controlType": "checkbox",
            "default": false,
            "lockable": true,
            "description": "When enabled, applies a brightness gradient to the ripple rings to simulate a three-dimensional depth effect."
        },
        {
            "id": "Ripple_TimingTrack",
            "label": "Timing Track",
            "type": "enum",
            "controlType": "choice",
            "options": [],
            "default": "",
            "dynamicOptions": "timingTracks",
            "lockable": true,
            "description": "When set, each timing mark triggers a new ripple cycle. Duration controls how long each cycle lasts.",
            "expandToFill": true
        },
        {
            "id": "Ripple_FilterLabel",
            "label": "Filter",
            "type": "string",
            "controlType": "text",
            "default": "",
            "description": "Text filter applied to timing track labels. Only timing marks whose labels match this filter text will trigger a ripple."
        },
        {
            "id": "Ripple_FilterRegex",
            "label": "Regex",
            "type": "bool",
            "controlType": "checkbox",
            "default": false,
            "description": "When enabled, the filter text is treated as a regular expression pattern instead of a plain text match."
        },
        {
            "id": "Ripple_Duration",
            "label": "Duration (ms)",
            "type": "int",
            "controlType": "slider",
            "default": 1000,
            "min": 50,
            "max": 5000,
            "lockable": true,
            "description": "How long each ripple cycle lasts in milliseconds after a timing mark fires. Only active when a Timing Track is selected."
        }
    ],
    "visibilityRules": [
        {
            "when": { "property": "Ripple_Object_To_Draw", "oneOf": ["Star", "Snow Flake", "Polygon"] },
            "enable": ["RIPPLE_POINTS"]
        },
        {
            "when": { "property": "Ripple_Object_To_Draw", "oneOf": ["Star", "Snow Flake", "Polygon"] },
            "enable": ["Ripple_Rotation"]
        },
        {
            "when": { "property": "Ripple_Draw_Style", "notEquals": "Old" },
            "enable": ["Ripple_Rotation"]
        },
        {
            "when": { "property": "Ripple_Draw_Style", "notEquals": "Old" },
            "enable": ["Ripple_Scale", "Ripple_Spacing", "Ripple_Twist", "Ripple_Direction", "Ripple_Velocity", "Ripple_Outline"]
        },
        {
            "when": { "property": "Ripple_TimingTrack", "notOneOf": [""] },
            "enable": ["Ripple_FilterLabel", "Ripple_FilterRegex", "Ripple_Duration"]
        },
        {
            "when": { "property": "Ripple_TimingTrack", "oneOf": [""] },
            "disable": ["Ripple_FilterLabel", "Ripple_FilterRegex", "Ripple_Duration"]
        }
    ]
}
