{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": true,
  "description": "One design element's embroidery parameters, as JSON values. Generated by `cargo xtask docs` from the parameter registry; the reference pages (params.md) describe the same parameters for people. Keys that are not listed are allowed: StitchCraft keeps them unchanged and reports them (SC-W0105).",
  "properties": {
    "angle": {
      "default": 0.0,
      "description": "The direction of the rows, in degrees counter-clockwise from horizontal: 0 sews horizontal rows and 90 upright ones.",
      "title": "Angle",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Rows",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "°"
      }
    },
    "bean_stitch_repeats": {
      "default": [
        0
      ],
      "description": "How many times to go back and forth over each stitch: 1 sews every stitch three times (there, back and there again), 2 five times. Several numbers separated by spaces are taken in turn along the stitches: \"1 0\" makes every other stitch bold.",
      "items": {
        "maximum": 10,
        "minimum": 0,
        "type": "integer"
      },
      "maxItems": 16,
      "minItems": 1,
      "title": "Bean stitch",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "zigzag_stitch",
          "manual_stitch"
        ],
        "group": "Repeats",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "center_walk_underlay": {
      "default": false,
      "description": "Sew a running stitch along the middle of the column first, there and back. It holds the fabric still along the column, and suits narrow columns. The other underlays and the top stitches follow it.",
      "title": "Centre walk underlay",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Centre walk underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "center_walk_underlay_position": {
      "default": 50.0,
      "description": "Where the centre walk runs, in percent of the way from the first rail to the second: 50 is the middle.",
      "maximum": 100.0,
      "minimum": 0.0,
      "title": "Centre walk position",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Centre walk underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "center_walk_underlay_repeats": {
      "default": 2,
      "description": "How many times the centre walk is sewn: 2 goes there and back, 3 there, back and there again. An odd number ends at the column's end, and the rest of the column is then sewn from its end.",
      "maximum": 100,
      "minimum": 1,
      "title": "Centre walk repeats",
      "type": "integer",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Centre walk underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "center_walk_underlay_stitch_length_mm": {
      "default": 3.0,
      "description": "How long each stitch of the centre walk is. Between corners its stitches are spread evenly, so each one is at most this long.",
      "maximum": 25.0,
      "minimum": 0.1,
      "title": "Centre walk stitch length",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Centre walk underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "center_walk_underlay_stitch_tolerance_mm": {
      "default": 0.2,
      "description": "How far a centre walk stitch may stray from the middle of the column on a curve. A smaller tolerance follows curves more closely, with more and shorter stitches.",
      "maximum": 5.0,
      "minimum": 0.01,
      "title": "Centre walk tolerance",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "deviation": "DEV-SAT-004",
        "group": "Centre walk underlay",
        "origin": "inkstitch-deviates",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "contour_underlay": {
      "default": false,
      "description": "Sew a running stitch along each edge of the column, a little inside it, after any centre walk. It holds the edges still and keeps them crisp.",
      "title": "Contour underlay",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Contour underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "contour_underlay_inset_mm": {
      "default": [
        0.4
      ],
      "description": "How far inside each rail the contour runs, so that it does not show past the top stitches. It also stops short of the column's start by the first rail's value and of its end by the second's. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 10.0,
        "minimum": -10.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Contour inset",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Contour underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "contour_underlay_inset_percent": {
      "default": [
        0.0
      ],
      "description": "More inset, in percent of the column's width at each point, added to the length above. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 100.0,
        "minimum": -100.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Contour inset (% of width)",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Contour underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "contour_underlay_stitch_length_mm": {
      "default": 3.0,
      "description": "How long each stitch of the contour is. Between corners its stitches are spread evenly, so each one is at most this long.",
      "maximum": 25.0,
      "minimum": 0.1,
      "title": "Contour stitch length",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Contour underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "contour_underlay_stitch_tolerance_mm": {
      "default": 0.2,
      "description": "How far a contour stitch may stray from its line on a curve. A smaller tolerance follows curves more closely, with more and shorter stitches.",
      "maximum": 5.0,
      "minimum": 0.01,
      "title": "Contour tolerance",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Contour underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "enable_random_stitch_length": {
      "default": false,
      "description": "Vary the stitch lengths at random instead of spreading them evenly, or in a tatami fill, instead of placing the needle points on the stagger grid. Lines and rows sewn close together then do not line their needle holes up, which avoids moiré patterns.",
      "title": "Random stitch length",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "tatami_fill"
        ],
        "group": "Running stitch",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "end_at_nearest_point": {
      "default": true,
      "description": "End near where the next element starts: the column is sewn up to the end point, along the line under it to its end, and back, and ends on its edge nearest the next element.",
      "title": "End at nearest point",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Start and end",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "end_row_spacing_mm": {
      "default": null,
      "description": "The spacing of the last rows, for a fill that fades: from the first row the spacing changes steadily towards it, reaching it the part's height away, in each part of the fill. Empty, every row is the row spacing from the next.",
      "maximum": 100.0,
      "minimum": 0.1,
      "title": "End row spacing",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "deviation": "DEV-FILL-003",
        "group": "Rows",
        "origin": "inkstitch-deviates",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "expand_mm": {
      "default": 0.0,
      "description": "How far past the drawn edge the top rows reach: each part is grown by this much, with round corners, before its rows are laid. The thread's pull opens gaps between fills sewn side by side, and this closes them. Negative values pull the rows in from the edge.",
      "maximum": 10.0,
      "minimum": -10.0,
      "title": "Expand",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Rows",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "fill": {
      "default": true,
      "description": "Whether the fill is sewn. Off, it sews nothing, and the shape's outline, if it has one, is sewn as its stroke settings say. The element before it still ends near it, as Ink/Stitch's does.",
      "title": "Sew the fill",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill",
          "circular_fill",
          "contour_fill",
          "cross_stitch",
          "guided_fill",
          "linear_gradient_fill",
          "meander_fill",
          "tartan_fill",
          "legacy_fill"
        ],
        "group": "Fill",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "fill_method": {
      "default": "tatami_fill",
      "description": "The stitch the area is filled with. A tatami fill sews rows of running stitches across it, and a fill set to Ink/Stitch's legacy fill is sewn as a tatami fill without underlay (`SC-W0314`). The other methods arrive in later versions; until then an element set to one is skipped (`SC-W0011`).",
      "enum": [
        "tatami_fill",
        "circular_fill",
        "contour_fill",
        "cross_stitch",
        "guided_fill",
        "linear_gradient_fill",
        "meander_fill",
        "tartan_fill",
        "legacy_fill"
      ],
      "title": "Fill method",
      "type": "string",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill",
          "circular_fill",
          "contour_fill",
          "cross_stitch",
          "guided_fill",
          "linear_gradient_fill",
          "meander_fill",
          "tartan_fill",
          "legacy_fill"
        ],
        "group": "Fill",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "fill_underlay": {
      "default": true,
      "description": "Sew underlay before the top rows: rows of stitches farther apart than the top rows, square to them unless set otherwise. It holds the fabric still while the fill is sewn and lifts the top rows, so less fabric shows between them.",
      "title": "Underlay",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "fill_underlay_angle": {
      "default": null,
      "description": "The direction of the underlay's rows, in degrees counter-clockwise from horizontal. Several angles separated by spaces sew a layer of underlay at each, one after another. Empty: square to the top rows, at the fill's angle plus 90°.",
      "items": {
        "type": "number"
      },
      "maxItems": 16,
      "minItems": 1,
      "title": "Underlay angle",
      "type": [
        "array",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "°"
      }
    },
    "fill_underlay_inset_mm": {
      "default": 0.0,
      "description": "How far inside the fill's edge its underlay stops: each part is shrunk by this much, with round corners, before the underlay's rows are laid, so that none of the underlay shows beyond the top rows. Negative values let it reach past the edge.",
      "maximum": 10.0,
      "minimum": -10.0,
      "title": "Underlay inset",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "fill_underlay_max_stitch_length_mm": {
      "default": null,
      "description": "How far apart the needle points along the underlay's rows are. Empty: the fill's longest stitch (`max_stitch_length_mm`).",
      "maximum": 25.0,
      "minimum": 0.1,
      "title": "Underlay longest stitch",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "fill_underlay_row_spacing_mm": {
      "default": null,
      "description": "How far apart the underlay's rows are, measured square to them. Empty: 3 times the row spacing.",
      "maximum": 100.0,
      "minimum": 0.1,
      "title": "Underlay row spacing",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "fill_underlay_skip_last": {
      "default": false,
      "description": "Leave out the needle point at the end of each underlay row, as `skip_last` does for the top rows.",
      "title": "Skip last underlay stitch",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "force_lock_stitches": {
      "default": false,
      "description": "Lock the end of every group of stitches, and jump to the next, even where the needle would otherwise go straight on to it. The end lock is sewn even where `ties` leaves it out, manual stitch gets the locks it otherwise goes without, and a fill whose top rows `expand_mm` cuts into pieces locks each piece on its own.",
      "title": "Always lock",
      "type": "boolean",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "gap_fill_rows": {
      "default": 0,
      "description": "Rows sewn again where the fill leaves a stretch of more than 3 rows for another: that many rows past the stretch's last row, back and forth, before the needle travels on. The rows on the far side are sewn later, and the fabric between can be pulled apart by then; these close the gap. Rounded up to an even number, so the needle comes back to where the stretch ended.",
      "maximum": 100,
      "minimum": 0,
      "title": "Gap-filling rows",
      "type": "integer",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Rows",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "lock_custom_end": {
      "default": "",
      "description": "The steps a custom end lock takes along the stitching after it ends, as numbers separated by spaces, each a number of `lock_end_scale_mm`. Positive steps go back into the stitching. The first step starts where the stitching ends, and `1 -1 1 -1` goes back and forth twice. Ink/Stitch also takes an SVG path that draws the lock. StitchCraft does not sew those yet, and sews the half stitch in its place (`SC-W0503`).",
      "maxLength": 4096,
      "title": "Custom end lock",
      "type": "string",
      "x-stitchcraft": {
        "deviation": "DEV-LCK-002",
        "group": "Lock stitches",
        "origin": "inkstitch-deviates",
        "stability": "stable",
        "visible_when": {
          "any_of": [
            "custom"
          ],
          "key": "lock_end"
        }
      }
    },
    "lock_custom_start": {
      "default": "",
      "description": "The steps a custom start lock takes along the stitching before it starts, as numbers separated by spaces, each a number of `lock_start_scale_mm`. Positive steps go into the stitching. The last step ends where the stitching starts, and `1 -1 1 -1` goes forth and back twice. Ink/Stitch also takes an SVG path that draws the lock. StitchCraft does not sew those yet, and sews the half stitch in its place (`SC-W0503`).",
      "maxLength": 4096,
      "title": "Custom start lock",
      "type": "string",
      "x-stitchcraft": {
        "deviation": "DEV-LCK-002",
        "group": "Lock stitches",
        "origin": "inkstitch-deviates",
        "stability": "stable",
        "visible_when": {
          "any_of": [
            "custom"
          ],
          "key": "lock_start"
        }
      }
    },
    "lock_end": {
      "default": "half_stitch",
      "description": "The shape of the lock stitches at the end. The half stitch goes back and forth over the last half of the last stitch, which hides it. The other shapes are larger and grip more.",
      "enum": [
        "half_stitch",
        "arrow",
        "back_forth",
        "bowtie",
        "cross",
        "star",
        "simple",
        "triangle",
        "zigzag",
        "custom"
      ],
      "title": "End lock",
      "type": "string",
      "x-stitchcraft": {
        "deviation": "DEV-LCK-001",
        "group": "Lock stitches",
        "origin": "inkstitch-deviates",
        "stability": "stable"
      }
    },
    "lock_end_scale_mm": {
      "default": 0.7,
      "description": "How long each step of an end lock made of steps (back and forth, or custom) is.",
      "maximum": 10.0,
      "minimum": 0.1,
      "title": "End lock size",
      "type": "number",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm",
        "visible_when": {
          "any_of": [
            "back_forth",
            "custom"
          ],
          "key": "lock_end"
        }
      }
    },
    "lock_end_scale_percent": {
      "default": 100.0,
      "description": "How large a drawn end lock is, in percent of its own size: at 100 % it reaches about 1.4 mm along the stitching.",
      "maximum": 500.0,
      "minimum": 10.0,
      "title": "End lock scale",
      "type": "number",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%",
        "visible_when": {
          "any_of": [
            "arrow",
            "bowtie",
            "cross",
            "star",
            "simple",
            "triangle",
            "zigzag",
            "custom"
          ],
          "key": "lock_end"
        }
      }
    },
    "lock_start": {
      "default": "half_stitch",
      "description": "The shape of the lock stitches at the start. The half stitch goes back and forth over the first half of the first stitch, which hides it. The other shapes are larger and grip more.",
      "enum": [
        "half_stitch",
        "arrow",
        "back_forth",
        "bowtie",
        "cross",
        "star",
        "simple",
        "triangle",
        "zigzag",
        "custom"
      ],
      "title": "Start lock",
      "type": "string",
      "x-stitchcraft": {
        "deviation": "DEV-LCK-001",
        "group": "Lock stitches",
        "origin": "inkstitch-deviates",
        "stability": "stable"
      }
    },
    "lock_start_scale_mm": {
      "default": 0.7,
      "description": "How long each step of a start lock made of steps (back and forth, or custom) is.",
      "maximum": 10.0,
      "minimum": 0.1,
      "title": "Start lock size",
      "type": "number",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm",
        "visible_when": {
          "any_of": [
            "back_forth",
            "custom"
          ],
          "key": "lock_start"
        }
      }
    },
    "lock_start_scale_percent": {
      "default": 100.0,
      "description": "How large a drawn start lock is, in percent of its own size: at 100 % it reaches about 1.4 mm along the stitching.",
      "maximum": 500.0,
      "minimum": 10.0,
      "title": "Start lock scale",
      "type": "number",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%",
        "visible_when": {
          "any_of": [
            "arrow",
            "bowtie",
            "cross",
            "star",
            "simple",
            "triangle",
            "zigzag",
            "custom"
          ],
          "key": "lock_start"
        }
      }
    },
    "max_stitch_length_mm": {
      "default": null,
      "description": "Manual stitch splits a stitch longer than this into equal parts, and a satin column splits it as its split method says. Empty, every stitch is sewn whole. A tatami fill sews its rows in stitches this long.",
      "maximum": 25.0,
      "minimum": 0.1,
      "title": "Longest stitch",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "manual_stitch",
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "family_defaults": {
          "fill": 4.0
        },
        "group": "Longest stitch",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "min_jump_stitch_length_mm": {
      "default": null,
      "description": "A move to the next element no longer than this is sewn straight on, without lock stitches or a jump. Empty: the document's setting.",
      "maximum": 20.0,
      "minimum": 0.0,
      "title": "Shortest jump",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "group": "Shortest stitch and jump",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "min_random_split_length_mm": {
      "default": null,
      "description": "With a random split phase, also split stitches longer than this but no longer than the longest stitch. 0 splits every stitch. Empty: the longest stitch.",
      "maximum": 25.0,
      "minimum": 0.0,
      "title": "Shortest split stitch",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Split stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm",
        "visible_when": {
          "any_of": [
            "default"
          ],
          "key": "split_method"
        }
      }
    },
    "min_stitch_length_mm": {
      "default": null,
      "description": "Stitches shorter than this are merged into their neighbours, so the needle does not hammer one hole. Empty: the larger of the document's setting and the machine's minimum.",
      "maximum": 10.0,
      "minimum": 0.0,
      "title": "Shortest stitch",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "group": "Shortest stitch and jump",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "pull_compensation_mm": {
      "default": [
        0.0
      ],
      "description": "How far each end of every stitch reaches past the shape's edge: a satin column's stitches past its rails, and a fill's rows past its outline and its holes. The thread pulls the fabric in along the stitches as it sews, so a shape comes out smaller than drawn, and this makes up for it. 2 values set the 2 ends: a satin's first rail's side, then the second's, or the end each fill row starts from at the fill's angle, then the other (at 0°, the left end, then the right). Negative values make a satin narrower; a fill reads them as 0, as Ink/Stitch does.",
      "items": {
        "maximum": 10.0,
        "minimum": -10.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Pull compensation",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "group": "Pull compensation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "pull_compensation_percent": {
      "default": [
        0.0
      ],
      "description": "More pull compensation, in percent of each stitch's length, added to the length above: a satin's stitches reach out by a share of the column's width there, and a fill's rows by a share of each row's length, so wide parts and long rows reach further. 2 values set the 2 ends, as above. A fill reads negative values as 0, as Ink/Stitch does.",
      "items": {
        "maximum": 100.0,
        "minimum": -100.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Pull compensation (%)",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "group": "Pull compensation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "push_compensation_mm": {
      "default": [
        0.0
      ],
      "description": "How much shorter the column is made at its start and its end. Satin stitches push the fabric out along the column, so it comes out longer than drawn, and this makes up for it. Negative values lengthen the column. 2 values set the start, then the end.",
      "items": {
        "maximum": 10.0,
        "minimum": -10.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Push compensation",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Compensation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "random_seed": {
      "default": null,
      "description": "Where random variation starts: a running stitch's random lengths, a satin column's random widths and spacing, and a tatami fill's random lengths. The same seed gives the same stitches, another seed others, and elements alike given one seed vary alike. Empty, each element gets its own.",
      "minimum": 0,
      "title": "Random seed",
      "type": [
        "integer",
        "string",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "group": "Random variation",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "random_split_jitter_percent": {
      "default": 0.0,
      "description": "How far each split may move at random, in percent of a part, either way. With a random split phase, how much each part's length may vary instead.",
      "maximum": 100.0,
      "minimum": 0.0,
      "title": "Split jitter",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Split stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%",
        "visible_when": {
          "any_of": [
            "default"
          ],
          "key": "split_method"
        }
      }
    },
    "random_split_phase": {
      "default": false,
      "description": "Start each stitch's splits at a random distance from its start, and space them by the longest stitch, instead of dividing the stitch evenly. The needle holes of neighbouring stitches then fall apart, at the cost of a few more stitches.",
      "title": "Random split phase",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Split stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "visible_when": {
          "any_of": [
            "default"
          ],
          "key": "split_method"
        }
      }
    },
    "random_stitch_length_jitter_percent": {
      "default": 10.0,
      "description": "How much each stitch may be longer or shorter than the stitch length, in percent of it. A tatami fill's stitch length is its longest stitch. Where the random lengths start is the element's `random_seed`.",
      "maximum": 100.0,
      "minimum": 0.0,
      "title": "Length variation",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "tatami_fill"
        ],
        "group": "Running stitch",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%",
        "visible_when": {
          "any_of": [
            true
          ],
          "key": "enable_random_stitch_length"
        }
      }
    },
    "random_width_decrease_percent": {
      "default": [
        0.0
      ],
      "description": "How much narrower than the compensated column a stitch may come out on each side, chosen at random for each stitch, in percent of the column's width there. A ragged edge looks like fur or grass. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 100.0,
        "minimum": 0.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Random width decrease",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Random variation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "random_width_increase_percent": {
      "default": [
        0.0
      ],
      "description": "How much wider than the compensated column a stitch may come out on each side, chosen at random for each stitch, in percent of the column's width there. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 100.0,
        "minimum": 0.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Random width increase",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Random variation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "random_zigzag_spacing_percent": {
      "default": 0.0,
      "description": "How much the distance to each stitch may differ from the zigzag spacing, chosen at random, in percent of the spacing, longer or shorter.",
      "maximum": 100.0,
      "minimum": 0.0,
      "title": "Random zigzag spacing",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Random variation",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "repeats": {
      "default": 1,
      "description": "How many times to sew along the path: 2 goes there and back, 3 there, back and there again. An even number ends where the path starts, which suits a line that must come back.",
      "maximum": 100,
      "minimum": 1,
      "title": "Repeats",
      "type": "integer",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "zigzag_stitch"
        ],
        "group": "Repeats",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "reverse_rails": {
      "default": "automatic",
      "description": "Which rails are sewn against the way they are drawn, so that both run the same way. Automatic reverses the second rail when it runs against the first.",
      "enum": [
        "automatic",
        "none",
        "first",
        "second",
        "both"
      ],
      "title": "Reverse rails",
      "type": "string",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Rails",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "row_spacing_mm": {
      "default": 0.25,
      "description": "How far apart the rows are, measured square to them. Rows closer together cover the fabric more fully, and pull it in more.",
      "maximum": 100.0,
      "minimum": 0.1,
      "title": "Row spacing",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Rows",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "running_stitch_length_mm": {
      "default": [
        2.5
      ],
      "description": "How long each stitch is. Between corners the stitches are spread evenly, so each one is at most this long. Several lengths separated by spaces sew as a repeating pattern: \"2.5 1\" sews long, short, long, short. The stitches that join a satin column's underlays are no longer than the first length.",
      "items": {
        "maximum": 25.0,
        "minimum": 0.1,
        "type": "number"
      },
      "maxItems": 16,
      "minItems": 1,
      "title": "Stitch length",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "group": "Running stitch",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "running_stitch_position": {
      "default": 50.0,
      "description": "Where the line the needle follows to the start and to the end runs, in percent of the way from the first rail to the second: 50 is the middle.",
      "maximum": 100.0,
      "minimum": 0.0,
      "title": "Running stitch position",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Start and end",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "running_stitch_tolerance_mm": {
      "default": 0.2,
      "description": "How far a stitch may stray from a curve. A smaller tolerance follows curves more closely, with more and shorter stitches. A satin column's way to its start and from its end keeps to it too.",
      "maximum": 5.0,
      "minimum": 0.01,
      "title": "Curve tolerance",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag",
          "tatami_fill"
        ],
        "deviation": "DEV-SAT-006",
        "group": "Running stitch",
        "origin": "inkstitch-deviates",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "satin_column": {
      "default": false,
      "description": "Sew the path as a satin column. Two of its subpaths are the rails, the column's edges, and the others are rungs across both, which say which point of one rail goes with which of the other. Without rungs, the rails' nodes pair up instead. A path of 1 subpath is the column's centre line: the column is as wide as the stroke, and turns its corners as the stroke's join does. Off, the path is sewn as a stroke, by its `stroke_method`.",
      "title": "Satin column",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "manual_stitch",
          "zigzag_stitch",
          "ripple_stitch",
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Satin column",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "satin_method": {
      "default": "satin_column",
      "description": "How the column is sewn. A satin column sews stitches straight across it, from one rail to the other and back. An E-stitch sews a spike across the column at each pair and a spine along its first rail between them, an edge for appliqué. An S-stitch sews one stitch across at each pair, every other one the other way, with a step along a rail between them: split by a longest stitch, they cover the column in rows, as a fill does. A zigzag satin sews a zigzag between the rails, every stitch slanting half the spacing along.",
      "enum": [
        "satin_column",
        "e_stitch",
        "s_stitch",
        "zigzag"
      ],
      "title": "Method",
      "type": "string",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Satin column",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "short_stitch_distance_mm": {
      "default": 0.25,
      "description": "How close a needle point may come to the last one left in place on its rail before it is moved in. 0 moves none.",
      "maximum": 5.0,
      "minimum": 0.0,
      "title": "Short stitch distance",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Short stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "short_stitch_inset": {
      "default": [
        15.0
      ],
      "description": "How far a crowded needle point is moved in along its stitch, in percent of the stitch's width. On the inside of a tight curve the needle points of a rail crowd together, and the thread piles up there. Moving some of them in spreads them out. Points that crowd one after another take turns with several values separated by spaces.",
      "items": {
        "maximum": 50.0,
        "minimum": 0.0,
        "type": "number"
      },
      "maxItems": 16,
      "minItems": 1,
      "title": "Short stitch inset",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Short stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "skip_last": {
      "default": false,
      "description": "Leave out the needle point at the end of each row. It lies close to the start of the next row, and leaving it out lowers the stitch count and the density along the fill's edge.",
      "title": "Skip last stitch",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Stitches",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "split_method": {
      "default": "default",
      "description": "How stitches longer than the longest stitch (`max_stitch_length_mm`) are split. Default splits each into the fewest equal parts no longer than it. Simple splits at whole multiples of it from the stitch's start. Staggered moves those splits along from one stitch to the next, so the needle holes of neighbouring stitches do not line up in a row.",
      "enum": [
        "default",
        "simple",
        "staggered"
      ],
      "title": "Split method",
      "type": "string",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Split stitches",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "split_staggers": {
      "default": 4.0,
      "description": "How many stitches the staggered splits take to come back to where they started. A fraction draws diagonals that show less than whole numbers do.",
      "maximum": 100.0,
      "minimum": 0.01,
      "title": "Staggers",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Split stitches",
        "origin": "inkstitch",
        "stability": "stable",
        "visible_when": {
          "any_of": [
            "staggered"
          ],
          "key": "split_method"
        }
      }
    },
    "staggers": {
      "default": 4.0,
      "description": "How many rows the needle points take to come back to where they started. Along each row they lie the longest stitch (`max_stitch_length_mm`) apart, a `staggers`-th of a stitch along from the row before's, so that neighbouring rows never line them up. A fraction draws diagonals that show less than whole numbers do. A negative number staggers the rows the other way, and 0 counts as 1, which lines every row's points up, as in Ink/Stitch.",
      "maximum": 100.0,
      "minimum": -100.0,
      "title": "Staggers",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Stitches",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "start_at_nearest_point": {
      "default": true,
      "description": "Start near where the elements before left the needle: on the line between the rails, or on the column's edge when only that is close, then along the line under the column to its start. It saves a jump and a trim.",
      "title": "Start at nearest point",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Start and end",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "stop_after": {
      "default": false,
      "description": "Pause the machine after this element: to add an appliqué fabric, or to check the work.",
      "title": "Stop after",
      "type": "boolean",
      "x-stitchcraft": {
        "group": "Trims and stops",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "stroke_method": {
      "default": "running_stitch",
      "description": "The stitch the path is sewn with. A running stitch goes along it and a zigzag across it, and manual stitch puts a needle point on each of its nodes. Ripple stitch arrives in a later version, and until then an element set to it is skipped (`SC-W0011`).",
      "enum": [
        "running_stitch",
        "ripple_stitch",
        "zigzag_stitch",
        "manual_stitch"
      ],
      "title": "Method",
      "type": "string",
      "x-stitchcraft": {
        "applies_to": [
          "running_stitch",
          "ripple_stitch",
          "zigzag_stitch",
          "manual_stitch"
        ],
        "group": "Stroke",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "stroke_pull_compensation_mm": {
      "default": [
        0.0
      ],
      "description": "How much further out than half the stroke's width the needle goes on each side, to make up for the thread pulling the fabric in. 2 values set the 2 sides: the left of the way the path goes, then the right. Negative values make the zigzag narrower.",
      "items": {
        "maximum": 10.0,
        "minimum": -10.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Pull compensation",
      "type": "array",
      "x-stitchcraft": {
        "applies_to": [
          "zigzag_stitch"
        ],
        "group": "Zigzag stroke",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "swap_satin_rails": {
      "default": false,
      "description": "Make the second rail the first. The column starts on its first rail, and each stitch across it goes from the first rail to the second.",
      "title": "Swap rails",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Rails",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "ties": {
      "default": "0",
      "description": "Where the element gets lock stitches: a few tiny stitches that stop the thread from unravelling where its stitching starts and ends.",
      "enum": [
        "0",
        "1",
        "2",
        "3"
      ],
      "title": "Lock stitches",
      "type": "string",
      "x-stitchcraft": {
        "group": "Lock stitches",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "trim_after": {
      "default": false,
      "description": "Cut the thread after this element, even if the next one starts close by.",
      "title": "Trim after",
      "type": "boolean",
      "x-stitchcraft": {
        "group": "Trims and stops",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "underlay_underpath": {
      "default": true,
      "description": "Travel between the underlay's rows runs inside the fill, under the underlay rows sewn after it. Off, the needle travels along the fill's outline.",
      "title": "Underlay underpath",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "underpath": {
      "default": true,
      "description": "Travel between rows runs inside the fill, under rows sewn after it, which hide it. Off, the needle travels along the fill's outline, where the travel can show along the edge.",
      "title": "Underpath",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "tatami_fill"
        ],
        "group": "Travel",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "zigzag_angle": {
      "default": 0.0,
      "description": "Turns every stitch away from square to the path, in degrees: positive turns clockwise as the drawing shows it. On a curve the turned stitches point like the spokes of a wheel.",
      "maximum": 89.0,
      "minimum": -89.0,
      "title": "Zigzag angle",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "zigzag_stitch"
        ],
        "group": "Zigzag stroke",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "°"
      }
    },
    "zigzag_spacing_mm": {
      "anyOf": [
        {
          "default": [
            0.4
          ],
          "description": "How far it is along the path from one stitch to the next that crosses the same way, a zig and a zag together. Ink/Stitch takes several spacings separated by spaces, and sews the first.",
          "items": {
            "maximum": 100.0,
            "minimum": 0.01,
            "type": "number"
          },
          "maxItems": 16,
          "minItems": 1,
          "title": "Zigzag spacing",
          "type": "array",
          "x-stitchcraft": {
            "applies_to": [
              "zigzag_stitch"
            ],
            "group": "Zigzag stroke",
            "origin": "inkstitch",
            "stability": "stable",
            "unit": "mm"
          }
        },
        {
          "default": 0.4,
          "description": "The distance from one pair of needle points across the column to the next. A satin column goes across and back in one spacing, an E-stitch sews a spike every spacing, and an S-stitch a stitch across, each the other way from the one before. In a zigzag satin the needle goes across and back in one spacing too, its points on the 2 rails half a spacing apart. It is measured across the column at its outside edge. On a curve the stitches lie closer together at the inside edge.",
          "maximum": 10.0,
          "minimum": 0.01,
          "title": "Zigzag spacing",
          "type": "number",
          "x-stitchcraft": {
            "applies_to": [
              "satin_column",
              "e_stitch",
              "s_stitch",
              "zigzag"
            ],
            "group": "Satin column",
            "origin": "inkstitch",
            "stability": "stable",
            "unit": "mm"
          }
        }
      ]
    },
    "zigzag_underlay": {
      "default": false,
      "description": "Sew a sparse zigzag across the column, to its end and back, before the top stitches. It lifts them off the fabric and makes a wide column look fuller.",
      "title": "Zigzag underlay",
      "type": "boolean",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Zigzag underlay",
        "origin": "inkstitch",
        "stability": "stable"
      }
    },
    "zigzag_underlay_inset_mm": {
      "default": null,
      "description": "How far inside each rail the zigzag's points are. Empty: half the contour's inset, which puts them between the contour and the edge. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 10.0,
        "minimum": -10.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Zigzag underlay inset",
      "type": [
        "array",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Zigzag underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "zigzag_underlay_inset_percent": {
      "default": null,
      "description": "More inset, in percent of the column's width at each point, added to the length above. Empty: half the contour's. 2 values set the first rail's side, then the second's.",
      "items": {
        "maximum": 100.0,
        "minimum": -100.0,
        "type": "number"
      },
      "maxItems": 2,
      "minItems": 1,
      "title": "Zigzag underlay inset (% of width)",
      "type": [
        "array",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Zigzag underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "%"
      }
    },
    "zigzag_underlay_max_stitch_length_mm": {
      "default": null,
      "description": "Split zigzag stitches longer than this into equal parts. Empty: none is split.",
      "maximum": 25.0,
      "minimum": 0.1,
      "title": "Zigzag underlay longest stitch",
      "type": [
        "number",
        "null"
      ],
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Zigzag underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    },
    "zigzag_underlay_spacing_mm": {
      "default": 3.0,
      "description": "How far apart the zigzag's points on each rail are, each way.",
      "maximum": 10.0,
      "minimum": 0.01,
      "title": "Zigzag underlay spacing",
      "type": "number",
      "x-stitchcraft": {
        "applies_to": [
          "satin_column",
          "e_stitch",
          "s_stitch",
          "zigzag"
        ],
        "group": "Zigzag underlay",
        "origin": "inkstitch",
        "stability": "stable",
        "unit": "mm"
      }
    }
  },
  "title": "StitchCraft parameters",
  "type": "object",
  "x-stitchcraft": {
    "groups": [
      {
        "keys": [
          "ties",
          "force_lock_stitches",
          "lock_start",
          "lock_custom_start",
          "lock_start_scale_mm",
          "lock_start_scale_percent",
          "lock_end",
          "lock_custom_end",
          "lock_end_scale_mm",
          "lock_end_scale_percent",
          "trim_after",
          "stop_after",
          "min_stitch_length_mm",
          "min_jump_stitch_length_mm",
          "max_stitch_length_mm",
          "random_seed"
        ],
        "name": "CommonParams",
        "title": "Common parameters"
      },
      {
        "keys": [
          "stroke_method"
        ],
        "name": "StrokeParams",
        "title": "Stroke parameters"
      },
      {
        "keys": [
          "running_stitch_length_mm",
          "running_stitch_tolerance_mm",
          "enable_random_stitch_length",
          "random_stitch_length_jitter_percent"
        ],
        "name": "RunningParams",
        "title": "Running parameters"
      },
      {
        "keys": [
          "repeats",
          "bean_stitch_repeats"
        ],
        "name": "RepeatParams",
        "title": "Repeat parameters"
      },
      {
        "keys": [
          "zigzag_spacing_mm",
          "stroke_pull_compensation_mm",
          "zigzag_angle"
        ],
        "name": "ZigzagStrokeParams",
        "title": "Zigzag stroke parameters"
      },
      {
        "keys": [
          "satin_column",
          "satin_method",
          "zigzag_spacing_mm",
          "reverse_rails",
          "swap_satin_rails",
          "start_at_nearest_point",
          "end_at_nearest_point",
          "running_stitch_position",
          "push_compensation_mm",
          "random_width_decrease_percent",
          "random_width_increase_percent",
          "random_zigzag_spacing_percent",
          "short_stitch_inset",
          "short_stitch_distance_mm",
          "split_method",
          "random_split_jitter_percent",
          "random_split_phase",
          "min_random_split_length_mm",
          "split_staggers",
          "center_walk_underlay",
          "center_walk_underlay_stitch_length_mm",
          "center_walk_underlay_stitch_tolerance_mm",
          "center_walk_underlay_repeats",
          "center_walk_underlay_position",
          "contour_underlay",
          "contour_underlay_stitch_length_mm",
          "contour_underlay_stitch_tolerance_mm",
          "contour_underlay_inset_mm",
          "contour_underlay_inset_percent",
          "zigzag_underlay",
          "zigzag_underlay_spacing_mm",
          "zigzag_underlay_inset_mm",
          "zigzag_underlay_inset_percent",
          "zigzag_underlay_max_stitch_length_mm"
        ],
        "name": "SatinParams",
        "title": "Satin parameters"
      },
      {
        "keys": [
          "pull_compensation_mm",
          "pull_compensation_percent"
        ],
        "name": "PullParams",
        "title": "Pull parameters"
      },
      {
        "keys": [
          "fill",
          "fill_method"
        ],
        "name": "FillParams",
        "title": "Fill parameters"
      },
      {
        "keys": [
          "angle",
          "row_spacing_mm",
          "end_row_spacing_mm",
          "expand_mm",
          "gap_fill_rows",
          "staggers",
          "skip_last",
          "underpath",
          "fill_underlay",
          "fill_underlay_angle",
          "fill_underlay_row_spacing_mm",
          "fill_underlay_max_stitch_length_mm",
          "fill_underlay_inset_mm",
          "fill_underlay_skip_last",
          "underlay_underpath"
        ],
        "name": "TatamiParams",
        "title": "Tatami parameters"
      }
    ]
  }
}
