Browse Source
Co-authored-by: likui628 <90845831+likui628@users.noreply.github.com>copilot/upgrade-tailwind-css-v4
3 changed files with 184 additions and 18 deletions
@ -0,0 +1,183 @@ |
|||||
|
# Tailwind CSS v4 Migration Notes |
||||
|
|
||||
|
## Current Status |
||||
|
|
||||
|
The Tailwind CSS has been successfully upgraded from v3.4.18 to v4.1.17, but the build is not yet functional due to architectural changes in v4. |
||||
|
|
||||
|
## Changes Completed |
||||
|
|
||||
|
1. **Dependencies Updated:** |
||||
|
- `tailwindcss`: ^3.4.17 → ^4.0.0 (v4.1.17 installed) |
||||
|
- `@tailwindcss/nesting`: Removed (now built-in to v4) |
||||
|
- `@tailwindcss/postcss`: Added (required for v4) |
||||
|
- PostCSS configuration updated to use `@tailwindcss/postcss` plugin |
||||
|
|
||||
|
2. **Configuration Updates:** |
||||
|
- Updated `pnpm-workspace.yaml` catalog |
||||
|
- Updated `internal/tailwind-config/package.json` |
||||
|
- Removed `@tailwindcss/nesting` dependency (built-in to v4) |
||||
|
- Updated peer dependency to `>=4.0.0-alpha` |
||||
|
|
||||
|
3. **CSS Import Migration:** |
||||
|
- Updated from `@tailwind` directives to `@import "tailwindcss"` (v4 style) |
||||
|
- Note: Later reverted to `@tailwind` directives due to compatibility issues |
||||
|
|
||||
|
## Critical Issues Discovered |
||||
|
|
||||
|
### 1. JavaScript Configuration Not Fully Supported |
||||
|
|
||||
|
Tailwind CSS v4 has a **CSS-first architecture**. The traditional JavaScript configuration (`tailwind.config.js`) is not processed the same way as in v3: |
||||
|
|
||||
|
- Custom colors defined in `theme.extend.colors` don't automatically generate utility classes |
||||
|
- The `@tailwindcss/postcss` plugin doesn't accept a `config` parameter like v3's plugin did |
||||
|
- Config files are discovered automatically but utilities aren't generated from complex theme extensions |
||||
|
|
||||
|
### 2. Custom Utility Classes Issue |
||||
|
|
||||
|
The project extensively uses custom utilities based on CSS variables: |
||||
|
- `border-border`, `text-foreground`, `bg-background` |
||||
|
- `text-primary-hover`, `text-primary-active` |
||||
|
- Many color utilities with opacity modifiers |
||||
|
|
||||
|
In v3, these were automatically generated from: |
||||
|
```javascript |
||||
|
colors: { |
||||
|
border: { |
||||
|
DEFAULT: 'hsl(var(--border))', |
||||
|
}, |
||||
|
primary: { |
||||
|
hover: 'hsl(var(--primary-600))', |
||||
|
// ... |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
In v4, this pattern doesn't work the same way. Utilities are not auto-generated from such theme configurations. |
||||
|
|
||||
|
### 3. @apply Directive Limitations |
||||
|
|
||||
|
The project uses `@apply` extensively with custom utilities: |
||||
|
```css |
||||
|
@apply border-border text-foreground bg-background; |
||||
|
@apply hover:text-primary-hover active:text-primary-active; |
||||
|
``` |
||||
|
|
||||
|
In v4, `@apply` with custom theme-based utilities requires those utilities to exist first, which they don't when using CSS variables in the theme config. |
||||
|
|
||||
|
## Solutions & Next Steps |
||||
|
|
||||
|
### Option 1: Use @theme Directive (Recommended for v4) |
||||
|
|
||||
|
Define colors directly in CSS using the `@theme` directive: |
||||
|
|
||||
|
```css |
||||
|
@import "tailwindcss"; |
||||
|
|
||||
|
@theme { |
||||
|
--color-border*: hsl(var(--border)); |
||||
|
--color-foreground*: hsl(var(--foreground)); |
||||
|
--color-primary*: hsl(var(--primary)); |
||||
|
--color-primary-hover*: hsl(var(--primary-600)); |
||||
|
/* ... all other colors */ |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
This makes colors available as `border`, `foreground`, `primary`, `primary-hover`, etc. |
||||
|
|
||||
|
**Challenges:** |
||||
|
- Need to map all 50+ custom color definitions |
||||
|
- Need to ensure CSS variable references work correctly |
||||
|
- May conflict with existing CSS variable naming |
||||
|
|
||||
|
### Option 2: Manual Utility Generation |
||||
|
|
||||
|
Create utilities manually using CSS or plugins: |
||||
|
|
||||
|
```css |
||||
|
@layer utilities { |
||||
|
.border-border { border-color: hsl(var(--border)); } |
||||
|
.text-primary-hover { color: hsl(var(--primary-600)); } |
||||
|
/* ...hundreds of utilities */ |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
**Challenges:** |
||||
|
- Extremely tedious for all combinations (colors × properties × modifiers) |
||||
|
- Hard to maintain |
||||
|
- Loses automatic responsive/hover/dark mode variants |
||||
|
|
||||
|
### Option 3: Replace @apply with Raw CSS |
||||
|
|
||||
|
Convert all `@apply` usage to regular CSS properties: |
||||
|
|
||||
|
```css |
||||
|
/* Before */ |
||||
|
.element { |
||||
|
@apply border-border text-foreground; |
||||
|
} |
||||
|
|
||||
|
/* After */ |
||||
|
.element { |
||||
|
border-color: hsl(var(--border)); |
||||
|
color: hsl(var(--foreground)); |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
**Challenges:** |
||||
|
- Affects hundreds of files |
||||
|
- Loses Tailwind utility benefits |
||||
|
- More verbose code |
||||
|
|
||||
|
### Option 4: Hybrid Approach |
||||
|
|
||||
|
1. Define core theme colors using `@theme` directive |
||||
|
2. Keep JavaScript config for complex configurations (breakpoints, etc.) |
||||
|
3. Convert critical @apply usage to raw CSS where needed |
||||
|
4. Create manual utilities for frequently used custom combinations |
||||
|
|
||||
|
### Option 5: Wait for Better v4 Support |
||||
|
|
||||
|
Tailwind v4 is still relatively new. Future updates may: |
||||
|
- Improve JavaScript config support |
||||
|
- Add compatibility layers |
||||
|
- Provide migration tools |
||||
|
|
||||
|
## Immediate Recommendations |
||||
|
|
||||
|
1. **For Production:** Stay on Tailwind v3 until v4 matures or a clear migration path exists |
||||
|
2. **For Migration:** Allocate 2-3 days for a proper migration using Option 4 (Hybrid) |
||||
|
3. **Documentation:** Review official Tailwind v4 migration guide when available |
||||
|
|
||||
|
## Files Affected |
||||
|
|
||||
|
### Modified: |
||||
|
- `pnpm-workspace.yaml` - Updated catalog versions |
||||
|
- `pnpm-lock.yaml` - Dependencies updated |
||||
|
- `internal/tailwind-config/package.json` - Removed nesting, added postcss plugin |
||||
|
- `internal/tailwind-config/src/postcss.config.ts` - Updated PostCSS plugin |
||||
|
- `packages/@core/base/design/src/css/global.css` - Updated imports, partial @apply conversion |
||||
|
- `packages/styles/src/antd/index.css` - Attempted opacity modifier fix |
||||
|
|
||||
|
### Needs Attention: |
||||
|
- All files using `@apply` with custom utilities |
||||
|
- Component styles relying on custom color utilities |
||||
|
- Theme configuration in `internal/tailwind-config/src/index.ts` |
||||
|
|
||||
|
## Resources |
||||
|
|
||||
|
- [Tailwind CSS v4 Documentation](https://tailwindcss.com) |
||||
|
- [v4 Beta Announcement](https://tailwindcss.com/blog/tailwindcss-v4-beta) |
||||
|
- [@tailwindcss/postcss Documentation](https://github.com/tailwindlabs/tailwindcss/tree/next/packages/%40tailwindcss-postcss) |
||||
|
|
||||
|
## Testing Command |
||||
|
|
||||
|
```bash |
||||
|
pnpm run build:antd |
||||
|
``` |
||||
|
|
||||
|
Currently fails with: |
||||
|
``` |
||||
|
Cannot apply unknown utility class `rounded-sm` |
||||
|
``` |
||||
|
|
||||
|
This indicates the Tailwind configuration is not being loaded properly by the v4 PostCSS plugin. |
||||
Loading…
Reference in new issue