{
  "$schema": "../_schema.json",
  "format": "xlsx",
  "element": "conditionalformatting",
  "elementAliases": ["cf"],
  "parent": "sheet",
  "operations": {
    "add": true,
    "set": true,
    "get": true,
    "query": true,
    "remove": true
  },
  "paths": {
    "positional": ["/SheetName/cf[N]"]
  },
  "note": "Aliases: cf, cfextended. Type names map to xlsx CF rules (cellIs, colorScale, dataBar, iconSet, containsText, top/bottom N, etc.).",
  "properties": {
    "type": {
      "type": "enum",
      "description": "CF rule type.",
      "values": ["cellIs", "colorScale", "dataBar", "iconSet", "containsText", "notContainsText", "beginsWith", "endsWith", "top", "topN", "top10", "topPercent", "bottom", "bottomN", "bottomPercent", "aboveAverage", "belowAverage", "duplicateValues", "uniqueValues", "containsBlanks", "containsErrors", "notContainsBlanks", "notContainsErrors", "formula", "dateOccurring", "today", "yesterday", "tomorrow", "thisWeek", "lastWeek", "nextWeek", "thisMonth", "lastMonth", "nextMonth"],
      "aliases": ["rule"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=cellIs", "--prop rule=top10"],
      "readback": "rule type",
      "enforcement": "report"
    },
    "ref": {
      "type": "string",
      "description": "target cell range.",
      "aliases": ["range", "sqref"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop ref=A1:A10", "--prop sqref=A1:A10"],
      "readback": "cell range",
      "enforcement": "report"
    },
    "fill": {
      "type": "color",
      "description": "background fill color for matched cells. Use this for cellIs, text, top/bottom, and formula rules.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop fill=FFFF00"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "operator": {
      "type": "string",
      "description": "operator for cellIs/text rules.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop operator=greaterThan"],
      "readback": "operator",
      "enforcement": "report"
    },
    "value": {
      "type": "string",
      "description": "threshold / comparison value.",
      "aliases": ["formula1", "formula"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop value=100", "--prop formula=$A1>5"],
      "readback": "value/formula",
      "enforcement": "report"
    },
    "color": {
      "type": "color",
      "description": "bar color for dataBar rules only. For cellIs/text/formula rules, use 'fill' instead.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop color=#FFFF00"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "value2": {
      "type": "string",
      "description": "second threshold for between/notBetween cellIs rules. Alias: maxvalue.",
      "aliases": ["maxvalue"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop value=10 --prop value2=20"],
      "readback": "value/formula",
      "enforcement": "report"
    },
    "text": {
      "type": "string",
      "description": "needle for containsText/notContainsText/beginsWith/endsWith rules.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=containsText --prop text=ERROR"],
      "readback": "needle string",
      "enforcement": "report"
    },
    "rank": {
      "type": "number",
      "description": "rank for top/bottom N rules. Aliases: top, bottomN.",
      "aliases": ["top", "bottomN"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=topN --prop rank=10"],
      "readback": "integer rank",
      "enforcement": "report"
    },
    "percent": {
      "type": "bool",
      "description": "treat 'rank' as a percentile rather than count (top/bottom rules).",
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=top --prop rank=10 --prop percent=true"],
      "readback": "true/false",
      "enforcement": "report"
    },
    "bottom": {
      "type": "bool",
      "description": "select bottom-N instead of top-N (top/bottom rules).",
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=bottom --prop rank=5"],
      "readback": "true/false",
      "enforcement": "report"
    },
    "aboveAverage": {
      "type": "bool",
      "description": "aboveAverage rule: true=above, false=below. Alias: above.",
      "aliases": ["above"],
      "add": true, "set": false, "get": true,
      "examples": ["--prop type=aboveAverage --prop aboveAverage=true"],
      "readback": "true/false",
      "enforcement": "report"
    },
    "stdDev": {
      "type": "number",
      "description": "stdDev offset for aboveAverage rules (1 = 1σ above mean). Add-time only — Get does not surface this back today.",
      "add": true, "set": false, "get": false,
      "examples": ["--prop stdDev=1"],
      "readback": "n/a",
      "enforcement": "report"
    },
    "equalAverage": {
      "type": "bool",
      "description": "include the mean in aboveAverage matching. Add-time only — Get does not surface this back today.",
      "add": true, "set": false, "get": false,
      "examples": ["--prop equalAverage=true"],
      "readback": "n/a",
      "enforcement": "report"
    },
    "period": {
      "type": "string",
      "description": "time-period token for dateOccurring rules (today, yesterday, tomorrow, thisWeek, lastWeek, nextWeek, thisMonth, lastMonth, nextMonth). Aliases: timePeriod.",
      "aliases": ["timePeriod", "timeperiod"],
      "add": true, "set": false, "get": true,
      "examples": ["--prop type=dateOccurring --prop period=lastWeek"],
      "readback": "period token",
      "enforcement": "report"
    },
    "min": {
      "type": "string",
      "description": "data-bar minimum value (numeric or 'auto'). Used by dataBar rules.",
      "add": true, "set": false, "get": true,
      "examples": ["--prop type=dataBar --prop min=0 --prop max=100"],
      "readback": "number or token",
      "enforcement": "report"
    },
    "max": {
      "type": "string",
      "description": "data-bar maximum value (numeric or 'auto'). Used by dataBar rules.",
      "add": true, "set": false, "get": true,
      "examples": ["--prop type=dataBar --prop max=100"],
      "readback": "number or token",
      "enforcement": "report"
    },
    "showValue": {
      "type": "bool",
      "description": "show numeric label alongside data bar / icon set. Alias: showvalue.",
      "aliases": ["showvalue"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop showValue=false"],
      "readback": "true/false",
      "enforcement": "report"
    },
    "negativeColor": {
      "type": "color",
      "description": "data-bar fill color for negative values.",
      "add": true, "set": false, "get": true,
      "examples": ["--prop negativeColor=#FF0000"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "axisColor": {
      "type": "color",
      "description": "data-bar axis color (separator between positive and negative bars).",
      "add": true, "set": false, "get": true,
      "examples": ["--prop axisColor=#000000"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "axisPosition": {
      "type": "enum",
      "values": ["automatic", "middle", "none"],
      "description": "data-bar axis position. Default: automatic. Add-time only — Get does not surface this back today.",
      "add": true, "set": false, "get": false,
      "examples": ["--prop axisPosition=middle"],
      "readback": "n/a",
      "enforcement": "report"
    },
    "minColor": {
      "type": "color",
      "description": "color-scale color at the minimum stop. Alias: mincolor.",
      "aliases": ["mincolor"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=colorScale --prop minColor=#F8696B"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "maxColor": {
      "type": "color",
      "description": "color-scale color at the maximum stop. Alias: maxcolor.",
      "aliases": ["maxcolor"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop maxColor=#63BE7B"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "midColor": {
      "type": "color",
      "description": "color-scale color at the midpoint stop. Alias: midcolor.",
      "aliases": ["midcolor"],
      "add": true, "set": false, "get": true,
      "examples": ["--prop midColor=#FFEB84"],
      "readback": "#-prefixed hex",
      "enforcement": "report"
    },
    "midPoint": {
      "type": "string",
      "description": "color-scale midpoint value (numeric or percentile). Alias: midpoint. Add-time only — Get does not surface this back today.",
      "aliases": ["midpoint"],
      "add": true, "set": false, "get": false,
      "examples": ["--prop midPoint=50"],
      "readback": "n/a",
      "enforcement": "report"
    },
    "iconset": {
      "type": "string",
      "description": "icon-set name (e.g. 3TrafficLights1, 3Arrows, 5Rating). Alias: icons.",
      "aliases": ["icons"],
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=iconSet --prop iconset=3TrafficLights1"],
      "readback": "icon-set name",
      "enforcement": "report"
    },
    "reverse": {
      "type": "bool",
      "description": "reverse the icon-set ordering.",
      "add": true, "set": true, "get": true,
      "examples": ["--prop reverse=true"],
      "readback": "true/false",
      "enforcement": "report"
    },
    "formula": {
      "type": "string",
      "description": "formulaCf expression (without leading '=').",
      "add": true, "set": true, "get": true,
      "examples": ["--prop type=formula --prop formula=ISERROR(A1)"],
      "readback": "formula expression",
      "enforcement": "report"
    },
    "type": {
      "type": "enum",
      "values": ["dataBar", "colorScale", "iconSet", "formula", "topN", "aboveAverage", "duplicateValues", "uniqueValues", "containsText", "cellIs", "timePeriod"],
      "description": "Canonical Get-only CF rule type token (camelCase). One key per semantic value — previously split as ruleType + cfType.",
      "add": false, "set": false, "get": true,
      "readback": "canonical CF type token",
      "enforcement": "report"
    },
    "dxfId": {
      "type": "int",
      "description": "Get-only readback of the differential format index referenced by this rule (links to the workbook-level dxfs table).",
      "add": false, "set": false, "get": true,
      "readback": "0-based dxf index",
      "enforcement": "report"
    }
  }
}
