<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:schemas-jetbrains-com:css-xml" xmlns="urn:schemas-jetbrains-com:css-xml" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="definitions">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="property">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="tooltip" type="xs:string" use="optional" />
            <xs:attribute name="initial" type="xs:string" use="optional" />
            <xs:attribute name="applies" type="xs:string" use="optional" />
            <xs:attribute name="inherited" type="yes-no" use="optional" default="no" />
            <xs:attribute name="animatable" type="yes-no" use="optional" default="no" />
            <xs:attribute name="media" type="xs:string" use="optional" default="all" />
            <xs:attribute name="percentage" type="xs:string" use="optional" default="N/A" />
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="prefixed-property">
          <xs:complexType>
            <xs:attribute name="id" type="xs:string" use="required"/>
            <xs:attribute name="prefix" type="xs:string" use="required"/>
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="media-feature">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attribute name="min-max" type="yes-no" use="required" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="tooltip" type="xs:string" use="optional" />
            <xs:attribute name="applies" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
            <xs:attribute name="media" type="xs:string" use="optional" default="all" />
          </xs:complexType>
        </xs:element>
        <xs:element name="pseudo-class">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attribute name="media" type="xs:string" use="optional" default="all" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="tooltip" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
            <xs:attribute name="elementRequired" type="yes-no" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="pseudo-element">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attribute name="media" type="xs:string" use="optional" default="all" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="tooltip" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="function">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="media" type="xs:string" use="optional" default="all" />
            <xs:attribute name="dynamic" type="yes-no" use="optional" default="no" />
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="tooltip" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="prefixed-function">
          <xs:complexType>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attribute name="prefix" type="xs:string" use="required" />
            <xs:attribute name="browsers" type="xs:string" use="optional" />
            <xs:attribute name="url" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
        <xs:element name="named-value">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="description" minOccurs="0" maxOccurs="1" />
              <xs:element ref="value" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attributeGroup ref="version"/>
            <xs:attribute name="url" type="xs:string" use="optional" />
            <xs:attribute name="rules" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="value" abstract="true" />

  <xs:element name="any" substitutionGroup="value" type="valueType" />
  <xs:element name="position" substitutionGroup="value" type="valueType" />
  <xs:element name="expression" substitutionGroup="value" type="valueType" />
  <xs:element name="javaScript" substitutionGroup="value" type="valueType" />
  <xs:element name="selector" substitutionGroup="value" type="valueType" />
  <xs:element name="integer" substitutionGroup="value" type="numberValueType" />
  <xs:element name="resolution" substitutionGroup="value" type="numberValueType" />
  <xs:element name="number" substitutionGroup="value" type="numberValueType" />
  <xs:element name="uri" substitutionGroup="value" type="valueType" />
  <xs:element name="percentage" substitutionGroup="value" type="numberValueType" />
  <xs:element name="length" substitutionGroup="value" type="numberValueType" />
  <xs:element name="urange" substitutionGroup="value" type="valueType" />
  <xs:element name="angle" substitutionGroup="value" type="numberValueType" />
  <xs:element name="time" substitutionGroup="value" type="numberValueType" />
  <xs:element name="flex" substitutionGroup="value" type="numberValueType" />
  <xs:element name="frequency" substitutionGroup="value" type="numberValueType" />
  <xs:element name="color" substitutionGroup="value" type="valueType" />
  <xs:element name="decibel" substitutionGroup="value" type="valueType" />
  <xs:element name="semitones" substitutionGroup="value" type="valueType" />
  <xs:element name="empty" substitutionGroup="value" type="valueType" />

  <xs:complexType name="numberValueType">
    <xs:complexContent>
      <xs:extension base="valueType">
        <xs:attribute name="min-value" type="xs:decimal" use="optional" />
        <xs:attribute name="max-value" type="xs:decimal" use="optional" />
        <xs:attribute name="allow-zero" type="yes-no" default="yes" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="name" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="value" type="xs:string" use="optional" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="text" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="value" type="xs:string" use="optional" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="string" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="value" type="xs:string" use="optional" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="property" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="id" type="xs:string" use="required" />
          <xs:attribute name="rule" type="xs:string" use="optional" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="inline" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="id" type="xs:string" use="required" />
          <xs:attribute name="rule" type="xs:string" use="optional" />
          <xs:attribute name="inline" type="yes-no" use="optional" default="no"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="invoke" substitutionGroup="value">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="valueType">
          <xs:attribute name="id" type="xs:string" use="required" />
          <xs:attribute name="rule" type="xs:string" use="optional" />
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="group" substitutionGroup="value">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="separator" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="value" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element ref="value" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="type" type="group-kind" default="all" use="optional"/>
      <xs:attributeGroup ref="min-max"/>
      <xs:attribute name="name" type="xs:string" use="optional" />
      <xs:attribute name="tooltip" type="xs:string" use="optional" />
      <xs:attribute name="completion" type="yes-no" default="yes" use="optional" />
      <xs:attribute name="ignoreWhitespaces" type="yes-no" default="yes" use="optional" />
      <xs:attribute name="comma-separated" type="yes-no" use="optional" default="no"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="min-occurence">
    <xs:union memberTypes="xs:unsignedInt"/>
  </xs:simpleType>

  <xs:simpleType name="max-occurence">
    <xs:restriction base="xs:int">
      <xs:minInclusive value="-1" />
    </xs:restriction>
  </xs:simpleType>

  <xs:attributeGroup name="min-max">
    <xs:attribute name="min" type="min-occurence" default="1" />
    <xs:attribute name="max" type="max-occurence" default="1" />
  </xs:attributeGroup>
  
  <xs:attributeGroup name="version">
    <xs:attribute name="declared-in" type="css-version" use="required" />
    <xs:attribute name="obsolete-in" type="css-version" use="optional" />
    <xs:attribute name="obsolete-tooltip" type="xs:string" use="optional" />
  </xs:attributeGroup>

  <xs:simpleType name="css-version">
    <xs:restriction base="xs:decimal">
      <xs:enumeration value="0" />
      <xs:enumeration value="1.0" />
      <xs:enumeration value="2.0" />
      <xs:enumeration value="2.1" />
      <xs:enumeration value="3.0" />
      <xs:enumeration value="4.0" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="group-kind">
    <xs:restriction base="xs:string">
      <xs:enumeration value="all" />
      <xs:enumeration value="and" />
      <xs:enumeration value="or" />
      <xs:enumeration value="any" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="yes-no">
    <xs:restriction base="xs:string">
      <xs:enumeration value="yes" />
      <xs:enumeration value="no" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="valueType">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element name="exclusion">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="value" minOccurs="1" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attributeGroup ref="min-max"/>
    <xs:attribute name="name" type="xs:string" use="optional" />
    <xs:attribute name="browsers" type="xs:string" use="optional" />
    <xs:attribute name="tooltip" type="xs:string" use="optional" />
    <xs:attribute name="completion" type="yes-no" default="yes" use="optional" />
    <xs:attribute name="obsolete-in" type="css-version" use="optional" />
    <xs:attribute name="obsolete-tooltip" type="xs:string" use="optional" />
    <xs:attribute name="comma-separated" type="yes-no" use="optional" default="no"/>
  </xs:complexType>

</xs:schema>
