{
  "$schema": "../_schema.json",
  "format": "xlsx",
  "element": "shape",
  "elementAliases": ["textbox"],
  "parent": "sheet",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": [
      "/SheetName/shape[N]"
    ]
  },
  "note": "Aliases: textbox. Anchor: 'anchor=B2:F7' (cell range) or x/y/width/height in cell units. 'ref=B2' expands to a 1x1 cell rectangle. Font/text props accept either bare ('size', 'bold', 'color', 'font') or dotted ('font.size', 'font.bold', 'font.color', 'font.name') forms.",
  "extends": "_shared/shape",
  "properties": {
    "reflection": {
      "type": "string",
      "description": "reflection effect. Accepts 'true' / 'tight' / 'half' / 'full' to enable a reflection of varying length, a numeric percentage 0-100, or 'none' to clear.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop reflection=true",
        "--prop reflection=half",
        "--prop reflection=full"
      ],
      "readback": "tight | half | full (mapped from a:reflection @endPos: 55000=tight, 90000=half, 100000=full, else numeric percent).",
      "enforcement": "report"
    },
    "anchor": {
      "type": "string",
      "description": "cell range anchor (e.g. B2:F7) — Add-only. Set uses x/y/width/height; Get readback emits x/y/width/height instead of cell-range form (round-trip via numeric position, not anchor string).",
      "aliases": [
        "ref"
      ],
      "add": true,
      "set": false,
      "get": false,
      "examples": [
        "--prop anchor=B2:F7"
      ],
      "readback": "x/y/width/height (numeric)",
      "enforcement": "report"
    },
    "gradientFill": {
      "type": "string",
      "description": "Two/three-stop linear gradient, e.g. 'C1-C2[-C3][:angle]'. Mutually exclusive with fill (gradientFill wins).",
      "add": true,
      "set": false,
      "examples": [
        "--prop gradientFill=FF0000-0000FF:90"
      ],
      "enforcement": "report"
    },
    "geometry": {
      "type": "string",
      "description": "geometry preset name (rect, ellipse, roundRect, triangle, rightArrow, etc.). Unknown presets fall back to rect with a stderr warning. Set replaces the existing PresetGeometry preserving fill/line/effects.",
      "aliases": [
        "preset",
        "shape"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop geometry=ellipse"
      ],
      "enforcement": "report"
    },
    "flip": {
      "type": "string",
      "description": "Compact flip token: 'h' / 'v' / 'both' / 'hv' / 'vh' / 'none'.",
      "add": true,
      "set": true,
      "examples": [
        "--prop flip=h",
        "--prop flip=both"
      ],
      "enforcement": "report"
    },
    "flipBoth": {
      "type": "bool",
      "description": "Flip both axes.",
      "add": true,
      "set": true,
      "examples": [
        "--prop flipBoth=true"
      ],
      "enforcement": "report"
    },
    "x": {
      "type": "length",
      "description": "x as TwoCellAnchor column/row index. xlsx cell-anchor positioning, integer.",
      "aliases": [
        "left"
      ],
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop x=2",
        "--prop x=2cm",
        "--prop x=1in",
        "--prop x=72pt"
      ],
      "readback": "integer column/row index",
      "enforcement": "strict"
    },
    "y": {
      "type": "string",
      "description": "y as TwoCellAnchor column/row index. xlsx cell-anchor positioning, integer.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop y=3",
        "--prop y=3cm"
      ],
      "enforcement": "report",
      "aliases": [
        "top"
      ],
      "readback": "integer column/row index"
    },
    "width": {
      "type": "string",
      "description": "width as TwoCellAnchor column/row index. xlsx cell-anchor positioning, integer.",
      "add": true,
      "set": true,
      "get": true,
      "aliases": [
        "w"
      ],
      "examples": [
        "--prop width=4",
        "--prop width=6cm",
        "--prop width=5cm"
      ],
      "enforcement": "report",
      "readback": "integer column/row index"
    },
    "height": {
      "type": "string",
      "description": "height as TwoCellAnchor column/row index. xlsx cell-anchor positioning, integer.",
      "add": true,
      "set": true,
      "get": true,
      "aliases": [
        "h"
      ],
      "examples": [
        "--prop height=3",
        "--prop height=3cm"
      ],
      "enforcement": "report",
      "readback": "integer column/row index"
    }
  }
}
