Skip to content

Tailwind CSS Integration ​

Ctrovalidate works seamlessly with Tailwind CSS. Configure the library to use Tailwind's utility classes for validation states.


Basic Configuration ​

Configure Ctrovalidate to use Tailwind classes:

javascript
import { Ctrovalidate, LogLevel } from 'ctrovalidate';

const validator = new Ctrovalidate(form, {
  errorClass: 'border-red-500 ring-1 ring-red-500',
  errorMessageClass: 'text-red-600 text-sm mt-1',
  pendingClass: 'border-blue-500 animate-pulse'
});

Complete Example ​

html
<form id="signup-form" novalidate class="space-y-6 max-w-md mx-auto">
  <div>
    <label class="block text-sm font-medium text-gray-700 mb-1">
      Email Address
    </label>
    <input
      name="email"
      type="email"
      data-ctrovalidate-rules="required|email"
      class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
    />
    <div class="error-message"></div>
  </div>

  <div>
    <label class="block text-sm font-medium text-gray-700 mb-1">
      Password
    </label>
    <input
      name="password"
      type="password"
      data-ctrovalidate-rules="required|minLength:8"
      class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
    />
    <div class="error-message"></div>
  </div>

  <button
    type="submit"
    class="w-full bg-blue-600 text-white font-semibold py-3 px-4 rounded-lg hover:bg-blue-700 transition-colors"
  >
    Sign Up
  </button>
</form>
javascript
import { Ctrovalidate } from 'ctrovalidate';

const form = document.getElementById('signup-form');
const validator = new Ctrovalidate(form, {
  realTime: true,
  errorClass: 'border-red-500 ring-1 ring-red-500',
  errorMessageClass: 'text-red-600 text-sm font-medium mt-1'
});

Using @apply Directive ​

Define error styles in your CSS file:

css
/* styles.css */
input.is-invalid {
  @apply border-red-500 ring-1 ring-red-500;
}

div.error-message {
  @apply text-red-600 text-sm font-medium mt-1;
}

input.ctrovalidate-pending {
  @apply border-blue-500 animate-pulse;
}
javascript
// Use default class names
const validator = new Ctrovalidate(form, {
  realTime: true
  // errorClass: 'is-invalid' (default)
  // errorMessageClass: 'error-message' (default)
  // pendingClass: 'ctrovalidate-pending' (default)
});

Advanced: Peer Selection ​

Use Tailwind's peer utility to style elements based on validation state:

html
<div class="relative">
  <input
    name="username"
    class="peer w-full px-4 py-2 border border-gray-300 rounded-lg"
    data-ctrovalidate-rules="required"
  />
  
  <!-- Show checkmark when valid -->
  <div class="hidden peer-[:not(.is-invalid)]:block absolute right-3 top-3 text-green-500">
    ✓
  </div>
  
  <!-- Show error icon when invalid -->
  <div class="hidden peer-[.is-invalid]:block absolute right-3 top-3 text-red-500">
    ✗
  </div>
</div>

Dark Mode Support ​

Use Tailwind's dark mode variants:

javascript
const validator = new Ctrovalidate(form, {
  errorClass: 'border-red-500 dark:border-red-400',
  errorMessageClass: 'text-red-600 dark:text-red-400 text-sm mt-1'
});

Or in CSS:

css
input.is-invalid {
  @apply border-red-500 dark:border-red-400;
}

div.error-message {
  @apply text-red-600 dark:text-red-400 text-sm;
}

Loading States ​

Style async validation with Tailwind:

javascript
const validator = new Ctrovalidate(form, {
  pendingClass: 'border-blue-500 bg-blue-50 animate-pulse'
});
html
<input
  name="username"
  data-ctrovalidate-rules="required|usernameAvailable"
  class="w-full px-4 py-2 border border-gray-300 rounded-lg transition-all"
/>

When the async rule runs, the input will have the border-blue-500 bg-blue-50 animate-pulse classes applied.


Best Practices ​

1. Use Transitions ​

Add smooth transitions to validation states:

html
<input class="... transition-all duration-200" />

2. Consistent Error Styling ​

Use the same error classes across all forms:

javascript
const defaultOptions = {
  errorClass: 'border-red-500 ring-1 ring-red-500',
  errorMessageClass: 'text-red-600 text-sm mt-1'
};

const validator = new Ctrovalidate(form, defaultOptions);

3. Accessible Colors ​

Ensure error colors meet WCAG contrast requirements:

javascript
// Good contrast for accessibility
errorClass: 'border-red-600 ring-1 ring-red-600'

Benefits ​

  • Utility-First: Use Tailwind's utility classes directly
  • No Custom CSS: No need to write custom stylesheets
  • Responsive: Easy to add responsive validation styles
  • Dark Mode: Built-in dark mode support

TIP

Use Tailwind's transition classes on inputs to make validation state changes smooth and polished.


Next Steps ​

Released under the MIT License.