Skip to content

Wind4 preset

The Tailwind4 CSS compact preset for UnoCSS. It's compatible with all features of PresetWind3 and enhances it further.

Source Code

TIP

You can spend a little time reading this document to understand the changes

Installation

bash
pnpm add -D @unocss/preset-wind4
bash
yarn add -D @unocss/preset-wind4
bash
npm install -D @unocss/preset-wind4
bash
bun add -D @unocss/preset-wind4
uno.config.ts
ts
import 
presetWind4
from '@unocss/preset-wind4'
import {
defineConfig
} from 'unocss'
export default
defineConfig
({
presets
: [
presetWind4
(),
], })

Compatibility

Refer to Tailwind Compatibility to learn about browser support and compatibility.

Theme

PresetWind4's theme is almost identical to PresetWind3's theme, but some theme keys have been adjusted.

WARNING

Please note when switching to PresetWind4, refer to the table below to check your theme key configuration and make appropriate adjustments.

PresetWind3PresetWind4
fontFamilyfont
fontSizeMoved to fontSize property in text
lineHeightMoved to lineHeight property in text or use leading
letterSpacingMoved to letterSpacing property in text or use tracking
borderRadiusradius
easingease
breakpointsbreakpoint
verticalBreakpointsverticalBreakpoint
boxShadowshadow
-insetShadow
Size properties like width, height, maxWidth, maxHeight, minWidth, minHeightUnified to use spacing
transitionPropertyproperty
gridAutoColumn, gridAutoRow, gridColumn, gridRow, gridTemplateColumn, gridTemplateRow-
container.maxWidthcontainers.maxWidth
-defaults

Theme.defaults

Theme.defaults is a global default theme configuration that will be applied to reset styles or used as default values for certain rules.

Below are the default values for Theme.defaults, which you can override in your theme configuration.

Click to view default values
uno.config.ts
ts
import type { 
Theme
} from '@unocss/preset-wind4/theme'
export const
defaults
:
Theme
['defaults'] = {
transition
: {
duration
: '150ms',
timingFunction
: 'cubic-bezier(0.4, 0, 0.2, 1)',
},
font
: {
family
: 'var(--font-sans)',
featureSettings
: 'var(--font-sans--font-feature-settings)',
variationSettings
: 'var(--font-sans--font-variation-settings)',
},
monoFont
: {
family
: 'var(--font-mono)',
featureSettings
: 'var(--font-mono--font-feature-settings)',
variationSettings
: 'var(--font-mono--font-variation-settings)',
}, }

Options

PresetWind4's basic configuration is similar to PresetWind3, with the following important changes.

Reset Styles

In PresetWind4, we align the reset styles with tailwind4 and integrate them internally. You don't need to install any additional CSS reset package like @unocss/reset or normalize.css.

main.ts
ts
import '@unocss/reset/tailwind.css'
import '@unocss/reset/tailwind-compact.css'

You only need to control whether to enable reset styles through a switch:

uno.config.ts
ts
import 
presetWind4
from '@unocss/preset-wind4'
import {
defineConfig
} from 'unocss'
export default
defineConfig
({
presets
: [
presetWind4
({
reset
: true,
}), ], })

Utility Resolver

In PresetWind4, we've upgraded the postProcess hook to provide a more concise API. You can now directly customize utilities in the preset.

For example, if you want to use the presetRemToPx preset to convert rem to px, you no longer need to import this preset separately as presetWind4 provides this functionality internally.

uno.config.ts
ts
import { 
createRemToPxResolver
} from '@unocss/preset-wind4/utils'
import {
defineConfig
,
presetWind4
} from 'unocss'
export default
defineConfig
({
presets
: [
presetWind4
({
utilityResolver
:
createRemToPxResolver
()
}), ], })

You can customize more resolver sets to process utilities and output the CSS you want.

For specific implementation methods, please refer to postProcess or the presetWind4 test case

Theme Preflight

Choose how to generate theme CSS variables.

The UnoCSS engine with presetWind4 installed will automatically collect dependencies on the theme when parsing utilities and generate CSS variables at the end.

  • true: Generate theme keys fully.
  • false: Disable theme keys. (Not recommended ⚠️)
  • 'on-demand': Generate theme keys only when used. -> ✅ (By default)

Generated CSS

In the output of PresetWind4, two new layers have been added: theme and cssvar-property.

Layer NameDescriptionorder
cssvar-propertyCSS properties defined by @property-200
themeTheme-related CSS variables-150

cssvar-property Layer

We have used @property to define CSS properties in many rules to achieve better performance and smaller size.

For example, commonly used utilities like text-op-xx, bg-op-xx, and so on.

css
@property --un-text-opacity {
  syntax: '<percentage>';
  inherits: false;
  initial-value: 100%;
}

theme Layer

We've placed theme-related CSS variables in the theme layer to make it easier for you to override and use directly. It can be comprehensive or on-demand. It always comes from your theme configuration.

css
:root,
:host {
  --spacing: 0.25rem;
  --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
    'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
  --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;
  --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
  --colors-black: #000;
  --colors-white: #fff;
  /* ... */
}

Compatibility with Other Presets

PresetWind4 enhances and is compatible with PresetWind3. Since other packages were originally developed for PresetWind3, some issues may arise when using them together. Known issues include:

presetWebFonts

When using presetWebFonts with PresetWind4, the fontFamily theme key is no longer supported. Please make the following adjustment:

uno.config.ts
ts
import { 
defineConfig
,
presetWebFonts
,
presetWind4
} from 'unocss'
export default
defineConfig
({
presets
: [
presetWind4
(),
presetWebFonts
({
themeKey
: 'font',
}), ], })

transformDirectives

transformDirectives doesn't work well with PresetWind4. There are some known issues, so please use it with caution.

WARNING

  • When using @apply to process rules that have @property, conflicts may occur between different layer levels.

Released under the MIT License.