openapi: 3.1.0
info:
  title: Shared Diff Presentation Foundation Contract
  version: 0.1.0
  description: >-
    Internal presentation contract for Spec 141. This feature introduces no new HTTP
    routes. The component schemas document the supported input and output shapes for the
    shared diff presenter and Blade partials so follow-up consumer specs can adopt the
    foundation consistently.
paths: {}
components:
  schemas:
    StructuredCompareInput:
      type: object
      additionalProperties: false
      properties:
        baseline:
          type: object
          additionalProperties: true
        current:
          type: object
          additionalProperties: true
        changedKeys:
          type: array
          items:
            type: string
        labels:
          type: object
          additionalProperties:
            type: string
        meta:
          type: object
          additionalProperties:
            type: object
            additionalProperties: true
      required:
        - baseline
        - current
    DiffRowStatus:
      type: string
      enum:
        - unchanged
        - changed
        - added
        - removed
    DiffRow:
      type: object
      additionalProperties: false
      properties:
        key:
          type: string
        label:
          type: string
        status:
          $ref: '#/components/schemas/DiffRowStatus'
        oldValue:
          nullable: true
        newValue:
          nullable: true
        isListLike:
          type: boolean
        addedItems:
          type: array
          items: {}
        removedItems:
          type: array
          items: {}
        unchangedItems:
          type: array
          items: {}
        meta:
          type: object
          additionalProperties: true
      required:
        - key
        - label
        - status
        - isListLike
        - addedItems
        - removedItems
        - unchangedItems
        - meta
    DiffSummary:
      type: object
      additionalProperties: false
      properties:
        changedCount:
          type: integer
          minimum: 0
        addedCount:
          type: integer
          minimum: 0
        removedCount:
          type: integer
          minimum: 0
        unchangedCount:
          type: integer
          minimum: 0
        hasRows:
          type: boolean
        message:
          type: string
          nullable: true
      required:
        - changedCount
        - addedCount
        - removedCount
        - unchangedCount
        - hasRows
    DiffPresentation:
      type: object
      additionalProperties: false
      properties:
        summary:
          $ref: '#/components/schemas/DiffSummary'
        rows:
          type: array
          items:
            $ref: '#/components/schemas/DiffRow'
      required:
        - summary
        - rows