{ "$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": { "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" } } }