Vuelidate example

HTML

<script src="https://unpkg.com/vuelidate/dist/vuelidate.min.js"></script>
<script src="https://unpkg.com/vuelidate/dist/validators.min.js"></script>
<div id="app">
  <input v-model="isUniversal" type="checkbox"> is universal?
  <input v-model="$v.text.$model" :class="status($v.text)">
  
  <pre>{{ $v }}</pre>
</div>

CSS

input {
  border: 1px solid silver;
  border-radius: 4px;
  background: white;
  padding: 5px 10px;
}

.dirty {
  border-color: #5A5;
  background: #EFE;
}

.dirty:focus {
  outline-color: #8E8;
}

.error {
  border-color: red;
  background: #FDD;
}

.error:focus {
  outline-color: #F99;
}

Babel + JSX

Vue.use(window.vuelidate.default)
const { required, minLength, requiredIf } = window.validators

new Vue({
	el: "#app",
  data: {
  	text: '',
    isUniversal: false
  },
  validations: {
  	text: {
    	required: requiredIf(function () {
      	return this.isUniversal
      }),
      roblox (val) {
      	return !!val.match(/roblox.com/)
      }
    }
  },
  methods: {
  	status(validation) {
    	return {
      	error: validation.$error,
        dirty: validation.$dirty
      }
    }
  }
})