diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 75ca2dfb9533..93e104db8d2d 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -14,7 +14,7 @@ If you open a pull request for a new feature, we're likely to close it not becau
## Coding standards
-Our code formatting rules are defined in the `"prettier"` section of [package.json](https://github.com/tailwindcss/tailwindcss/blob/next/package.json). You can check your code against these standards by running:
+Our code formatting rules are defined in the `"prettier"` section of [package.json](https://github.com/tailwindcss/tailwindcss/blob/main/package.json). You can check your code against these standards by running:
```sh
pnpm run lint
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 54512c071671..e3844c3050a6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,7 +2,7 @@ name: CI
on:
push:
- branches: [next]
+ branches: [main]
pull_request:
permissions:
@@ -25,13 +25,13 @@ jobs:
os: macos-14
# Exclude windows and macos from being built on feature branches
- on-next-branch:
- - ${{ github.ref == 'refs/heads/next' }}
+ on-main-branch:
+ - ${{ github.ref == 'refs/heads/main' }}
exclude:
- - on-next-branch: false
+ - on-main-branch: false
runner:
name: Windows
- - on-next-branch: false
+ - on-main-branch: false
runner:
name: macOS
@@ -97,8 +97,8 @@ jobs:
run: npm run test:ui
- name: Notify Discord
- if: failure() && github.ref == 'refs/heads/next'
+ if: failure() && github.ref == 'refs/heads/main'
uses: discord-actions/message@v2
with:
webhookUrl: ${{ secrets.DISCORD_WEBHOOK_URL }}
- message: 'The [most recent build](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>) on the `next` branch has failed.'
+ message: 'The [most recent build](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>) on the `main` branch has failed.'
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index d61223ae72b6..e997fb825f6f 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -2,7 +2,7 @@ name: Integration Tests
on:
push:
- branches: [next]
+ branches: [main]
pull_request:
permissions:
@@ -32,13 +32,13 @@ jobs:
- postcss
# Exclude windows and macos from being built on feature branches
- on-next-branch:
- - ${{ github.ref == 'refs/heads/next' }}
+ on-main-branch:
+ - ${{ github.ref == 'refs/heads/main' }}
exclude:
- - on-next-branch: false
+ - on-main-branch: false
runner:
name: Windows
- - on-next-branch: false
+ - on-main-branch: false
runner:
name: macOS
@@ -95,8 +95,8 @@ jobs:
GITHUB_WORKSPACE: ${{ github.workspace }}
- name: Notify Discord
- if: failure() && github.ref == 'refs/heads/next'
+ if: failure() && github.ref == 'refs/heads/main'
uses: discord-actions/message@v2
with:
webhookUrl: ${{ secrets.DISCORD_WEBHOOK_URL }}
- message: 'The [most recent build](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>) on the `next` branch has failed.'
+ message: 'The [most recent build](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>) on the `main` branch has failed.'
diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml
index 0c4979b2bd55..f1387d570f17 100644
--- a/.github/workflows/prepare-release.yml
+++ b/.github/workflows/prepare-release.yml
@@ -2,21 +2,257 @@ name: Prepare Release
on:
workflow_dispatch:
+ push:
+ tags:
+ - 'v*'
env:
- CI: true
+ APP_NAME: tailwindcss-oxide
+ NODE_VERSION: 20
+ OXIDE_LOCATION: ./crates/node
permissions:
contents: read
jobs:
build:
- runs-on: macos-12
- timeout-minutes: 15
-
strategy:
matrix:
- node-version: [16]
+ include:
+ # Windows
+ - os: windows-latest
+ target: x86_64-pc-windows-msvc
+ - os: windows-latest
+ target: aarch64-pc-windows-msvc
+ # macOS
+ - os: macos-latest
+ target: x86_64-apple-darwin
+ strip: strip -x # Must use -x on macOS. This produces larger results on linux.
+ - os: macos-latest
+ target: aarch64-apple-darwin
+ page-size: 14
+ strip: strip -x # Must use -x on macOS. This produces larger results on linux.
+ # Android
+ - os: ubuntu-latest
+ target: aarch64-linux-android
+ strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
+ - os: ubuntu-latest
+ target: armv7-linux-androideabi
+ strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
+ # Linux
+ - os: ubuntu-latest
+ target: x86_64-unknown-linux-gnu
+ strip: strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
+ - os: ubuntu-latest
+ target: aarch64-unknown-linux-gnu
+ strip: llvm-strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
+ - os: ubuntu-latest
+ target: armv7-unknown-linux-gnueabihf
+ strip: llvm-strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-zig
+ - os: ubuntu-latest
+ target: aarch64-unknown-linux-musl
+ strip: aarch64-linux-musl-strip
+ download: true
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
+ - os: ubuntu-latest
+ target: x86_64-unknown-linux-musl
+ strip: strip
+ download: true
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
+
+ name: Build ${{ matrix.target }} (OXIDE)
+ runs-on: ${{ matrix.os }}
+ container: ${{ matrix.container }}
+ timeout-minutes: 15
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: 'pnpm'
+
+ # Cargo already skips downloading dependencies if they already exist
+ - name: Cache cargo
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cargo/bin/
+ ~/.cargo/registry/index/
+ ~/.cargo/registry/cache/
+ ~/.cargo/git/db/
+ target/
+ key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
+
+ # Cache the `oxide` Rust build
+ - name: Cache oxide build
+ uses: actions/cache@v4
+ with:
+ path: |
+ ./oxide/target/
+ ./crates/node/*.node
+ ./crates/node/index.js
+ ./crates/node/index.d.ts
+ key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
+
+ - name: Install Node.JS
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Install Rust (Stable)
+ if: ${{ matrix.download }}
+ run: |
+ rustup default stable
+
+ - name: Setup rust target
+ run: rustup target add ${{ matrix.target }}
+
+ - name: Install dependencies
+ run: pnpm install --ignore-scripts --filter=!./playgrounds/*
+
+ - name: Build release
+ run: pnpm run --filter ${{ env.OXIDE_LOCATION }} build
+ env:
+ RUST_TARGET: ${{ matrix.target }}
+ JEMALLOC_SYS_WITH_LG_PAGE: ${{ matrix.page-size }}
+
+ - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
+ if: ${{ matrix.strip }}
+ run: ${{ matrix.strip }} ${{ env.OXIDE_LOCATION }}/*.node
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: bindings-${{ matrix.target }}
+ path: ${{ env.OXIDE_LOCATION }}/*.node
+
+ prepare:
+ runs-on: macos-14
+ timeout-minutes: 15
+ name: Build and release Tailwind CSS
+
+ permissions:
+ contents: write # for softprops/action-gh-release to create GitHub release
+ # https://docs.npmjs.com/generating-provenance-statements#publishing-packages-with-provenance-via-github-actions
+ id-token: write
+
+ needs:
+ - build
steps:
- - run: echo "stub"
+ - uses: actions/checkout@v4
+ with:
+ fetch-tags: true
+ fetch-depth: 20
+
+ - run: git fetch --tags -f
+
+ - name: Resolve version
+ id: vars
+ run: |
+ echo "TAG_NAME=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
+
+ - uses: pnpm/action-setup@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: 'pnpm'
+ registry-url: 'https://registry.npmjs.org'
+
+ # Cargo already skips downloading dependencies if they already exist
+ - name: Cache cargo
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cargo/bin/
+ ~/.cargo/registry/index/
+ ~/.cargo/registry/cache/
+ ~/.cargo/git/db/
+ target/
+ key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
+
+ # Cache the `oxide` Rust build
+ - name: Cache oxide build
+ uses: actions/cache@v4
+ with:
+ path: |
+ ./oxide/target/
+ ./crates/node/*.node
+ ./crates/node/index.js
+ ./crates/node/index.d.ts
+ key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
+
+ - name: Install dependencies
+ run: pnpm --filter=!./playgrounds/* install
+
+ - name: Download artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: ${{ env.OXIDE_LOCATION }}
+
+ - name: Move artifacts
+ run: |
+ cd ${{ env.OXIDE_LOCATION }}
+ cp bindings-x86_64-pc-windows-msvc/* ./npm/win32-x64-msvc/
+ cp bindings-aarch64-pc-windows-msvc/* ./npm/win32-arm64-msvc/
+ cp bindings-x86_64-apple-darwin/* ./npm/darwin-x64/
+ cp bindings-aarch64-apple-darwin/* ./npm/darwin-arm64/
+ cp bindings-aarch64-linux-android/* ./npm/android-arm64/
+ cp bindings-armv7-linux-androideabi/* ./npm/android-arm-eabi/
+ cp bindings-aarch64-unknown-linux-gnu/* ./npm/linux-arm64-gnu/
+ cp bindings-aarch64-unknown-linux-musl/* ./npm/linux-arm64-musl/
+ cp bindings-armv7-unknown-linux-gnueabihf/* ./npm/linux-arm-gnueabihf/
+ cp bindings-x86_64-unknown-linux-gnu/* ./npm/linux-x64-gnu/
+ cp bindings-x86_64-unknown-linux-musl/* ./npm/linux-x64-musl/
+
+ - name: Build Tailwind CSS
+ run: pnpm run build
+
+ - name: Run pre-publish optimizations scripts
+ run: node ./scripts/pre-publish-optimizations.mjs
+
+ - name: Lock pre-release versions
+ run: node ./scripts/lock-pre-release-versions.mjs
+
+ - name: Get release notes
+ run: |
+ RELEASE_NOTES=$(node ./scripts/release-notes.mjs)
+ echo "RELEASE_NOTES<> $GITHUB_ENV
+ echo "$RELEASE_NOTES" >> $GITHUB_ENV
+ echo "EOF" >> $GITHUB_ENV
+
+ - name: Upload Standalone Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: tailwindcss-standalone
+ path: packages/@tailwindcss-standalone/dist/
+
+ - name: Prepare GitHub Release
+ uses: softprops/action-gh-release@v2
+ with:
+ draft: true
+ tag_name: ${{ env.TAG_NAME }}
+ body: |
+ ${{ env.RELEASE_NOTES }}
+ files: |
+ packages/@tailwindcss-standalone/dist/sha256sums.txt
+ packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64
+ packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64-musl
+ packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64
+ packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64-musl
+ packages/@tailwindcss-standalone/dist/tailwindcss-macos-arm64
+ packages/@tailwindcss-standalone/dist/tailwindcss-macos-x64
+ packages/@tailwindcss-standalone/dist/tailwindcss-windows-x64.exe
diff --git a/.github/workflows/release-insiders.yml b/.github/workflows/release-insiders.yml
new file mode 100644
index 000000000000..46f8a3899c58
--- /dev/null
+++ b/.github/workflows/release-insiders.yml
@@ -0,0 +1,248 @@
+name: Release Insiders
+
+on:
+ push:
+ branches: [main]
+
+permissions:
+ contents: read
+
+env:
+ APP_NAME: tailwindcss-oxide
+ NODE_VERSION: 20
+ OXIDE_LOCATION: ./crates/node
+ RELEASE_CHANNEL: insiders
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ include:
+ # Windows
+ - os: windows-latest
+ target: x86_64-pc-windows-msvc
+ - os: windows-latest
+ target: aarch64-pc-windows-msvc
+ # macOS
+ - os: macos-latest
+ target: x86_64-apple-darwin
+ strip: strip -x # Must use -x on macOS. This produces larger results on linux.
+ - os: macos-latest
+ target: aarch64-apple-darwin
+ page-size: 14
+ strip: strip -x # Must use -x on macOS. This produces larger results on linux.
+ # Android
+ - os: ubuntu-latest
+ target: aarch64-linux-android
+ strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
+ - os: ubuntu-latest
+ target: armv7-linux-androideabi
+ strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
+ # Linux
+ - os: ubuntu-latest
+ target: x86_64-unknown-linux-gnu
+ strip: strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
+ - os: ubuntu-latest
+ target: aarch64-unknown-linux-gnu
+ strip: llvm-strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
+ - os: ubuntu-latest
+ target: armv7-unknown-linux-gnueabihf
+ strip: llvm-strip
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-zig
+ - os: ubuntu-latest
+ target: aarch64-unknown-linux-musl
+ strip: aarch64-linux-musl-strip
+ download: true
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
+ - os: ubuntu-latest
+ target: x86_64-unknown-linux-musl
+ strip: strip
+ download: true
+ container:
+ image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
+
+ name: Build ${{ matrix.target }} (OXIDE)
+ runs-on: ${{ matrix.os }}
+ container: ${{ matrix.container }}
+ timeout-minutes: 15
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: 'pnpm'
+
+ # Cargo already skips downloading dependencies if they already exist
+ - name: Cache cargo
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cargo/bin/
+ ~/.cargo/registry/index/
+ ~/.cargo/registry/cache/
+ ~/.cargo/git/db/
+ target/
+ key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
+
+ # Cache the `oxide` Rust build
+ - name: Cache oxide build
+ uses: actions/cache@v4
+ with:
+ path: |
+ ./oxide/target/
+ ./crates/node/*.node
+ ./crates/node/index.js
+ ./crates/node/index.d.ts
+ key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
+
+ - name: Install Node.JS
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Install Rust (Stable)
+ if: ${{ matrix.download }}
+ run: |
+ rustup default stable
+
+ - name: Setup rust target
+ run: rustup target add ${{ matrix.target }}
+
+ - name: Install dependencies
+ run: pnpm install --ignore-scripts --filter=!./playgrounds/*
+
+ - name: Build release
+ run: pnpm run --filter ${{ env.OXIDE_LOCATION }} build
+ env:
+ RUST_TARGET: ${{ matrix.target }}
+ JEMALLOC_SYS_WITH_LG_PAGE: ${{ matrix.page-size }}
+
+ - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
+ if: ${{ matrix.strip }}
+ run: ${{ matrix.strip }} ${{ env.OXIDE_LOCATION }}/*.node
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: bindings-${{ matrix.target }}
+ path: ${{ env.OXIDE_LOCATION }}/*.node
+
+ release:
+ runs-on: macos-14
+ timeout-minutes: 15
+ name: Build and release Tailwind CSS insiders
+
+ permissions:
+ contents: write # for softprops/action-gh-release to create GitHub release
+ # https://docs.npmjs.com/generating-provenance-statements#publishing-packages-with-provenance-via-github-actions
+ id-token: write
+
+ needs:
+ - build
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-tags: true
+ fetch-depth: 20
+
+ - name: Resolve version
+ id: vars
+ run: |
+ echo "SHA_SHORT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
+
+ - uses: pnpm/action-setup@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: 'pnpm'
+ registry-url: 'https://registry.npmjs.org'
+
+ # Cargo already skips downloading dependencies if they already exist
+ - name: Cache cargo
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cargo/bin/
+ ~/.cargo/registry/index/
+ ~/.cargo/registry/cache/
+ ~/.cargo/git/db/
+ target/
+ key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
+
+ # Cache the `oxide` Rust build
+ - name: Cache oxide build
+ uses: actions/cache@v4
+ with:
+ path: |
+ ./oxide/target/
+ ./crates/node/*.node
+ ./crates/node/index.js
+ ./crates/node/index.d.ts
+ key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
+
+ - name: Install dependencies
+ run: pnpm --filter=!./playgrounds/* install
+
+ - name: Download artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: ${{ env.OXIDE_LOCATION }}
+
+ - name: Move artifacts
+ run: |
+ cd ${{ env.OXIDE_LOCATION }}
+ cp bindings-x86_64-pc-windows-msvc/* ./npm/win32-x64-msvc/
+ cp bindings-aarch64-pc-windows-msvc/* ./npm/win32-arm64-msvc/
+ cp bindings-x86_64-apple-darwin/* ./npm/darwin-x64/
+ cp bindings-aarch64-apple-darwin/* ./npm/darwin-arm64/
+ cp bindings-aarch64-linux-android/* ./npm/android-arm64/
+ cp bindings-armv7-linux-androideabi/* ./npm/android-arm-eabi/
+ cp bindings-aarch64-unknown-linux-gnu/* ./npm/linux-arm64-gnu/
+ cp bindings-aarch64-unknown-linux-musl/* ./npm/linux-arm64-musl/
+ cp bindings-armv7-unknown-linux-gnueabihf/* ./npm/linux-arm-gnueabihf/
+ cp bindings-x86_64-unknown-linux-gnu/* ./npm/linux-x64-gnu/
+ cp bindings-x86_64-unknown-linux-musl/* ./npm/linux-x64-musl/
+
+ - name: 'Version based on commit: 0.0.0-${{ env.RELEASE_CHANNEL }}.${{ env.SHA_SHORT }}'
+ run: pnpm run version-packages 0.0.0-${{ env.RELEASE_CHANNEL }}.${{ env.SHA_SHORT }}
+
+ - name: Build Tailwind CSS
+ run: pnpm run build
+
+ - name: Run pre-publish optimizations scripts
+ run: node ./scripts/pre-publish-optimizations.mjs
+
+ - name: Lock pre-release versions
+ run: node ./scripts/lock-pre-release-versions.mjs
+
+ - name: Publish
+ run: pnpm --recursive publish --tag ${{ env.RELEASE_CHANNEL }} --no-git-checks
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Trigger Tailwind Play update
+ uses: actions/github-script@v7
+ with:
+ github-token: ${{ secrets.TAILWIND_PLAY_TOKEN }}
+ script: |
+ await github.rest.actions.createWorkflowDispatch({
+ owner: 'tailwindlabs',
+ repo: 'play.tailwindcss.com',
+ ref: 'master',
+ workflow_id: 'upgrade-tailwindcss.yml',
+ inputs: {
+ insidersVersion: '0.0.0-${{ env.RELEASE_CHANNEL }}.${{ env.SHA_SHORT }}'
+ }
+ })
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index faa4a8271342..c9a21abc892a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,13 +1,9 @@
name: Release
on:
+ release:
+ types: [published]
workflow_dispatch:
- inputs:
- release_channel:
- description: 'Release channel'
- required: false
- default: 'next'
- type: string
permissions:
contents: read
@@ -159,13 +155,6 @@ jobs:
fetch-tags: true
fetch-depth: 20
- - run: git fetch --tags -f
-
- - name: Resolve version
- id: vars
- run: |
- echo "TAG_NAME=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
-
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
@@ -230,44 +219,28 @@ jobs:
- name: Lock pre-release versions
run: node ./scripts/lock-pre-release-versions.mjs
- - name: Get release notes
+ - name: Calculate environment variables
run: |
- RELEASE_NOTES=$(node ./scripts/release-notes.mjs)
- echo "RELEASE_NOTES<> $GITHUB_ENV
- echo "$RELEASE_NOTES" >> $GITHUB_ENV
- echo "EOF" >> $GITHUB_ENV
-
- - name: Upload Standalone Artifacts
- uses: actions/upload-artifact@v4
- with:
- name: tailwindcss-standalone
- path: packages/@tailwindcss-standalone/dist/
+ echo "RELEASE_CHANNEL=$(node ./scripts/release-channel.js)" >> $GITHUB_ENV
+ echo "TAILWINDCSS_VERSION=$(node -e 'console.log(require(`./packages/tailwindcss/package.json`).version);')" >> $GITHUB_ENV
- name: Publish
- run: pnpm --recursive publish --tag ${{ inputs.release_channel }} --no-git-checks
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- - name: Alias packages to `latest`
- if: ${{ inputs.release_channel == 'next' }}
- run: |
- npm dist-tag add @tailwindcss/upgrade@${{ env.TAG_NAME }} latest
+ run: pnpm --recursive publish --tag ${{ env.RELEASE_CHANNEL }} --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- - name: Release
- uses: softprops/action-gh-release@v2
+ - name: Trigger Tailwind Play update
+ if: env.RELEASE_CHANNEL == 'latest'
+ uses: actions/github-script@v7
with:
- draft: true
- tag_name: ${{ env.TAG_NAME }}
- body: |
- ${{ env.RELEASE_NOTES }}
- files: |
- packages/@tailwindcss-standalone/dist/sha256sums.txt
- packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64
- packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64-musl
- packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64
- packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64-musl
- packages/@tailwindcss-standalone/dist/tailwindcss-macos-arm64
- packages/@tailwindcss-standalone/dist/tailwindcss-macos-x64
- packages/@tailwindcss-standalone/dist/tailwindcss-windows-x64.exe
+ github-token: ${{ secrets.TAILWIND_PLAY_TOKEN }}
+ script: |
+ await github.rest.actions.createWorkflowDispatch({
+ owner: 'tailwindlabs',
+ repo: 'play.tailwindcss.com',
+ ref: 'master',
+ workflow_id: 'upgrade-tailwindcss.yml',
+ inputs: {
+ version: '${{ env.TAILWINDCSS_VERSION }}'
+ }
+ })
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cf05bf19e3e..c60d4490700e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,9 +7,64 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
-- Nothing yet
+- Nothing yet!
+
+## [4.0.1] - 2025-01-29
+
+### Added
+
+- Include `:open` pseudo-class in existing `open` variant ([#15349](https://github.com/tailwindlabs/tailwindcss/pull/15349))
+
+### Fixed
+
+- Remove invalid `min-w/h-none` utilities ([#15845](https://github.com/tailwindlabs/tailwindcss/pull/15845))
+- Discard CSS variable shorthand utilities that don't use valid CSS variables ([#15738](https://github.com/tailwindlabs/tailwindcss/pull/15738))
+- Ensure font-size utilities with `none` modifier have a line-height set e.g. `text-sm/none` ([#15921](https://github.com/tailwindlabs/tailwindcss/pull/15921))
+- Ensure font-size utilities with unknown modifier don't generate CSS ([#15921](https://github.com/tailwindlabs/tailwindcss/pull/15921))
+- Don’t suggest font weight utilities more than once ([#15857](https://github.com/tailwindlabs/tailwindcss/pull/15857))
+- Suggest container query variants ([#15857](https://github.com/tailwindlabs/tailwindcss/pull/15857))
+- Disable bare value suggestions when not using the `--spacing` variable ([#15857](https://github.com/tailwindlabs/tailwindcss/pull/15857))
+- Ensure suggested classes are properly sorted ([#15857](https://github.com/tailwindlabs/tailwindcss/pull/15857))
+- Don’t look at .gitignore files outside initialized repos ([#15941](https://github.com/tailwindlabs/tailwindcss/pull/15941))
+- Find utilities when using the Svelte class shorthand syntax across multiple lines ([#15974](https://github.com/tailwindlabs/tailwindcss/pull/15974))
+- Find utilities when using the Angular class shorthand syntax ([#15974](https://github.com/tailwindlabs/tailwindcss/pull/15974))
+- Find utilities when using functions inside arrays ([#15974](https://github.com/tailwindlabs/tailwindcss/pull/15974))
+- Ensure that `@tailwindcss/browser` does not pollute the global namespace ([#15978](https://github.com/tailwindlabs/tailwindcss/pull/15978))
+- Ensure that `tailwind-merge` is not scanned when using the Vite plugin ([#16005](https://github.com/tailwindlabs/tailwindcss/pull/16005))
+- Ensure CSS theme variables are available within shadow roots ([#15975](https://github.com/tailwindlabs/tailwindcss/pull/15975))
+- Fix crash when project lives in the `/` directory ([#15988](https://github.com/tailwindlabs/tailwindcss/pull/15988))
+- Ensure custom variants have a non-empty selector list ([#16009](https://github.com/tailwindlabs/tailwindcss/pull/16009))
+- _Upgrade_: Ensure JavaScript config files on different drives are correctly migrated ([#15927](https://github.com/tailwindlabs/tailwindcss/pull/15927))
+- _Upgrade_: Migrate `leading-[1]` to `leading-none` ([#16004](https://github.com/tailwindlabs/tailwindcss/pull/16004))
+- _Upgrade_: Do not migrate arbitrary leading utilities to bare values ([#16004](https://github.com/tailwindlabs/tailwindcss/pull/16004))
## [4.0.0] - 2025-01-21
+
+### Added
+
+- [New high-performance engine](https://tailwindcss.com/blog/tailwindcss-v4#new-high-performance-engine) — where full builds are up to 5x faster, and incremental builds are over 100x faster — and measured in microseconds.
+- [Designed for the modern web](https://tailwindcss.com/blog/tailwindcss-v4#designed-for-the-modern-web) — built on cutting-edge CSS features like cascade layers, registered custom properties with `@property`, and `color-mix()`.
+- [Simplified installation](https://tailwindcss.com/blog/tailwindcss-v4#simplified-installation) — fewer dependencies, zero configuration, and just a single line of code in your CSS file.
+- [First-party Vite plugin](https://tailwindcss.com/blog/tailwindcss-v4#first-party-vite-plugin) — tight integration for maximum performance and minimum configuration.
+- [Automatic content detection](https://tailwindcss.com/blog/tailwindcss-v4#automatic-content-detection) — all of your template files are discovered automatically, with no configuration required.
+- [Built-in import support](https://tailwindcss.com/blog/tailwindcss-v4#built-in-import-support) — no additional tooling necessary to bundle multiple CSS files.
+- [CSS-first configuration](https://tailwindcss.com/blog/tailwindcss-v4#css-first-configuration) — a reimagined developer experience where you customize and extend the framework directly in CSS instead of a JavaScript configuration file.
+- [CSS theme variables](https://tailwindcss.com/blog/tailwindcss-v4#css-theme-variables) — all of your design tokens exposed as native CSS variables so you can access them anywhere.
+- [Dynamic utility values and variants](https://tailwindcss.com/blog/tailwindcss-v4#dynamic-utility-values-and-variants) — stop guessing what values exist in your spacing scale, or extending your configuration for things like basic data attributes.
+- [Modernized P3 color palette](https://tailwindcss.com/blog/tailwindcss-v4#modernized-p3-color-palette) — a redesigned, more vivid color palette that takes full advantage of modern display technology.
+- [Container queries](https://tailwindcss.com/blog/tailwindcss-v4#container-queries) — first-class APIs for styling elements based on their container size, no plugins required.
+- [New 3D transform utilities](https://tailwindcss.com/blog/tailwindcss-v4#new-3d-transform-utilities) — transform elements in 3D space directly in your HTML.
+- [Expanded gradient APIs](https://tailwindcss.com/blog/tailwindcss-v4#expanded-gradient-apis) — radial and conic gradients, interpolation modes, and more.
+- [@starting-style support](https://tailwindcss.com/blog/tailwindcss-v4#starting-style-support) — a new variant you can use to create enter and exit transitions, without the need for JavaScript.
+- [not-\* variant](https://tailwindcss.com/blog/tailwindcss-v4#not-variant) — style an element only when it doesn't match another variant, custom selector, or media or feature query.
+- [Even more new utilities and variants](https://tailwindcss.com/blog/tailwindcss-v4#even-more-new-utilities-and-variants) — including support for `color-scheme`, `field-sizing`, complex shadows, `inert`, and more.
+
+Start using Tailwind CSS v4.0 today by [installing it in a new project](https://tailwindcss.com/docs/installation/), or playing with it directly in the browser on [Tailwind Play](https://play.tailwindcss.com/).
+
+For existing projects, we've published a comprehensive [upgrade guide](https://tailwindcss.com/docs/upgrade-guide) and built an [automated upgrade tool](https://tailwindcss.com/docs/upgrade-guide#using-the-upgrade-tool) to get you on the latest version as quickly and painlessly as possible.
+
+For a deep-dive into everything that's new, [check out the announcement post](https://tailwindcss.com/blog/tailwindcss-v4).
+
## [4.0.0-beta.10] - 2025-01-21
### Added
@@ -301,7 +356,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Rename `drop-shadow` to `drop-shadow-sm` and `drop-shadow-sm` to `drop-shadow-xs` ([#14849](https://github.com/tailwindlabs/tailwindcss/pull/14849))
- Rename `rounded` to `rounded-sm` and `rounded-sm` to `rounded-xs` ([#14849](https://github.com/tailwindlabs/tailwindcss/pull/14849))
- Rename `blur` to `blur-sm` and `blur-sm` to `blur-xs` ([#14849](https://github.com/tailwindlabs/tailwindcss/pull/14849))
-- Remove fixed line-height theme values and derive `leading-*` utilites from `--spacing-*` scale ([#14857](https://github.com/tailwindlabs/tailwindcss/pull/14857))
+- Remove fixed line-height theme values and derive `leading-*` utilities from `--spacing-*` scale ([#14857](https://github.com/tailwindlabs/tailwindcss/pull/14857))
- Remove `--transition-timing-function-linear` from the default theme in favor of a static `ease-linear` utility ([#14880](https://github.com/tailwindlabs/tailwindcss/pull/14880))
- Remove default `--spacing-*` scale in favor of `--spacing` multiplier ([#14857](https://github.com/tailwindlabs/tailwindcss/pull/14857))
- Remove `var(…)` fallbacks from theme values in utilities ([#14881](https://github.com/tailwindlabs/tailwindcss/pull/14881))
@@ -827,3 +882,2733 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [4.0.0-alpha.1] - 2024-03-06
- First 4.0.0-alpha.1 release
+
+## [3.4.17] - 2024-12-17
+
+### Fixed
+
+- Work around Node v22.12+ issue ([#15421](https://github.com/tailwindlabs/tailwindcss/pull/15421))
+
+## [3.4.16] - 2024-12-03
+
+### Fixed
+
+- Ensure the TypeScript types for `PluginsConfig` allow `undefined` values ([#14668](https://github.com/tailwindlabs/tailwindcss/pull/14668))
+
+# Changed
+
+- Bumped lilconfig to v3.x ([#15289](https://github.com/tailwindlabs/tailwindcss/pull/15289))
+
+## [3.4.15] - 2024-11-14
+
+- Bump versions for security vulnerabilities ([#14697](https://github.com/tailwindlabs/tailwindcss/pull/14697))
+- Ensure the TypeScript types for the `boxShadow` theme configuration allows arrays ([#14856](https://github.com/tailwindlabs/tailwindcss/pull/14856))
+- Set fallback for opacity variables to ensure setting colors with the `selection:*` variant works in Chrome 131 ([#15003](https://github.com/tailwindlabs/tailwindcss/pull/15003))
+
+## [3.4.14] - 2024-10-15
+
+### Fixed
+
+- Don't set `display: none` on elements that use `hidden="until-found"` ([#14625](https://github.com/tailwindlabs/tailwindcss/pull/14625))
+
+## [3.4.13] - 2024-09-23
+
+### Fixed
+
+- Improve source glob verification performance ([#14481](https://github.com/tailwindlabs/tailwindcss/pull/14481))
+
+## [3.4.12] - 2024-09-17
+
+### Fixed
+
+- Ensure using `@apply` with utilities that use `@defaults` works with rules defined in the base layer when using `optimizeUniversalDefaults` ([#14427](https://github.com/tailwindlabs/tailwindcss/pull/14427))
+
+## [3.4.11] - 2024-09-11
+
+### Fixed
+
+- Allow `anchor-size(…)` in arbitrary values ([#14393](https://github.com/tailwindlabs/tailwindcss/pull/14393))
+
+## [3.4.10] - 2024-08-13
+
+### Fixed
+
+- Bump versions of plugins in the Standalone CLI ([#14185](https://github.com/tailwindlabs/tailwindcss/pull/14185))
+
+## [3.4.9] - 2024-08-08
+
+### Fixed
+
+- No longer warns when broad glob patterns are detecting `vendor` folders
+
+## [3.4.8] - 2024-08-07
+
+### Fixed
+
+- Fix minification when using nested CSS ([#14105](https://github.com/tailwindlabs/tailwindcss/pull/14105))
+- Warn when broad glob patterns are used in the content configuration ([#14140](https://github.com/tailwindlabs/tailwindcss/pull/14140))
+
+## [3.4.7] - 2024-07-25
+
+### Fixed
+
+- Fix class detection in Slim templates with attached attributes and ID ([#14019](https://github.com/tailwindlabs/tailwindcss/pull/14019))
+- Ensure attribute values in `data-*` and `aria-*` modifiers are always quoted in the generated CSS ([#14037](https://github.com/tailwindlabs/tailwindcss/pull/14037))
+
+## [3.4.6] - 2024-07-16
+
+### Fixed
+
+- Fix detection of some utilities in Slim/Pug templates ([#14006](https://github.com/tailwindlabs/tailwindcss/pull/14006))
+
+### Changed
+
+- Loosen `:is()` wrapping rules when using an important selector ([#13900](https://github.com/tailwindlabs/tailwindcss/pull/13900))
+
+## [3.4.5] - 2024-07-15
+
+### Fixed
+
+- Disable automatic `var()` injection for anchor properties ([#13826](https://github.com/tailwindlabs/tailwindcss/pull/13826))
+- Use no value instead of `blur(0px)` for `backdrop-blur-none` and `blur-none` utilities ([#13830](https://github.com/tailwindlabs/tailwindcss/pull/13830))
+- Add `.mts` and `.cts` config file detection ([#13940](https://github.com/tailwindlabs/tailwindcss/pull/13940))
+- Don't generate utilities like `px-1` unnecessarily when using utilities like `px-1.5` ([#13959](https://github.com/tailwindlabs/tailwindcss/pull/13959))
+- Always generate `-webkit-backdrop-filter` for `backdrop-*` utilities ([#13997](https://github.com/tailwindlabs/tailwindcss/pull/13997))
+
+## [3.4.4] - 2024-06-05
+
+### Fixed
+
+- Make it possible to use multiple `` placeholders in a single color definition ([#13740](https://github.com/tailwindlabs/tailwindcss/pull/13740))
+- Don't prefix classes in arbitrary values of `has-*`, `group-has-*`, and `peer-has-*` variants ([#13770](https://github.com/tailwindlabs/tailwindcss/pull/13770))
+- Support negative values for `{col,row}-{start,end}` utilities ([#13781](https://github.com/tailwindlabs/tailwindcss/pull/13781))
+- Update embedded browserslist database ([#13792](https://github.com/tailwindlabs/tailwindcss/pull/13792))
+
+## [3.4.3] - 2024-03-27
+
+### Fixed
+
+- Revert changes to glob handling ([#13384](https://github.com/tailwindlabs/tailwindcss/pull/13384))
+
+## [3.4.2] - 2024-03-27
+
+### Fixed
+
+- Ensure max specificity of `0,0,1` for button and input Preflight rules ([#12735](https://github.com/tailwindlabs/tailwindcss/pull/12735))
+- Improve glob handling for folders with `(`, `)`, `[` or `]` in the file path ([#12715](https://github.com/tailwindlabs/tailwindcss/pull/12715))
+- Split `:has` rules when using `experimental.optimizeUniversalDefaults` ([#12736](https://github.com/tailwindlabs/tailwindcss/pull/12736))
+- Sort arbitrary properties alphabetically across multiple class lists ([#12911](https://github.com/tailwindlabs/tailwindcss/pull/12911))
+- Add `mix-blend-plus-darker` utility ([#12923](https://github.com/tailwindlabs/tailwindcss/pull/12923))
+- Ensure dashes are allowed in variant modifiers ([#13303](https://github.com/tailwindlabs/tailwindcss/pull/13303))
+- Fix crash showing completions in Intellisense when using a custom separator ([#13306](https://github.com/tailwindlabs/tailwindcss/pull/13306))
+- Transpile `import.meta.url` in config files ([#13322](https://github.com/tailwindlabs/tailwindcss/pull/13322))
+- Reset letter spacing for form elements ([#13150](https://github.com/tailwindlabs/tailwindcss/pull/13150))
+- Fix missing `xx-large` and remove double `x-large` absolute size ([#13324](https://github.com/tailwindlabs/tailwindcss/pull/13324))
+- Don't error when encountering nested CSS unless trying to `@apply` a class that uses nesting ([#13325](https://github.com/tailwindlabs/tailwindcss/pull/13325))
+- Ensure that arbitrary properties respect `important` configuration ([#13353](https://github.com/tailwindlabs/tailwindcss/pull/13353))
+- Change dark mode selector so `@apply` works correctly with pseudo elements ([#13379](https://github.com/tailwindlabs/tailwindcss/pull/13379))
+
+## [3.4.1] - 2024-01-05
+
+### Fixed
+
+- Don't remove keyframe stops when using important utilities ([#12639](https://github.com/tailwindlabs/tailwindcss/pull/12639))
+- Don't add spaces to gradients and grid track names when followed by `calc()` ([#12704](https://github.com/tailwindlabs/tailwindcss/pull/12704))
+- Restore old behavior for `class` dark mode strategy ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
+- Improve glob handling for folders with `(`, `)`, `[` or `]` in the file path ([#12715](https://github.com/tailwindlabs/tailwindcss/pull/12715))
+
+### Added
+
+- Add new `selector` and `variant` strategies for dark mode ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
+
+### Changed
+
+- Support `rtl` and `ltr` variants on same element as `dir` attribute ([#12717](https://github.com/tailwindlabs/tailwindcss/pull/12717))
+
+## [3.4.0] - 2023-12-19
+
+### Added
+
+- Add `svh`, `lvh`, and `dvh` values to default `height`/`min-height`/`max-height` theme ([#11317](https://github.com/tailwindlabs/tailwindcss/pull/11317))
+- Add `has-*` variants for `:has(...)` pseudo-class ([#11318](https://github.com/tailwindlabs/tailwindcss/pull/11318))
+- Add `text-wrap` utilities including `text-balance` and `text-pretty` ([#11320](https://github.com/tailwindlabs/tailwindcss/pull/11320), [#12031](https://github.com/tailwindlabs/tailwindcss/pull/12031))
+- Extend default `opacity` scale to include all steps of 5 ([#11832](https://github.com/tailwindlabs/tailwindcss/pull/11832))
+- Update Preflight `html` styles to include shadow DOM `:host` pseudo-class ([#11200](https://github.com/tailwindlabs/tailwindcss/pull/11200))
+- Increase default values for `grid-rows-*` utilities from 1–6 to 1–12 ([#12180](https://github.com/tailwindlabs/tailwindcss/pull/12180))
+- Add `size-*` utilities ([#12287](https://github.com/tailwindlabs/tailwindcss/pull/12287))
+- Add utilities for CSS subgrid ([#12298](https://github.com/tailwindlabs/tailwindcss/pull/12298))
+- Add spacing scale to `min-w-*`, `min-h-*`, and `max-w-*` utilities ([#12300](https://github.com/tailwindlabs/tailwindcss/pull/12300))
+- Add `forced-color-adjust` utilities ([#11931](https://github.com/tailwindlabs/tailwindcss/pull/11931))
+- Add `forced-colors` variant ([#11694](https://github.com/tailwindlabs/tailwindcss/pull/11694), [#12582](https://github.com/tailwindlabs/tailwindcss/pull/12582))
+- Add `appearance-auto` utility ([#12404](https://github.com/tailwindlabs/tailwindcss/pull/12404))
+- Add logical property values for `float` and `clear` utilities ([#12480](https://github.com/tailwindlabs/tailwindcss/pull/12480))
+- Add `*` variant for targeting direct children ([#12551](https://github.com/tailwindlabs/tailwindcss/pull/12551))
+
+### Changed
+
+- Simplify the `sans` font-family stack ([#11748](https://github.com/tailwindlabs/tailwindcss/pull/11748))
+- Disable the tap highlight overlay on iOS ([#12299](https://github.com/tailwindlabs/tailwindcss/pull/12299))
+- Improve relative precedence of `rtl`, `ltr`, `forced-colors`, and `dark` variants ([#12584](https://github.com/tailwindlabs/tailwindcss/pull/12584))
+
+## [3.3.7] - 2023-12-18
+
+### Fixed
+
+- Fix support for container query utilities with arbitrary values ([#12534](https://github.com/tailwindlabs/tailwindcss/pull/12534))
+- Fix custom config loading in Standalone CLI ([#12616](https://github.com/tailwindlabs/tailwindcss/pull/12616))
+
+## [3.3.6] - 2023-12-04
+
+### Fixed
+
+- Don’t add spaces to negative numbers following a comma ([#12324](https://github.com/tailwindlabs/tailwindcss/pull/12324))
+- Don't emit `@config` in CSS when watching via the CLI ([#12327](https://github.com/tailwindlabs/tailwindcss/pull/12327))
+- Improve types for `resolveConfig` ([#12272](https://github.com/tailwindlabs/tailwindcss/pull/12272))
+- Ensure configured `font-feature-settings` for `mono` are included in Preflight ([#12342](https://github.com/tailwindlabs/tailwindcss/pull/12342))
+- Improve candidate detection in minified JS arrays (without spaces) ([#12396](https://github.com/tailwindlabs/tailwindcss/pull/12396))
+- Don't crash when given applying a variant to a negated version of a simple utility ([#12514](https://github.com/tailwindlabs/tailwindcss/pull/12514))
+- Fix support for slashes in arbitrary modifiers ([#12515](https://github.com/tailwindlabs/tailwindcss/pull/12515))
+- Fix source maps of variant utilities that come from an `@layer` rule ([#12508](https://github.com/tailwindlabs/tailwindcss/pull/12508))
+- Fix loading of built-in plugins when using an ESM or TypeScript config with the Standalone CLI ([#12506](https://github.com/tailwindlabs/tailwindcss/pull/12506))
+
+## [3.3.5] - 2023-10-25
+
+### Fixed
+
+- Fix incorrect spaces around `-` in `calc()` expression ([#12283](https://github.com/tailwindlabs/tailwindcss/pull/12283))
+
+## [3.3.4] - 2023-10-24
+
+### Fixed
+
+- Improve normalisation of `calc()`-like functions ([#11686](https://github.com/tailwindlabs/tailwindcss/pull/11686))
+- Skip `calc()` normalisation in nested `theme()` calls ([#11705](https://github.com/tailwindlabs/tailwindcss/pull/11705))
+- Fix incorrectly generated CSS when using square brackets inside arbitrary properties ([#11709](https://github.com/tailwindlabs/tailwindcss/pull/11709))
+- Make `content` optional for presets in TypeScript types ([#11730](https://github.com/tailwindlabs/tailwindcss/pull/11730))
+- Handle variable colors that have variable fallback values ([#12049](https://github.com/tailwindlabs/tailwindcss/pull/12049))
+- Batch reading content files to prevent `too many open files` error ([#12079](https://github.com/tailwindlabs/tailwindcss/pull/12079))
+- Skip over classes inside `:not(…)` when nested in an at-rule ([#12105](https://github.com/tailwindlabs/tailwindcss/pull/12105))
+- Update types to work with `Node16` module resolution ([#12097](https://github.com/tailwindlabs/tailwindcss/pull/12097))
+- Don’t crash when important and parent selectors are equal in `@apply` ([#12112](https://github.com/tailwindlabs/tailwindcss/pull/12112))
+- Eliminate irrelevant rules when applying variants ([#12113](https://github.com/tailwindlabs/tailwindcss/pull/12113))
+- Improve RegEx parser, reduce possibilities as the key for arbitrary properties ([#12121](https://github.com/tailwindlabs/tailwindcss/pull/12121))
+- Fix sorting of utilities that share multiple candidates ([#12173](https://github.com/tailwindlabs/tailwindcss/pull/12173))
+- Ensure variants with arbitrary values and a modifier are correctly matched in the RegEx based parser ([#12179](https://github.com/tailwindlabs/tailwindcss/pull/12179))
+- Fix crash when watching renamed files on FreeBSD ([#12193](https://github.com/tailwindlabs/tailwindcss/pull/12193))
+- Allow plugins from a parent document to be used in an iframe ([#12208](https://github.com/tailwindlabs/tailwindcss/pull/12208))
+- Add types for `tailwindcss/nesting` ([#12269](https://github.com/tailwindlabs/tailwindcss/pull/12269))
+- Bump `jiti`, `fast-glob`, and `browserlist` dependencies ([#11550](https://github.com/tailwindlabs/tailwindcss/pull/11550))
+- Improve automatic `var` injection for properties that accept a `` ([#12236](https://github.com/tailwindlabs/tailwindcss/pull/12236))
+
+## [3.3.3] - 2023-07-13
+
+### Fixed
+
+- Fix issue where some pseudo-element variants generated the wrong selector ([#10943](https://github.com/tailwindlabs/tailwindcss/pull/10943), [#10962](https://github.com/tailwindlabs/tailwindcss/pull/10962), [#11111](https://github.com/tailwindlabs/tailwindcss/pull/11111))
+- Make font settings propagate into buttons, inputs, etc. ([#10940](https://github.com/tailwindlabs/tailwindcss/pull/10940))
+- Fix parsing of `theme()` inside `calc()` when there are no spaces around operators ([#11157](https://github.com/tailwindlabs/tailwindcss/pull/11157))
+- Ensure `repeating-conic-gradient` is detected as an image ([#11180](https://github.com/tailwindlabs/tailwindcss/pull/11180))
+- Move unknown pseudo-elements outside of `:is` by default ([#11345](https://github.com/tailwindlabs/tailwindcss/pull/11345))
+- Escape animation names when prefixes contain special characters ([#11470](https://github.com/tailwindlabs/tailwindcss/pull/11470))
+- Don't prefix arbitrary classes in `group` and `peer` variants ([#11454](https://github.com/tailwindlabs/tailwindcss/pull/11454))
+- Sort classes using position of first matching rule ([#11504](https://github.com/tailwindlabs/tailwindcss/pull/11504))
+- Allow variant to be an at-rule without a prelude ([#11589](https://github.com/tailwindlabs/tailwindcss/pull/11589))
+- Make PostCSS plugin async to improve performance ([#11548](https://github.com/tailwindlabs/tailwindcss/pull/11548))
+- Don’t error when a config file is missing ([f97759f](https://github.com/tailwindlabs/tailwindcss/commit/f97759f808d15ace66647b1405744fcf95a392e5))
+
+### Added
+
+- Add `aria-busy` utility ([#10966](https://github.com/tailwindlabs/tailwindcss/pull/10966))
+
+### Changed
+
+- Reset padding for `