Tailwind / Windi CSS compact preset for UnoCSS that provides comprehensive utility classes and theming system
—
Comprehensive variant system providing responsive breakpoints, pseudo-classes, dark mode support, and CSS combinators for conditional styling.
Creates variant configurations based on preset options, combining multiple variant categories.
function variants(options: PresetWindOptions): Variant<Theme>[];
type Variant = (matcher: VariantMatcherContext) => VariantHandlerContext | string | undefined;
interface VariantMatcherContext {
matcher: string;
generator: UnoGenerator;
}
interface VariantHandlerContext {
matcher: string;
handle?: VariantHandler;
multiPass?: boolean;
sort?: number;
layer?: string;
}
type VariantHandler = (input: VariantHandlerInput, next: VariantHandlerNext) => VariantHandlerReturn;CSS combinator variants for selecting related elements.
// From variants/combinators
const combinatorVariants: Variant[];Features:
>)+)~)Dark and light mode variants using class-based and media query approaches.
const variantColorsScheme: Variant[];Class-based Variants:
.dark - Applies styles when .dark class is present on parent.light - Applies styles when .light class is present on parentMedia Query Variants:
@dark - Applies styles when system prefers dark color scheme@light - Applies styles when system prefers light color schemeUsage Examples:
<!-- Class-based dark mode -->
<div class="bg-white dark:bg-gray-900">
<p class="text-black dark:text-white">Content</p>
</div>
<!-- Media query dark mode -->
<div class="bg-white @dark:bg-gray-900">
<p class="text-black @dark:text-white">Content</p>
</div>Core variant set from preset-mini including responsive breakpoints and pseudo-classes.
// From variants/default
const defaultVariants: Variant[];Features:
sm:, md:, lg:, xl:, 2xl:):hover, :focus, :active, etc.)::before, ::after, ::placeholder):checked, :disabled, :required)Extended media query variants for user preferences and device capabilities.
// From variants/media
const mediaVariants: Variant[];Features:
portrait:, landscape:)os-dark:, os-light:)motion-ok:, motion-not-ok:)high-contrast:, low-contrast:)opacity-ok:, opacity-not-ok:)use-data-ok:, use-data-not-ok:)touch:, stylus:, pointer:, mouse:)hd-color:)Additional utility variants for special cases.
// From variants/misc
const miscVariants: Variant[];Features:
Placeholder pseudo-element variants for input styling.
// From variants/placeholder
const placeholderVariants: Variant[];Features:
::placeholder pseudo-element styling<!-- Responsive utility classes -->
<div class="w-full md:w-1/2 lg:w-1/3">
<p class="text-sm sm:text-base lg:text-lg">Responsive text</p>
</div><!-- Hover and focus states -->
<button class="bg-blue-500 hover:bg-blue-700 focus:ring-2 focus:ring-blue-300">
Click me
</button><!-- Dark mode variants -->
<div class="bg-white dark:bg-gray-800">
<h1 class="text-gray-900 dark:text-white">Title</h1>
</div><!-- Motion and accessibility -->
<div class="animate-pulse motion-not-ok:animate-none">
<p class="text-base high-contrast:text-lg">Accessible content</p>
</div><!-- Touch and input method variants -->
<button class="p-2 touch:p-4 mouse:hover:bg-gray-100">
Adaptive button
</button>Variants are applied in a specific order to ensure proper CSS cascade:
Usage Example:
import { variants } from "@unocss/preset-wind";
// Create variants with options
const variantList = variants({
important: false
});
// Variants are used internally by the preset
// Individual variant access for advanced use casesInstall with Tessl CLI
npx tessl i tessl/npm-unocss--preset-wind