{
  "$schema": "../_schema.json",
  "format": "xlsx",
  "element": "picture",
  "elementAliases": ["image", "img"],
  "parent": "sheet",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": [
      "/SheetName/picture[N]"
    ]
  },
  "note": "Aliases: image, img. Anchor via ParseAnchorBoundsEmu — accepts cell counts or unit-qualified lengths. SVG sources get a PNG fallback.",
  "extends": [
    "_shared/picture",
    "_shared/picture.docx-xlsx",
    "_shared/picture.pptx-xlsx"
  ],
  "properties": {
    "crop": {
      "type": "string",
      "description": "Crop in percent (0-100). 1 value = symmetric, 2 values = vertical,horizontal, 4 values = left,top,right,bottom. Excel reads but does not write crops — overrides shared base which marks add/set true (pptx-only writability).",
      "add": false,
      "set": false,
      "get": true,
      "examples": [
        "--prop crop=10"
      ],
      "readback": "comma-separated percentages (left,top,right,bottom)",
      "enforcement": "report"
    },
    "title": {
      "type": "string",
      "description": "OOXML @title attribute on cNvPr (distinct from alt).",
      "add": true,
      "set": false,
      "examples": [
        "--prop title=\"Logo\""
      ],
      "enforcement": "report"
    },
    "decorative": {
      "type": "bool",
      "description": "Mark the picture as decorative (a16:decorative ext under cNvPr). Excludes it from screen-reader alt-text traversal.",
      "add": true,
      "set": false,
      "get": true,
      "examples": [
        "--prop decorative=true"
      ],
      "readback": "true when the picture carries the a16:decorative flag",
      "enforcement": "report"
    },
    "rotation": {
      "type": "string",
      "description": "Rotation in degrees (positive = clockwise). Stored OOXML-internal as 60000ths of a degree on Transform2D @rot.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop rotation=45"
      ],
      "readback": "rotation in degrees (rounded)",
      "enforcement": "report"
    },
    "flip": {
      "type": "string",
      "description": "Compact flip token: 'h' / 'v' / 'both' / 'hv' / 'vh' / 'horizontal' / 'vertical'.",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop flip=h",
        "--prop flip=both"
      ],
      "readback": "h / v / both",
      "enforcement": "report"
    },
    "flipH": {
      "type": "bool",
      "description": "Flip horizontally (Office-API-style alias of flip=h).",
      "add": true,
      "set": true,
      "examples": [
        "--prop flipH=true"
      ],
      "enforcement": "report"
    },
    "flipV": {
      "type": "bool",
      "description": "Flip vertically (Office-API-style alias of flip=v).",
      "add": true,
      "set": true,
      "examples": [
        "--prop flipV=true"
      ],
      "enforcement": "report"
    },
    "flipBoth": {
      "type": "bool",
      "description": "Flip both axes (alias of flip=both).",
      "add": true,
      "set": false,
      "examples": [
        "--prop flipBoth=true"
      ],
      "enforcement": "report"
    },
    "opacity": {
      "type": "string",
      "description": "Picture opacity. Accepts percent (50, '50%') or fraction (0.5). 100 / 100% / 1.0 = fully opaque.",
      "add": true,
      "set": false,
      "get": true,
      "examples": [
        "--prop opacity=50",
        "--prop opacity=0.5"
      ],
      "readback": "integer percent (0..99); key omitted when fully opaque",
      "enforcement": "report"
    },
    "hyperlink": {
      "type": "string",
      "description": "Picture-level hyperlink. External URL (https://...) or in-document jump (#SheetName!A1).",
      "aliases": [
        "link"
      ],
      "add": true,
      "set": false,
      "examples": [
        "--prop hyperlink=https://example.com"
      ],
      "enforcement": "report"
    },
    "anchor": {
      "type": "string",
      "description": "Cell-range anchor (e.g. 'B2:E6') or anchorMode token ('oneCell'/'twoCell'/'absolute'). Cell-range form implies twoCell mode.",
      "add": true,
      "set": false,
      "examples": [
        "--prop anchor=B2:E6",
        "--prop anchor=oneCell"
      ],
      "enforcement": "report"
    },
    "anchorMode": {
      "type": "string",
      "description": "Explicit anchor mode: 'oneCell' / 'twoCell' / 'absolute'. Overrides any anchor= mode token.",
      "add": true,
      "set": false,
      "examples": [
        "--prop anchorMode=oneCell"
      ],
      "enforcement": "report"
    },
    "shadow": {
      "type": "string",
      "description": "Outer shadow effect. 'none' to clear, or a color/spec accepted by DrawingEffectsHelper.",
      "add": false,
      "set": true,
      "examples": [
        "--prop shadow=#808080"
      ],
      "enforcement": "report"
    },
    "glow": {
      "type": "string",
      "description": "Glow effect color/spec. 'none' to clear.",
      "add": false,
      "set": true,
      "examples": [
        "--prop glow=#4472C4"
      ],
      "enforcement": "report"
    },
    "reflection": {
      "type": "string",
      "description": "Reflection effect. 'none' to clear.",
      "add": false,
      "set": true,
      "examples": [
        "--prop reflection=true"
      ],
      "enforcement": "report"
    },
    "softEdge": {
      "type": "string",
      "aliases": [
        "softedge"
      ],
      "description": "Soft edge effect radius. 'none' to clear.",
      "add": false,
      "set": true,
      "examples": [
        "--prop softEdge=5"
      ],
      "enforcement": "report"
    },
    "crop.l": {
      "type": "string",
      "description": "Crop from left edge as a percentage (e.g. 10 = 10%, '10%' also accepted). Internally stored in 1/1000 percent units.",
      "add": true,
      "set": true,
      "examples": [
        "--prop crop.l=10",
        "--prop crop.l=50%"
      ],
      "enforcement": "report"
    },
    "crop.r": {
      "type": "string",
      "description": "Crop from right edge as a percentage.",
      "add": true,
      "set": true,
      "examples": [
        "--prop crop.r=10"
      ],
      "enforcement": "report"
    },
    "crop.t": {
      "type": "string",
      "description": "Crop from top edge as a percentage.",
      "add": true,
      "set": true,
      "examples": [
        "--prop crop.t=10"
      ],
      "enforcement": "report"
    },
    "crop.b": {
      "type": "string",
      "description": "Crop from bottom edge as a percentage.",
      "add": true,
      "set": true,
      "examples": [
        "--prop crop.b=10"
      ],
      "enforcement": "report"
    },
    "srcRect": {
      "type": "string",
      "description": "Compound crop spec, e.g. 'l=10,r=10,t=5,b=5'. Equivalent to crop.l/crop.r/crop.t/crop.b.",
      "add": true,
      "set": true,
      "examples": [
        "--prop srcRect=l=10,r=10,t=5,b=5"
      ],
      "enforcement": "report"
    },
    "anchoredTo": {
      "type": "string",
      "add": false,
      "set": false,
      "get": true,
      "description": "anchor descriptor — sheet/cell-range path the picture is anchored to.",
      "readback": "`/SheetName/A1[:Z9]` anchor path",
      "enforcement": "report"
    },
    "mergeAnchor": {
      "type": "bool",
      "add": false,
      "set": false,
      "get": true,
      "description": "true when the picture is anchored to a merged-cell region.",
      "readback": "true|false",
      "enforcement": "report"
    },
    "x": {
      "type": "length",
      "description": "x as TwoCellAnchor column/row index (xlsx cell-anchor positioning, integer).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop x=0",
        "--prop x=1in"
      ],
      "readback": "integer column/row index",
      "enforcement": "report"
    },
    "y": {
      "type": "length",
      "description": "y as TwoCellAnchor column/row index (xlsx cell-anchor positioning, integer).",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop y=0",
        "--prop y=1in"
      ],
      "readback": "integer column/row index",
      "enforcement": "report"
    },
    "width": {
      "type": "integer",
      "description": "width — TwoCellAnchor column/row span (xlsx cell-anchor positioning, integer)",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop width=5",
        "--prop width=3in"
      ],
      "readback": "integer column/row span",
      "enforcement": "report"
    },
    "height": {
      "type": "integer",
      "description": "height — TwoCellAnchor column/row span (xlsx cell-anchor positioning, integer)",
      "add": true,
      "set": true,
      "get": true,
      "examples": [
        "--prop height=5",
        "--prop height=2in"
      ],
      "readback": "integer column/row span",
      "enforcement": "report"
    }
  }
}
