{
  "$schema": "../_schema.json",
  "format": "pptx",
  "element": "placeholder",
  "elementAliases": ["ph"],
  "parent": "slide",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": ["/slide[N]/placeholder[M]", "/slide[N]/shape[M]"]
  },
  "note": "Aliases: ph. Inserts a Shape with PlaceholderShape nonVisual properties — geometry comes from the slide layout. Add returns /slide[N]/shape[M] (placeholder is a shape at the OOXML layer). effective.* keys behave as documented in pptx/shape.json.",
  "properties": {
    "id": {
      "type": "number",
      "description": "cNvPr placeholder id. add honors a caller-supplied id so dump-replay keeps it stable for spTgt animation refs; immutable after creation.",
      "add": true,
      "set": false,
      "get": true,
      "readback": "integer shape id (cNvPr)",
      "enforcement": "report"
    },
    "phType": {
      "type": "enum",
      "description": "placeholder type. Required at Add. Set is intentionally not supported: phType binds the placeholder to a slide-layout slot for style/position inheritance, so changing it after creation would produce a half-bound shape rather than a typed placeholder. To change a placeholder's role, remove it and re-add with the new phType.",
      "values": ["title", "body", "subtitle", "date", "footer", "slidenum", "header", "picture", "chart", "table", "diagram", "media", "obj", "clipart"],
      "aliases": ["phtype", "type"],
      "add": true, "set": false, "get": true,
      "examples": ["--prop phType=title"],
      "readback": "placeholder type string",
      "enforcement": "report"
    },
    "name": {
      "type": "string",
      "description": "placeholder name. Defaults to '{type} Placeholder {id}'.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop name=\"Title 1\""],
      "readback": "name string",
      "enforcement": "report"
    },
    "text": {
      "type": "string",
      "description": "optional initial text content.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop text=\"Slide title\""],
      "readback": "concatenated run text",
      "enforcement": "report"
    },
    "phIndex": {
      "type": "number",
      "description": "placeholder index within the slide layout (PlaceholderShape/@idx). Disambiguates same-typed placeholders (e.g. two `body` placeholders).",
      "add": false, "set": false, "get": true,
      "readback": "non-negative integer; key omitted when @idx absent",
      "enforcement": "report"
    },
    "effective.direction": {
      "type": "enum",
      "values": ["rtl", "ltr"],
      "description": "resolved reading direction inherited from placeholder→layout→master→presentation defaults. Suppressed when 'direction' is set directly on the placeholder.",
      "add": false, "set": false, "get": true,
      "readback": "rtl | ltr",
      "enforcement": "report"
    },
    "effective.size": {
      "type": "length",
      "description": "resolved font size inherited from placeholder→layout→master→presentation defaults. Suppressed when 'size' is set directly on the placeholder.",
      "add": false, "set": false, "get": true,
      "readback": "unit-qualified pt (e.g. \"18pt\")",
      "enforcement": "report"
    },
    "effective.font": {
      "type": "string",
      "description": "resolved font name inherited from placeholder→layout→master→presentation defaults. Suppressed when 'font' is set directly on the placeholder.",
      "add": false, "set": false, "get": true,
      "readback": "font name",
      "enforcement": "report"
    },
    "effective.color": {
      "type": "color",
      "description": "resolved text color inherited from placeholder→layout→master→presentation defaults. Suppressed when 'color' is set directly on the placeholder.",
      "add": false, "set": false, "get": true,
      "readback": "#-prefixed uppercase hex (scheme colors pass through)",
      "enforcement": "report"
    },
    "effective.bold": {
      "type": "bool",
      "description": "resolved bold inherited from placeholder→layout→master→presentation defaults. Suppressed when 'bold' is set directly on the placeholder.",
      "add": false, "set": false, "get": true,
      "readback": "true/false",
      "enforcement": "report"
    },
    "isTitle": { "type":"bool", "add":false, "set":false, "get":true, "description":"true when the shape is the title placeholder (phType=title or ctrTitle).", "readback":"true on title placeholders", "enforcement":"report" },
    "inheritedFrom": { "type":"string", "add":false, "set":false, "get":true, "description":"placeholder inheritance source — `layout` when the placeholder definition lives on the parent slide layout (not the slide itself).", "readback":"`layout` when inherited", "enforcement":"report" }
  }
}
