{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://visualspec.dev/schema/1.0/schema.json",
  "title": "Visual Spec 1.0",
  "description": "Framework-independent contract for visual intent: what exists, what it means, how it appears, how it behaves, how it changes, and which evidence defines the expected result.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "visualSpec",
    "metadata",
    "profiles"
  ],
  "properties": {
    "$schema": {
      "const": "https://visualspec.dev/schema/1.0/schema.json"
    },
    "visualSpec": {
      "const": "1.0"
    },
    "metadata": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/common.schema.json#/$defs/metadata"
    },
    "profiles": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "enum": [
          "ui",
          "image",
          "illustration",
          "document",
          "presentation",
          "video",
          "motion-graphics",
          "3d",
          "game"
        ]
      },
      "description": "One or more combinable visual profiles."
    },
    "sources": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/references.schema.json#/$defs/source"
      }
    },
    "visualReferences": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/references.schema.json#/$defs/reference"
      }
    },
    "visualReferenceSets": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/references.schema.json#/$defs/referenceSet"
      }
    },
    "visualLanguage": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/tokens.schema.json#/$defs/visualLanguage"
    },
    "tokens": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/tokens.schema.json#/$defs/tokenRegistry"
    },
    "world": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/world.schema.json#/$defs/world"
    },
    "entities": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/world.schema.json#/$defs/entity"
      }
    },
    "relationships": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/world.schema.json#/$defs/relationship"
      }
    },
    "scenes": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/scene.schema.json#/$defs/scene"
      }
    },
    "components": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/components.schema.json#/$defs/component"
      }
    },
    "semantics": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/semantics.schema.json#/$defs/semanticNode"
      }
    },
    "events": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/interaction.schema.json#/$defs/event"
      }
    },
    "actions": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/interaction.schema.json#/$defs/action"
      }
    },
    "states": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/interaction.schema.json#/$defs/state"
      }
    },
    "motion": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/motion.schema.json#/$defs/animation"
      }
    },
    "timelines": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/timeline.schema.json#/$defs/timeline"
      }
    },
    "assets": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/assets.schema.json#/$defs/asset"
      }
    },
    "cameras": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/camera.schema.json#/$defs/camera"
      }
    },
    "lights": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/lighting.schema.json#/$defs/light"
      }
    },
    "materials": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/materials.schema.json#/$defs/material"
      }
    },
    "effects": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/effects.schema.json#/$defs/effect"
      }
    },
    "compositions": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/media.schema.json#/$defs/composition"
      }
    },
    "illustrations": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/media.schema.json#/$defs/illustration"
      }
    },
    "videos": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/media.schema.json#/$defs/video"
      }
    },
    "presentations": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/presentation.schema.json#/$defs/presentation"
      }
    },
    "documents": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/document.schema.json#/$defs/document"
      }
    },
    "threeD": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/three-d.schema.json#/$defs/threeD"
    },
    "game": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/game.schema.json#/$defs/game"
    },
    "accessibility": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/accessibility.schema.json#/$defs/accessibility"
    },
    "rendering": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/rendering.schema.json#/$defs/rendering"
    },
    "platformOverrides": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/rendering.schema.json#/$defs/override"
      }
    },
    "validation": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/validation.schema.json#/$defs/validation"
    },
    "flows": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/interaction.schema.json#/$defs/flow"
      }
    },
    "provenance": {
      "type": "array",
      "items": {
        "$ref": "https://visualspec.dev/schema/1.0/modules/references.schema.json#/$defs/assertion"
      }
    },
    "platforms": {
      "type": "array",
      "items": {
        "enum": [
          "web",
          "apple",
          "android",
          "fluent",
          "custom"
        ]
      },
      "uniqueItems": true
    },
    "extensions": {
      "$ref": "https://visualspec.dev/schema/1.0/modules/common.schema.json#/$defs/extensions"
    }
  },
  "allOf": [
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "ui"
            }
          }
        }
      },
      "then": {
        "required": [
          "scenes"
        ],
        "properties": {
          "scenes": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "image"
            }
          }
        }
      },
      "then": {
        "required": [
          "entities",
          "scenes",
          "cameras"
        ],
        "properties": {
          "entities": {
            "minItems": 1
          },
          "scenes": {
            "minItems": 1
          },
          "cameras": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "illustration"
            }
          }
        }
      },
      "then": {
        "required": [
          "illustrations",
          "entities"
        ],
        "properties": {
          "illustrations": {
            "minItems": 1
          },
          "entities": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "document"
            }
          }
        }
      },
      "then": {
        "required": [
          "documents"
        ],
        "properties": {
          "documents": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "presentation"
            }
          }
        }
      },
      "then": {
        "required": [
          "presentations"
        ],
        "properties": {
          "presentations": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "video"
            }
          }
        }
      },
      "then": {
        "required": [
          "videos",
          "timelines"
        ],
        "properties": {
          "videos": {
            "minItems": 1
          },
          "timelines": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "motion-graphics"
            }
          }
        }
      },
      "then": {
        "required": [
          "motion",
          "scenes"
        ],
        "properties": {
          "motion": {
            "minItems": 1
          },
          "scenes": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "3d"
            }
          }
        }
      },
      "then": {
        "required": [
          "threeD",
          "scenes",
          "entities"
        ],
        "properties": {
          "scenes": {
            "minItems": 1
          },
          "entities": {
            "minItems": 1
          }
        }
      }
    },
    {
      "if": {
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "contains": {
              "const": "game"
            }
          }
        }
      },
      "then": {
        "required": [
          "game"
        ],
        "properties": {}
      }
    }
  ]
}
