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 `` elements in preflight ([#11069](https://github.com/tailwindlabs/tailwindcss/pull/11069)) + +## [3.3.2] - 2023-04-25 + +### Fixed + +- Don’t move unknown pseudo-elements to the end of selectors ([#10943](https://github.com/tailwindlabs/tailwindcss/pull/10943), [#10962](https://github.com/tailwindlabs/tailwindcss/pull/10962)) +- Inherit gradient stop positions when using variants ([#11002](https://github.com/tailwindlabs/tailwindcss/pull/11002)) +- Honor default `to` position of gradient when using implicit transparent colors ([#11002](https://github.com/tailwindlabs/tailwindcss/pull/11002)) +- Ensure `@tailwindcss/oxide` doesn't leak in the stable engine ([#10988](https://github.com/tailwindlabs/tailwindcss/pull/10988)) +- Ensure multiple `theme(spacing[5])` calls with bracket notation in arbitrary properties work ([#11039](https://github.com/tailwindlabs/tailwindcss/pull/11039)) +- Normalize arbitrary modifiers ([#11057](https://github.com/tailwindlabs/tailwindcss/pull/11057)) + +### Changed + +- Drop support for Node.js v12 ([#11089](https://github.com/tailwindlabs/tailwindcss/pull/11089)) + +## [3.3.1] - 2023-03-30 + +### Fixed + +- Fix edge case bug when loading a TypeScript config file with webpack ([#10898](https://github.com/tailwindlabs/tailwindcss/pull/10898)) +- Fix variant, `@apply`, and `important` selectors when using `:is()` or `:has()` with pseudo-elements ([#10903](https://github.com/tailwindlabs/tailwindcss/pull/10903)) +- Fix `safelist` config types ([#10901](https://github.com/tailwindlabs/tailwindcss/pull/10901)) +- Fix build errors caused by `@tailwindcss/line-clamp` warning ([#10915](https://github.com/tailwindlabs/tailwindcss/pull/10915), [#10919](https://github.com/tailwindlabs/tailwindcss/pull/10919)) +- Fix "process is not defined" error ([#10919](https://github.com/tailwindlabs/tailwindcss/pull/10919)) + +## [3.3.0] - 2023-03-27 + +### Added + +- Support ESM and TypeScript config files ([#10785](https://github.com/tailwindlabs/tailwindcss/pull/10785)) +- Extend default color palette with new 950 shades ([#10879](https://github.com/tailwindlabs/tailwindcss/pull/10879)) +- Add `line-height` modifier support to `font-size` utilities ([#9875](https://github.com/tailwindlabs/tailwindcss/pull/9875)) +- Add support for using variables as arbitrary values without `var(...)` ([#9880](https://github.com/tailwindlabs/tailwindcss/pull/9880), [#9962](https://github.com/tailwindlabs/tailwindcss/pull/9962)) +- Add logical properties support for inline direction ([#10166](https://github.com/tailwindlabs/tailwindcss/pull/10166)) +- Add `hyphens` utilities ([#10071](https://github.com/tailwindlabs/tailwindcss/pull/10071)) +- Add `from-{position}`, `via-{position}` and `to-{position}` utilities ([#10886](https://github.com/tailwindlabs/tailwindcss/pull/10886)) +- Add `list-style-image` utilities ([#10817](https://github.com/tailwindlabs/tailwindcss/pull/10817)) +- Add `caption-side` utilities ([#10470](https://github.com/tailwindlabs/tailwindcss/pull/10470)) +- Add `line-clamp` utilities from `@tailwindcss/line-clamp` to core ([#10768](https://github.com/tailwindlabs/tailwindcss/pull/10768), [#10876](https://github.com/tailwindlabs/tailwindcss/pull/10876), [#10862](https://github.com/tailwindlabs/tailwindcss/pull/10862)) +- Add `delay-0` and `duration-0` utilities ([#10294](https://github.com/tailwindlabs/tailwindcss/pull/10294)) +- Add `justify-normal` and `justify-stretch` utilities ([#10560](https://github.com/tailwindlabs/tailwindcss/pull/10560)) +- Add `content-normal` and `content-stretch` utilities ([#10645](https://github.com/tailwindlabs/tailwindcss/pull/10645)) +- Add `whitespace-break-spaces` utility ([#10729](https://github.com/tailwindlabs/tailwindcss/pull/10729)) +- Add support for configuring default `font-variation-settings` for a `font-family` ([#10034](https://github.com/tailwindlabs/tailwindcss/pull/10034), [#10515](https://github.com/tailwindlabs/tailwindcss/pull/10515)) + +### Fixed + +- Disallow using multiple selectors in arbitrary variants ([#10655](https://github.com/tailwindlabs/tailwindcss/pull/10655)) +- Sort class lists deterministically for Prettier plugin ([#10672](https://github.com/tailwindlabs/tailwindcss/pull/10672)) +- Ensure CLI builds have a non-zero exit code on failure ([#10703](https://github.com/tailwindlabs/tailwindcss/pull/10703)) +- Ensure module dependencies for value `null`, is an empty `Set` ([#10877](https://github.com/tailwindlabs/tailwindcss/pull/10877)) +- Fix format assumption when resolving module dependencies ([#10878](https://github.com/tailwindlabs/tailwindcss/pull/10878)) + +### Changed + +- Mark `rtl` and `ltr` variants as stable and remove warnings ([#10764](https://github.com/tailwindlabs/tailwindcss/pull/10764)) +- Use `inset` instead of `top`, `right`, `bottom`, and `left` properties ([#10765](https://github.com/tailwindlabs/tailwindcss/pull/10765)) +- Make `dark` and `rtl`/`ltr` variants insensitive to DOM order ([#10766](https://github.com/tailwindlabs/tailwindcss/pull/10766)) +- Use `:is` to make important selector option insensitive to DOM order ([#10835](https://github.com/tailwindlabs/tailwindcss/pull/10835)) + +## [3.2.7] - 2023-02-16 + +### Fixed + +- Fix use of `:where(.btn)` when matching `!btn` ([#10601](https://github.com/tailwindlabs/tailwindcss/pull/10601)) +- Revert including `outline-color` in `transition` and `transition-colors` by default ([#10604](https://github.com/tailwindlabs/tailwindcss/pull/10604)) + +## [3.2.6] - 2023-02-08 + +### Fixed + +- Fix installation failing with yarn and pnpm by dropping `oxide-api-shim` ([add1636](https://github.com/tailwindlabs/tailwindcss/commit/add16364b4b1100e1af23ad1ca6900a0b53cbba0)) + +## [3.2.5] - 2023-02-08 + +### Added + +- Add standalone CLI build for 64-bit Windows on ARM (`node16-win-arm64`) ([#10001](https://github.com/tailwindlabs/tailwindcss/pull/10001)) + +### Fixed + +- Cleanup unused `variantOrder` ([#9829](https://github.com/tailwindlabs/tailwindcss/pull/9829)) +- Fix `foo-[abc]/[def]` not being handled correctly ([#9866](https://github.com/tailwindlabs/tailwindcss/pull/9866)) +- Add container queries plugin to standalone CLI ([#9865](https://github.com/tailwindlabs/tailwindcss/pull/9865)) +- Support renaming of output files by PostCSS plugins in CLI ([#9944](https://github.com/tailwindlabs/tailwindcss/pull/9944)) +- Improve return value of `resolveConfig`, unwrap `ResolvableTo` ([#9972](https://github.com/tailwindlabs/tailwindcss/pull/9972)) +- Clip unbalanced brackets in arbitrary values ([#9973](https://github.com/tailwindlabs/tailwindcss/pull/9973)) +- Don’t reorder webkit scrollbar pseudo elements ([#9991](https://github.com/tailwindlabs/tailwindcss/pull/9991)) +- Deterministic sorting of arbitrary variants ([#10016](https://github.com/tailwindlabs/tailwindcss/pull/10016)) +- Add `data` key to theme types ([#10023](https://github.com/tailwindlabs/tailwindcss/pull/10023)) +- Prevent invalid arbitrary variant selectors from failing the build ([#10059](https://github.com/tailwindlabs/tailwindcss/pull/10059)) +- Properly handle subtraction followed by a variable ([#10074](https://github.com/tailwindlabs/tailwindcss/pull/10074)) +- Fix missing `string[]` in the `theme.dropShadow` types ([#10072](https://github.com/tailwindlabs/tailwindcss/pull/10072)) +- Update list of length units ([#10100](https://github.com/tailwindlabs/tailwindcss/pull/10100)) +- Fix not matching arbitrary properties when closely followed by square brackets ([#10212](https://github.com/tailwindlabs/tailwindcss/pull/10212)) +- Allow direct nesting in `root` or `@layer` nodes ([#10229](https://github.com/tailwindlabs/tailwindcss/pull/10229)) +- Don't prefix classes in arbitrary variants ([#10214](https://github.com/tailwindlabs/tailwindcss/pull/10214)) +- Fix perf regression when checking for changed content ([#10234](https://github.com/tailwindlabs/tailwindcss/pull/10234)) +- Fix missing `blocklist` member in the `Config` type ([#10239](https://github.com/tailwindlabs/tailwindcss/pull/10239)) +- Escape group names in selectors ([#10276](https://github.com/tailwindlabs/tailwindcss/pull/10276)) +- Consider earlier variants before sorting functions ([#10288](https://github.com/tailwindlabs/tailwindcss/pull/10288)) +- Allow variants with slashes ([#10336](https://github.com/tailwindlabs/tailwindcss/pull/10336)) +- Ensure generated CSS is always sorted in the same order for a given set of templates ([#10382](https://github.com/tailwindlabs/tailwindcss/pull/10382)) +- Handle variants when the same class appears multiple times in a selector ([#10397](https://github.com/tailwindlabs/tailwindcss/pull/10397)) +- Handle group/peer variants with quoted strings ([#10400](https://github.com/tailwindlabs/tailwindcss/pull/10400)) +- Parse alpha value from rgba/hsla colors when using variables ([#10429](https://github.com/tailwindlabs/tailwindcss/pull/10429)) +- Sort by `layer` inside `variants` layer ([#10505](https://github.com/tailwindlabs/tailwindcss/pull/10505)) +- Add `--watch=always` option to prevent exit when stdin closes ([#9966](https://github.com/tailwindlabs/tailwindcss/pull/9966)) + +### Changed + +- Alphabetize `theme` keys in default config ([#9953](https://github.com/tailwindlabs/tailwindcss/pull/9953)) +- Update esbuild to v17 ([#10368](https://github.com/tailwindlabs/tailwindcss/pull/10368)) +- Include `outline-color` in `transition` and `transition-colors` utilities ([#10385](https://github.com/tailwindlabs/tailwindcss/pull/10385)) + +## [3.2.4] - 2022-11-11 + +### Added + +- Add `blocklist` option to prevent generating unwanted CSS ([#9812](https://github.com/tailwindlabs/tailwindcss/pull/9812)) + +### Fixed + +- Fix watching of files on Linux when renames are involved ([#9796](https://github.com/tailwindlabs/tailwindcss/pull/9796)) +- Make sure errors are always displayed when watching for changes ([#9810](https://github.com/tailwindlabs/tailwindcss/pull/9810)) + +## [3.2.3] - 2022-11-09 + +### Fixed + +- Fixed use of `raw` content in the CLI ([#9773](https://github.com/tailwindlabs/tailwindcss/pull/9773)) +- Pick up changes from files that are both context and content deps ([#9787](https://github.com/tailwindlabs/tailwindcss/pull/9787)) +- Sort pseudo-elements ONLY after classes when using variants and `@apply` ([#9765](https://github.com/tailwindlabs/tailwindcss/pull/9765)) +- Support important utilities in the safelist (pattern must include a `!`) ([#9791](https://github.com/tailwindlabs/tailwindcss/pull/9791)) + +## [3.2.2] - 2022-11-04 + +### Fixed + +- Escape special characters in resolved content base paths ([#9650](https://github.com/tailwindlabs/tailwindcss/pull/9650)) +- Don't reuse container for array returning variant functions ([#9644](https://github.com/tailwindlabs/tailwindcss/pull/9644)) +- Exclude non-relevant selectors when generating rules with the important modifier ([#9677](https://github.com/tailwindlabs/tailwindcss/issues/9677)) +- Fix merging of arrays during config resolution ([#9706](https://github.com/tailwindlabs/tailwindcss/issues/9706)) +- Ensure configured `font-feature-settings` are included in Preflight ([#9707](https://github.com/tailwindlabs/tailwindcss/pull/9707)) +- Fix fractional values not being parsed properly inside arbitrary properties ([#9705](https://github.com/tailwindlabs/tailwindcss/pull/9705)) +- Fix incorrect selectors when using `@apply` in selectors with combinators and pseudos ([#9722](https://github.com/tailwindlabs/tailwindcss/pull/9722)) +- Fix cannot read properties of undefined (reading 'modifier') ([#9656](https://github.com/tailwindlabs/tailwindcss/pull/9656), [aa979d6](https://github.com/tailwindlabs/tailwindcss/commit/aa979d645f8bf4108c5fc938d7c0ba085b654c31)) + +## [3.2.1] - 2022-10-21 + +### Fixed + +- Fix missing `supports` in types ([#9616](https://github.com/tailwindlabs/tailwindcss/pull/9616)) +- Fix missing PostCSS dependencies in the CLI ([#9617](https://github.com/tailwindlabs/tailwindcss/pull/9617)) +- Ensure `micromatch` is a proper CLI dependency ([#9620](https://github.com/tailwindlabs/tailwindcss/pull/9620)) +- Ensure modifier values exist when using a `modifiers` object for `matchVariant` ([ba6551d](https://github.com/tailwindlabs/tailwindcss/commit/ba6551db0f2726461371b4f3c6cd4c7090888504)) + +## [3.2.0] - 2022-10-19 + +### Added + +- Add new `@config` directive ([#9405](https://github.com/tailwindlabs/tailwindcss/pull/9405)) +- Add new `relative: true` option to resolve content paths relative to the config file ([#9396](https://github.com/tailwindlabs/tailwindcss/pull/9396)) +- Add new `supports-*` variant ([#9453](https://github.com/tailwindlabs/tailwindcss/pull/9453)) +- Add new `min-*` and `max-*` variants ([#9558](https://github.com/tailwindlabs/tailwindcss/pull/9558)) +- Add new `aria-*` variants ([#9557](https://github.com/tailwindlabs/tailwindcss/pull/9557), [#9588](https://github.com/tailwindlabs/tailwindcss/pull/9588)) +- Add new `data-*` variants ([#9559](https://github.com/tailwindlabs/tailwindcss/pull/9559), [#9588](https://github.com/tailwindlabs/tailwindcss/pull/9588)) +- Add new `break-keep` utility for `word-break: keep-all` ([#9393](https://github.com/tailwindlabs/tailwindcss/pull/9393)) +- Add new `collapse` utility for `visibility: collapse` ([#9181](https://github.com/tailwindlabs/tailwindcss/pull/9181)) +- Add new `fill-none` utility for `fill: none` ([#9403](https://github.com/tailwindlabs/tailwindcss/pull/9403)) +- Add new `stroke-none` utility for `stroke: none` ([#9403](https://github.com/tailwindlabs/tailwindcss/pull/9403)) +- Add new `place-content-baseline` utility for `place-content: baseline` ([#9498](https://github.com/tailwindlabs/tailwindcss/pull/9498)) +- Add new `place-items-baseline` utility for `place-items: baseline` ([#9507](https://github.com/tailwindlabs/tailwindcss/pull/9507)) +- Add new `content-baseline` utility for `align-content: baseline` ([#9507](https://github.com/tailwindlabs/tailwindcss/pull/9507)) +- Add support for configuring default `font-feature-settings` for a font family ([#9039](https://github.com/tailwindlabs/tailwindcss/pull/9039)) +- Add standalone CLI build for 32-bit Linux on ARM (`node16-linux-armv7`) ([#9084](https://github.com/tailwindlabs/tailwindcss/pull/9084)) +- Add future flag to disable color opacity utility plugins ([#9088](https://github.com/tailwindlabs/tailwindcss/pull/9088)) +- Add negative value support for `outline-offset` ([#9136](https://github.com/tailwindlabs/tailwindcss/pull/9136)) +- Add support for modifiers to `matchUtilities` ([#9541](https://github.com/tailwindlabs/tailwindcss/pull/9541)) +- Allow negating utilities using `min`/`max`/`clamp` ([#9237](https://github.com/tailwindlabs/tailwindcss/pull/9237)) +- Implement fallback plugins when there is ambiguity between plugins when using arbitrary values ([#9376](https://github.com/tailwindlabs/tailwindcss/pull/9376)) +- Support `sort` function in `matchVariant` ([#9423](https://github.com/tailwindlabs/tailwindcss/pull/9423)) +- Upgrade to `postcss-nested` v6.0 ([#9546](https://github.com/tailwindlabs/tailwindcss/pull/9546)) + +### Fixed + +- Use absolute paths when resolving changed files for resilience against working directory changes ([#9032](https://github.com/tailwindlabs/tailwindcss/pull/9032)) +- Fix ring color utility generation when using `respectDefaultRingColorOpacity` ([#9070](https://github.com/tailwindlabs/tailwindcss/pull/9070)) +- Sort tags before classes when `@apply`-ing a selector with joined classes ([#9107](https://github.com/tailwindlabs/tailwindcss/pull/9107)) +- Remove invalid `outline-hidden` utility ([#9147](https://github.com/tailwindlabs/tailwindcss/pull/9147)) +- Honor the `hidden` attribute on elements in preflight ([#9174](https://github.com/tailwindlabs/tailwindcss/pull/9174)) +- Don't stop watching atomically renamed files ([#9173](https://github.com/tailwindlabs/tailwindcss/pull/9173), [#9215](https://github.com/tailwindlabs/tailwindcss/pull/9215)) +- Fix duplicate utilities issue causing memory leaks ([#9208](https://github.com/tailwindlabs/tailwindcss/pull/9208)) +- Fix `fontFamily` config TypeScript types ([#9214](https://github.com/tailwindlabs/tailwindcss/pull/9214)) +- Handle variants on complex selector utilities ([#9262](https://github.com/tailwindlabs/tailwindcss/pull/9262)) +- Fix shared config mutation issue ([#9294](https://github.com/tailwindlabs/tailwindcss/pull/9294)) +- Fix ordering of parallel variants ([#9282](https://github.com/tailwindlabs/tailwindcss/pull/9282)) +- Handle variants in utility selectors using `:where()` and `:has()` ([#9309](https://github.com/tailwindlabs/tailwindcss/pull/9309)) +- Improve data type analysis for arbitrary values ([#9320](https://github.com/tailwindlabs/tailwindcss/pull/9320)) +- Don't emit generated utilities with invalid uses of theme functions ([#9319](https://github.com/tailwindlabs/tailwindcss/pull/9319)) +- Revert change that only listened for stdin close on TTYs ([#9331](https://github.com/tailwindlabs/tailwindcss/pull/9331)) +- Ignore unset values (like `null` or `undefined`) when resolving the classList for intellisense ([#9385](https://github.com/tailwindlabs/tailwindcss/pull/9385)) +- Improve type checking for formal syntax ([#9349](https://github.com/tailwindlabs/tailwindcss/pull/9349), [#9448](https://github.com/tailwindlabs/tailwindcss/pull/9448)) +- Fix incorrect required `content` key in custom plugin configs ([#9502](https://github.com/tailwindlabs/tailwindcss/pull/9502), [#9545](https://github.com/tailwindlabs/tailwindcss/pull/9545)) +- Fix content path detection on Windows ([#9569](https://github.com/tailwindlabs/tailwindcss/pull/9569)) +- Ensure `--content` is used in the CLI when passed ([#9587](https://github.com/tailwindlabs/tailwindcss/pull/9587)) + +## [3.1.8] - 2022-08-05 + +### Fixed + +- Don’t prefix classes within reused arbitrary variants ([#8992](https://github.com/tailwindlabs/tailwindcss/pull/8992)) +- Fix usage of alpha values inside single-named colors that are functions ([#9008](https://github.com/tailwindlabs/tailwindcss/pull/9008)) +- Fix `@apply` of user utilities when negative and non-negative versions both exist ([#9027](https://github.com/tailwindlabs/tailwindcss/pull/9027)) + +## [3.1.7] - 2022-07-29 + +### Fixed + +- Don't rewrite source maps for `@layer` rules ([#8971](https://github.com/tailwindlabs/tailwindcss/pull/8971)) + +### Added + +- Added types for `resolveConfig` ([#8924](https://github.com/tailwindlabs/tailwindcss/pull/8924)) + +## [3.1.6] - 2022-07-11 + +### Fixed + +- Fix usage on Node 12.x ([b4e637e](https://github.com/tailwindlabs/tailwindcss/commit/b4e637e2e096a9d6f2210efba9541f6fd4f28e56)) +- Handle theme keys with slashes when using `theme()` in CSS ([#8831](https://github.com/tailwindlabs/tailwindcss/pull/8831)) + +## [3.1.5] - 2022-07-07 + +### Added + +- Support configuring a default `font-weight` for each font size utility ([#8763](https://github.com/tailwindlabs/tailwindcss/pull/8763)) +- Add support for alpha values in safe list ([#8774](https://github.com/tailwindlabs/tailwindcss/pull/8774)) + +### Fixed + +- Improve types to support fallback values in the CSS-in-JS syntax used in plugin APIs ([#8762](https://github.com/tailwindlabs/tailwindcss/pull/8762)) +- Support including `tailwindcss` and `autoprefixer` in `postcss.config.js` in standalone CLI ([#8769](https://github.com/tailwindlabs/tailwindcss/pull/8769)) +- Fix using special-characters as prefixes ([#8772](https://github.com/tailwindlabs/tailwindcss/pull/8772)) +- Don’t prefix classes used within arbitrary variants ([#8773](https://github.com/tailwindlabs/tailwindcss/pull/8773)) +- Add more explicit types for the default theme ([#8780](https://github.com/tailwindlabs/tailwindcss/pull/8780)) + +## [3.1.4] - 2022-06-21 + +### Fixed + +- Provide default to `` when using `theme()` ([#8652](https://github.com/tailwindlabs/tailwindcss/pull/8652)) +- Detect arbitrary variants with quotes ([#8687](https://github.com/tailwindlabs/tailwindcss/pull/8687)) +- Don’t add spaces around raw `/` that are preceded by numbers ([#8688](https://github.com/tailwindlabs/tailwindcss/pull/8688)) + +## [3.1.3] - 2022-06-14 + +### Fixed + +- Fix extraction of multi-word utilities with arbitrary values and quotes ([#8604](https://github.com/tailwindlabs/tailwindcss/pull/8604)) +- Fix casing of import of `corePluginList` type definition ([#8587](https://github.com/tailwindlabs/tailwindcss/pull/8587)) +- Ignore PostCSS nodes returned by `addVariant` ([#8608](https://github.com/tailwindlabs/tailwindcss/pull/8608)) +- Fix missing spaces around arithmetic operators ([#8615](https://github.com/tailwindlabs/tailwindcss/pull/8615)) +- Detect alpha value in CSS `theme()` function when using quotes ([#8625](https://github.com/tailwindlabs/tailwindcss/pull/8625)) +- Fix "Maximum call stack size exceeded" bug ([#8636](https://github.com/tailwindlabs/tailwindcss/pull/8636)) +- Allow functions returning parallel variants to mutate the container ([#8622](https://github.com/tailwindlabs/tailwindcss/pull/8622)) +- Remove text opacity CSS variables from `::marker` ([#8622](https://github.com/tailwindlabs/tailwindcss/pull/8622)) + +## [3.1.2] - 2022-06-10 + +### Fixed + +- Ensure `\` is a valid arbitrary variant token ([#8576](https://github.com/tailwindlabs/tailwindcss/pull/8576)) +- Enable `postcss-import` in the CLI by default in watch mode ([#8574](https://github.com/tailwindlabs/tailwindcss/pull/8574), [#8580](https://github.com/tailwindlabs/tailwindcss/pull/8580)) + +## [3.1.1] - 2022-06-09 + +### Fixed + +- Fix candidate extractor regression ([#8558](https://github.com/tailwindlabs/tailwindcss/pull/8558)) +- Split `::backdrop` into separate defaults group ([#8567](https://github.com/tailwindlabs/tailwindcss/pull/8567)) +- Fix postcss plugin type ([#8564](https://github.com/tailwindlabs/tailwindcss/pull/8564)) +- Fix class detection in markdown code fences and slim templates ([#8569](https://github.com/tailwindlabs/tailwindcss/pull/8569)) + +## [3.1.0] - 2022-06-08 + +### Fixed + +- Types: allow for arbitrary theme values (for 3rd party plugins) ([#7926](https://github.com/tailwindlabs/tailwindcss/pull/7926)) +- Don’t split vars with numbers in them inside arbitrary values ([#8091](https://github.com/tailwindlabs/tailwindcss/pull/8091)) +- Require matching prefix when detecting negatives ([#8121](https://github.com/tailwindlabs/tailwindcss/pull/8121)) +- Handle duplicate At Rules without children ([#8122](https://github.com/tailwindlabs/tailwindcss/pull/8122)) +- Allow arbitrary values with commas in `@apply` ([#8125](https://github.com/tailwindlabs/tailwindcss/pull/8125)) +- Fix intellisense for plugins with multiple `@apply` rules ([#8213](https://github.com/tailwindlabs/tailwindcss/pull/8213)) +- Improve type detection for arbitrary color values ([#8201](https://github.com/tailwindlabs/tailwindcss/pull/8201)) +- Support PostCSS config options in config file in CLI ([#8226](https://github.com/tailwindlabs/tailwindcss/pull/8226)) +- Remove default `[hidden]` style in preflight ([#8248](https://github.com/tailwindlabs/tailwindcss/pull/8248)) +- Only check selectors containing base apply candidates for circular dependencies ([#8222](https://github.com/tailwindlabs/tailwindcss/pull/8222)) +- Rewrite default class extractor ([#8204](https://github.com/tailwindlabs/tailwindcss/pull/8204)) +- Move `important` selector to the front when `@apply`-ing selector-modifying variants in custom utilities ([#8313](https://github.com/tailwindlabs/tailwindcss/pull/8313)) +- Error when registering an invalid custom variant ([#8345](https://github.com/tailwindlabs/tailwindcss/pull/8345)) +- Create tailwind.config.cjs file in ESM package when running init ([#8363](https://github.com/tailwindlabs/tailwindcss/pull/8363)) +- Fix `matchVariant` that use at-rules and placeholders ([#8392](https://github.com/tailwindlabs/tailwindcss/pull/8392)) +- Improve types of the `tailwindcss/plugin` ([#8400](https://github.com/tailwindlabs/tailwindcss/pull/8400)) +- Allow returning parallel variants from `addVariant` or `matchVariant` callback functions ([#8455](https://github.com/tailwindlabs/tailwindcss/pull/8455)) +- Try using local `postcss` installation first in the CLI ([#8270](https://github.com/tailwindlabs/tailwindcss/pull/8270)) +- Allow default ring color to be a function ([#7587](https://github.com/tailwindlabs/tailwindcss/pull/7587)) +- Don't inherit `to` value from parent gradients ([#8489](https://github.com/tailwindlabs/tailwindcss/pull/8489)) +- Remove process dependency from log functions ([#8530](https://github.com/tailwindlabs/tailwindcss/pull/8530)) +- Ensure we can use `@import 'tailwindcss/...'` without node_modules ([#8537](https://github.com/tailwindlabs/tailwindcss/pull/8537)) + +### Changed + +- Only apply hover styles when supported (future) ([#8394](https://github.com/tailwindlabs/tailwindcss/pull/8394)) +- Respect default ring color opacity (future) ([#8448](https://github.com/tailwindlabs/tailwindcss/pull/8448), [3f4005e](https://github.com/tailwindlabs/tailwindcss/commit/3f4005e833445f7549219eb5ae89728cbb3a2630)) + +### Added + +- Support PostCSS `Document` nodes ([#7291](https://github.com/tailwindlabs/tailwindcss/pull/7291)) +- Add `text-start` and `text-end` utilities ([#6656](https://github.com/tailwindlabs/tailwindcss/pull/6656)) +- Support customizing class name when using `darkMode: 'class'` ([#5800](https://github.com/tailwindlabs/tailwindcss/pull/5800)) +- Add `--poll` option to the CLI ([#7725](https://github.com/tailwindlabs/tailwindcss/pull/7725)) +- Add new `border-spacing` utilities ([#7102](https://github.com/tailwindlabs/tailwindcss/pull/7102)) +- Add `enabled` variant ([#7905](https://github.com/tailwindlabs/tailwindcss/pull/7905)) +- Add TypeScript types for the `tailwind.config.js` file ([#7891](https://github.com/tailwindlabs/tailwindcss/pull/7891)) +- Add `backdrop` variant ([#7924](https://github.com/tailwindlabs/tailwindcss/pull/7924), [#8526](https://github.com/tailwindlabs/tailwindcss/pull/8526)) +- Add `grid-flow-dense` utility ([#8193](https://github.com/tailwindlabs/tailwindcss/pull/8193)) +- Add `mix-blend-plus-lighter` utility ([#8288](https://github.com/tailwindlabs/tailwindcss/pull/8288)) +- Add arbitrary variants ([#8299](https://github.com/tailwindlabs/tailwindcss/pull/8299)) +- Add experimental `matchVariant` API ([#8310](https://github.com/tailwindlabs/tailwindcss/pull/8310), [34fd0fb8](https://github.com/tailwindlabs/tailwindcss/commit/34fd0fb82aa574cddc5c7aa3ad7d1af5e3735e5d)) +- Add `prefers-contrast` media query variants ([#8410](https://github.com/tailwindlabs/tailwindcss/pull/8410)) +- Add opacity support when referencing colors with `theme` function ([#8416](https://github.com/tailwindlabs/tailwindcss/pull/8416)) +- Add `postcss-import` support to the CLI ([#8437](https://github.com/tailwindlabs/tailwindcss/pull/8437)) +- Add `optional` variant ([#8486](https://github.com/tailwindlabs/tailwindcss/pull/8486)) +- Add `` placeholder support for custom colors ([#8501](https://github.com/tailwindlabs/tailwindcss/pull/8501)) + +## [3.0.24] - 2022-04-12 + +### Fixed + +- Prevent nesting plugin from breaking other plugins ([#7563](https://github.com/tailwindlabs/tailwindcss/pull/7563)) +- Recursively collapse adjacent rules ([#7565](https://github.com/tailwindlabs/tailwindcss/pull/7565)) +- Preserve source maps for generated CSS ([#7588](https://github.com/tailwindlabs/tailwindcss/pull/7588)) +- Split box shadows on top-level commas only ([#7479](https://github.com/tailwindlabs/tailwindcss/pull/7479)) +- Use local user CSS cache for `@apply` ([#7524](https://github.com/tailwindlabs/tailwindcss/pull/7524)) +- Invalidate context when main CSS changes ([#7626](https://github.com/tailwindlabs/tailwindcss/pull/7626)) +- Only add `!` to selector class matching template candidate when using important modifier with multi-class selectors ([#7664](https://github.com/tailwindlabs/tailwindcss/pull/7664)) +- Correctly parse and prefix animation names with dots ([#7163](https://github.com/tailwindlabs/tailwindcss/pull/7163)) +- Fix extraction from template literal/function with array ([#7481](https://github.com/tailwindlabs/tailwindcss/pull/7481)) +- Don't output unparsable arbitrary values ([#7789](https://github.com/tailwindlabs/tailwindcss/pull/7789)) +- Fix generation of `div:not(.foo)` if `.foo` is never defined ([#7815](https://github.com/tailwindlabs/tailwindcss/pull/7815)) +- Allow for custom properties in `rgb`, `rgba`, `hsl` and `hsla` colors ([#7933](https://github.com/tailwindlabs/tailwindcss/pull/7933)) +- Remove autoprefixer as explicit peer-dependency to avoid invalid warnings in situations where it isn't actually needed ([#7949](https://github.com/tailwindlabs/tailwindcss/pull/7949)) +- Ensure the `percentage` data type is validated correctly ([#8015](https://github.com/tailwindlabs/tailwindcss/pull/8015)) +- Make sure `font-weight` is inherited by form controls in all browsers ([#8078](https://github.com/tailwindlabs/tailwindcss/pull/8078)) + +### Changed + +- Replace `chalk` with `picocolors` ([#6039](https://github.com/tailwindlabs/tailwindcss/pull/6039)) +- Replace `cosmiconfig` with `lilconfig` ([#6039](https://github.com/tailwindlabs/tailwindcss/pull/6038)) +- Update `cssnano` to avoid removing empty variables when minifying ([#7818](https://github.com/tailwindlabs/tailwindcss/pull/7818)) + +## [3.0.23] - 2022-02-16 + +### Fixed + +- Remove opacity variables from `:visited` pseudo class ([#7458](https://github.com/tailwindlabs/tailwindcss/pull/7458)) +- Support arbitrary values + calc + theme with quotes ([#7462](https://github.com/tailwindlabs/tailwindcss/pull/7462)) +- Don't duplicate layer output when scanning content with variants + wildcards ([#7478](https://github.com/tailwindlabs/tailwindcss/pull/7478)) +- Implement `getClassOrder` instead of `sortClassList` ([#7459](https://github.com/tailwindlabs/tailwindcss/pull/7459)) + +## [3.0.22] - 2022-02-11 + +### Fixed + +- Temporarily move `postcss` to dependencies ([#7424](https://github.com/tailwindlabs/tailwindcss/pull/7424)) + +## [3.0.21] - 2022-02-10 + +### Fixed + +- Move prettier plugin to dev dependencies ([#7418](https://github.com/tailwindlabs/tailwindcss/pull/7418)) + +## [3.0.20] - 2022-02-10 + +### Added + +- Expose `context.sortClassList(classes)` ([#7412](https://github.com/tailwindlabs/tailwindcss/pull/7412)) + +## [3.0.19] - 2022-02-07 + +### Fixed + +- Fix preflight border color fallback ([#7288](https://github.com/tailwindlabs/tailwindcss/pull/7288)) +- Correctly parse shadow lengths without a leading zero ([#7289](https://github.com/tailwindlabs/tailwindcss/pull/7289)) +- Don't crash when scanning extremely long class candidates ([#7331](https://github.com/tailwindlabs/tailwindcss/pull/7331)) +- Use less hacky fix for URLs detected as custom properties ([#7275](https://github.com/tailwindlabs/tailwindcss/pull/7275)) +- Correctly generate negative utilities when dash is before the prefix ([#7295](https://github.com/tailwindlabs/tailwindcss/pull/7295)) +- Detect prefixed negative utilities in the safelist ([#7295](https://github.com/tailwindlabs/tailwindcss/pull/7295)) + +## [3.0.18] - 2022-01-28 + +### Fixed + +- Fix `@apply` order regression (in `addComponents`, `addUtilities`, ...) ([#7232](https://github.com/tailwindlabs/tailwindcss/pull/7232)) +- Quick fix for incorrect arbitrary properties when using URLs ([#7252](https://github.com/tailwindlabs/tailwindcss/pull/7252)) + +## [3.0.17] - 2022-01-26 + +### Fixed + +- Remove false positive warning in CLI when using the `--content` option ([#7220](https://github.com/tailwindlabs/tailwindcss/pull/7220)) + +## [3.0.16] - 2022-01-24 + +### Fixed + +- Ensure to transpile the PostCSS Nesting plugin (tailwindcss/nesting) ([#7080](https://github.com/tailwindlabs/tailwindcss/pull/7080)) +- Improve various warnings ([#7118](https://github.com/tailwindlabs/tailwindcss/pull/7118)) +- Fix grammatical mistake ([cca5a38](https://github.com/tailwindlabs/tailwindcss/commit/cca5a3804e1d3ee0214491921e1aec35bf62a813)) + +## [3.0.15] - 2022-01-15 + +### Fixed + +- Temporarily remove optional chaining in nesting plugin ([#7077](https://github.com/tailwindlabs/tailwindcss/pull/7077)) + +## [3.0.14] - 2022-01-14 + +### Added + +- Show warnings for invalid content config ([#7065](https://github.com/tailwindlabs/tailwindcss/pull/7065)) + +### Fixed + +- Only emit utility/component variants when those layers exist ([#7066](https://github.com/tailwindlabs/tailwindcss/pull/7066)) +- Ensure nesting plugins can receive options ([#7016](https://github.com/tailwindlabs/tailwindcss/pull/7016)) + +## [3.0.13] - 2022-01-11 + +### Fixed + +- Fix consecutive builds with at apply producing different CSS ([#6999](https://github.com/tailwindlabs/tailwindcss/pull/6999)) + +## [3.0.12] - 2022-01-07 + +### Fixed + +- Allow use of falsy values in theme config ([#6917](https://github.com/tailwindlabs/tailwindcss/pull/6917)) +- Ensure we can apply classes that are grouped with non-class selectors ([#6922](https://github.com/tailwindlabs/tailwindcss/pull/6922)) +- Improve standalone CLI compatibility on Linux by switching to the `linuxstatic` build target ([#6914](https://github.com/tailwindlabs/tailwindcss/pull/6914)) +- Ensure `@apply` works consistently with or without `@layer` ([#6938](https://github.com/tailwindlabs/tailwindcss/pull/6938)) +- Only emit defaults when using base layer ([#6926](https://github.com/tailwindlabs/tailwindcss/pull/6926)) +- Emit plugin defaults regardless of usage ([#6926](https://github.com/tailwindlabs/tailwindcss/pull/6926)) +- Move default border color back to preflight ([#6926](https://github.com/tailwindlabs/tailwindcss/pull/6926)) +- Change `experimental.optimizeUniversalDefaults` to only work with `@tailwind base` ([#6926](https://github.com/tailwindlabs/tailwindcss/pull/6926)) + +## [3.0.11] - 2022-01-05 + +### Fixed + +- Preserve casing of CSS variables added by plugins ([#6888](https://github.com/tailwindlabs/tailwindcss/pull/6888)) +- Ignore content paths that are passed in but don't actually exist ([#6901](https://github.com/tailwindlabs/tailwindcss/pull/6901)) +- Revert change that applies Tailwind's defaults in isolated environments like CSS modules ([9fdc391](https://github.com/tailwindlabs/tailwindcss/commit/9fdc391d4ff93e7e350f5ce439060176b1f0162f)) + +## [3.0.10] - 2022-01-04 + +### Fixed + +- Fix `@apply` in files without `@tailwind` directives ([#6580](https://github.com/tailwindlabs/tailwindcss/pull/6580), [#6875](https://github.com/tailwindlabs/tailwindcss/pull/6875)) +- CLI: avoid unnecessary writes to output files ([#6550](https://github.com/tailwindlabs/tailwindcss/pull/6550)) + +### Added + +- Allow piping data into the CLI ([#6876](https://github.com/tailwindlabs/tailwindcss/pull/6876)) + +## [3.0.9] - 2022-01-03 + +### Fixed + +- Improve `DEBUG` flag ([#6797](https://github.com/tailwindlabs/tailwindcss/pull/6797), [#6804](https://github.com/tailwindlabs/tailwindcss/pull/6804)) +- Ensure we can use `<` and `>` characters in modifiers ([#6851](https://github.com/tailwindlabs/tailwindcss/pull/6851)) +- Validate `theme()` works in arbitrary values ([#6852](https://github.com/tailwindlabs/tailwindcss/pull/6852)) +- Properly detect `theme()` value usage in arbitrary properties ([#6854](https://github.com/tailwindlabs/tailwindcss/pull/6854)) +- Improve collapsing of duplicate declarations ([#6856](https://github.com/tailwindlabs/tailwindcss/pull/6856)) +- Remove support for `TAILWIND_MODE=watch` ([#6858](https://github.com/tailwindlabs/tailwindcss/pull/6858)) + +## [3.0.8] - 2021-12-28 + +### Fixed + +- Reduce specificity of `abbr` rule in preflight ([#6671](https://github.com/tailwindlabs/tailwindcss/pull/6671)) +- Support HSL with hue units in arbitrary values ([#6726](https://github.com/tailwindlabs/tailwindcss/pull/6726)) +- Add `node16-linux-arm64` target for standalone CLI ([#6693](https://github.com/tailwindlabs/tailwindcss/pull/6693)) + +## [3.0.7] - 2021-12-17 + +### Fixed + +- Don't mutate custom color palette when overriding per-plugin colors ([#6546](https://github.com/tailwindlabs/tailwindcss/pull/6546)) +- Improve circular dependency detection when using `@apply` ([#6588](https://github.com/tailwindlabs/tailwindcss/pull/6588)) +- Only generate variants for non-`user` layers ([#6589](https://github.com/tailwindlabs/tailwindcss/pull/6589)) +- Properly extract classes with arbitrary values in arrays and classes followed by escaped quotes ([#6590](https://github.com/tailwindlabs/tailwindcss/pull/6590)) +- Improve jsx interpolation candidate matching ([#6593](https://github.com/tailwindlabs/tailwindcss/pull/6593)) +- Ensure `@apply` of a rule inside an AtRule works ([#6594](https://github.com/tailwindlabs/tailwindcss/pull/6594)) + +## [3.0.6] - 2021-12-16 + +### Fixed + +- Support square bracket notation in paths ([#6519](https://github.com/tailwindlabs/tailwindcss/pull/6519)) +- Ensure all plugins are executed for a given candidate ([#6540](https://github.com/tailwindlabs/tailwindcss/pull/6540)) + +## [3.0.5] - 2021-12-15 + +### Fixed + +- Revert: add `li` to list-style reset ([9777562d](https://github.com/tailwindlabs/tailwindcss/commit/9777562da37ee631bbf77374c0d14825f09ef9af)) + +## [3.0.4] - 2021-12-15 + +### Fixed + +- Insert always-on defaults layer in correct spot ([#6526](https://github.com/tailwindlabs/tailwindcss/pull/6526)) + +## [3.0.3] - 2021-12-15 + +### Added + +- Warn about invalid globs in `content` ([#6449](https://github.com/tailwindlabs/tailwindcss/pull/6449)) +- Add standalone tailwindcss CLI ([#6506](https://github.com/tailwindlabs/tailwindcss/pull/6506)) +- Add `li` to list-style reset ([00f60e6](https://github.com/tailwindlabs/tailwindcss/commit/00f60e61013c6e4e3419e4b699371a13eb30b75d)) + +### Fixed + +- Don't output unparsable values ([#6469](https://github.com/tailwindlabs/tailwindcss/pull/6469)) +- Fix text decoration utilities from overriding the new text decoration color/style/thickness utilities when used with a modifier ([#6378](https://github.com/tailwindlabs/tailwindcss/pull/6378)) +- Move defaults to their own always-on layer ([#6500](https://github.com/tailwindlabs/tailwindcss/pull/6500)) +- Support negative values in safelist patterns ([#6480](https://github.com/tailwindlabs/tailwindcss/pull/6480)) + +## [3.0.2] - 2021-12-13 + +### Fixed + +- Temporarily disable optimize universal defaults, fixes issue with transforms/filters/rings not being `@apply`-able in CSS modules/Svelte components/Vue components ([#6461](https://github.com/tailwindlabs/tailwindcss/pull/6461)) + +## [3.0.1] - 2021-12-10 + +### Fixed + +- Ensure complex variants with multiple classes work ([#6311](https://github.com/tailwindlabs/tailwindcss/pull/6311)) +- Re-add `default` interop to public available functions ([#6348](https://github.com/tailwindlabs/tailwindcss/pull/6348)) +- Detect circular dependencies when using `@apply` ([#6365](https://github.com/tailwindlabs/tailwindcss/pull/6365)) +- Fix defaults optimization when vendor prefixes are involved ([#6369](https://github.com/tailwindlabs/tailwindcss/pull/6369)) + +## [3.0.0] - 2021-12-09 + +### Fixed + +- Enforce the order of some variants (like `before` and `after`) ([#6018](https://github.com/tailwindlabs/tailwindcss/pull/6018)) + +### Added + +- Add `placeholder` variant ([#6106](https://github.com/tailwindlabs/tailwindcss/pull/6106)) +- Add composable `touch-action` utilities ([#6115](https://github.com/tailwindlabs/tailwindcss/pull/6115)) +- Add support for "arbitrary properties" ([#6161](https://github.com/tailwindlabs/tailwindcss/pull/6161)) +- Add `portrait` and `landscape` variants ([#6046](https://github.com/tailwindlabs/tailwindcss/pull/6046)) +- Add `text-decoration-style`, `text-decoration-thickness`, and `text-underline-offset` utilities ([#6004](https://github.com/tailwindlabs/tailwindcss/pull/6004)) +- Add `menu` reset to preflight ([#6213](https://github.com/tailwindlabs/tailwindcss/pull/6213)) +- Allow `0` as a valid `length` value ([#6233](https://github.com/tailwindlabs/tailwindcss/pull/6233), [#6259](https://github.com/tailwindlabs/tailwindcss/pull/6259)) +- Add CSS functions to data types ([#6258](https://github.com/tailwindlabs/tailwindcss/pull/6258)) +- Support negative values for `scale-*` utilities ([c48e629](https://github.com/tailwindlabs/tailwindcss/commit/c48e629955585ad18dadba9f470fda59cc448ab7)) +- Improve `length` data type, by validating each value individually ([#6283](https://github.com/tailwindlabs/tailwindcss/pull/6283)) + +### Changed + +- Deprecate `decoration-slice` and `decoration-break` in favor `box-decoration-slice` and `box-decoration-break` _(non-breaking)_ ([#6004](https://github.com/tailwindlabs/tailwindcss/pull/6004)) + +## [3.0.0-alpha.2] - 2021-11-08 + +### Changed + +- Don't use pointer cursor on disabled buttons by default ([#5772](https://github.com/tailwindlabs/tailwindcss/pull/5772)) +- Set default content value in preflight instead of within each before/after utility ([#5820](https://github.com/tailwindlabs/tailwindcss/pull/5820)) +- Remove `prefix` as a function ([#5829](https://github.com/tailwindlabs/tailwindcss/pull/5829)) + +### Added + +- Add `flex-basis` utilities ([#5671](https://github.com/tailwindlabs/tailwindcss/pull/5671)) +- Make negative values a first-class feature ([#5709](https://github.com/tailwindlabs/tailwindcss/pull/5709)) +- Add `fit-content` values for `min/max-width/height` utilities ([#5638](https://github.com/tailwindlabs/tailwindcss/pull/5638)) +- Add `min/max-content` values for `min/max-height` utilities ([#5729](https://github.com/tailwindlabs/tailwindcss/pull/5729)) +- Add all standard `cursor-*` values by default ([#5734](https://github.com/tailwindlabs/tailwindcss/pull/5734)) +- Add `grow-*` and `shrink-*` utilities, deprecate `flex-grow-*` and `flex-shrink-*` ([#5733](https://github.com/tailwindlabs/tailwindcss/pull/5733)) +- Add `text-decoration-color` utilities ([#5760](https://github.com/tailwindlabs/tailwindcss/pull/5760)) +- Add new declarative `addVariant` API ([#5809](https://github.com/tailwindlabs/tailwindcss/pull/5809)) +- Add first-class `print` variant for targeting printed media ([#5885](https://github.com/tailwindlabs/tailwindcss/pull/5885)) +- Add `outline-style`, `outline-color`, `outline-width` and `outline-offset` utilities ([#5887](https://github.com/tailwindlabs/tailwindcss/pull/5887)) +- Add full color palette for `fill-*` and `stroke-*` utilities (#5933[](https://github.com/tailwindlabs/tailwindcss/pull/5933)) +- Add composable API for colored box shadows ([#5979](https://github.com/tailwindlabs/tailwindcss/pull/5979)) + +### Fixed + +- Configure chokidar's `awaitWriteFinish` setting to avoid occasional stale builds on Windows ([#5774](https://github.com/tailwindlabs/tailwindcss/pull/5774)) +- Fix CLI `--content` option ([#5775](https://github.com/tailwindlabs/tailwindcss/pull/5775)) +- Fix before/after utilities overriding custom content values at larger breakpoints ([#5820](https://github.com/tailwindlabs/tailwindcss/pull/5820)) +- Cleanup duplicate properties ([#5830](https://github.com/tailwindlabs/tailwindcss/pull/5830)) +- Allow `_` inside `url()` when using arbitrary values ([#5853](https://github.com/tailwindlabs/tailwindcss/pull/5853)) +- Prevent crashes when using comments in `@layer` AtRules ([#5854](https://github.com/tailwindlabs/tailwindcss/pull/5854)) +- Handle color transformations properly with `theme(...)` for all relevant plugins ([#4533](https://github.com/tailwindlabs/tailwindcss/pull/4533), [#5871](https://github.com/tailwindlabs/tailwindcss/pull/5871)) +- Ensure `@apply`-ing a utility with multiple definitions works ([#5870](https://github.com/tailwindlabs/tailwindcss/pull/5870)) + +## [3.0.0-alpha.1] - 2021-10-01 + +### Changed + +- Remove AOT engine, make JIT the default ([#5340](https://github.com/tailwindlabs/tailwindcss/pull/5340)) +- Throw when trying to `@apply` the `group` class ([#4666](https://github.com/tailwindlabs/tailwindcss/pull/4666)) +- Remove dependency on `modern-normalize`, inline and consolidate with Preflight ([#5358](https://github.com/tailwindlabs/tailwindcss/pull/5358)) +- Enable extended color palette by default with updated color names ([#5384](https://github.com/tailwindlabs/tailwindcss/pull/5384)) +- Move `vertical-align` values to config file instead of hard-coding ([#5487](https://github.com/tailwindlabs/tailwindcss/pull/5487)) +- Rename `overflow-clip` to `text-clip` and `overflow-ellipsis` to `text-ellipsis` ([#5630](https://github.com/tailwindlabs/tailwindcss/pull/5630)) + +### Added + +- Add native `aspect-ratio` utilities ([#5359](https://github.com/tailwindlabs/tailwindcss/pull/5359)) +- Unify config callback helpers into single object ([#5382](https://github.com/tailwindlabs/tailwindcss/pull/5382)) +- Preserve original color format when adding opacity whenever possible ([#5154](https://github.com/tailwindlabs/tailwindcss/pull/5154)) +- Add `accent-color` utilities ([#5387](https://github.com/tailwindlabs/tailwindcss/pull/5387)) +- Add `scroll-behavior` utilities ([#5388](https://github.com/tailwindlabs/tailwindcss/pull/5388)) +- Add `will-change` utilities ([#5448](https://github.com/tailwindlabs/tailwindcss/pull/5448)) +- Add `text-indent` utilities ([#5449](https://github.com/tailwindlabs/tailwindcss/pull/5449)) +- Add `column` utilities ([#5457](https://github.com/tailwindlabs/tailwindcss/pull/5457)) +- Add `border-hidden` utility ([#5485](https://github.com/tailwindlabs/tailwindcss/pull/5485)) +- Add `align-sub` and `align-super` utilities by default ([#5486](https://github.com/tailwindlabs/tailwindcss/pull/5486)) +- Add `break-before`, `break-inside` and `break-after` utilities ([#5530](https://github.com/tailwindlabs/tailwindcss/pull/5530)) +- Add `file` variant for `::file-selector-button` pseudo element ([#4936](https://github.com/tailwindlabs/tailwindcss/pull/4936)) +- Add comprehensive arbitrary value support ([#5568](https://github.com/tailwindlabs/tailwindcss/pull/5568)) +- Add `touch-action` utilities ([#5603](https://github.com/tailwindlabs/tailwindcss/pull/5603)) +- Add `inherit` to default color palette ([#5597](https://github.com/tailwindlabs/tailwindcss/pull/5597)) +- Add `overflow-clip`, `overflow-x-clip` and `overflow-y-clip` utilities ([#5630](https://github.com/tailwindlabs/tailwindcss/pull/5630)) +- Add `[open]` variant ([#5627](https://github.com/tailwindlabs/tailwindcss/pull/5627)) +- Add `scroll-snap` utilities ([#5637](https://github.com/tailwindlabs/tailwindcss/pull/5637)) +- Add `border-x` and `border-y` width and color utilities ([#5639](https://github.com/tailwindlabs/tailwindcss/pull/5639)) + +### Fixed + +- Fix defining colors as functions when color opacity plugins are disabled ([#5470](https://github.com/tailwindlabs/tailwindcss/pull/5470)) +- Fix using negated `content` globs ([#5625](https://github.com/tailwindlabs/tailwindcss/pull/5625)) +- Fix using backslashes in `content` globs ([#5628](https://github.com/tailwindlabs/tailwindcss/pull/5628)) + +## [2.2.19] - 2021-10-29 + +### Fixed + +- Ensure `corePlugins` order is consistent in AOT mode ([#5928](https://github.com/tailwindlabs/tailwindcss/pull/5928)) + +## [2.2.18] - 2021-10-29 + +### Fixed + +- Bump versions for security vulnerabilities ([#5924](https://github.com/tailwindlabs/tailwindcss/pull/5924)) + +## [2.2.17] - 2021-10-13 + +### Fixed + +- Configure chokidar's `awaitWriteFinish` setting to avoid occasional stale builds on Windows ([#5758](https://github.com/tailwindlabs/tailwindcss/pull/5758)) + +## [2.2.16] - 2021-09-26 + +### Fixed + +- JIT: Properly handle animations that use CSS custom properties ([#5602](https://github.com/tailwindlabs/tailwindcss/pull/5602)) + +## [2.2.15] - 2021-09-10 + +### Fixed + +- Ensure using CLI without `-i` for input file continues to work even though deprecated ([#5464](https://github.com/tailwindlabs/tailwindcss/pull/5464)) + +## [2.2.14] - 2021-09-08 + +### Fixed + +- Only use `@defaults` in JIT, switch back to `clean-css` in case there's any meaningful differences in the output ([bf248cb](https://github.com/tailwindlabs/tailwindcss/commit/bf248cb0de889d48854fbdd26536f4a492556efd)) + +## [2.2.13] - 2021-09-08 + +### Fixed + +- Replace `clean-css` with `cssnano` for CDN builds to fix minified builds ([75cc3ca](https://github.com/tailwindlabs/tailwindcss/commit/75cc3ca305aedddc8a85f3df1a420fefad3fb5c4)) + +## [2.2.12] - 2021-09-08 + +### Fixed + +- Ensure that divide utilities inject a default border color ([#5438](https://github.com/tailwindlabs/tailwindcss/pull/5438)) + +## [2.2.11] - 2021-09-07 + +### Fixed + +- Rebundle to fix missing CLI peer dependencies + +## [2.2.10] - 2021-09-06 + +### Fixed + +- Fix build error when using `presets: []` in config file ([#4903](https://github.com/tailwindlabs/tailwindcss/pull/4903)) + +### Added + +- Reintroduce universal selector optimizations under experimental `optimizeUniversalDefaults` flag ([a9e160c](https://github.com/tailwindlabs/tailwindcss/commit/a9e160cf9acb75a2bbac34f8864568b12940f89a)) + +## [2.2.9] - 2021-08-30 + +### Fixed + +- JIT: Fix `@apply`ing utilities that contain variants + the important modifier ([#4854](https://github.com/tailwindlabs/tailwindcss/pull/4854)) +- JIT: Don't strip "null" when parsing tracked file paths ([#5008](https://github.com/tailwindlabs/tailwindcss/pull/5008)) +- Pin `clean-css` to v5.1.4 to fix empty CSS variables in CDN builds ([#5338](https://github.com/tailwindlabs/tailwindcss/pull/5338)) + +## [2.2.8] - 2021-08-27 + +### Fixed + +- Improve accessibility of default link focus styles in Firefox ([#5082](https://github.com/tailwindlabs/tailwindcss/pull/5082)) +- JIT: Fix animation variants corrupting keyframes rules ([#5223](https://github.com/tailwindlabs/tailwindcss/pull/5223)) +- JIT: Ignore escaped commas when splitting selectors to apply prefixes ([#5239](https://github.com/tailwindlabs/tailwindcss/pull/5239/)) +- Nesting: Maintain PostCSS node sources when handling `@apply` ([#5249](https://github.com/tailwindlabs/tailwindcss/pull/5249)) +- JIT: Fix support for animation lists ([#5252](https://github.com/tailwindlabs/tailwindcss/pull/5252)) +- JIT: Fix arbitrary value support for `object-position` utilities ([#5245](https://github.com/tailwindlabs/tailwindcss/pull/5245)) +- CLI: Abort watcher if stdin is closed to avoid zombie processes ([#4997](https://github.com/tailwindlabs/tailwindcss/pull/4997)) +- JIT: Ignore arbitrary values with unbalanced brackets ([#5293](https://github.com/tailwindlabs/tailwindcss/pull/5293)) + +## [2.2.7] - 2021-07-23 + +### Fixed + +- Temporarily revert runtime performance optimizations introduced in v2.2.5, use universal selector again ([#5060](https://github.com/tailwindlabs/tailwindcss/pull/5060)) + +## [2.2.6] - 2021-07-21 + +### Fixed + +- Fix issue where base styles not generated for translate transforms in JIT ([#5038](https://github.com/tailwindlabs/tailwindcss/pull/5038)) + +## [2.2.5] - 2021-07-21 + +### Added + +- Added `self-baseline` utility (I know this is a patch release, no one's going to die relax) ([#5000](https://github.com/tailwindlabs/tailwindcss/pull/5000)) + +### Changed + +- JIT: Optimize universal selector usage by inlining only the relevant selectors ([#4850](https://github.com/tailwindlabs/tailwindcss/pull/4850))) + + This provides a very significant performance boost on pages with a huge number of DOM nodes, but there's a chance it could be a breaking change in very rare edge cases we haven't thought of. Please open an issue if anything related to shadows, rings, transforms, filters, or backdrop-filters seems to be behaving differently after upgrading. + +### Fixed + +- Fix support for `step-start` and `step-end` in animation utilities ([#4795](https://github.com/tailwindlabs/tailwindcss/pull/4795))) +- JIT: Prevent presence of `!*` in templates from ruining everything ([#4816](https://github.com/tailwindlabs/tailwindcss/pull/4816))) +- JIT: Improve support for quotes in arbitrary values ([#4817](https://github.com/tailwindlabs/tailwindcss/pull/4817))) +- Fix filter/backdrop-filter/transform utilities being inserted into the wrong position if not all core plugins are enabled ([#4852](https://github.com/tailwindlabs/tailwindcss/pull/4852))) +- JIT: Fix `@layer` rules being mistakenly inserted during incremental rebuilds ([#4853](https://github.com/tailwindlabs/tailwindcss/pull/4853))) +- Improve build performance for projects with many small non-Tailwind stylesheets ([#4644](https://github.com/tailwindlabs/tailwindcss/pull/4644)) +- Ensure `[hidden]` works as expected on elements where we override the default `display` value in Preflight ([#4873](https://github.com/tailwindlabs/tailwindcss/pull/4873)) +- Fix variant configuration not being applied to `backdropOpacity` utilities ([#4892](https://github.com/tailwindlabs/tailwindcss/pull/4892)) + +## [2.2.4] - 2021-06-23 + +### Fixed + +- Remove `postinstall` script that was preventing people from installing the library ([1eacfb9](https://github.com/tailwindlabs/tailwindcss/commit/1eacfb98849c0d4737e0af3595ddec8c73addaac)) + +## [2.2.3] - 2021-06-23 + +### Added + +- Pass extended color palette to theme closures so it can be used without installing Tailwind when using `npx tailwindcss` ([359252c](https://github.com/tailwindlabs/tailwindcss/commit/359252c9b429e81217c28eb3ca7bab73d8f81e6d)) + +### Fixed + +- JIT: Explicitly error when `-` is used as a custom separator ([#4704](https://github.com/tailwindlabs/tailwindcss/pull/4704)) +- JIT: Don't add multiple `~` when stacking `peer-*` variants ([#4757](https://github.com/tailwindlabs/tailwindcss/pull/4757)) +- Remove outdated focus style fix in Preflight ([#4780](https://github.com/tailwindlabs/tailwindcss/pull/4780)) +- Enable `purge` if provided on the CLI ([#4772](https://github.com/tailwindlabs/tailwindcss/pull/4772)) +- JIT: Fix error when not using a config file with postcss-cli ([#4773](https://github.com/tailwindlabs/tailwindcss/pull/4773)) +- Fix issue with `resolveConfig` not being importable in Next.js pages ([#4725](https://github.com/tailwindlabs/tailwindcss/pull/4725)) + +## [2.2.2] - 2021-06-18 + +### Fixed + +- JIT: Reintroduce `transform`, `filter`, and `backdrop-filter` classes purely to create stacking contexts to minimize the impact of the breaking change ([#4700](https://github.com/tailwindlabs/tailwindcss/pull/4700)) + +## [2.2.1] - 2021-06-18 + +### Fixed + +- Recover from errors gracefully in CLI watch mode ([#4693](https://github.com/tailwindlabs/tailwindcss/pull/4693)) +- Fix issue with media queries not being generated properly when using PostCSS 7 ([#4695](https://github.com/tailwindlabs/tailwindcss/pull/4695)) + +## [2.2.0] - 2021-06-17 + +### Changed + +- JIT: Use "tracking" context by default instead of "watching" context for improved reliability with most bundlers ([#4514](https://github.com/tailwindlabs/tailwindcss/pull/4514)) + + Depending on which tooling you use, you may need to explicitly set `TAILWIND_MODE=watch` until your build runner has been updated to support PostCSS's `dir-dependency` message type. + +### Added + +- Add `background-origin` utilities ([#4117](https://github.com/tailwindlabs/tailwindcss/pull/4117)) +- Improve `@apply` performance in projects that process many CSS sources ([#3178](https://github.com/tailwindlabs/tailwindcss/pull/3718)) +- JIT: Don't use CSS variables for color utilities if color opacity utilities are disabled ([#3984](https://github.com/tailwindlabs/tailwindcss/pull/3984)) +- JIT: Redesign `matchUtilities` API to make it more suitable for third-party use ([#4232](https://github.com/tailwindlabs/tailwindcss/pull/4232)) +- JIT: Support applying important utility variants ([#4260](https://github.com/tailwindlabs/tailwindcss/pull/4260)) +- JIT: Support coercing arbitrary values when the type isn't detectable ([#4263](https://github.com/tailwindlabs/tailwindcss/pull/4263)) +- JIT: Support for `raw` syntax in `purge` config ([#4272](https://github.com/tailwindlabs/tailwindcss/pull/4272)) +- Add `empty` variant ([#3298](https://github.com/tailwindlabs/tailwindcss/pull/3298)) +- Update `modern-normalize` to v1.1 ([#4287](https://github.com/tailwindlabs/tailwindcss/pull/4287)) +- Implement `theme` function internally, remove `postcss-functions` dependency ([#4317](https://github.com/tailwindlabs/tailwindcss/pull/4317)) +- Add `screen` function to improve nesting plugin compatibility ([#4318](https://github.com/tailwindlabs/tailwindcss/pull/4318)) +- JIT: Add universal shorthand color opacity syntax ([#4348](https://github.com/tailwindlabs/tailwindcss/pull/4348)) +- JIT: Add `@tailwind variants` directive to replace `@tailwind screens` ([#4356](https://github.com/tailwindlabs/tailwindcss/pull/4356)) +- JIT: Add support for PostCSS `dir-dependency` messages in `TAILWIND_DISABLE_TOUCH` mode ([#4388](https://github.com/tailwindlabs/tailwindcss/pull/4388)) +- JIT: Add per-side border color utilities ([#4404](https://github.com/tailwindlabs/tailwindcss/pull/4404)) +- JIT: Add support for `before` and `after` pseudo-element variants and `content` utilities ([#4461](https://github.com/tailwindlabs/tailwindcss/pull/4461)) +- Add new `transform` and `extract` APIs to simplify PurgeCSS/JIT customization ([#4469](https://github.com/tailwindlabs/tailwindcss/pull/4469)) +- JIT: Add exhaustive pseudo-class and pseudo-element variant support ([#4482](https://github.com/tailwindlabs/tailwindcss/pull/4482)) +- JIT: Add `caret-color` utilities ([#4499](https://github.com/tailwindlabs/tailwindcss/pull/4499)) +- Rename `lightBlue` to `sky`, emit console warning when using deprecated name ([#4513](https://github.com/tailwindlabs/tailwindcss/pull/4513)) +- New CLI with improved JIT support, `--watch` mode, and more ([#4526](https://github.com/tailwindlabs/tailwindcss/pull/4526), [4558](https://github.com/tailwindlabs/tailwindcss/pull/4558)) +- JIT: Add new `peer-*` variants for styling based on sibling state ([#4556](https://github.com/tailwindlabs/tailwindcss/pull/4556)) +- Expose `safelist` as a top-level option under `purge` for both JIT and classic engines ([#4580](https://github.com/tailwindlabs/tailwindcss/pull/4580)) +- JIT: Remove need for `transform` class when using classes like `scale-*`, `rotate-*`, etc. ([#4604](https://github.com/tailwindlabs/tailwindcss/pull/4604)) +- JIT: Remove need for `filter` and `backdrop-filter` classes when using classes like `contrast-*`, `backdrop-blur-*`, etc. ([#4614](https://github.com/tailwindlabs/tailwindcss/pull/4614)) +- Support passing a custom path for your PostCSS configuration in the Tailwind CLI ([#4607](https://github.com/tailwindlabs/tailwindcss/pull/4607)) +- Add `blur-none` by default with intent to deprecate `blur-0` ([#4614](https://github.com/tailwindlabs/tailwindcss/pull/4614)) + +### Fixed + +- JIT: Improve support for Svelte class bindings ([#4187](https://github.com/tailwindlabs/tailwindcss/pull/4187)) +- JIT: Improve support for `calc` and `var` in arbitrary values ([#4147](https://github.com/tailwindlabs/tailwindcss/pull/4147)) +- Convert `hsl` colors to `hsla` when transforming for opacity support instead of `rgba` ([#3850](https://github.com/tailwindlabs/tailwindcss/pull/3850)) +- Fix `backdropBlur` variants not being generated ([#4188](https://github.com/tailwindlabs/tailwindcss/pull/4188)) +- Improve animation value parsing ([#4250](https://github.com/tailwindlabs/tailwindcss/pull/4250)) +- Ignore unknown object types when hashing config ([82f4eaa](https://github.com/tailwindlabs/tailwindcss/commit/82f4eaa6832ef8a4e3fd90869e7068efdf6e34f2)) +- Ensure variants are grouped properly for plugins with order-dependent utilities ([#4273](https://github.com/tailwindlabs/tailwindcss/pull/4273)) +- JIT: Fix temp file storage when node temp directories are kept on a different drive than the project itself ([#4044](https://github.com/tailwindlabs/tailwindcss/pull/4044)) +- Support border-opacity utilities alongside default `border` utility ([#4277](https://github.com/tailwindlabs/tailwindcss/pull/4277)) +- JIT: Fix source maps for expanded `@tailwind` directives ([2f15411](https://github.com/tailwindlabs/tailwindcss/commit/2f1541123dea29d8a2ab0f1411bf60c79eeb96b4)) +- JIT: Ignore whitespace when collapsing adjacent rules ([15642fb](https://github.com/tailwindlabs/tailwindcss/commit/15642fbcc885eba9cc50b7678a922b09c90d6b51)) +- JIT: Generate group parent classes correctly when using custom separator ([#4508](https://github.com/tailwindlabs/tailwindcss/pull/4508)) +- JIT: Fix incorrect stacking of multiple `group` variants ([#4551](https://github.com/tailwindlabs/tailwindcss/pull/4551)) +- JIT: Fix memory leak due to holding on to unused contexts ([#4571](https://github.com/tailwindlabs/tailwindcss/pull/4571)) + +### Internals + +- Add integration tests for popular build runners ([#4354](https://github.com/tailwindlabs/tailwindcss/pull/4354)) + +## [2.1.4] - 2021-06-02 + +### Fixed + +- Skip `raw` PurgeCSS sources when registering template dependencies ([#4542](https://github.com/tailwindlabs/tailwindcss/pull/4542)) + +## [2.1.3] - 2021-06-01 + +### Fixed + +- Register PurgeCSS paths as PostCSS dependencies to guarantee proper cache-busting in webpack 5 ([#4530](https://github.com/tailwindlabs/tailwindcss/pull/4530)) + +## [2.1.2] - 2021-04-23 + +### Fixed + +- Fix issue where JIT engine would generate the wrong CSS when using PostCSS 7 ([#4078](https://github.com/tailwindlabs/tailwindcss/pull/4078)) + +## [2.1.1] - 2021-04-05 + +### Fixed + +- Fix issue where JIT engine would fail to compile when a source path isn't provided by the build runner for the current input file ([#3978](https://github.com/tailwindlabs/tailwindcss/pull/3978)) + +## [2.1.0] - 2021-04-05 + +### Added + +- Add alternate JIT engine (in preview) ([#3905](https://github.com/tailwindlabs/tailwindcss/pull/3905)) +- Add new `mix-blend-mode` and `background-blend-mode` utilities ([#3920](https://github.com/tailwindlabs/tailwindcss/pull/3920)) +- Add new `box-decoration-break` utilities ([#3911](https://github.com/tailwindlabs/tailwindcss/pull/3911)) +- Add new `isolation` utilities ([#3914](https://github.com/tailwindlabs/tailwindcss/pull/3914)) +- Add `inline-table` display utility ([#3563](https://github.com/tailwindlabs/tailwindcss/pull/3563)) +- Add `list-item` display utility ([#3929](https://github.com/tailwindlabs/tailwindcss/pull/3929)) +- Add new `filter` and `backdrop-filter` utilities ([#3923](https://github.com/tailwindlabs/tailwindcss/pull/3923)) + +## [2.0.4] - 2021-03-17 + +### Fixed + +- Pass full `var(--bg-opacity)` value as `opacityValue` when defining colors as functions + +## [2.0.3] - 2021-02-07 + +### Fixed + +- Ensure sourcemap input is deterministic when using `@apply` in Vue components ([#3356](https://github.com/tailwindlabs/tailwindcss/pull/3356)) +- Ensure placeholder opacity is consistent across browsers ([#3308](https://github.com/tailwindlabs/tailwindcss/pull/3308)) +- Fix issue where `theme()` didn't work with colors defined as functions ([#2919](https://github.com/tailwindlabs/tailwindcss/pull/2919)) +- Enable `dark` variants by default for color opacity utilities ([#2975](https://github.com/tailwindlabs/tailwindcss/pull/2975)) + +### Added + +- Add support for a `tailwind.config.cjs` file in Node ESM projects ([#3181](https://github.com/tailwindlabs/tailwindcss/pull/3181)) +- Add version comment to Preflight ([#3255](https://github.com/tailwindlabs/tailwindcss/pull/3255)) +- Add `cursor-help` by default ([#3199](https://github.com/tailwindlabs/tailwindcss/pull/3199)) + +## [2.0.2] - 2020-12-11 + +### Fixed + +- Fix issue with `@apply` not working as expected with `!important` inside an at-rule ([#2824](https://github.com/tailwindlabs/tailwindcss/pull/2824)) +- Fix issue with `@apply` not working as expected with defined classes ([#2832](https://github.com/tailwindlabs/tailwindcss/pull/2832)) +- Fix memory leak, and broken `@apply` when splitting up files ([#3032](https://github.com/tailwindlabs/tailwindcss/pull/3032)) + +### Added + +- Add default values for the `ring` utility ([#2951](https://github.com/tailwindlabs/tailwindcss/pull/2951)) + +## [2.0.1] - 2020-11-18 + +- Nothing, just the only thing I could do when I found out npm won't let me publish the same version under two tags. + +## [2.0.0] - 2020-11-18 + +### Added + +- Add redesigned color palette ([#2623](https://github.com/tailwindlabs/tailwindcss/pull/2623), [700866c](https://github.com/tailwindlabs/tailwindcss/commit/700866ce5e0c0b8d140be161c4d07fc6f31242bc), [#2633](https://github.com/tailwindlabs/tailwindcss/pull/2633)) +- Add dark mode support ([#2279](https://github.com/tailwindlabs/tailwindcss/pull/2279), [#2631](https://github.com/tailwindlabs/tailwindcss/pull/2631)) +- Add `overflow-ellipsis` and `overflow-clip` utilities ([#1289](https://github.com/tailwindlabs/tailwindcss/pull/1289)) +- Add `transform-gpu` to force hardware acceleration on transforms when desired ([#1380](https://github.com/tailwindlabs/tailwindcss/pull/1380)) +- Extend default spacing scale ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630), [7f05204](https://github.com/tailwindlabs/tailwindcss/commit/7f05204ce7a5581b6845591448265c3c21afde86)) +- Add spacing scale to `inset` plugin ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630)) +- Add percentage sizes to `translate`, `inset`, and `height` plugins ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630), [5259560](https://github.com/tailwindlabs/tailwindcss/commit/525956065272dc53e8f8395f55f9ad13077a38d1)) +- Extend default font size scale ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609), [#2619](https://github.com/tailwindlabs/tailwindcss/pull/2619)) +- Support using `@apply` with complex classes, including variants like `lg:hover:bg-blue-500` ([#2159](https://github.com/tailwindlabs/tailwindcss/pull/2159)) +- Add new `2xl` breakpoint at 1536px by default ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609)) +- Add default line-height values for font-size utilities ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609)) +- Support defining theme values using arrays for CSS properties that support comma separated values ([e13f083c4](https://github.com/tailwindlabs/tailwindcss/commit/e13f083c4bc48bf9870d27c966136a9584943127)) +- Enable `group-hover` for color plugins, `boxShadow`, and `textDecoration` by default ([28985b6](https://github.com/tailwindlabs/tailwindcss/commit/28985b6cd592e72d4849fdb9ce97eb045744e09c), [f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Enable `focus` for z-index utilities by default ([ae5b3d3](https://github.com/tailwindlabs/tailwindcss/commit/ae5b3d312d5000ae9c2065001f3df7add72dc365)) +- Support `extend` in `variants` configuration ([#2651](https://github.com/tailwindlabs/tailwindcss/pull/2651)) +- Add `max-w-prose` class by default ([#2574](https://github.com/tailwindlabs/tailwindcss/pull/2574)) +- Support flattening deeply nested color objects ([#2148](https://github.com/tailwindlabs/tailwindcss/pull/2148)) +- Support defining presets as functions ([#2680](https://github.com/tailwindlabs/tailwindcss/pull/2680)) +- Support deep merging of objects under `extend` ([#2679](https://github.com/tailwindlabs/tailwindcss/pull/2679), [#2700](https://github.com/tailwindlabs/tailwindcss/pull/2700)) +- Enable `focus-within` for all plugins that have `focus` enabled by default ([1a21f072](https://github.com/tailwindlabs/tailwindcss/commit/1a21f0721c7368d61fa3feef33d616de3f78c7d7), [f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Added new `ring` utilities for creating outline/focus rings using box shadows ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747), [879f088](https://github.com/tailwindlabs/tailwindcss/commit/879f088), [e0788ef](https://github.com/tailwindlabs/tailwindcss/commit/879f088)) +- Added `5` and `95` to opacity scale ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747)) +- Add support for default duration and timing function values whenever enabling transitions ([#2755](https://github.com/tailwindlabs/tailwindcss/pull/2755)) + +### Changed + +- Completely redesign color palette ([#2623](https://github.com/tailwindlabs/tailwindcss/pull/2623), [700866c](https://github.com/tailwindlabs/tailwindcss/commit/700866ce5e0c0b8d140be161c4d07fc6f31242bc), [#2633](https://github.com/tailwindlabs/tailwindcss/pull/2633)) +- Drop support for Node 8 and 10 ([#2582](https://github.com/tailwindlabs/tailwindcss/pull/2582)) +- Removed `target` feature and dropped any compatibility with IE 11 ([#2571](https://github.com/tailwindlabs/tailwindcss/pull/2571)) +- Upgrade to PostCSS 8 (but include PostCSS 7 compatibility build) ([729b400](https://github.com/tailwindlabs/tailwindcss/commit/729b400a685973f46af73c8a68b364f20f7c5e1e), [1d8679d](https://github.com/tailwindlabs/tailwindcss/commit/1d8679d37e0eb1ba8281b2076bade5fc754f47dd), [c238ed1](https://github.com/tailwindlabs/tailwindcss/commit/c238ed15b5c02ff51978965511312018f2bc2cae)) +- Removed `shadow-outline`, `shadow-solid`, and `shadow-xs` by default in favor of new `ring` API ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747)) +- Switch `normalize.css` to `modern-normalize` ([#2572](https://github.com/tailwindlabs/tailwindcss/pull/2572)) +- Rename `whitespace-no-wrap` to `whitespace-nowrap` ([#2664](https://github.com/tailwindlabs/tailwindcss/pull/2664)) +- Rename `flex-no-wrap` to `flex-nowrap` ([#2676](https://github.com/tailwindlabs/tailwindcss/pull/2676)) +- Remove `clearfix` utility, recommend `flow-root` instead ([#2766](https://github.com/tailwindlabs/tailwindcss/pull/2766)) +- Disable `hover` and `focus` for `fontWeight` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Remove `grid-gap` fallbacks needed for old versions of Safari ([5ec45fa](https://github.com/tailwindlabs/tailwindcss/commit/5ec45fa)) +- Change special use of 'default' in config to 'DEFAULT' ([#2580](https://github.com/tailwindlabs/tailwindcss/pull/2580)) +- New `@apply` implementation, slight backwards incompatibilities with previous behavior ([#2159](https://github.com/tailwindlabs/tailwindcss/pull/2159)) +- Make `theme` retrieve the expected resolved value when theme value is complex ([e13f083c4](https://github.com/tailwindlabs/tailwindcss/commit/e13f083c4bc48bf9870d27c966136a9584943127)) +- Move `truncate` class to `textOverflow` core plugin ([#2562](https://github.com/tailwindlabs/tailwindcss/pull/2562)) +- Remove `scrolling-touch` and `scrolling-auto` utilities ([#2573](https://github.com/tailwindlabs/tailwindcss/pull/2573)) +- Modernize default system font stacks ([#1711](https://github.com/tailwindlabs/tailwindcss/pull/1711)) +- Upgrade to PurgeCSS 3.0 ([8e4e0a0](https://github.com/tailwindlabs/tailwindcss/commit/8e4e0a0eb8dcbf84347c7562988b4f9afd344081)) +- Change default `text-6xl` font-size to 3.75rem instead of 4rem ([#2619](https://github.com/tailwindlabs/tailwindcss/pull/2619)) +- Ignore `[hidden]` elements within `space` and `divide` utilities instead of `template` elements ([#2642](https://github.com/tailwindlabs/tailwindcss/pull/2642)) +- Automatically prefix keyframes and animation names when a prefix is configured ([#2621](https://github.com/tailwindlabs/tailwindcss/pull/2621), [#2641](https://github.com/tailwindlabs/tailwindcss/pull/2641)) +- Merge `extend` objects deeply by default ([#2679](https://github.com/tailwindlabs/tailwindcss/pull/2679)) +- Respect `preserveHtmlElements` option even when using custom PurgeCSS extractor ([#2704](https://github.com/tailwindlabs/tailwindcss/pull/2704)) +- Namespace all internal custom properties under `tw-` to avoid collisions with end-user custom properties ([#2771](https://github.com/tailwindlabs/tailwindcss/pull/2771)) + +## [2.0.0-alpha.25] - 2020-11-17 + +### Fixed + +- Fix issue where `ring-offset-0` didn't work due to unitless `0` in `calc` function ([3de0c48](https://github.com/tailwindlabs/tailwindcss/commit/3de0c48)) + +## [2.0.0-alpha.24] - 2020-11-16 + +### Changed + +- Don't override ring color when overriding ring width with a variant ([e40079a](https://github.com/tailwindlabs/tailwindcss/commit/e40079a)) + +### Fixed + +- Prevent shadow/ring styles from cascading to children ([e40079a](https://github.com/tailwindlabs/tailwindcss/commit/e40079a)) +- Ensure rings have a default color even if `colors.blue.500` is not present in config ([e40079a](https://github.com/tailwindlabs/tailwindcss/commit/e40079a)) + +## [2.0.0-alpha.23] - 2020-11-16 + +### Added + +- Add scripts for generating a PostCSS 7 compatible build alongside PostCSS 8 version ([#2773](https://github.com/tailwindlabs/tailwindcss/pull/2773)) + +### Changed + +- All custom properties have been internally namespaced under `tw-` to avoid collisions with end-user custom properties ([#2771](https://github.com/tailwindlabs/tailwindcss/pull/2771)) + +## [2.0.0-alpha.22] - 2020-11-16 + +### Changed + +- ~~All custom properties have been internally namespaced under `tw-` to avoid collisions with end-user custom properties ([#2771](https://github.com/tailwindlabs/tailwindcss/pull/2771))~~ I made a git boo-boo, check alpha.23 instead + +## [2.0.0-alpha.21] - 2020-11-15 + +### Changed + +- Upgrade to PostCSS 8, Autoprefixer 10, move `postcss` and `autoprefixer` to peerDependencies ([729b400](https://github.com/tailwindlabs/tailwindcss/commit/729b400)) + +## [2.0.0-alpha.20] - 2020-11-13 + +### Changed + +- Remove `clearfix` utility, recommend `flow-root` instead ([#2766](https://github.com/tailwindlabs/tailwindcss/pull/2766)) + +## [2.0.0-alpha.19] - 2020-11-13 + +### Fixed + +- Don't crash when color palette is empty ([278c203](https://github.com/tailwindlabs/tailwindcss/commit/278c203)) + +## [2.0.0-alpha.18] - 2020-11-13 + +### Changed + +- `black` and `white` have been added to `colors.js` ([b3ed724](https://github.com/tailwindlabs/tailwindcss/commit/b3ed724)) + +### Fixed + +- Add support for colors as closures to `ringColor` and `ringOffsetColor`, previously would crash build ([62a47f9](https://github.com/tailwindlabs/tailwindcss/commit/62a47f9)) + +## [2.0.0-alpha.17] - 2020-11-13 + +### Changed + +- Remove `grid-gap` fallbacks needed for old versions of Safari ([5ec45fa](https://github.com/tailwindlabs/tailwindcss/commit/5ec45fa)) + +## [2.0.0-alpha.16] - 2020-11-12 + +### Added + +- Enable `focus`, `focus-within`, and `dark` variants (when enabled) for all ring utilities by default ([e0788ef](https://github.com/tailwindlabs/tailwindcss/commit/879f088)) + +## [2.0.0-alpha.15] - 2020-11-11 + +### Added + +- Added `ring-inset` utility for rendering rings as inset shadows ([879f088](https://github.com/tailwindlabs/tailwindcss/commit/879f088)) + +### Changed + +- `ringWidth` utilities always reset ring styles to ensure no accidental variable inheritance through the cascade ([879f088](https://github.com/tailwindlabs/tailwindcss/commit/879f088)) + +## [2.0.0-alpha.14] - 2020-11-11 + +### Added + +- Enable `focus-within` for `outline` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Enable `focus-within` for `ringWidth` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Enable `group-hover` for `boxShadow` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) +- Enable `group-hover` and `focus-within` for `textDecoration` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) + +### Changed + +- Disable `hover` and `focus` for `fontWeight` utilities by default ([f6923b1](https://github.com/tailwindlabs/tailwindcss/commit/f6923b1)) + +## [2.0.0-alpha.13] - 2020-11-11 + +### Added + +- Add support for default duration and timing function values whenever enabling transitions ([#2755](https://github.com/tailwindlabs/tailwindcss/pull/2755)) + +## [2.0.0-alpha.12] - 2020-11-10 + +### Fixed + +- Prevent `boxShadow` utilities from overriding ring shadows added by components like in the custom forms plugin ([c3dd3b6](https://github.com/tailwindlabs/tailwindcss/commit/c3dd3b68454ad418833a9edf7f3409cad66fb5b0)) + +## [2.0.0-alpha.11] - 2020-11-09 + +### Fixed + +- Convert `none` to `0 0 #0000` when used for shadows to ensure compatibility with `ring` utilities ([4eecc27](https://github.com/tailwindlabs/tailwindcss/commit/4eecc2751ca0c461e8da5bd5772ae650197a2e5d)) + +## [2.0.0-alpha.10] - 2020-11-09 + +### Added + +- Added new `ring` utilities ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747)) +- Added `5` and `95` to opacity scale ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747)) + +### Changed + +- Removed `shadow-outline`, `shadow-solid`, and `shadow-xs` in favor of new `ring` API ([#2747](https://github.com/tailwindlabs/tailwindcss/pull/2747)) + +## [2.0.0-alpha.9] - 2020-11-07 + +### Added + +- Added `shadow-solid` utility, a 2px solid shadow that uses the current text color ([369cfae](https://github.com/tailwindlabs/tailwindcss/commit/369cfae2905a577033529c46a5e8ca58c69f5623)) +- Enable `focus-within` where useful by default ([1a21f072](https://github.com/tailwindlabs/tailwindcss/commit/1a21f0721c7368d61fa3feef33d616de3f78c7d7)) + +### Changed + +- Update `shadow-outline` to use the new blue ([b078238](https://github.com/tailwindlabs/tailwindcss/commit/b0782385c9832d35a10929b38b4fcaf27e055d6b)) + +## [2.0.0-alpha.8] - 2020-11-06 + +### Added + +- Add `11` to spacing scale ([7f05204](https://github.com/tailwindlabs/tailwindcss/commit/7f05204ce7a5581b6845591448265c3c21afde86)) +- Add percentage-based height values ([5259560](https://github.com/tailwindlabs/tailwindcss/commit/525956065272dc53e8f8395f55f9ad13077a38d1)) +- Add indigo to the color palette by default ([700866c](https://github.com/tailwindlabs/tailwindcss/commit/700866ce5e0c0b8d140be161c4d07fc6f31242bc)) + +### Changed + +- Use `coolGray` as the default gray ([700866c](https://github.com/tailwindlabs/tailwindcss/commit/700866ce5e0c0b8d140be161c4d07fc6f31242bc)) + +## [2.0.0-alpha.7] - 2020-11-05 + +### Changed + +- Revert upgrading to PostCSS 8 lol + +## [2.0.0-alpha.6] - 2020-11-04 + +### Changed + +- Respect `preserveHtmlElements` option even when using custom PurgeCSS extractor ([#2704](https://github.com/tailwindlabs/tailwindcss/pull/2704)) +- Set font-family and line-height to `inherit` on `body` to behave more like v1.x ([#2729](https://github.com/tailwindlabs/tailwindcss/pull/2729)) + +## [2.0.0-alpha.5] - 2020-10-30 + +### Changed + +- Upgrade to PostCSS 8 ([59aa484](https://github.com/tailwindlabs/tailwindcss/commit/59aa484dfea0607d96bff6ef41b1150c78576c37)) + +## [2.0.0-alpha.4] - 2020-10-29 + +### Added + +- Support deep merging of arrays of objects under `extend` ([#2700](https://github.com/tailwindlabs/tailwindcss/pull/2700)) + +## [2.0.0-alpha.3] - 2020-10-27 + +### Added + +- Support flattening deeply nested color objects ([#2148](https://github.com/tailwindlabs/tailwindcss/pull/2148)) +- Support defining presets as functions ([#2680](https://github.com/tailwindlabs/tailwindcss/pull/2680)) + +### Changed + +- Merge `extend` objects deeply by default ([#2679](https://github.com/tailwindlabs/tailwindcss/pull/2679)) +- Rename `flex-no-wrap` to `flex-nowrap` ([#2676](https://github.com/tailwindlabs/tailwindcss/pull/2676)) + +## [2.0.0-alpha.2] - 2020-10-25 + +### Added + +- Support `extend` in `variants` configuration ([#2651](https://github.com/tailwindlabs/tailwindcss/pull/2651)) +- Add `max-w-prose` class by default ([#2574](https://github.com/tailwindlabs/tailwindcss/pull/2574)) + +### Changed + +- Revert use of logical properties for `space` and `divide` utilities ([#2644](https://github.com/tailwindlabs/tailwindcss/pull/2644)) +- `space` and `divide` utilities ignore elements with `[hidden]` now instead of only ignoring `template` elements ([#2642](https://github.com/tailwindlabs/tailwindcss/pull/2642)) +- Set default font on `body`, not just `html` ([#2643](https://github.com/tailwindlabs/tailwindcss/pull/2643)) +- Automatically prefix keyframes and animation names when a prefix is configured ([#2621](https://github.com/tailwindlabs/tailwindcss/pull/2621), [#2641](https://github.com/tailwindlabs/tailwindcss/pull/2641)) +- Rename `whitespace-no-wrap` to `whitespace-nowrap` ([#2664](https://github.com/tailwindlabs/tailwindcss/pull/2664)) + +## [1.9.6] - 2020-10-23 + +### Changed + +- The `presets` feature had unexpected behavior where a preset config without its own `presets` key would not extend the default config. ([#2662](https://github.com/tailwindlabs/tailwindcss/pull/2662)) + + If you were depending on this unexpected behavior, just add `presets: []` to your own preset to exclude the default configuration. + +## [2.0.0-alpha.1] - 2020-10-20 + +### Added + +- Added dark mode support ([#2279](https://github.com/tailwindlabs/tailwindcss/pull/2279), [#2631](https://github.com/tailwindlabs/tailwindcss/pull/2631)) +- Added `overflow-ellipsis` and `overflow-clip` utilities ([#1289](https://github.com/tailwindlabs/tailwindcss/pull/1289)) +- Add `transform-gpu` to force hardware acceleration on transforms when beneficial ([#1380](https://github.com/tailwindlabs/tailwindcss/pull/1380)) +- Extended spacing scale ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630)) +- Add spacing scale to `inset` plugin ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630)) +- Enable useful relative sizes for more plugins ([#2630](https://github.com/tailwindlabs/tailwindcss/pull/2630)) +- Extend font size scale ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609), [#2619](https://github.com/tailwindlabs/tailwindcss/pull/2619)) +- Support using `@apply` with complex classes ([#2159](https://github.com/tailwindlabs/tailwindcss/pull/2159)) +- Add new `2xl` breakpoint ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609)) +- Add default line-height values for font-size utilities ([#2609](https://github.com/tailwindlabs/tailwindcss/pull/2609)) +- Support defining theme values using arrays wherever it makes sense (box-shadow, transition-property, etc.) ([e13f083c4](https://github.com/tailwindlabs/tailwindcss/commit/e13f083c4bc48bf9870d27c966136a9584943127)) +- Enable `group-hover` for color utilities by default ([28985b6](https://github.com/tailwindlabs/tailwindcss/commit/28985b6cd592e72d4849fdb9ce97eb045744e09c)) +- Enable `focus` for z-index utilities by default ([ae5b3d3](https://github.com/tailwindlabs/tailwindcss/commit/ae5b3d312d5000ae9c2065001f3df7add72dc365)) + +### Changed + +- New `@apply` implementation, slight backwards incompatibilities with previous behavior ([#2159](https://github.com/tailwindlabs/tailwindcss/pull/2159)) +- Move `truncate` class to `textOverflow` core plugin ([#2562](https://github.com/tailwindlabs/tailwindcss/pull/2562)) +- Removed `target` feature and dropped any compatibility with IE 11 ([#2571](https://github.com/tailwindlabs/tailwindcss/pull/2571)) +- Switch `normalize.css` to `modern-normalize` ([#2572](https://github.com/tailwindlabs/tailwindcss/pull/2572)) +- Remove `scrolling-touch` and `scrolling-auto` utilities ([#2573](https://github.com/tailwindlabs/tailwindcss/pull/2573)) +- Change special use of 'default' in config to 'DEFAULT' ([#2580](https://github.com/tailwindlabs/tailwindcss/pull/2580)) +- Drop support for Node 8 and 10 ([#2582](https://github.com/tailwindlabs/tailwindcss/pull/2582)) +- Modernize default system font stacks ([#1711](https://github.com/tailwindlabs/tailwindcss/pull/1711)) +- Upgrade to PurgeCSS 3.0 +- ~~Upgrade to PostCSS 8.0~~ Reverted for now +- Use logical properties for `space` and `divide` utilities ([#1883](https://github.com/tailwindlabs/tailwindcss/pull/1883)) +- Make `theme` retrieve the expected resolved value when theme value is complex ([e13f083c4](https://github.com/tailwindlabs/tailwindcss/commit/e13f083c4bc48bf9870d27c966136a9584943127)) +- Adjust default font-size scale to include 60px instead of 64px ([#2619](https://github.com/tailwindlabs/tailwindcss/pull/2619)) +- Update default colors in Preflight to match new color palette ([#2633](https://github.com/tailwindlabs/tailwindcss/pull/2633)) + +## [1.9.5] - 2020-10-19 + +### Fixed + +- Fix issue where using `theme` with default line-heights did not resolve correctly + +## [1.9.4] - 2020-10-17 + +### Fixed + +- Fix issue changing plugins defined using the `withOptions` API would not trigger rebuilds in watch processes + +## [1.9.3] - 2020-10-16 + +### Fixed + +- Fix issue where `tailwindcss init --full` scaffolded a corrupt config file (https://github.com/tailwindlabs/tailwindcss/issues/2556) + +### Changed + +- Remove console warnings about upcoming breaking changes + +## [1.9.2] - 2020-10-14 + +### Fixed + +- Merge plugins when merging config with preset ([#2561](https://github.com/tailwindlabs/tailwindcss/pulls/#2561) +- Use `word-wrap` and `overflow-wrap` together, not one or the other since `word-wrap` is IE-only + +## [1.9.1] - 2020-10-14 + +### Fixed + +- Don't import `corePlugins` in `resolveConfig` to avoid bundling browser-incompatible code ([#2548](https://github.com/tailwindlabs/tailwindcss/pull/2548)) + +## [1.9.0] - 2020-10-12 + +### Added + +- Add new `presets` config option ([#2474](https://github.com/tailwindlabs/tailwindcss/pull/2474)) +- Scaffold new `tailwind.config.js` files with available `future` flags commented out ([#2379](https://github.com/tailwindlabs/tailwindcss/pull/2379)) +- Add `col-span-full` and `row-span-full` ([#2471](https://github.com/tailwindlabs/tailwindcss/pull/2471)) +- Make `outline` configurable, `outline-none` more accessible by default, and add `outline-black` and `outline-white` ([#2460](https://github.com/tailwindlabs/tailwindcss/pull/2460)) +- Add additional small `rotate` and `skew` values ([#2528](https://github.com/tailwindlabs/tailwindcss/pull/2528)) +- Add `xl`, `2xl`, and `3xl` border radius values ([#2529](https://github.com/tailwindlabs/tailwindcss/pull/2529)) +- Add new utilities for `grid-auto-columns` and `grid-auto-rows` ([#2531](https://github.com/tailwindlabs/tailwindcss/pull/2531)) +- Promote `defaultLineHeights` and `standardFontWeights` from experimental to future + +### Fixed + +- Don't escape keyframe values ([#2432](https://github.com/tailwindlabs/tailwindcss/pull/2432)) +- Use `word-wrap` instead of `overflow-wrap` in `ie11` target mode ([#2391](https://github.com/tailwindlabs/tailwindcss/pull/2391)) + +### Experimental + +- Add experimental `2xl` breakpoint ([#2468](https://github.com/tailwindlabs/tailwindcss/pull/2468)) +- Rename `{u}-max-content` and `{u}-min-content` utilities to `{u}-max` and `{u}-min` in experimental extended spacing scale ([#2532](https://github.com/tailwindlabs/tailwindcss/pull/2532)) +- Support disabling dark mode variants globally ([#2530](https://github.com/tailwindlabs/tailwindcss/pull/2530)) + +## [1.8.13] - 2020-10-09 + +### Fixed + +- Support defining colors as closures even when opacity variables are not supported ([#2536](https://github.com/tailwindlabs/tailwindcss/pull/2515)) + +## [1.8.12] - 2020-10-07 + +### Fixed + +- Reset color opacity variable in utilities generated using closure colors ([#2515](https://github.com/tailwindlabs/tailwindcss/pull/2515)) + +## [1.8.11] - 2020-10-06 + +- Make `tailwindcss.plugin` work in ESM environments for reasons + +## [1.8.10] - 2020-09-14 + +### Fixed + +- Prevent new `dark` experiment from causing third-party `dark` variants to inherit stacking behavior ([#2382](https://github.com/tailwindlabs/tailwindcss/pull/2382)) + +## [1.8.9] - 2020-09-13 + +### Fixed + +- Add negative spacing values to inset plugin in the `extendedSpacingScale` experiment ([#2358](https://github.com/tailwindlabs/tailwindcss/pull/2358)) +- Fix issue where `!important` was stripped from declarations within rules that used `@apply` with `applyComplexClasses` ([#2376](https://github.com/tailwindlabs/tailwindcss/pull/2376)) + +### Changed + +- Add `future` section to config stubs ([#2372](https://github.com/tailwindlabs/tailwindcss/pull/2372), [3090b98](https://github.com/tailwindlabs/tailwindcss/commit/3090b98ece766b1046abe5bbaa94204e811f7fac)) + +## [1.8.8] - 2020-09-11 + +### Fixed + +- Register dark mode plugin outside of `resolveConfig` code path ([#2368](https://github.com/tailwindlabs/tailwindcss/pull/2368)) + +## [1.8.7] - 2020-09-10 + +### Fixed + +- Fix issue where classes in escaped strings (like `class=\"block\"`) weren't extracted properly for purging ([#2364](https://github.com/tailwindlabs/tailwindcss/pull/2364)) + +## [1.8.6] - 2020-09-09 + +### Fixed + +- Fix issue where container padding not applied when using object syntax ([#2353](https://github.com/tailwindlabs/tailwindcss/pull/2353)) + +## [1.8.5] - 2020-09-07 + +### Fixed + +- Fix issue where `resolveConfig` didn't take into account configs added by feature flags ([#2347](https://github.com/tailwindlabs/tailwindcss/pull/2347)) + +## [1.8.4] - 2020-09-06 + +### Fixed + +- Fix [issue](https://github.com/tailwindlabs/tailwindcss/issues/2258) where inserting extra PurgeCSS control comments could break integrated PurgeCSS support +- Fix issue where dark variant in 'class' mode was incompatible with 'group-hover' variant ([#2337](https://github.com/tailwindlabs/tailwindcss/pull/2337)) +- Support basic nesting structure with `@apply` when using the `applyComplexClasses` experiment ([#2271](https://github.com/tailwindlabs/tailwindcss/pull/2271)) + +### Changed + +- Rename `font-hairline` and `font-thin` to `font-thin` and `font-extralight` behind `standardFontWeights` flag (experimental until v1.9.0) ([#2333](https://github.com/tailwindlabs/tailwindcss/pull/2333)) + +## [1.8.3] - 2020-09-05 + +### Fixed + +- Fix issue where `font-variant-numeric` utilities would break in combination with most CSS minifier configurations ([f3660ce](https://github.com/tailwindlabs/tailwindcss/commit/f3660ceed391cfc9390ca4ea1a729a955e64b895)) +- Only warn about `conservative` purge mode being deprecated once per process ([58781b5](https://github.com/tailwindlabs/tailwindcss/commit/58781b517daffbaf80fc5c0791d311f53b2d67d8)) + +## [1.8.2] - 2020-09-04 + +### Fixed + +- Fix bug where dark mode variants would cause an error if you had a `plugins` array in your config ([#2322](https://github.com/tailwindlabs/tailwindcss/pull/2322)) + +## [1.8.1] - 2020-09-04 + +### Fixed + +- Fix bug in the new font-variant-numeric utilities which broke the whole rule ([#2318](https://github.com/tailwindlabs/tailwindcss/pull/2318)) +- Fix bug while purging ([#2320](https://github.com/tailwindlabs/tailwindcss/pull/2320)) + +## [1.8.0] - 2020-09-04 + +### Added + +- Dark mode variant (experimental) ([#2279](https://github.com/tailwindlabs/tailwindcss/pull/2279)) +- New `preserveHtmlElements` option for `purge` ([#2283](https://github.com/tailwindlabs/tailwindcss/pull/2283)) +- New `layers` mode for `purge` ([#2288](https://github.com/tailwindlabs/tailwindcss/pull/2288)) +- New `font-variant-numeric` utilities ([#2305](https://github.com/tailwindlabs/tailwindcss/pull/2305)) +- New `place-items`, `place-content`, `place-self`, `justify-items`, and `justify-self` utilities ([#2306](https://github.com/tailwindlabs/tailwindcss/pull/2306)) +- Support configuring variants as functions ([#2309](https://github.com/tailwindlabs/tailwindcss/pull/2309)) + +### Changed + +- CSS within `@layer` at-rules are now grouped with the corresponding `@tailwind` at-rule ([#2312](https://github.com/tailwindlabs/tailwindcss/pull/2312)) + +### Deprecated + +- `conservative` purge mode, deprecated in favor of `layers` + +## [1.7.6] - 2020-08-29 + +### Fixed + +- Fix bug where the new experimental `@apply` implementation broke when applying a variant class with the important option globally enabled + +## [1.7.5] - 2020-08-28 + +### Changed + +- Update lodash to latest to silence security warnings + +## [1.7.4] - 2020-08-26 + +### Added + +- Add new -p flag to CLI to quickly scaffold a `postcss.config.js` file + +### Changed + +- Make `@apply` insensitive to whitespace in the new `applyComplexClasses` experiment + +### Fixed + +- Fix bug where the new `applyComplexClasses` experiment didn't behave as expected with rules with multiple selectors, like `.foo, .bar { color: red }` + +## [1.7.3] - 2020-08-20 + +### Changed + +- Log feature flag notices to stderr instead of stdout to preserve compatibility with pipe-based build systems +- Add missing bg-none utility for disabling background images + +### Fixed + +- Fix bug that prevented defining colors as closures when the `gradientColorStops` plugin was enabled + +## [1.7.2] - 2020-08-19 + +### Added + +- Reuse generated CSS as much as possible in long-running processes instead of needlessly recalculating + +## [1.7.1] - 2020-08-28 + +### Changed + +- Don't issue duplicate flag notices in long-running build processes + +## [1.7.0] - 2020-08-28 + +### Added + +- Gradients +- New background-clip utilities +- New `contents` display utility +- Default letter-spacing per font-size +- Divide border styles +- Access entire config object from plugins +- Define colors as closures +- Use `@apply` with variants and other complex classes (experimental) +- New additional color-palette (experimental) +- Extended spacing scale (experimental) +- Default line-heights per font-size by default (experimental) +- Extended font size scale (experimental) + +### Deprecated + +- Deprecated gap utilities + +## [1.6.3] - 2020-08-18 + +### Fixed + +- Fixes issue where motion-safe and motion-reduce variants didn't stack correctly with group-hover variants + +## [1.6.2] - 2020-08-03 + +### Fixed + +- Fixes issue where `@keyframes` respecting the important option would break animations in Chrome + +## [1.6.1] - 2020-08-02 + +### Fixed + +- Fixes an issue where animation keyframes weren't included in the build without @tailwind base (#2108) + +## [1.6.0] - 2020-07-28 + +### Added + +- Animation support +- New `prefers-reduced-motion` variants +- New `overscroll-behaviour` utilities +- Generate CSS without an input file + +## [1.5.2] - 2020-07-21 + +### Fixed + +- Fixes issue where you could no longer use `@apply` with unprefixed class names if you had configured a prefix + +## [1.5.1] - 2020-07-15 + +### Fixed + +- Fixes accidental breaking change where adding component variants using the old manual syntax (as recommended in the docs) stopped working + +## [1.5.0] - 2020-07-15 + +### Added + +- Component `variants` support +- Responsive `container` variants +- New `focus-visible` variant +- New `checked` variant + +## v0.0.0-658250a96 - 2020-07-12 [YANKED] + +No release notes + +## [1.4.6] - 2020-05-08 + +### Changed + +- Explicitly error when using a class as the important config option instead of just generating the wrong CSS + +## [1.4.5] - 2020-05-06 + +### Fixed + +- Fix bug where the `divideColor` plugin was using the wrong '' in IE11 target mode + +## [1.4.4] - 2020-05-01 + +### Fixed + +- Fix bug where target: 'browserslist' didn't work, only `target: ['browserslist', {...}]` did + +## [1.4.3] - 2020-05-01 + +### Changed + +- Don't generate unnecessary CSS in color plugins when color opacity utilities are disabled + +## [1.4.2] - 2020-05-01 + +### Fixed + +- Fix issue where `purge: { enabled: false }` was ignored, add `purge: false` shorthand + +## [1.4.1] - 2020-04-30 + +### Changed + +- Improve built-in PurgeCSS extractor to better support Haml and Slim templates + +## [1.4.0] - 2020-04-29 + +### Added + +- New color opacity utilities +- Built-in PurgeCSS +- IE 11 target mode (experimental) + +## [1.3.5] - 2020-04-23 + +### Removed + +- Drop `fs-extra` dependency to `^8.0.0` to preserve Node 8 compatibility until Tailwind 2.0 + +### Fixed + +- Fix missing unit in calc bug in space plugin (`space-x-0` didn't work for example) + +## [1.3.4] - 2020-04-21 + +### Fixed + +- Fix bug where `divide-{x/y}-0` utilities didn't work due to missing unit in `calc` call + +## [1.3.3] - 2020-04-21 + +### Added + +- Add forgotten responsive variants for `space`, `divideWidth`, and `divideColor` utilities + +## [1.3.1] - 2020-04-21 + +### Fixed + +- Fix bug where the `space-x` utilities were not being applied correctly due to referencing `--space-y-reverse` instead of `--space-x-reverse` + +## [1.3.0] - 2020-04-21 + +### Added + +- New `space` and `divide` layout utilities +- New `transition-delay` utilities +- New `group-focus` variant +- Support for specifying a default line-height for each font-size utility +- Support for breakpoint-specific padding for `container` class +- Added `current` to the default color palette +- New `inline-grid` utility +- New `flow-root` display utility +- New `clear-none` utility + +## [1.2.0] - 2020-02-05 + +### Added + +- CSS Transition support +- CSS Transform support +- CSS Grid support +- Added `max-w-{screen}` utilities +- Added `max-w-none` utility +- Added `rounded-md` utility +- Added `shadow-sm` utility +- Added `shadow-xs` utility +- Added `stroke-width` utilities +- Added fixed line-height utilities +- Added additional display utilities for table elements +- Added box-sizing utilities +- Added clear utilities +- Config file dependencies are now watchable +- Added new `plugin` and `plugin.withOptions` APIs + +### Changed + +- Allow plugins to extend the user's config + +## [1.2.0-canary.8] - 2020-02-05 + +### Added + +- Add additional fixed-size line-height utilities + +## [1.2.0-canary.7] - 2020-02-04 + +### Removed + +- Remove Inter from font-sans, plan to add later under new class + +## [1.2.0-canary.6] - 2020-02-03 + +### Added + +- Add system-ui to default font stack +- Add shadow-xs, increase shadow-sm alpha to 0.05 +- Support import syntax even without postcss-import +- Alias tailwind bin to tailwindcss +- Add fill/stroke to transition-colors +- Add transition-shadow, add box-shadow to default transition +- Combine gap/columnGap/rowGap +- Add grid row utilities +- Add skew utilities + +### Changed + +- Use font-sans as default font + +## [1.2.0-canary.5] - 2020-01-08 + +### Added + +- Adds missing dependency `resolve` which is required for making config dependencies watchable + +## [1.2.0-canary.4] - 2020-01-08 + +### Added + +- CSS Transition support +- CSS Transform support +- CSS Grid support +- New `max-w-{screen}` utilities +- Added `max-w-none` utility +- Added "Inter" to the default sans-serif font stack +- Add `rounded-md` utility +- Add `shadow-sm` utility +- Added stroke-width utilities +- Added additional display utilities for table elements +- Added box-sizing utilities +- Added clear utilities +- Config file dependencies are now watchable +- Allow plugins to extend the user's config +- Add new `plugin` and `plugin.withOptions` APIs + +## [v1.2.0-canary.3] - 2020-01-08 [YANKED] + +No release notes + +## [1.1.4] - 2019-11-25 + +### Changed + +- Note: Although this is a bugfix it could affect your site if you were working around the bug in your own code by not prefixing the `.group` class. I'm sorry 😞 + +### Fixed + +- Fixes a bug where the `.group` class was not receiving the user's configured prefix when using the `prefix` option + +## [1.2.0-canary.1] - 2019-10-22 + +### Changed + +- Don't watch `node_modules` files for changes + +### Fixed + +- Fixes significant build performance regression in `v1.2.0-canary.0` + +## [1.1.3] - 2019-10-22 + +### Fixed + +- Fixes an issue where in some cases function properties in the user's `theme` config didn't receive the second utils argument + +## [1.2.0-canary.0] - 2019-10-14 + +### Added + +- Automatically watch all config file dependencies (plugins, design tokens imported from other files, etc.) for changes when build watcher is running +- Add `justify-evenly` utility + +### Changed + +- Allow plugins to add their own config file to be resolved with the user's custom config + +## [1.1.2] - 2019-08-14 + +### Fixed + +- Fixes a bug with horizontal rules where they were displayed with a 2px border instead of a 1px border +- Fixes a bug with horizontal rules where they were rendered with default top/bottom margin + +## [1.1.1] - 2019-08-09 + +### Fixed + +- Fixes issue where values like `auto` would fail to make it through the default negative margin config + +## [1.1.0] - 2019-08-06 + +### Added + +- Added utilities for screenreader visibility +- Added utilities for placeholder color +- First, last, even, and odd child variants +- Disabled variant +- Visited variant +- Increase utility specificity using a scope instead of !important +- Add hover/focus variants for opacity by default +- Added `border-double` utility +- Support negative prefix for boxShadow and letterSpacing plugins +- Support passing config path via object + +### Fixed + +- Placeholders no longer have a default opacity +- Make horizontal rules visible by default +- Generate correct negative margins when using calc + +## [1.0.6] - 2019-08-01 + +### Fixed + +- Fixes issue where modifiers would mutate nested rules + +## [1.0.5] - 2019-07-11 + +### Added + +- Support built-in variants for utilities that include pseudo-elements + +### Changed + +- Update several dependencies, including postcss-js which fixes an issue with using `!important` directly in Tailwind utility plugins + +## [1.0.4] - 2019-06-11 + +### Changed + +- Increase precision of percentage width values to avoid 1px rounding issues in grid layouts + +## [1.0.3] - 2019-06-01 + +### Changed + +- Throws an error when someone tries to use `@tailwind preflight` instead of `@tailwind base`, this is the source of many support requests + +## [1.0.2] - 2019-05-27 + +### Fixed + +- Fixes a bug where `@screen` rules weren't bubbled properly when nested in plugins + +## [1.0.1] - 2019-05-13 + +### Fixed + +- Fixes a bug where global variants weren't properly merged + +## [1.0.0] - 2019-05-13 + +No release notes + +## [1.0.0-beta.10] - 2019-05-12 + +### Changed + +- Use `9999` and `-9999` for `order-last` and `order-first` utilities respectively + +## [1.0.0-beta.9] - 2019-05-12 + +### Added + +- Add `bg-repeat-round` and `bg-repeat-space` utilities +- Add `select-all` and `select-auto` utilities + +### Changed + +- Make all utilities responsive by default + +## [1.0.0-beta.8] - 2019-04-28 + +### Added + +- Adds `responsive` variants for the new order utilities by default, should have been there all along + +## [1.0.0-beta.7] - 2019-04-27 + +### Fixed + +- Fixes a bug where you couldn't extend the margin config + +## [1.0.0-beta.6] - 2019-04-27 + +### Added + +- Added support for negative inset (`-top-6`, `-right-4`) and z-index (`-z-10`) utilities, using the same negative key syntax supported by the margin plugin +- Add missing fractions as well as x/12 fractions to width scale +- Add `order` utilities +- Add `cursor-text` class by default + +### Changed + +- Make it possible to access your fully merged config file in JS + +### Removed + +- Removed `negativeMargin` plugin, now the regular `margin` plugin supports generating negative classes (like `-mx-6`) by using negative keys in the config, like `-6` + +## [1.0.0-beta.5] - 2019-04-18 + +### Changed + +- Make it possible to disable all core plugins using `corePlugins: false` +- Make it possible to configure a single list of variants that applies to all utility plugins +- Make it possible to safelist which core plugins should be enabled + +### Fixed + +- Fix a bug where stroke and fill plugins didn't properly handle the next object syntax for color definitions +- Fix a bug where you couldn't have comments near `@apply` directives + +## [1.0.0-beta.4] - 2019-03-29 + +### Added + +- Add the `container` key to the scaffolded config file when generated with `--full` + +### Changed + +- Bumps node dependency to 8.9.0 so we can keep our default config file clean, 6.9.0 is EOL next month anyways + +### Removed + +- Removes `SFMono-Regular` from the beginning of the default monospace font stack, it has no italic support and Menlo looks better anyways + +### Fixed + +- Fixes an issue where the user's config object was being mutated during processing (only affects @bradlc 😅) +- Fixes an issue where you couldn't use a closure to define theme sections under `extend` + +## [1.0.0-beta.3] - 2019-03-18 + +### Added + +- Support lazy evaluation in `theme.extend` + +### Changed + +- Use lighter default border color +- Revert #745 and use `bolder` for strong tags by default instead of `fontWeight.bold` + +## [1.0.0-beta.2] - 2019-03-17 + +### Changed + +- Closures in the `theme` section of the config file are now passed a `theme` function instead of an object + +### Fixed + +- Fix issue where `@screen` didn't work at all 🙃 + +## [1.0.0-beta.1] - 2019-03-17 + +### Added + +- New config file structure +- New expanded default color palette +- New default `maxWidth` scale +- Added utilities for `list-style-type` and `list-style-position` +- Added `break-all` utility + +### Changed + +- `object-position` utilities are now customizable under `theme.objectPosition` +- `cursor` utilities are now customizable under `theme.cursors` +- `flex-grow/shrink` utilities are now customizable under `theme.flexGrow/flexShrink` +- Default variant output position can be customized +- Extended default line-height scale +- Extended default letter-spacing scale + +## [0.7.4] - 2019-01-23 + +### Changed + +- Update our PostCSS related dependencies + +### Fixed + +- Fix bug where class names containing a `.`character had the responsive prefix added in the wrong place + +## [0.7.3] - 2018-12-03 + +### Changed + +- Update Normalize to v8.0.1 + +## [0.7.2] - 2018-11-05 + +### Added + +- Add `--no-autoprefixer` option to CLI `build` command + +## [0.7.1] - 2018-11-05 + +### Changed + +- Update autoprefixer dependency + +## [0.7.0] - 2018-10-31 + +### Added + +- Registering new variants from plugins +- Variant order can be customized per module +- Added focus-within variant +- Fancy CLI updates +- Option to generate config without comments +- Make configured prefix optional when using @apply +- Improve Flexbox behavior in IE 10/11 + +### Changed + +- Variant order in modules is now significant +- Normalize.css updated to v8.0.0 +- Removed CSS fix for Chrome 62 button border radius change + +## [0.6.6] - 2018-09-21 + +### Changed + +- Promote `shadowLookup` from experiment to official feature + +## [0.6.5] - 2018-08-18 + +### Fixed + +- Fixes an issue where units were stripped from zero value properties + +## [0.6.4] - 2018-07-16 + +### Fixed + +- Fixes an issue where changes to your configuration file were ignored when using `webpack --watch` + +## [0.6.3] - 2018-07-11 + +### Fixed + +- Fixes an issue where `@tailwind utilities` generated no output + +## [0.6.2] - 2018-03-11 + +### Added + +- Added table layout utilities for styling tables +- Configuration can now be passed as an object +- Registering new variants from plugins (experimental) +- Allow `@apply`-ing classes that aren't defined but would be generated (experimental) + +### Changed + +- Default config file changes + +## [0.6.1] - 2018-06-22 + +### Fixed + +- Fix incorrect box-shadow syntax for the `.shadow-outline` utility 🤦‍♂️ + +## [0.6.0] - 2018-06-21 + +### Added + +- Added border collapse utilities for styling tables +- Added more axis-specific overflow utilities +- Added `.outline-none` utility for suppressing focus styles +- Added `.shadow-outline` utility as an alternative to default browser focus styles +- Extended default padding, margin, negative margin, width, and height scales +- Enable focus and hover variants for more modules by default + +### Changed + +- Removed default `outline: none !important` styles from focusable but keyboard-inaccessible elements +- Moved screen prefix for responsive `group-hover` variants +- Default config file changes + +## [0.5.3] - 2018-05-07 + +### Changed + +- Improve sourcemaps for replaced styles like `preflight` + +### Fixed + +- Fix bug where informational messages were being logged to stdout during build, preventing the ability to use Tailwind's output in Unix pipelines + +## [0.5.2] - 2018-03-29 + +### Fixed + +- Fixes an issue with a dependency that had a security vulnerability + +## [0.5.1] - 2018-03-13 + +### Removed + +- Reverts a change that renamed the `.roman` class to `.not-italic` due to the fact that it breaks compatibility with cssnext: [postcss/postcss-selector-not#10](https://github.com/postcss/postcss-selector-not/issues/10). We'll stick with `.roman` for now with a plan to switch to `.not-italic` in another breaking version should that issue get resolved in postcss-selector-not. + +## [0.5.0] - 2018-03-13 + +### Added + +- Plugin system +- Added `.sticky position` utility +- Added `.cursor-wait` and `.cursor-move` utilities +- Added `.bg-auto` background size utility +- Background sizes are now customizable +- Support for active variants +- Better postcss-import support +- Configuration options for the `.container` component + +### Changed + +- The `.container` component is now a built-in plugin +- State variant precedence changes +- New config file keys +- `.overflow-x/y-scroll` now set `overflow: scroll` instead of `overflow: auto` +- `.roman` renamed to `.not-italic` + +## [0.4.3] - 2018-03-13 + +### Changed + +- Use `global.Object` to avoid issues with polyfills when importing the Tailwind config into other JS + +## [0.4.2] - 2018-03-01 + +### Added + +- Add support for using a function to define class prefixes in addition to a simple string + +### Changed + +- Improve the performance of @apply by using a lookup table instead of searching + +### Fixed + +- Fix an issue where borders couldn't be applied to `img` tags without specifying a border style + +## [0.4.1] - 2018-01-22 + +### Changed + +- Make default sans-serif font stack more future proof and safe to use with CSS `font` shorthand +- Replace stylefmt with Perfectionist to avoid weird stylelint conflicts + +## [0.4.0] - 2017-12-15 + +### Added + +- `@apply`'d classes can now be made `!important` explicitly + +### Changed + +- `@apply` now strips `!important` from any mixed in classes +- Default color palette tweaks + +## [0.3.0] - 2017-12-01 + +### Added + +- Enable/disable modules and control which variants are generated for each +- Focus variants +- Group hover variants +- New `@variants` at-rule +- Customize the separator character +- Missing config keys now fallback to their default values +- New utilities + +### Changed + +- Lists now have no margins by default +- `.pin` no longer sets width and height to 100% +- SVG `fill` no longer defaults to currentColor + +## [0.2.2] - 2017-11-19 + +### Fixed + +- Fix issue with dist files not being published due to bug in latest npm + +## [0.2.1] - 2017-11-18 + +### Fixed + +- Fix overly specific border-radius reset for Chrome 62 button styles + +## [0.2.0] - 2017-11-17 + +### Added + +- Add a custom prefix to all utilities +- Optionally make all utilities `!important` +- Round element corners independently +- Cascading border colors and styles + +### Changed + +- `auto` is no longer a hard-coded margin value +- The `defaultConfig` function is now a separate module +- Rounded utilities now combine position and radius size +- Border width utilities no longer affect border color/style +- `@apply` is now very strict about what classes can be applied +- Add `options` key to your config +- Spacing, radius, and border width utility declaration order changes + +## [0.1.6] - 2017-11-09 + +### Fixed + +- Fix CDN files not being published to npm + +## [0.1.5] - 2017-11-08 + +### Changed + +- Apply the same default placeholder styling that's applied to inputs to textareas + +### Fixed + +- Fix CLI tool not loading config files properly + +## [0.1.4] - 2017-11-06 + +### Added + +- Autoprefix dist assets for quick hacking and prototyping +- Add `my-auto`, `mt-auto`, and `mb-auto` margin utilities +- Add `sans-serif` to end of default `sans` font stack + +### Changed + +- If using Webpack, it will now watch your config file changes +- When running `tailwind init [filename]`, automatically append `.js` to filename if not present +- Support default fallback value in `config(...)` function, ie. `config('colors.blue', #0000ff)` +- Don't output empty media queries if Tailwind processes a file that doesn't use Tailwind + +### Fixed + +- Move list utilities earlier in stylesheet to allow overriding with spacing utilities + +## [0.1.3] - 2017-11-02 + +### Added + +- Add new `.scrolling-touch` and `.scrolling-auto` utilities for controlling inertial scroll behavior on WebKit touch devices +- Generate separate dist files for preflight, utilities, and tailwind for CDN usage + +## [0.1.2] - 2017-11-01 + +### Changed + +- Target Node 6.9.0 explicitly (instead of 8.6 implicitly) to support more users + +### Fixed + +- Fix issue with config option not being respected in `tailwind build` + +## [0.1.1] - 2017-11-01 + +### Fixed + +- Fix `tailwind build` CLI command not writing output files + +## [0.1.0] - 2017-11-01 + +### Added + +- Everything! + +[unreleased]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.1...HEAD +[4.0.1]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0...v4.0.1 +[4.0.0]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.10...v4.0.0 +[4.0.0-beta.10]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.9...v4.0.0-beta.10 +[4.0.0-beta.9]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.8...v4.0.0-beta.9 +[4.0.0-beta.8]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.7...v4.0.0-beta.8 +[4.0.0-beta.7]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.6...v4.0.0-beta.7 +[4.0.0-beta.6]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.5...v4.0.0-beta.6 +[4.0.0-beta.5]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.4...v4.0.0-beta.5 +[4.0.0-beta.4]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.3...v4.0.0-beta.4 +[4.0.0-beta.3]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.2...v4.0.0-beta.3 +[4.0.0-beta.2]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-beta.1...v4.0.0-beta.2 +[4.0.0-beta.1]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.36...v4.0.0-beta.1 +[4.0.0-alpha.36]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.35...v4.0.0-alpha.36 +[4.0.0-alpha.35]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.34...v4.0.0-alpha.35 +[4.0.0-alpha.34]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.33...v4.0.0-alpha.34 +[4.0.0-alpha.33]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.32...v4.0.0-alpha.33 +[4.0.0-alpha.32]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.31...v4.0.0-alpha.32 +[4.0.0-alpha.31]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.30...v4.0.0-alpha.31 +[4.0.0-alpha.30]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.29...v4.0.0-alpha.30 +[4.0.0-alpha.29]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.28...v4.0.0-alpha.29 +[4.0.0-alpha.28]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.27...v4.0.0-alpha.28 +[4.0.0-alpha.27]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.26...v4.0.0-alpha.27 +[4.0.0-alpha.26]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.25...v4.0.0-alpha.26 +[4.0.0-alpha.25]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.24...v4.0.0-alpha.25 +[4.0.0-alpha.24]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.23...v4.0.0-alpha.24 +[4.0.0-alpha.23]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.0-alpha.22...v4.0.0-alpha.23 +[4.0.0-alpha.22]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.17...v4.0.0-alpha.22 +[3.4.17]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.16...v3.4.17 +[3.4.16]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.15...v3.4.16 +[3.4.15]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.14...v3.4.15 +[3.4.14]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.13...v3.4.14 +[3.4.13]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.12...v3.4.13 +[3.4.12]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.11...v3.4.12 +[3.4.11]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.10...v3.4.11 +[3.4.10]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.9...v3.4.10 +[3.4.9]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.8...v3.4.9 +[3.4.8]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.7...v3.4.8 +[3.4.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.6...v3.4.7 +[3.4.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.5...v3.4.6 +[3.4.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.4...v3.4.5 +[3.4.4]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.3...v3.4.4 +[3.4.3]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.2...v3.4.3 +[3.4.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.1...v3.4.2 +[3.4.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.4.0...v3.4.1 +[3.4.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.7...v3.4.0 +[3.3.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.6...v3.3.7 +[3.3.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.5...v3.3.6 +[3.3.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.4...v3.3.5 +[3.3.4]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.3...v3.3.4 +[3.3.3]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.2...v3.3.3 +[3.3.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.1...v3.3.2 +[3.3.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.3.0...v3.3.1 +[3.3.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.7...v3.3.0 +[3.2.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.6...v3.2.7 +[3.2.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.5...v3.2.6 +[3.2.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.4...v3.2.5 +[3.2.4]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.3...v3.2.4 +[3.2.3]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.2...v3.2.3 +[3.2.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.1...v3.2.2 +[3.2.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.2.0...v3.2.1 +[3.2.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.8...v3.2.0 +[3.1.8]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.7...v3.1.8 +[3.1.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.6...v3.1.7 +[3.1.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.5...v3.1.6 +[3.1.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.4...v3.1.5 +[3.1.4]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.3...v3.1.4 +[3.1.3]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.2...v3.1.3 +[3.1.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.1...v3.1.2 +[3.1.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.1.0...v3.1.1 +[3.1.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.24...v3.1.0 +[3.0.24]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.23...v3.0.24 +[3.0.23]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.22...v3.0.23 +[3.0.22]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.21...v3.0.22 +[3.0.21]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.20...v3.0.21 +[3.0.20]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.19...v3.0.20 +[3.0.19]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.18...v3.0.19 +[3.0.18]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.17...v3.0.18 +[3.0.17]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.16...v3.0.17 +[3.0.16]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.15...v3.0.16 +[3.0.15]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.14...v3.0.15 +[3.0.14]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.13...v3.0.14 +[3.0.13]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.12...v3.0.13 +[3.0.12]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.11...v3.0.12 +[3.0.11]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.10...v3.0.11 +[3.0.10]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.9...v3.0.10 +[3.0.9]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.8...v3.0.9 +[3.0.8]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.7...v3.0.8 +[3.0.7]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.6...v3.0.7 +[3.0.6]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.5...v3.0.6 +[3.0.5]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.4...v3.0.5 +[3.0.4]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.3...v3.0.4 +[3.0.3]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.2...v3.0.3 +[3.0.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.1...v3.0.2 +[3.0.1]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.0...v3.0.1 +[3.0.0]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.0-alpha.2...v3.0.0 +[3.0.0-alpha.2]: https://github.com/tailwindlabs/tailwindcss/compare/v3.0.0-alpha.1...v3.0.0-alpha.2 +[3.0.0-alpha.1]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.19...v3.0.0-alpha.1 +[2.2.19]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.18...v2.2.19 +[2.2.18]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.17...v2.2.18 +[2.2.17]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.16...v2.2.17 +[2.2.16]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.15...v2.2.16 +[2.2.15]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.14...v2.2.15 +[2.2.14]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.13...v2.2.14 +[2.2.13]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.12...v2.2.13 +[2.2.12]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.11...v2.2.12 +[2.2.11]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.10...v2.2.11 +[2.2.10]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.9...v2.2.10 +[2.2.9]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.8...v2.2.9 +[2.2.8]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.7...v2.2.8 +[2.2.7]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.6...v2.2.7 +[2.2.6]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.5...v2.2.6 +[2.2.5]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.4...v2.2.5 +[2.2.4]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.3...v2.2.4 +[2.2.3]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.2...v2.2.3 +[2.2.2]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.1...v2.2.2 +[2.2.1]: https://github.com/tailwindlabs/tailwindcss/compare/v2.2.0...v2.2.1 +[2.2.0]: https://github.com/tailwindlabs/tailwindcss/compare/v2.1.4...v2.2.0 +[2.1.4]: https://github.com/tailwindlabs/tailwindcss/compare/v2.1.3...v2.1.4 +[2.1.3]: https://github.com/tailwindlabs/tailwindcss/compare/v2.1.2...v2.1.3 +[2.1.2]: https://github.com/tailwindlabs/tailwindcss/compare/v2.1.1...v2.1.2 +[2.1.1]: https://github.com/tailwindlabs/tailwindcss/compare/v2.1.0...v2.1.1 +[2.1.0]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.4...v2.1.0 +[2.0.4]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.3...v2.0.4 +[2.0.3]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.2...v2.0.3 +[2.0.2]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.1...v2.0.2 +[2.0.1]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0...v2.0.1 +[2.0.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.6...v2.0.0 +[2.0.0-alpha.25]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.24...v2.0.0-alpha.25 +[2.0.0-alpha.24]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.23...v2.0.0-alpha.24 +[2.0.0-alpha.23]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.22...v2.0.0-alpha.23 +[2.0.0-alpha.22]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.21...v2.0.0-alpha.22 +[2.0.0-alpha.21]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.20...v2.0.0-alpha.21 +[2.0.0-alpha.20]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.19...v2.0.0-alpha.20 +[2.0.0-alpha.19]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.18...v2.0.0-alpha.19 +[2.0.0-alpha.18]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.17...v2.0.0-alpha.18 +[2.0.0-alpha.17]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.16...v2.0.0-alpha.17 +[2.0.0-alpha.16]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.15...v2.0.0-alpha.16 +[2.0.0-alpha.15]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.14...v2.0.0-alpha.15 +[2.0.0-alpha.14]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.13...v2.0.0-alpha.14 +[2.0.0-alpha.13]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.12...v2.0.0-alpha.13 +[2.0.0-alpha.12]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.11...v2.0.0-alpha.12 +[2.0.0-alpha.11]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.10...v2.0.0-alpha.11 +[2.0.0-alpha.10]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.9...v2.0.0-alpha.10 +[2.0.0-alpha.9]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.8...v2.0.0-alpha.9 +[2.0.0-alpha.8]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.7...v2.0.0-alpha.8 +[2.0.0-alpha.7]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.6...v2.0.0-alpha.7 +[2.0.0-alpha.6]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.5...v2.0.0-alpha.6 +[2.0.0-alpha.5]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.4...v2.0.0-alpha.5 +[2.0.0-alpha.4]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.3...v2.0.0-alpha.4 +[2.0.0-alpha.3]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.2...v2.0.0-alpha.3 +[2.0.0-alpha.2]: https://github.com/tailwindlabs/tailwindcss/compare/v2.0.0-alpha.1...v2.0.0-alpha.2 +[1.9.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.5...v1.9.6 +[2.0.0-alpha.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.5...v2.0.0-alpha.1 +[1.9.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.4...v1.9.5 +[1.9.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.3...v1.9.4 +[1.9.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.2...v1.9.3 +[1.9.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.1...v1.9.2 +[1.9.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.9.0...v1.9.1 +[1.9.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.13...v1.9.0 +[1.8.13]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.12...v1.8.13 +[1.8.12]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.11...v1.8.12 +[1.8.11]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.10...v1.8.11 +[1.8.10]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.9...v1.8.10 +[1.8.9]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.8...v1.8.9 +[1.8.8]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.7...v1.8.8 +[1.8.7]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.6...v1.8.7 +[1.8.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.5...v1.8.6 +[1.8.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.4...v1.8.5 +[1.8.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.3...v1.8.4 +[1.8.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.2...v1.8.3 +[1.8.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.1...v1.8.2 +[1.8.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.8.0...v1.8.1 +[1.8.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.6...v1.8.0 +[1.7.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.5...v1.7.6 +[1.7.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.4...v1.7.5 +[1.7.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.3...v1.7.4 +[1.7.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.2...v1.7.3 +[1.7.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.1...v1.7.2 +[1.7.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.7.0...v1.7.1 +[1.7.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.6.3...v1.7.0 +[1.6.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.6.2...v1.6.3 +[1.6.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.6.1...v1.6.2 +[1.6.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.6.0...v1.6.1 +[1.6.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.5.2...v1.6.0 +[1.5.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.5.1...v1.5.2 +[1.5.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.5.0...v1.5.1 +[1.5.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.6...v1.5.0 +[1.4.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.5...v1.4.6 +[1.4.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.4...v1.4.5 +[1.4.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.3...v1.4.4 +[1.4.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.2...v1.4.3 +[1.4.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.1...v1.4.2 +[1.4.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.4.0...v1.4.1 +[1.4.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.3.5...v1.4.0 +[1.3.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.3.4...v1.3.5 +[1.3.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.3.3...v1.3.4 +[1.3.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.3.1...v1.3.3 +[1.3.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.4...v1.2.0 +[1.2.0-canary.8]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.7...v1.2.0-canary.8 +[1.2.0-canary.7]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.6...v1.2.0-canary.7 +[1.2.0-canary.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.5...v1.2.0-canary.6 +[1.2.0-canary.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.4...v1.2.0-canary.5 +[1.2.0-canary.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.3...v1.2.0-canary.4 +[1.1.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.3...v1.1.4 +[1.2.0-canary.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.2.0-canary.0...v1.2.0-canary.1 +[1.1.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.2...v1.1.3 +[1.2.0-canary.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.2...v1.2.0-canary.0 +[1.1.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.1...v1.1.2 +[1.1.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.6...v1.1.0 +[1.0.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.5...v1.0.6 +[1.0.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.4...v1.0.5 +[1.0.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.3...v1.0.4 +[1.0.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.2...v1.0.3 +[1.0.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.1...v1.0.2 +[1.0.1]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.10...v1.0.0 +[1.0.0-beta.10]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.9...v1.0.0-beta.10 +[1.0.0-beta.9]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.8...v1.0.0-beta.9 +[1.0.0-beta.8]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.7...v1.0.0-beta.8 +[1.0.0-beta.7]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.6...v1.0.0-beta.7 +[1.0.0-beta.6]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.5...v1.0.0-beta.6 +[1.0.0-beta.5]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.4...v1.0.0-beta.5 +[1.0.0-beta.4]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.3...v1.0.0-beta.4 +[1.0.0-beta.3]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.2...v1.0.0-beta.3 +[1.0.0-beta.2]: https://github.com/tailwindlabs/tailwindcss/compare/v1.0.0-beta.1...v1.0.0-beta.2 +[1.0.0-beta.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.7.4...v1.0.0-beta.1 +[0.7.4]: https://github.com/tailwindlabs/tailwindcss/compare/v0.7.3...v0.7.4 +[0.7.3]: https://github.com/tailwindlabs/tailwindcss/compare/v0.7.2...v0.7.3 +[0.7.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.7.1...v0.7.2 +[0.7.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.7.0...v0.7.1 +[0.7.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.6...v0.7.0 +[0.6.6]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.5...v0.6.6 +[0.6.5]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.4...v0.6.5 +[0.6.4]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.3...v0.6.4 +[0.6.3]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.2...v0.6.3 +[0.6.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.1...v0.6.2 +[0.6.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.6.0...v0.6.1 +[0.6.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.5.3...v0.6.0 +[0.5.3]: https://github.com/tailwindlabs/tailwindcss/compare/v0.5.2...v0.5.3 +[0.5.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.5.1...v0.5.2 +[0.5.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.5.0...v0.5.1 +[0.5.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.4.3...v0.5.0 +[0.4.3]: https://github.com/tailwindlabs/tailwindcss/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.3.0...v0.4.0 +[0.3.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.2.2...v0.3.0 +[0.2.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.6...v0.2.0 +[0.1.6]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.5...v0.1.6 +[0.1.5]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/tailwindlabs/tailwindcss/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/tailwindlabs/tailwindcss/releases/tag/v0.1.0 diff --git a/crates/node/npm/android-arm-eabi/package.json b/crates/node/npm/android-arm-eabi/package.json index d8ec4ab95d00..f786a9acea9e 100644 --- a/crates/node/npm/android-arm-eabi/package.json +++ b/crates/node/npm/android-arm-eabi/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-android-arm-eabi", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/android-arm64/package.json b/crates/node/npm/android-arm64/package.json index 5eb9a0fa19d6..adc7a56c43c6 100644 --- a/crates/node/npm/android-arm64/package.json +++ b/crates/node/npm/android-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-android-arm64", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/darwin-arm64/package.json b/crates/node/npm/darwin-arm64/package.json index 619f1c8b779d..2f20b3232fa0 100644 --- a/crates/node/npm/darwin-arm64/package.json +++ b/crates/node/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-darwin-arm64", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/darwin-x64/package.json b/crates/node/npm/darwin-x64/package.json index 2c7b5ab1a824..3169e58dc9fc 100644 --- a/crates/node/npm/darwin-x64/package.json +++ b/crates/node/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-darwin-x64", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/freebsd-x64/package.json b/crates/node/npm/freebsd-x64/package.json index 6090f34618db..1d7f1390bd64 100644 --- a/crates/node/npm/freebsd-x64/package.json +++ b/crates/node/npm/freebsd-x64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-freebsd-x64", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm-gnueabihf/package.json b/crates/node/npm/linux-arm-gnueabihf/package.json index 4c8dc4a44d90..38a82b6baa62 100644 --- a/crates/node/npm/linux-arm-gnueabihf/package.json +++ b/crates/node/npm/linux-arm-gnueabihf/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm-gnueabihf", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm64-gnu/package.json b/crates/node/npm/linux-arm64-gnu/package.json index f70d59c02fac..25f2012c7744 100644 --- a/crates/node/npm/linux-arm64-gnu/package.json +++ b/crates/node/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm64-gnu", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm64-musl/package.json b/crates/node/npm/linux-arm64-musl/package.json index 7fd9e903b78d..eec1330699b2 100644 --- a/crates/node/npm/linux-arm64-musl/package.json +++ b/crates/node/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm64-musl", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-x64-gnu/package.json b/crates/node/npm/linux-x64-gnu/package.json index d5d66ee0d1a1..8df51808885c 100644 --- a/crates/node/npm/linux-x64-gnu/package.json +++ b/crates/node/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-x64-gnu", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-x64-musl/package.json b/crates/node/npm/linux-x64-musl/package.json index 3e8d92d99259..0013c4b287b5 100644 --- a/crates/node/npm/linux-x64-musl/package.json +++ b/crates/node/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-x64-musl", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/win32-arm64-msvc/package.json b/crates/node/npm/win32-arm64-msvc/package.json index b73a264cd1ba..c8721d3ba78c 100644 --- a/crates/node/npm/win32-arm64-msvc/package.json +++ b/crates/node/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-win32-arm64-msvc", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/win32-x64-msvc/package.json b/crates/node/npm/win32-x64-msvc/package.json index 3119f85b1927..b135728598b5 100644 --- a/crates/node/npm/win32-x64-msvc/package.json +++ b/crates/node/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-win32-x64-msvc", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/package.json b/crates/node/package.json index ac069ef8e1b2..d1588c89247b 100644 --- a/crates/node/package.json +++ b/crates/node/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide", - "version": "4.0.0", + "version": "4.0.1", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/oxide/src/lib.rs b/crates/oxide/src/lib.rs index 4631cabc843c..557e87ef5f78 100644 --- a/crates/oxide/src/lib.rs +++ b/crates/oxide/src/lib.rs @@ -447,7 +447,14 @@ fn read_changed_content(c: ChangedContent) -> Option> { }; match extension { - Some("svelte") => Some(content.replace(" class:", " ")), + // Angular class shorthand + Some("html") => Some(content.replace("[class.", "[")), + Some("svelte") => Some( + content + .replace(" class:", " ") + .replace("\tclass:", " ") + .replace("\nclass:", " "), + ), _ => Some(content), } } diff --git a/crates/oxide/src/parser.rs b/crates/oxide/src/parser.rs index d6d2df1433c3..12791ae780ac 100644 --- a/crates/oxide/src/parser.rs +++ b/crates/oxide/src/parser.rs @@ -334,6 +334,26 @@ impl<'a> Extractor<'a> { return ValidationResult::Restart; } + // Only allow parentheses for the shorthand arbitrary custom properties syntax + if let Some(index) = utility.find(b"(") { + let mut skip_parens_check = false; + let start_brace_index = utility.find(b"["); + let end_brace_index = utility.find(b"]"); + + match (start_brace_index, end_brace_index) { + (Some(start_brace_index), Some(end_brace_index)) => { + if start_brace_index < index && end_brace_index > index { + skip_parens_check = true; + } + } + _ => {} + } + + if !skip_parens_check && !utility[index + 1..].starts_with(b"--") { + return ValidationResult::Restart; + } + } + // Pluck out the part that we are interested in. let utility = &utility[offset..(utility.len() - offset_end)]; @@ -911,9 +931,6 @@ impl<'a> Extractor<'a> { fn generate_slices(&mut self, candidate: &'a [u8]) -> ParseAction<'a> { match self.without_surrounding() { Bracketing::None => ParseAction::SingleCandidate(candidate), - Bracketing::Included(sliceable) if sliceable == candidate => { - ParseAction::SingleCandidate(candidate) - } Bracketing::Included(sliceable) | Bracketing::Wrapped(sliceable) => { if candidate == sliceable { ParseAction::SingleCandidate(candidate) @@ -1117,7 +1134,7 @@ mod test { assert_eq!(candidates, vec!["something"]); let candidates = run(" [feature(slice_as_chunks)]", false); - assert_eq!(candidates, vec!["feature(slice_as_chunks)"]); + assert_eq!(candidates, vec!["feature", "slice_as_chunks"]); let candidates = run("![feature(slice_as_chunks)]", false); assert!(candidates.is_empty()); @@ -1213,9 +1230,8 @@ mod test { #[test] fn ignores_arbitrary_property_ish_things() { - // FIXME: () are only valid in an arbitrary let candidates = run(" [feature(slice_as_chunks)]", false); - assert_eq!(candidates, vec!["feature(slice_as_chunks)",]); + assert_eq!(candidates, vec!["feature", "slice_as_chunks",]); } #[test] @@ -1637,7 +1653,6 @@ mod test { #[test] fn arbitrary_properties_are_not_picked_up_after_an_escape() { - _please_trace(); let candidates = run( r#" @@ -1648,4 +1663,48 @@ mod test { assert_eq!(candidates, vec!["!code", "a"]); } + + #[test] + fn test_find_candidates_in_braces_inside_brackets() { + let candidates = run( + r#" + const classes = [wrapper("bg-red-500")] + "#, + false, + ); + + assert_eq!( + candidates, + vec!["const", "classes", "wrapper", "bg-red-500"] + ); + } + + #[test] + fn test_is_valid_candidate_string() { + assert_eq!( + Extractor::is_valid_candidate_string(b"foo"), + ValidationResult::Valid + ); + assert_eq!( + Extractor::is_valid_candidate_string(b"foo-(--color-red-500)"), + ValidationResult::Valid + ); + assert_eq!( + Extractor::is_valid_candidate_string(b"bg-[url(foo)]"), + ValidationResult::Valid + ); + assert_eq!( + Extractor::is_valid_candidate_string(b"group-foo/(--bar)"), + ValidationResult::Valid + ); + + assert_eq!( + Extractor::is_valid_candidate_string(b"foo(\"bg-red-500\")"), + ValidationResult::Restart + ); + assert_eq!( + Extractor::is_valid_candidate_string(b"foo-("), + ValidationResult::Restart + ); + } } diff --git a/crates/oxide/src/scanner/allowed_paths.rs b/crates/oxide/src/scanner/allowed_paths.rs index 8a584d06fb2c..b906335f8979 100644 --- a/crates/oxide/src/scanner/allowed_paths.rs +++ b/crates/oxide/src/scanner/allowed_paths.rs @@ -33,17 +33,11 @@ pub fn resolve_allowed_paths(root: &Path) -> impl Iterator { #[tracing::instrument(skip_all)] pub fn resolve_paths(root: &Path) -> impl Iterator { - WalkBuilder::new(root) - .hidden(false) - .require_git(false) - .build() - .filter_map(Result::ok) + create_walk_builder(root).build().filter_map(Result::ok) } pub fn read_dir(root: &Path, depth: Option) -> impl Iterator { - WalkBuilder::new(root) - .hidden(false) - .require_git(false) + create_walk_builder(root) .max_depth(depth) .filter_entry(move |entry| match entry.file_type() { Some(file_type) if file_type.is_dir() => match entry.file_name().to_str() { @@ -59,6 +53,61 @@ pub fn read_dir(root: &Path, depth: Option) -> impl Iterator WalkBuilder { + let mut builder = WalkBuilder::new(root); + + // Scan hidden files / directories + builder.hidden(false); + + // By default, allow .gitignore files to be used regardless of whether or not + // a .git directory is present. This is an optimization for when projects + // are first created and may not be in a git repo yet. + builder.require_git(false); + + // Don't descend into .git directories inside the root folder + // This is necessary when `root` contains the `.git` dir. + builder.filter_entry(|entry| entry.file_name() != ".git"); + + // If we are in a git repo then require it to ensure that only rules within + // the repo are used. For example, we don't want to consider a .gitignore file + // in the user's home folder if we're in a git repo. + // + // The alternative is using a call like `.parents(false)` but that will + // prevent looking at parent directories for .gitignore files from within + // the repo and that's not what we want. + // + // For example, in a project with this structure: + // + // home + // .gitignore + // my-project + // .gitignore + // apps + // .gitignore + // web + // {root} + // + // We do want to consider all .gitignore files listed: + // - home/.gitignore + // - my-project/.gitignore + // - my-project/apps/.gitignore + // + // However, if a repo is initialized inside my-project then only the following + // make sense for consideration: + // - my-project/.gitignore + // - my-project/apps/.gitignore + // + // Setting the require_git(true) flag conditionally allows us to do this. + for parent in root.ancestors() { + if parent.join(".git").exists() { + builder.require_git(true); + break; + } + } + + builder +} + pub fn is_allowed_content_path(path: &Path) -> bool { // Skip known ignored files if path diff --git a/crates/oxide/src/scanner/detect_sources.rs b/crates/oxide/src/scanner/detect_sources.rs index a5fcae731dea..6828e8eca7c7 100644 --- a/crates/oxide/src/scanner/detect_sources.rs +++ b/crates/oxide/src/scanner/detect_sources.rs @@ -112,13 +112,16 @@ impl DetectSources { continue; } - // If we are in a directory where the parent is a forced static directory, then this - // will become a forced static directory as well. - if forced_static_directories.contains(&entry.path().parent().unwrap().to_path_buf()) - { - forced_static_directories.push(entry.path().to_path_buf()); - root_directories.insert(entry.path().to_path_buf()); - continue; + // Although normally very unlikely, if running inside a dockerfile + // the current directory might be "/" with no parent + if let Some(parent) = entry.path().parent() { + // If we are in a directory where the parent is a forced static directory, then this + // will become a forced static directory as well. + if forced_static_directories.contains(&parent.to_path_buf()) { + forced_static_directories.push(entry.path().to_path_buf()); + root_directories.insert(entry.path().to_path_buf()); + continue; + } } // If we are in a directory, and the directory is git ignored, then we don't have to diff --git a/crates/oxide/tests/scanner.rs b/crates/oxide/tests/scanner.rs index cdec9a44dd26..e14bfc7316f7 100644 --- a/crates/oxide/tests/scanner.rs +++ b/crates/oxide/tests/scanner.rs @@ -323,14 +323,33 @@ mod scanner { ("foo.jpg", "xl:font-bold"), // A file that is ignored ("foo.html", "lg:font-bold"), + // An Angular file using the class shorthand syntax + ( + "index.angular.html", + "
", + ), // A svelte file with `class:foo="bar"` syntax ("index.svelte", "
"), + ("index2.svelte", ""), + ("index3.svelte", ""), + ("index4.svelte", ""), ]) .1; assert_eq!( candidates, - vec!["condition", "div", "font-bold", "md:flex", "px-4"] + vec![ + "bool", + "condition", + "div", + "font-bold", + "md:flex", + "px-4", + "px-5", + "px-6", + "px-7", + "underline" + ] ); } @@ -586,4 +605,121 @@ mod scanner { ] ); } + + #[test] + fn skips_ignore_files_outside_of_a_repo() { + // Create a temporary working directory + let dir = tempdir().unwrap().into_path(); + + // Create files + create_files_in( + &dir, + &[ + // This file should always be picked up + ("home/project/apps/web/index.html", "content-['index.html']"), + // Set up various ignore rules + ("home/.gitignore", "ignore-home.html"), + ("home/project/.gitignore", "ignore-project.html"), + ("home/project/apps/.gitignore", "ignore-apps.html"), + ("home/project/apps/web/.gitignore", "ignore-web.html"), + // Some of these should be ignored depending on which dir is the repo root + ( + "home/project/apps/web/ignore-home.html", + "content-['ignore-home.html']", + ), + ( + "home/project/apps/web/ignore-project.html", + "content-['ignore-project.html']", + ), + ( + "home/project/apps/web/ignore-apps.html", + "content-['ignore-apps.html']", + ), + ( + "home/project/apps/web/ignore-web.html", + "content-['ignore-web.html']", + ), + ], + ); + + let sources = vec![GlobEntry { + base: dir + .join("home/project/apps/web") + .to_string_lossy() + .to_string(), + pattern: "**/*".to_owned(), + }]; + + let candidates = Scanner::new(Some(sources.clone())).scan(); + + // All ignore files are applied because there's no git repo + assert_eq!(candidates, vec!["content-['index.html']".to_owned(),]); + + // Initialize `home` as a git repository and scan again + // The results should be the same as before + _ = Command::new("git") + .arg("init") + .current_dir(dir.join("home")) + .output(); + let candidates = Scanner::new(Some(sources.clone())).scan(); + + assert_eq!(candidates, vec!["content-['index.html']".to_owned(),]); + + // Drop the .git folder + fs::remove_dir_all(dir.join("home/.git")).unwrap(); + + // Initialize `home/project` as a git repository and scan again + _ = Command::new("git") + .arg("init") + .current_dir(dir.join("home/project")) + .output(); + let candidates = Scanner::new(Some(sources.clone())).scan(); + + assert_eq!( + candidates, + vec![ + "content-['ignore-home.html']".to_owned(), + "content-['index.html']".to_owned(), + ] + ); + + // Drop the .git folder + fs::remove_dir_all(dir.join("home/project/.git")).unwrap(); + + // Initialize `home/project/apps` as a git repository and scan again + _ = Command::new("git") + .arg("init") + .current_dir(dir.join("home/project/apps")) + .output(); + let candidates = Scanner::new(Some(sources.clone())).scan(); + + assert_eq!( + candidates, + vec![ + "content-['ignore-home.html']".to_owned(), + "content-['ignore-project.html']".to_owned(), + "content-['index.html']".to_owned(), + ] + ); + + // Drop the .git folder + fs::remove_dir_all(dir.join("home/project/apps/.git")).unwrap(); + + // Initialize `home/project/apps` as a git repository and scan again + _ = Command::new("git") + .arg("init") + .current_dir(dir.join("home/project/apps/web")) + .output(); + let candidates = Scanner::new(Some(sources.clone())).scan(); + + assert_eq!( + candidates, + vec![ + "content-['ignore-apps.html']".to_owned(), + "content-['ignore-home.html']".to_owned(), + "content-['ignore-project.html']".to_owned(), + "content-['index.html']".to_owned(), + ] + ); + } } diff --git a/integrations/cli/index.test.ts b/integrations/cli/index.test.ts index aff5b108994f..60fc03e421f6 100644 --- a/integrations/cli/index.test.ts +++ b/integrations/cli/index.test.ts @@ -370,7 +370,7 @@ describe.each([ await fs.expectFileToContain('project-a/dist/out.css', [ css` - :root { + :root, :host { } `, ]) @@ -556,6 +556,83 @@ describe.each([ ]) }, ) + + test( + 'git ignore files outside of a repo are not considered', + { + fs: { + // Ignore everything in the "home" directory + 'home/.gitignore': '*', + + // Only ignore files called ignore-*.html in the actual git repo + 'home/project/.gitignore': 'ignore-*.html', + + 'home/project/package.json': json` + { + "type": "module", + "dependencies": { + "tailwindcss": "workspace:^", + "@tailwindcss/cli": "workspace:^" + } + } + `, + + 'home/project/src/index.css': css` @import 'tailwindcss'; `, + 'home/project/src/index.html': html` +
+ `, + 'home/project/src/ignore-1.html': html` +
+ `, + 'home/project/src/ignore-2.html': html` +
+ `, + }, + + installDependencies: false, + }, + async ({ fs, root, exec }) => { + await exec(`pnpm install --ignore-workspace`, { + cwd: path.join(root, 'home/project'), + }) + + // No git repo = all ignore files are considered + await exec(`${command} --input src/index.css --output dist/out.css`, { + cwd: path.join(root, 'home/project'), + }) + + await fs.expectFileNotToContain('./home/project/dist/out.css', [ + candidate`content-['index.html']`, + candidate`content-['ignore-1.html']`, + candidate`content-['ignore-2.html']`, + ]) + + // Make home/project a git repo + // Only ignore files within the repo are considered + await exec(`git init`, { + cwd: path.join(root, 'home/project'), + }) + + await exec(`${command} --input src/index.css --output dist/out.css`, { + cwd: path.join(root, 'home/project'), + }) + + await fs.expectFileToContain('./home/project/dist/out.css', [ + candidate`content-['index.html']`, + ]) + + await fs.expectFileNotToContain('./home/project/dist/out.css', [ + candidate`content-['ignore-1.html']`, + candidate`content-['ignore-2.html']`, + ]) + }, + ) }) test( diff --git a/integrations/utils.ts b/integrations/utils.ts index 4644ece49ab8..20f3fb49ec9e 100644 --- a/integrations/utils.ts +++ b/integrations/utils.ts @@ -32,6 +32,8 @@ interface TestConfig { fs: { [filePath: string]: string | Uint8Array } + + installDependencies?: boolean } interface TestContext { root: string @@ -382,14 +384,18 @@ export function test( await context.fs.write(filename, content) } + let shouldInstallDependencies = config.installDependencies ?? true + try { // In debug mode, the directory is going to be inside the pnpm workspace // of the tailwindcss package. This means that `pnpm install` will run // pnpm install on the workspace instead (expect if the root dir defines // a separate workspace). We work around this by using the // `--ignore-workspace` flag. - let ignoreWorkspace = debug && !config.fs['pnpm-workspace.yaml'] - await context.exec(`pnpm install${ignoreWorkspace ? ' --ignore-workspace' : ''}`) + if (shouldInstallDependencies) { + let ignoreWorkspace = debug && !config.fs['pnpm-workspace.yaml'] + await context.exec(`pnpm install${ignoreWorkspace ? ' --ignore-workspace' : ''}`) + } } catch (error: any) { console.error(error) console.error(error.stdout?.toString()) diff --git a/integrations/vite/ignored-packages.test.ts b/integrations/vite/ignored-packages.test.ts new file mode 100644 index 000000000000..f7f85ff14975 --- /dev/null +++ b/integrations/vite/ignored-packages.test.ts @@ -0,0 +1,81 @@ +import { candidate, css, fetchStyles, html, js, retryAssertion, test, ts, txt } from '../utils' + +const WORKSPACE = { + fs: { + 'package.json': txt` + { + "type": "module", + "dependencies": { + "tailwind-merge": "^2", + "@tailwindcss/vite": "workspace:^", + "tailwindcss": "workspace:^" + }, + "devDependencies": { + "vite": "^6" + } + } + `, + 'vite.config.ts': ts` + import tailwindcss from '@tailwindcss/vite' + import { defineConfig } from 'vite' + + export default defineConfig({ + build: { cssMinify: false }, + plugins: [tailwindcss()], + }) + `, + 'index.html': html` + + + + + `, + 'src/index.js': js` + import { twMerge } from 'tailwind-merge' + + twMerge('underline') + + console.log('underline') + `, + 'src/index.css': css`@import 'tailwindcss/utilities' layer(utilities);`, + }, +} + +test( + 'does not scan tailwind-merge in production builds', + WORKSPACE, + async ({ fs, exec, expect }) => { + await exec('pnpm vite build') + + let files = await fs.glob('dist/**/*.css') + expect(files).toHaveLength(1) + let [, content] = files[0] + + expect(content).toMatchInlineSnapshot(` + "@layer utilities { + .underline { + text-decoration-line: underline; + } + } + " + `) + }, +) + +test('does not scan tailwind-merge in dev builds', WORKSPACE, async ({ spawn, expect }) => { + let process = await spawn('pnpm vite dev') + await process.onStdout((m) => m.includes('ready in')) + + let url = '' + await process.onStdout((m) => { + let match = /Local:\s*(http.*)\//.exec(m) + if (match) url = match[1] + return Boolean(url) + }) + + await retryAssertion(async () => { + let styles = await fetchStyles(url, '/index.html') + + expect(styles).not.toContain(candidate`flex`) + }) +}) diff --git a/packages/@tailwindcss-browser/package.json b/packages/@tailwindcss-browser/package.json index 420c2faf7d41..5758c89547eb 100644 --- a/packages/@tailwindcss-browser/package.json +++ b/packages/@tailwindcss-browser/package.json @@ -1,10 +1,10 @@ { "name": "@tailwindcss/browser", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", - "main": "./dist/index.mjs", - "browser": "./dist/index.mjs", + "main": "./dist/index.global.js", + "browser": "./dist/index.global.js", "repository": { "type": "git", "url": "https://github.com/tailwindlabs/tailwindcss.git", @@ -19,7 +19,7 @@ "test:ui": "playwright test" }, "exports": { - ".": "./dist/index.mjs", + ".": "./dist/index.global.js", "./package.json": "./package.json" }, "files": [ diff --git a/packages/@tailwindcss-browser/tsup.config.ts b/packages/@tailwindcss-browser/tsup.config.ts index 57fa6d7dc321..5a6d78273e65 100644 --- a/packages/@tailwindcss-browser/tsup.config.ts +++ b/packages/@tailwindcss-browser/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'tsup' export default defineConfig({ - format: ['esm'], + format: ['iife'], clean: true, minify: true, entry: ['src/index.ts'], diff --git a/packages/@tailwindcss-cli/package.json b/packages/@tailwindcss-cli/package.json index 90ad3b80dcbe..63b35d2fb3c8 100644 --- a/packages/@tailwindcss-cli/package.json +++ b/packages/@tailwindcss-cli/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/cli", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-node/package.json b/packages/@tailwindcss-node/package.json index 1978c69f7935..fb5333b8e72b 100644 --- a/packages/@tailwindcss-node/package.json +++ b/packages/@tailwindcss-node/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/node", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-postcss/package.json b/packages/@tailwindcss-postcss/package.json index 98f23e318c35..00b49bdf5783 100644 --- a/packages/@tailwindcss-postcss/package.json +++ b/packages/@tailwindcss-postcss/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/postcss", - "version": "4.0.0", + "version": "4.0.1", "description": "PostCSS plugin for Tailwind CSS, a utility-first CSS framework for rapidly building custom user interfaces", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-postcss/src/__snapshots__/index.test.ts.snap b/packages/@tailwindcss-postcss/src/__snapshots__/index.test.ts.snap index 2dcb76ba54d5..d401ace41bed 100644 --- a/packages/@tailwindcss-postcss/src/__snapshots__/index.test.ts.snap +++ b/packages/@tailwindcss-postcss/src/__snapshots__/index.test.ts.snap @@ -2,7 +2,7 @@ exports[`\`@import 'tailwindcss'\` is replaced with the generated CSS 1`] = ` "@layer theme { - :root { + :root, :host { --font-sans: ui-sans-serif, system-ui, 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; diff --git a/packages/@tailwindcss-postcss/src/index.test.ts b/packages/@tailwindcss-postcss/src/index.test.ts index 50f72a13d992..97eedb95d183 100644 --- a/packages/@tailwindcss-postcss/src/index.test.ts +++ b/packages/@tailwindcss-postcss/src/index.test.ts @@ -280,7 +280,7 @@ test('runs `Once` plugins in the right order', async () => { ) expect(result.css.trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -297,7 +297,7 @@ test('runs `Once` plugins in the right order', async () => { }" `) expect(after).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } diff --git a/packages/@tailwindcss-standalone/package.json b/packages/@tailwindcss-standalone/package.json index 8705696e58cb..d45ad2037f5e 100644 --- a/packages/@tailwindcss-standalone/package.json +++ b/packages/@tailwindcss-standalone/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/standalone", - "version": "4.0.0", + "version": "4.0.1", "private": true, "description": "Standalone CLI for Tailwind CSS", "license": "MIT", diff --git a/packages/@tailwindcss-upgrade/package.json b/packages/@tailwindcss-upgrade/package.json index b3b7bbedfe9b..2274dd358018 100644 --- a/packages/@tailwindcss-upgrade/package.json +++ b/packages/@tailwindcss-upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/upgrade", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-upgrade/src/migrate.ts b/packages/@tailwindcss-upgrade/src/migrate.ts index 53b2282561c5..45e75849622d 100644 --- a/packages/@tailwindcss-upgrade/src/migrate.ts +++ b/packages/@tailwindcss-upgrade/src/migrate.ts @@ -435,7 +435,7 @@ export async function linkConfigs( // If the path points to a file in the same directory, `path.relative` will // remove the leading `./` and we need to add it back in order to still // consider the path relative - if (!relative.startsWith('.')) { + if (!relative.startsWith('.') && !path.isAbsolute(relative)) { relative = './' + relative } diff --git a/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.test.ts b/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.test.ts index 62355dc6f3f1..c9b459d84b6b 100644 --- a/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.test.ts +++ b/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.test.ts @@ -32,6 +32,11 @@ test.each([ // generates something. Converting it to `text-1/2` doesn't produce anything. ['text-[1/2]', 'text-[1/2]'], + // Leading is special, because `leading-[123]` is the direct value of 123, but + // `leading-123` maps to `calc(--spacing(123))`. + ['leading-[1]', 'leading-none'], + ['leading-[123]', 'leading-[123]'], + ['data-[selected]:flex', 'data-selected:flex'], ['data-[foo=bar]:flex', 'data-[foo=bar]:flex'], diff --git a/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.ts b/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.ts index 77a303dc3d96..64c06a8f3ea9 100644 --- a/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.ts +++ b/packages/@tailwindcss-upgrade/src/template/codemods/arbitrary-value-to-bare-value.ts @@ -64,6 +64,23 @@ export function arbitraryValueToBareValue( clone.value?.kind === 'arbitrary' && clone.value.dataType === null ) { + if (clone.root === 'leading') { + // leading-[1] -> leading-none + if (clone.value.value === '1') { + changed = true + clone.value = { + kind: 'named', + value: 'none', + fraction: null, + } + } + + // Keep leading-[] as leading-[] + else { + continue + } + } + let parts = segment(clone.value.value, '/') if (parts.every((part) => isPositiveInteger(part))) { changed = true diff --git a/packages/@tailwindcss-upgrade/src/template/prepare-config.ts b/packages/@tailwindcss-upgrade/src/template/prepare-config.ts index f5a817d40ea3..e936df6a3332 100644 --- a/packages/@tailwindcss-upgrade/src/template/prepare-config.ts +++ b/packages/@tailwindcss-upgrade/src/template/prepare-config.ts @@ -40,7 +40,7 @@ export async function prepareConfig( // If the path points to a file in the same directory, `path.relative` will // remove the leading `./` and we need to add it back in order to still // consider the path relative - if (!relative.startsWith('.')) { + if (!relative.startsWith('.') && !path.isAbsolute(relative)) { relative = './' + relative } @@ -49,7 +49,7 @@ export async function prepareConfig( let newPrefix = userConfig.prefix ? migratePrefix(userConfig.prefix) : null let input = css` @import 'tailwindcss' ${newPrefix ? `prefix(${newPrefix})` : ''}; - @config './${relative}'; + @config '${relative}'; ` let [compiler, designSystem] = await Promise.all([ diff --git a/packages/@tailwindcss-vite/package.json b/packages/@tailwindcss-vite/package.json index 2fb5e0e8b046..bd8682a9ddfb 100644 --- a/packages/@tailwindcss-vite/package.json +++ b/packages/@tailwindcss-vite/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/vite", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-vite/src/index.ts b/packages/@tailwindcss-vite/src/index.ts index 2fedf73231f2..c8976c0276da 100644 --- a/packages/@tailwindcss-vite/src/index.ts +++ b/packages/@tailwindcss-vite/src/index.ts @@ -9,6 +9,8 @@ import type { Plugin, ResolvedConfig, Rollup, Update, ViteDevServer } from 'vite const DEBUG = env.DEBUG const SPECIAL_QUERY_RE = /[?&](raw|url)\b/ +const IGNORED_DEPENDENCIES = ['tailwind-merge'] + export default function tailwindcss(): Plugin[] { let servers: ViteDevServer[] = [] let config: ResolvedConfig | null = null @@ -62,6 +64,18 @@ export default function tailwindcss(): Plugin[] { }) function scanFile(id: string, content: string, extension: string, isSSR: boolean) { + for (let dependency of IGNORED_DEPENDENCIES) { + // We validated that Vite IDs always use posix style path separators, even on Windows. + // In dev build, Vite precompiles dependencies + if (id.includes(`.vite/deps/${dependency}.js`)) { + return + } + // In prod builds, use the node_modules path + if (id.includes(`/node_modules/${dependency}/`)) { + return + } + } + let updated = false for (let candidate of moduleGraphScanner.scanFiles([{ content, extension }])) { updated = true diff --git a/packages/tailwindcss/package.json b/packages/tailwindcss/package.json index 14e47b358d3d..29b92bef2394 100644 --- a/packages/tailwindcss/package.json +++ b/packages/tailwindcss/package.json @@ -1,6 +1,6 @@ { "name": "tailwindcss", - "version": "4.0.0", + "version": "4.0.1", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/tailwindcss/src/__snapshots__/index.test.ts.snap b/packages/tailwindcss/src/__snapshots__/index.test.ts.snap index 5c7fedca01f8..9ed291c3908a 100644 --- a/packages/tailwindcss/src/__snapshots__/index.test.ts.snap +++ b/packages/tailwindcss/src/__snapshots__/index.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`compiling CSS > \`@tailwind utilities\` is replaced by utilities using the default theme 1`] = ` -":root { +":root, :host { --font-sans: ui-sans-serif, system-ui, 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; diff --git a/packages/tailwindcss/src/__snapshots__/intellisense.test.ts.snap b/packages/tailwindcss/src/__snapshots__/intellisense.test.ts.snap index 3f95c9fafcb1..d58d605473a1 100644 --- a/packages/tailwindcss/src/__snapshots__/intellisense.test.ts.snap +++ b/packages/tailwindcss/src/__snapshots__/intellisense.test.ts.snap @@ -11,6 +11,33 @@ exports[`getClassList 1`] = ` "-bg-conic-0/shorter", "-bg-conic-0/increasing", "-bg-conic-0/decreasing", + "-bg-conic-30", + "-bg-conic-30/oklab", + "-bg-conic-30/oklch", + "-bg-conic-30/srgb", + "-bg-conic-30/hsl", + "-bg-conic-30/longer", + "-bg-conic-30/shorter", + "-bg-conic-30/increasing", + "-bg-conic-30/decreasing", + "-bg-conic-60", + "-bg-conic-60/oklab", + "-bg-conic-60/oklch", + "-bg-conic-60/srgb", + "-bg-conic-60/hsl", + "-bg-conic-60/longer", + "-bg-conic-60/shorter", + "-bg-conic-60/increasing", + "-bg-conic-60/decreasing", + "-bg-conic-90", + "-bg-conic-90/oklab", + "-bg-conic-90/oklch", + "-bg-conic-90/srgb", + "-bg-conic-90/hsl", + "-bg-conic-90/longer", + "-bg-conic-90/shorter", + "-bg-conic-90/increasing", + "-bg-conic-90/decreasing", "-bg-conic-120", "-bg-conic-120/oklab", "-bg-conic-120/oklch", @@ -65,15 +92,6 @@ exports[`getClassList 1`] = ` "-bg-conic-270/shorter", "-bg-conic-270/increasing", "-bg-conic-270/decreasing", - "-bg-conic-30", - "-bg-conic-30/oklab", - "-bg-conic-30/oklch", - "-bg-conic-30/srgb", - "-bg-conic-30/hsl", - "-bg-conic-30/longer", - "-bg-conic-30/shorter", - "-bg-conic-30/increasing", - "-bg-conic-30/decreasing", "-bg-conic-300", "-bg-conic-300/oklab", "-bg-conic-300/oklch", @@ -92,24 +110,6 @@ exports[`getClassList 1`] = ` "-bg-conic-330/shorter", "-bg-conic-330/increasing", "-bg-conic-330/decreasing", - "-bg-conic-60", - "-bg-conic-60/oklab", - "-bg-conic-60/oklch", - "-bg-conic-60/srgb", - "-bg-conic-60/hsl", - "-bg-conic-60/longer", - "-bg-conic-60/shorter", - "-bg-conic-60/increasing", - "-bg-conic-60/decreasing", - "-bg-conic-90", - "-bg-conic-90/oklab", - "-bg-conic-90/oklch", - "-bg-conic-90/srgb", - "-bg-conic-90/hsl", - "-bg-conic-90/longer", - "-bg-conic-90/shorter", - "-bg-conic-90/increasing", - "-bg-conic-90/decreasing", "-bg-linear-0", "-bg-linear-0/oklab", "-bg-linear-0/oklch", @@ -119,6 +119,33 @@ exports[`getClassList 1`] = ` "-bg-linear-0/shorter", "-bg-linear-0/increasing", "-bg-linear-0/decreasing", + "-bg-linear-30", + "-bg-linear-30/oklab", + "-bg-linear-30/oklch", + "-bg-linear-30/srgb", + "-bg-linear-30/hsl", + "-bg-linear-30/longer", + "-bg-linear-30/shorter", + "-bg-linear-30/increasing", + "-bg-linear-30/decreasing", + "-bg-linear-60", + "-bg-linear-60/oklab", + "-bg-linear-60/oklch", + "-bg-linear-60/srgb", + "-bg-linear-60/hsl", + "-bg-linear-60/longer", + "-bg-linear-60/shorter", + "-bg-linear-60/increasing", + "-bg-linear-60/decreasing", + "-bg-linear-90", + "-bg-linear-90/oklab", + "-bg-linear-90/oklch", + "-bg-linear-90/srgb", + "-bg-linear-90/hsl", + "-bg-linear-90/longer", + "-bg-linear-90/shorter", + "-bg-linear-90/increasing", + "-bg-linear-90/decreasing", "-bg-linear-120", "-bg-linear-120/oklab", "-bg-linear-120/oklch", @@ -173,15 +200,6 @@ exports[`getClassList 1`] = ` "-bg-linear-270/shorter", "-bg-linear-270/increasing", "-bg-linear-270/decreasing", - "-bg-linear-30", - "-bg-linear-30/oklab", - "-bg-linear-30/oklch", - "-bg-linear-30/srgb", - "-bg-linear-30/hsl", - "-bg-linear-30/longer", - "-bg-linear-30/shorter", - "-bg-linear-30/increasing", - "-bg-linear-30/decreasing", "-bg-linear-300", "-bg-linear-300/oklab", "-bg-linear-300/oklch", @@ -200,65 +218,43 @@ exports[`getClassList 1`] = ` "-bg-linear-330/shorter", "-bg-linear-330/increasing", "-bg-linear-330/decreasing", - "-bg-linear-60", - "-bg-linear-60/oklab", - "-bg-linear-60/oklch", - "-bg-linear-60/srgb", - "-bg-linear-60/hsl", - "-bg-linear-60/longer", - "-bg-linear-60/shorter", - "-bg-linear-60/increasing", - "-bg-linear-60/decreasing", - "-bg-linear-90", - "-bg-linear-90/oklab", - "-bg-linear-90/oklch", - "-bg-linear-90/srgb", - "-bg-linear-90/hsl", - "-bg-linear-90/longer", - "-bg-linear-90/shorter", - "-bg-linear-90/increasing", - "-bg-linear-90/decreasing", "-bottom-0", "-bottom-0.5", "-bottom-1", "-bottom-1.5", + "-bottom-2", + "-bottom-2.5", + "-bottom-3", + "-bottom-3.5", + "-bottom-4", + "-bottom-5", + "-bottom-6", + "-bottom-7", + "-bottom-8", + "-bottom-9", "-bottom-10", "-bottom-11", "-bottom-12", "-bottom-14", "-bottom-16", - "-bottom-2", - "-bottom-2.5", "-bottom-20", "-bottom-24", "-bottom-28", - "-bottom-3", - "-bottom-3.5", "-bottom-32", "-bottom-36", - "-bottom-4", "-bottom-40", "-bottom-44", "-bottom-48", - "-bottom-5", "-bottom-52", "-bottom-56", - "-bottom-6", "-bottom-60", "-bottom-64", - "-bottom-7", "-bottom-72", - "-bottom-8", "-bottom-80", - "-bottom-9", "-bottom-96", "-bottom-full", "-bottom-px", "-col-end-1", - "-col-end-10", - "-col-end-11", - "-col-end-12", - "-col-end-13", "-col-end-2", "-col-end-3", "-col-end-4", @@ -267,11 +263,11 @@ exports[`getClassList 1`] = ` "-col-end-7", "-col-end-8", "-col-end-9", + "-col-end-10", + "-col-end-11", + "-col-end-12", + "-col-end-13", "-col-start-1", - "-col-start-10", - "-col-start-11", - "-col-start-12", - "-col-start-13", "-col-start-2", "-col-start-3", "-col-start-4", @@ -280,39 +276,43 @@ exports[`getClassList 1`] = ` "-col-start-7", "-col-start-8", "-col-start-9", + "-col-start-10", + "-col-start-11", + "-col-start-12", + "-col-start-13", "-end-0", "-end-0.5", "-end-1", "-end-1.5", + "-end-2", + "-end-2.5", + "-end-3", + "-end-3.5", + "-end-4", + "-end-5", + "-end-6", + "-end-7", + "-end-8", + "-end-9", "-end-10", "-end-11", "-end-12", "-end-14", "-end-16", - "-end-2", - "-end-2.5", "-end-20", "-end-24", "-end-28", - "-end-3", - "-end-3.5", "-end-32", "-end-36", - "-end-4", "-end-40", "-end-44", "-end-48", - "-end-5", "-end-52", "-end-56", - "-end-6", "-end-60", "-end-64", - "-end-7", "-end-72", - "-end-8", "-end-80", - "-end-9", "-end-96", "-end-full", "-end-px", @@ -320,70 +320,70 @@ exports[`getClassList 1`] = ` "-indent-0.5", "-indent-1", "-indent-1.5", + "-indent-2", + "-indent-2.5", + "-indent-3", + "-indent-3.5", + "-indent-4", + "-indent-5", + "-indent-6", + "-indent-7", + "-indent-8", + "-indent-9", "-indent-10", "-indent-11", "-indent-12", "-indent-14", "-indent-16", - "-indent-2", - "-indent-2.5", "-indent-20", "-indent-24", "-indent-28", - "-indent-3", - "-indent-3.5", "-indent-32", "-indent-36", - "-indent-4", "-indent-40", "-indent-44", "-indent-48", - "-indent-5", "-indent-52", "-indent-56", - "-indent-6", "-indent-60", "-indent-64", - "-indent-7", "-indent-72", - "-indent-8", "-indent-80", - "-indent-9", "-indent-96", "-indent-px", "-inset-0", "-inset-0.5", "-inset-1", "-inset-1.5", + "-inset-2", + "-inset-2.5", + "-inset-3", + "-inset-3.5", + "-inset-4", + "-inset-5", + "-inset-6", + "-inset-7", + "-inset-8", + "-inset-9", "-inset-10", "-inset-11", "-inset-12", "-inset-14", "-inset-16", - "-inset-2", - "-inset-2.5", "-inset-20", "-inset-24", "-inset-28", - "-inset-3", - "-inset-3.5", "-inset-32", "-inset-36", - "-inset-4", "-inset-40", "-inset-44", "-inset-48", - "-inset-5", "-inset-52", "-inset-56", - "-inset-6", "-inset-60", "-inset-64", - "-inset-7", "-inset-72", - "-inset-8", "-inset-80", - "-inset-9", "-inset-96", "-inset-full", "-inset-px", @@ -391,35 +391,35 @@ exports[`getClassList 1`] = ` "-inset-x-0.5", "-inset-x-1", "-inset-x-1.5", + "-inset-x-2", + "-inset-x-2.5", + "-inset-x-3", + "-inset-x-3.5", + "-inset-x-4", + "-inset-x-5", + "-inset-x-6", + "-inset-x-7", + "-inset-x-8", + "-inset-x-9", "-inset-x-10", "-inset-x-11", "-inset-x-12", "-inset-x-14", "-inset-x-16", - "-inset-x-2", - "-inset-x-2.5", "-inset-x-20", "-inset-x-24", "-inset-x-28", - "-inset-x-3", - "-inset-x-3.5", "-inset-x-32", "-inset-x-36", - "-inset-x-4", "-inset-x-40", "-inset-x-44", "-inset-x-48", - "-inset-x-5", "-inset-x-52", "-inset-x-56", - "-inset-x-6", "-inset-x-60", "-inset-x-64", - "-inset-x-7", "-inset-x-72", - "-inset-x-8", "-inset-x-80", - "-inset-x-9", "-inset-x-96", "-inset-x-full", "-inset-x-px", @@ -427,35 +427,35 @@ exports[`getClassList 1`] = ` "-inset-y-0.5", "-inset-y-1", "-inset-y-1.5", + "-inset-y-2", + "-inset-y-2.5", + "-inset-y-3", + "-inset-y-3.5", + "-inset-y-4", + "-inset-y-5", + "-inset-y-6", + "-inset-y-7", + "-inset-y-8", + "-inset-y-9", "-inset-y-10", "-inset-y-11", "-inset-y-12", "-inset-y-14", "-inset-y-16", - "-inset-y-2", - "-inset-y-2.5", "-inset-y-20", "-inset-y-24", "-inset-y-28", - "-inset-y-3", - "-inset-y-3.5", "-inset-y-32", "-inset-y-36", - "-inset-y-4", "-inset-y-40", "-inset-y-44", "-inset-y-48", - "-inset-y-5", "-inset-y-52", "-inset-y-56", - "-inset-y-6", "-inset-y-60", "-inset-y-64", - "-inset-y-7", "-inset-y-72", - "-inset-y-8", "-inset-y-80", - "-inset-y-9", "-inset-y-96", "-inset-y-full", "-inset-y-px", @@ -463,35 +463,35 @@ exports[`getClassList 1`] = ` "-left-0.5", "-left-1", "-left-1.5", + "-left-2", + "-left-2.5", + "-left-3", + "-left-3.5", + "-left-4", + "-left-5", + "-left-6", + "-left-7", + "-left-8", + "-left-9", "-left-10", "-left-11", "-left-12", "-left-14", "-left-16", - "-left-2", - "-left-2.5", "-left-20", "-left-24", "-left-28", - "-left-3", - "-left-3.5", "-left-32", "-left-36", - "-left-4", "-left-40", "-left-44", "-left-48", - "-left-5", "-left-52", "-left-56", - "-left-6", "-left-60", "-left-64", - "-left-7", "-left-72", - "-left-8", "-left-80", - "-left-9", "-left-96", "-left-full", "-left-px", @@ -499,321 +499,318 @@ exports[`getClassList 1`] = ` "-m-0.5", "-m-1", "-m-1.5", + "-m-2", + "-m-2.5", + "-m-3", + "-m-3.5", + "-m-4", + "-m-5", + "-m-6", + "-m-7", + "-m-8", + "-m-9", "-m-10", "-m-11", "-m-12", "-m-14", "-m-16", - "-m-2", - "-m-2.5", "-m-20", "-m-24", "-m-28", - "-m-3", - "-m-3.5", "-m-32", "-m-36", - "-m-4", "-m-40", "-m-44", "-m-48", - "-m-5", "-m-52", "-m-56", - "-m-6", "-m-60", "-m-64", - "-m-7", "-m-72", - "-m-8", "-m-80", - "-m-9", "-m-96", "-m-px", "-mb-0", "-mb-0.5", "-mb-1", "-mb-1.5", + "-mb-2", + "-mb-2.5", + "-mb-3", + "-mb-3.5", + "-mb-4", + "-mb-5", + "-mb-6", + "-mb-7", + "-mb-8", + "-mb-9", "-mb-10", "-mb-11", "-mb-12", "-mb-14", "-mb-16", - "-mb-2", - "-mb-2.5", "-mb-20", "-mb-24", "-mb-28", - "-mb-3", - "-mb-3.5", "-mb-32", "-mb-36", - "-mb-4", "-mb-40", "-mb-44", "-mb-48", - "-mb-5", "-mb-52", "-mb-56", - "-mb-6", "-mb-60", "-mb-64", - "-mb-7", "-mb-72", - "-mb-8", "-mb-80", - "-mb-9", "-mb-96", "-mb-px", "-me-0", "-me-0.5", "-me-1", "-me-1.5", + "-me-2", + "-me-2.5", + "-me-3", + "-me-3.5", + "-me-4", + "-me-5", + "-me-6", + "-me-7", + "-me-8", + "-me-9", "-me-10", "-me-11", "-me-12", "-me-14", "-me-16", - "-me-2", - "-me-2.5", "-me-20", "-me-24", "-me-28", - "-me-3", - "-me-3.5", "-me-32", "-me-36", - "-me-4", "-me-40", "-me-44", "-me-48", - "-me-5", "-me-52", "-me-56", - "-me-6", "-me-60", "-me-64", - "-me-7", "-me-72", - "-me-8", "-me-80", - "-me-9", "-me-96", "-me-px", "-ml-0", "-ml-0.5", "-ml-1", "-ml-1.5", + "-ml-2", + "-ml-2.5", + "-ml-3", + "-ml-3.5", + "-ml-4", + "-ml-5", + "-ml-6", + "-ml-7", + "-ml-8", + "-ml-9", "-ml-10", "-ml-11", "-ml-12", "-ml-14", "-ml-16", - "-ml-2", - "-ml-2.5", "-ml-20", "-ml-24", "-ml-28", - "-ml-3", - "-ml-3.5", "-ml-32", "-ml-36", - "-ml-4", "-ml-40", "-ml-44", "-ml-48", - "-ml-5", "-ml-52", "-ml-56", - "-ml-6", "-ml-60", "-ml-64", - "-ml-7", "-ml-72", - "-ml-8", "-ml-80", - "-ml-9", "-ml-96", "-ml-px", "-mr-0", "-mr-0.5", "-mr-1", "-mr-1.5", + "-mr-2", + "-mr-2.5", + "-mr-3", + "-mr-3.5", + "-mr-4", + "-mr-5", + "-mr-6", + "-mr-7", + "-mr-8", + "-mr-9", "-mr-10", "-mr-11", "-mr-12", "-mr-14", "-mr-16", - "-mr-2", - "-mr-2.5", "-mr-20", "-mr-24", "-mr-28", - "-mr-3", - "-mr-3.5", "-mr-32", "-mr-36", - "-mr-4", "-mr-40", "-mr-44", "-mr-48", - "-mr-5", "-mr-52", "-mr-56", - "-mr-6", "-mr-60", "-mr-64", - "-mr-7", "-mr-72", - "-mr-8", "-mr-80", - "-mr-9", "-mr-96", "-mr-px", "-ms-0", "-ms-0.5", "-ms-1", "-ms-1.5", + "-ms-2", + "-ms-2.5", + "-ms-3", + "-ms-3.5", + "-ms-4", + "-ms-5", + "-ms-6", + "-ms-7", + "-ms-8", + "-ms-9", "-ms-10", "-ms-11", "-ms-12", "-ms-14", "-ms-16", - "-ms-2", - "-ms-2.5", "-ms-20", "-ms-24", "-ms-28", - "-ms-3", - "-ms-3.5", "-ms-32", "-ms-36", - "-ms-4", "-ms-40", "-ms-44", "-ms-48", - "-ms-5", "-ms-52", "-ms-56", - "-ms-6", "-ms-60", "-ms-64", - "-ms-7", "-ms-72", - "-ms-8", "-ms-80", - "-ms-9", "-ms-96", "-ms-px", "-mt-0", "-mt-0.5", "-mt-1", "-mt-1.5", + "-mt-2", + "-mt-2.5", + "-mt-3", + "-mt-3.5", + "-mt-4", + "-mt-5", + "-mt-6", + "-mt-7", + "-mt-8", + "-mt-9", "-mt-10", "-mt-11", "-mt-12", "-mt-14", "-mt-16", - "-mt-2", - "-mt-2.5", "-mt-20", "-mt-24", "-mt-28", - "-mt-3", - "-mt-3.5", "-mt-32", "-mt-36", - "-mt-4", "-mt-40", "-mt-44", "-mt-48", - "-mt-5", "-mt-52", "-mt-56", - "-mt-6", "-mt-60", "-mt-64", - "-mt-7", "-mt-72", - "-mt-8", "-mt-80", - "-mt-9", "-mt-96", "-mt-px", "-mx-0", "-mx-0.5", "-mx-1", "-mx-1.5", + "-mx-2", + "-mx-2.5", + "-mx-3", + "-mx-3.5", + "-mx-4", + "-mx-5", + "-mx-6", + "-mx-7", + "-mx-8", + "-mx-9", "-mx-10", "-mx-11", "-mx-12", "-mx-14", "-mx-16", - "-mx-2", - "-mx-2.5", "-mx-20", "-mx-24", "-mx-28", - "-mx-3", - "-mx-3.5", "-mx-32", "-mx-36", - "-mx-4", "-mx-40", "-mx-44", "-mx-48", - "-mx-5", "-mx-52", "-mx-56", - "-mx-6", "-mx-60", "-mx-64", - "-mx-7", "-mx-72", - "-mx-8", "-mx-80", - "-mx-9", "-mx-96", "-mx-px", "-my-0", "-my-0.5", "-my-1", "-my-1.5", + "-my-2", + "-my-2.5", + "-my-3", + "-my-3.5", + "-my-4", + "-my-5", + "-my-6", + "-my-7", + "-my-8", + "-my-9", "-my-10", "-my-11", "-my-12", "-my-14", "-my-16", - "-my-2", - "-my-2.5", "-my-20", "-my-24", "-my-28", - "-my-3", - "-my-3.5", "-my-32", "-my-36", - "-my-4", "-my-40", "-my-44", "-my-48", - "-my-5", "-my-52", "-my-56", - "-my-6", "-my-60", "-my-64", - "-my-7", "-my-72", - "-my-8", "-my-80", - "-my-9", "-my-96", "-my-px", "-order-1", - "-order-10", - "-order-11", - "-order-12", "-order-2", "-order-3", "-order-4", @@ -822,6 +819,9 @@ exports[`getClassList 1`] = ` "-order-7", "-order-8", "-order-9", + "-order-10", + "-order-11", + "-order-12", "-outline-offset-0", "-outline-offset-1", "-outline-offset-2", @@ -831,79 +831,75 @@ exports[`getClassList 1`] = ` "-right-0.5", "-right-1", "-right-1.5", + "-right-2", + "-right-2.5", + "-right-3", + "-right-3.5", + "-right-4", + "-right-5", + "-right-6", + "-right-7", + "-right-8", + "-right-9", "-right-10", "-right-11", "-right-12", "-right-14", "-right-16", - "-right-2", - "-right-2.5", "-right-20", "-right-24", "-right-28", - "-right-3", - "-right-3.5", "-right-32", "-right-36", - "-right-4", "-right-40", "-right-44", "-right-48", - "-right-5", "-right-52", "-right-56", - "-right-6", "-right-60", "-right-64", - "-right-7", "-right-72", - "-right-8", "-right-80", - "-right-9", "-right-96", "-right-full", "-right-px", "-rotate-0", "-rotate-1", - "-rotate-12", - "-rotate-180", "-rotate-2", "-rotate-3", - "-rotate-45", "-rotate-6", + "-rotate-12", + "-rotate-45", "-rotate-90", + "-rotate-180", "-rotate-x-0", "-rotate-x-1", - "-rotate-x-12", - "-rotate-x-180", "-rotate-x-2", "-rotate-x-3", - "-rotate-x-45", "-rotate-x-6", + "-rotate-x-12", + "-rotate-x-45", "-rotate-x-90", + "-rotate-x-180", "-rotate-y-0", "-rotate-y-1", - "-rotate-y-12", - "-rotate-y-180", "-rotate-y-2", "-rotate-y-3", - "-rotate-y-45", "-rotate-y-6", + "-rotate-y-12", + "-rotate-y-45", "-rotate-y-90", + "-rotate-y-180", "-rotate-z-0", "-rotate-z-1", - "-rotate-z-12", - "-rotate-z-180", "-rotate-z-2", "-rotate-z-3", - "-rotate-z-45", "-rotate-z-6", + "-rotate-z-12", + "-rotate-z-45", "-rotate-z-90", + "-rotate-z-180", "-row-end-1", - "-row-end-10", - "-row-end-11", - "-row-end-12", - "-row-end-13", "-row-end-2", "-row-end-3", "-row-end-4", @@ -912,11 +908,11 @@ exports[`getClassList 1`] = ` "-row-end-7", "-row-end-8", "-row-end-9", + "-row-end-10", + "-row-end-11", + "-row-end-12", + "-row-end-13", "-row-start-1", - "-row-start-10", - "-row-start-11", - "-row-start-12", - "-row-start-13", "-row-start-2", "-row-start-3", "-row-start-4", @@ -925,486 +921,490 @@ exports[`getClassList 1`] = ` "-row-start-7", "-row-start-8", "-row-start-9", + "-row-start-10", + "-row-start-11", + "-row-start-12", + "-row-start-13", "-scale-0", - "-scale-100", - "-scale-105", - "-scale-110", - "-scale-125", - "-scale-150", - "-scale-200", "-scale-50", "-scale-75", "-scale-90", "-scale-95", + "-scale-100", + "-scale-105", + "-scale-110", + "-scale-125", + "-scale-150", + "-scale-200", "-scale-x-0", + "-scale-x-50", + "-scale-x-75", + "-scale-x-90", + "-scale-x-95", "-scale-x-100", "-scale-x-105", "-scale-x-110", "-scale-x-125", "-scale-x-150", "-scale-x-200", - "-scale-x-50", - "-scale-x-75", - "-scale-x-90", - "-scale-x-95", "-scale-y-0", + "-scale-y-50", + "-scale-y-75", + "-scale-y-90", + "-scale-y-95", "-scale-y-100", "-scale-y-105", "-scale-y-110", "-scale-y-125", "-scale-y-150", "-scale-y-200", - "-scale-y-50", - "-scale-y-75", - "-scale-y-90", - "-scale-y-95", "-scale-z-0", + "-scale-z-50", + "-scale-z-75", + "-scale-z-90", + "-scale-z-95", "-scale-z-100", "-scale-z-105", "-scale-z-110", "-scale-z-125", "-scale-z-150", "-scale-z-200", - "-scale-z-50", - "-scale-z-75", - "-scale-z-90", - "-scale-z-95", "-scroll-m-0", "-scroll-m-0.5", "-scroll-m-1", "-scroll-m-1.5", + "-scroll-m-2", + "-scroll-m-2.5", + "-scroll-m-3", + "-scroll-m-3.5", + "-scroll-m-4", + "-scroll-m-5", + "-scroll-m-6", + "-scroll-m-7", + "-scroll-m-8", + "-scroll-m-9", "-scroll-m-10", "-scroll-m-11", "-scroll-m-12", "-scroll-m-14", "-scroll-m-16", - "-scroll-m-2", - "-scroll-m-2.5", "-scroll-m-20", "-scroll-m-24", "-scroll-m-28", - "-scroll-m-3", - "-scroll-m-3.5", "-scroll-m-32", "-scroll-m-36", - "-scroll-m-4", "-scroll-m-40", "-scroll-m-44", "-scroll-m-48", - "-scroll-m-5", "-scroll-m-52", "-scroll-m-56", - "-scroll-m-6", "-scroll-m-60", "-scroll-m-64", - "-scroll-m-7", "-scroll-m-72", - "-scroll-m-8", "-scroll-m-80", - "-scroll-m-9", "-scroll-m-96", "-scroll-m-px", "-scroll-mb-0", "-scroll-mb-0.5", "-scroll-mb-1", "-scroll-mb-1.5", + "-scroll-mb-2", + "-scroll-mb-2.5", + "-scroll-mb-3", + "-scroll-mb-3.5", + "-scroll-mb-4", + "-scroll-mb-5", + "-scroll-mb-6", + "-scroll-mb-7", + "-scroll-mb-8", + "-scroll-mb-9", "-scroll-mb-10", "-scroll-mb-11", "-scroll-mb-12", "-scroll-mb-14", "-scroll-mb-16", - "-scroll-mb-2", - "-scroll-mb-2.5", "-scroll-mb-20", "-scroll-mb-24", "-scroll-mb-28", - "-scroll-mb-3", - "-scroll-mb-3.5", "-scroll-mb-32", "-scroll-mb-36", - "-scroll-mb-4", "-scroll-mb-40", "-scroll-mb-44", "-scroll-mb-48", - "-scroll-mb-5", "-scroll-mb-52", "-scroll-mb-56", - "-scroll-mb-6", "-scroll-mb-60", "-scroll-mb-64", - "-scroll-mb-7", "-scroll-mb-72", - "-scroll-mb-8", "-scroll-mb-80", - "-scroll-mb-9", "-scroll-mb-96", "-scroll-mb-px", "-scroll-me-0", "-scroll-me-0.5", "-scroll-me-1", "-scroll-me-1.5", + "-scroll-me-2", + "-scroll-me-2.5", + "-scroll-me-3", + "-scroll-me-3.5", + "-scroll-me-4", + "-scroll-me-5", + "-scroll-me-6", + "-scroll-me-7", + "-scroll-me-8", + "-scroll-me-9", "-scroll-me-10", "-scroll-me-11", "-scroll-me-12", "-scroll-me-14", "-scroll-me-16", - "-scroll-me-2", - "-scroll-me-2.5", "-scroll-me-20", "-scroll-me-24", "-scroll-me-28", - "-scroll-me-3", - "-scroll-me-3.5", "-scroll-me-32", "-scroll-me-36", - "-scroll-me-4", "-scroll-me-40", "-scroll-me-44", "-scroll-me-48", - "-scroll-me-5", "-scroll-me-52", "-scroll-me-56", - "-scroll-me-6", "-scroll-me-60", "-scroll-me-64", - "-scroll-me-7", "-scroll-me-72", - "-scroll-me-8", "-scroll-me-80", - "-scroll-me-9", "-scroll-me-96", "-scroll-me-px", "-scroll-ml-0", "-scroll-ml-0.5", "-scroll-ml-1", "-scroll-ml-1.5", + "-scroll-ml-2", + "-scroll-ml-2.5", + "-scroll-ml-3", + "-scroll-ml-3.5", + "-scroll-ml-4", + "-scroll-ml-5", + "-scroll-ml-6", + "-scroll-ml-7", + "-scroll-ml-8", + "-scroll-ml-9", "-scroll-ml-10", "-scroll-ml-11", "-scroll-ml-12", "-scroll-ml-14", "-scroll-ml-16", - "-scroll-ml-2", - "-scroll-ml-2.5", "-scroll-ml-20", "-scroll-ml-24", "-scroll-ml-28", - "-scroll-ml-3", - "-scroll-ml-3.5", "-scroll-ml-32", "-scroll-ml-36", - "-scroll-ml-4", "-scroll-ml-40", "-scroll-ml-44", "-scroll-ml-48", - "-scroll-ml-5", "-scroll-ml-52", "-scroll-ml-56", - "-scroll-ml-6", "-scroll-ml-60", "-scroll-ml-64", - "-scroll-ml-7", "-scroll-ml-72", - "-scroll-ml-8", "-scroll-ml-80", - "-scroll-ml-9", "-scroll-ml-96", "-scroll-ml-px", "-scroll-mr-0", "-scroll-mr-0.5", "-scroll-mr-1", "-scroll-mr-1.5", + "-scroll-mr-2", + "-scroll-mr-2.5", + "-scroll-mr-3", + "-scroll-mr-3.5", + "-scroll-mr-4", + "-scroll-mr-5", + "-scroll-mr-6", + "-scroll-mr-7", + "-scroll-mr-8", + "-scroll-mr-9", "-scroll-mr-10", "-scroll-mr-11", "-scroll-mr-12", "-scroll-mr-14", "-scroll-mr-16", - "-scroll-mr-2", - "-scroll-mr-2.5", "-scroll-mr-20", "-scroll-mr-24", "-scroll-mr-28", - "-scroll-mr-3", - "-scroll-mr-3.5", "-scroll-mr-32", "-scroll-mr-36", - "-scroll-mr-4", "-scroll-mr-40", "-scroll-mr-44", "-scroll-mr-48", - "-scroll-mr-5", "-scroll-mr-52", "-scroll-mr-56", - "-scroll-mr-6", "-scroll-mr-60", "-scroll-mr-64", - "-scroll-mr-7", "-scroll-mr-72", - "-scroll-mr-8", "-scroll-mr-80", - "-scroll-mr-9", "-scroll-mr-96", "-scroll-mr-px", "-scroll-ms-0", "-scroll-ms-0.5", "-scroll-ms-1", "-scroll-ms-1.5", + "-scroll-ms-2", + "-scroll-ms-2.5", + "-scroll-ms-3", + "-scroll-ms-3.5", + "-scroll-ms-4", + "-scroll-ms-5", + "-scroll-ms-6", + "-scroll-ms-7", + "-scroll-ms-8", + "-scroll-ms-9", "-scroll-ms-10", "-scroll-ms-11", "-scroll-ms-12", "-scroll-ms-14", "-scroll-ms-16", - "-scroll-ms-2", - "-scroll-ms-2.5", "-scroll-ms-20", "-scroll-ms-24", "-scroll-ms-28", - "-scroll-ms-3", - "-scroll-ms-3.5", "-scroll-ms-32", "-scroll-ms-36", - "-scroll-ms-4", "-scroll-ms-40", "-scroll-ms-44", "-scroll-ms-48", - "-scroll-ms-5", "-scroll-ms-52", "-scroll-ms-56", - "-scroll-ms-6", "-scroll-ms-60", "-scroll-ms-64", - "-scroll-ms-7", "-scroll-ms-72", - "-scroll-ms-8", "-scroll-ms-80", - "-scroll-ms-9", "-scroll-ms-96", "-scroll-ms-px", "-scroll-mt-0", "-scroll-mt-0.5", "-scroll-mt-1", "-scroll-mt-1.5", + "-scroll-mt-2", + "-scroll-mt-2.5", + "-scroll-mt-3", + "-scroll-mt-3.5", + "-scroll-mt-4", + "-scroll-mt-5", + "-scroll-mt-6", + "-scroll-mt-7", + "-scroll-mt-8", + "-scroll-mt-9", "-scroll-mt-10", "-scroll-mt-11", "-scroll-mt-12", "-scroll-mt-14", "-scroll-mt-16", - "-scroll-mt-2", - "-scroll-mt-2.5", "-scroll-mt-20", "-scroll-mt-24", "-scroll-mt-28", - "-scroll-mt-3", - "-scroll-mt-3.5", "-scroll-mt-32", "-scroll-mt-36", - "-scroll-mt-4", "-scroll-mt-40", "-scroll-mt-44", "-scroll-mt-48", - "-scroll-mt-5", "-scroll-mt-52", "-scroll-mt-56", - "-scroll-mt-6", "-scroll-mt-60", "-scroll-mt-64", - "-scroll-mt-7", "-scroll-mt-72", - "-scroll-mt-8", "-scroll-mt-80", - "-scroll-mt-9", "-scroll-mt-96", "-scroll-mt-px", "-scroll-mx-0", "-scroll-mx-0.5", "-scroll-mx-1", "-scroll-mx-1.5", + "-scroll-mx-2", + "-scroll-mx-2.5", + "-scroll-mx-3", + "-scroll-mx-3.5", + "-scroll-mx-4", + "-scroll-mx-5", + "-scroll-mx-6", + "-scroll-mx-7", + "-scroll-mx-8", + "-scroll-mx-9", "-scroll-mx-10", "-scroll-mx-11", "-scroll-mx-12", "-scroll-mx-14", "-scroll-mx-16", - "-scroll-mx-2", - "-scroll-mx-2.5", "-scroll-mx-20", "-scroll-mx-24", "-scroll-mx-28", - "-scroll-mx-3", - "-scroll-mx-3.5", "-scroll-mx-32", "-scroll-mx-36", - "-scroll-mx-4", "-scroll-mx-40", "-scroll-mx-44", "-scroll-mx-48", - "-scroll-mx-5", "-scroll-mx-52", "-scroll-mx-56", - "-scroll-mx-6", "-scroll-mx-60", "-scroll-mx-64", - "-scroll-mx-7", "-scroll-mx-72", - "-scroll-mx-8", "-scroll-mx-80", - "-scroll-mx-9", "-scroll-mx-96", "-scroll-mx-px", "-scroll-my-0", "-scroll-my-0.5", "-scroll-my-1", "-scroll-my-1.5", + "-scroll-my-2", + "-scroll-my-2.5", + "-scroll-my-3", + "-scroll-my-3.5", + "-scroll-my-4", + "-scroll-my-5", + "-scroll-my-6", + "-scroll-my-7", + "-scroll-my-8", + "-scroll-my-9", "-scroll-my-10", "-scroll-my-11", "-scroll-my-12", "-scroll-my-14", "-scroll-my-16", - "-scroll-my-2", - "-scroll-my-2.5", "-scroll-my-20", "-scroll-my-24", "-scroll-my-28", - "-scroll-my-3", - "-scroll-my-3.5", "-scroll-my-32", "-scroll-my-36", - "-scroll-my-4", "-scroll-my-40", "-scroll-my-44", "-scroll-my-48", - "-scroll-my-5", "-scroll-my-52", "-scroll-my-56", - "-scroll-my-6", "-scroll-my-60", "-scroll-my-64", - "-scroll-my-7", "-scroll-my-72", - "-scroll-my-8", "-scroll-my-80", - "-scroll-my-9", "-scroll-my-96", "-scroll-my-px", "-skew-0", "-skew-1", - "-skew-12", "-skew-2", "-skew-3", "-skew-6", + "-skew-12", "-skew-x-0", "-skew-x-1", - "-skew-x-12", "-skew-x-2", "-skew-x-3", "-skew-x-6", + "-skew-x-12", "-skew-y-0", "-skew-y-1", - "-skew-y-12", "-skew-y-2", "-skew-y-3", "-skew-y-6", + "-skew-y-12", "-space-x-0", "-space-x-0.5", "-space-x-1", "-space-x-1.5", + "-space-x-2", + "-space-x-2.5", + "-space-x-3", + "-space-x-3.5", + "-space-x-4", + "-space-x-5", + "-space-x-6", + "-space-x-7", + "-space-x-8", + "-space-x-9", "-space-x-10", "-space-x-11", "-space-x-12", "-space-x-14", "-space-x-16", - "-space-x-2", - "-space-x-2.5", "-space-x-20", "-space-x-24", "-space-x-28", - "-space-x-3", - "-space-x-3.5", "-space-x-32", "-space-x-36", - "-space-x-4", "-space-x-40", "-space-x-44", "-space-x-48", - "-space-x-5", "-space-x-52", "-space-x-56", - "-space-x-6", "-space-x-60", "-space-x-64", - "-space-x-7", "-space-x-72", - "-space-x-8", "-space-x-80", - "-space-x-9", "-space-x-96", "-space-x-px", "-space-y-0", "-space-y-0.5", "-space-y-1", "-space-y-1.5", + "-space-y-2", + "-space-y-2.5", + "-space-y-3", + "-space-y-3.5", + "-space-y-4", + "-space-y-5", + "-space-y-6", + "-space-y-7", + "-space-y-8", + "-space-y-9", "-space-y-10", "-space-y-11", "-space-y-12", "-space-y-14", "-space-y-16", - "-space-y-2", - "-space-y-2.5", "-space-y-20", "-space-y-24", "-space-y-28", - "-space-y-3", - "-space-y-3.5", "-space-y-32", "-space-y-36", - "-space-y-4", "-space-y-40", "-space-y-44", "-space-y-48", - "-space-y-5", "-space-y-52", "-space-y-56", - "-space-y-6", "-space-y-60", "-space-y-64", - "-space-y-7", "-space-y-72", - "-space-y-8", "-space-y-80", - "-space-y-9", "-space-y-96", "-space-y-px", "-start-0", "-start-0.5", "-start-1", "-start-1.5", + "-start-2", + "-start-2.5", + "-start-3", + "-start-3.5", + "-start-4", + "-start-5", + "-start-6", + "-start-7", + "-start-8", + "-start-9", "-start-10", "-start-11", "-start-12", "-start-14", "-start-16", - "-start-2", - "-start-2.5", "-start-20", "-start-24", "-start-28", - "-start-3", - "-start-3.5", "-start-32", "-start-36", - "-start-4", "-start-40", "-start-44", "-start-48", - "-start-5", "-start-52", "-start-56", - "-start-6", "-start-60", "-start-64", - "-start-7", "-start-72", - "-start-8", "-start-80", - "-start-9", "-start-96", "-start-full", "-start-px", @@ -1412,35 +1412,35 @@ exports[`getClassList 1`] = ` "-top-0.5", "-top-1", "-top-1.5", + "-top-2", + "-top-2.5", + "-top-3", + "-top-3.5", + "-top-4", + "-top-5", + "-top-6", + "-top-7", + "-top-8", + "-top-9", "-top-10", "-top-11", "-top-12", "-top-14", "-top-16", - "-top-2", - "-top-2.5", "-top-20", "-top-24", "-top-28", - "-top-3", - "-top-3.5", "-top-32", "-top-36", - "-top-4", "-top-40", "-top-44", "-top-48", - "-top-5", "-top-52", "-top-56", - "-top-6", "-top-60", "-top-64", - "-top-7", "-top-72", - "-top-8", "-top-80", - "-top-9", "-top-96", "-top-full", "-top-px", @@ -1448,35 +1448,35 @@ exports[`getClassList 1`] = ` "-translate-0.5", "-translate-1", "-translate-1.5", + "-translate-2", + "-translate-2.5", + "-translate-3", + "-translate-3.5", + "-translate-4", + "-translate-5", + "-translate-6", + "-translate-7", + "-translate-8", + "-translate-9", "-translate-10", "-translate-11", "-translate-12", "-translate-14", "-translate-16", - "-translate-2", - "-translate-2.5", "-translate-20", "-translate-24", "-translate-28", - "-translate-3", - "-translate-3.5", "-translate-32", "-translate-36", - "-translate-4", "-translate-40", "-translate-44", "-translate-48", - "-translate-5", "-translate-52", "-translate-56", - "-translate-6", "-translate-60", "-translate-64", - "-translate-7", "-translate-72", - "-translate-8", "-translate-80", - "-translate-9", "-translate-96", "-translate-full", "-translate-px", @@ -1484,35 +1484,35 @@ exports[`getClassList 1`] = ` "-translate-x-0.5", "-translate-x-1", "-translate-x-1.5", + "-translate-x-2", + "-translate-x-2.5", + "-translate-x-3", + "-translate-x-3.5", + "-translate-x-4", + "-translate-x-5", + "-translate-x-6", + "-translate-x-7", + "-translate-x-8", + "-translate-x-9", "-translate-x-10", "-translate-x-11", "-translate-x-12", "-translate-x-14", "-translate-x-16", - "-translate-x-2", - "-translate-x-2.5", "-translate-x-20", "-translate-x-24", "-translate-x-28", - "-translate-x-3", - "-translate-x-3.5", "-translate-x-32", "-translate-x-36", - "-translate-x-4", "-translate-x-40", "-translate-x-44", "-translate-x-48", - "-translate-x-5", "-translate-x-52", "-translate-x-56", - "-translate-x-6", "-translate-x-60", "-translate-x-64", - "-translate-x-7", "-translate-x-72", - "-translate-x-8", "-translate-x-80", - "-translate-x-9", "-translate-x-96", "-translate-x-full", "-translate-x-px", @@ -1520,35 +1520,35 @@ exports[`getClassList 1`] = ` "-translate-y-0.5", "-translate-y-1", "-translate-y-1.5", + "-translate-y-2", + "-translate-y-2.5", + "-translate-y-3", + "-translate-y-3.5", + "-translate-y-4", + "-translate-y-5", + "-translate-y-6", + "-translate-y-7", + "-translate-y-8", + "-translate-y-9", "-translate-y-10", "-translate-y-11", "-translate-y-12", "-translate-y-14", "-translate-y-16", - "-translate-y-2", - "-translate-y-2.5", "-translate-y-20", "-translate-y-24", "-translate-y-28", - "-translate-y-3", - "-translate-y-3.5", "-translate-y-32", "-translate-y-36", - "-translate-y-4", "-translate-y-40", "-translate-y-44", "-translate-y-48", - "-translate-y-5", "-translate-y-52", "-translate-y-56", - "-translate-y-6", "-translate-y-60", "-translate-y-64", - "-translate-y-7", "-translate-y-72", - "-translate-y-8", "-translate-y-80", - "-translate-y-9", "-translate-y-96", "-translate-y-full", "-translate-y-px", @@ -1556,35 +1556,35 @@ exports[`getClassList 1`] = ` "-translate-z-0.5", "-translate-z-1", "-translate-z-1.5", + "-translate-z-2", + "-translate-z-2.5", + "-translate-z-3", + "-translate-z-3.5", + "-translate-z-4", + "-translate-z-5", + "-translate-z-6", + "-translate-z-7", + "-translate-z-8", + "-translate-z-9", "-translate-z-10", "-translate-z-11", "-translate-z-12", "-translate-z-14", "-translate-z-16", - "-translate-z-2", - "-translate-z-2.5", "-translate-z-20", "-translate-z-24", "-translate-z-28", - "-translate-z-3", - "-translate-z-3.5", "-translate-z-32", "-translate-z-36", - "-translate-z-4", "-translate-z-40", "-translate-z-44", "-translate-z-48", - "-translate-z-5", "-translate-z-52", "-translate-z-56", - "-translate-z-6", "-translate-z-60", "-translate-z-64", - "-translate-z-7", "-translate-z-72", - "-translate-z-8", "-translate-z-80", - "-translate-z-9", "-translate-z-96", "-translate-z-px", "-underline-offset-0", @@ -1693,44 +1693,44 @@ exports[`getClassList 1`] = ` "auto-rows-min", "backdrop-blur-none", "backdrop-brightness-0", + "backdrop-brightness-50", + "backdrop-brightness-75", + "backdrop-brightness-90", + "backdrop-brightness-95", "backdrop-brightness-100", "backdrop-brightness-105", "backdrop-brightness-110", "backdrop-brightness-125", "backdrop-brightness-150", "backdrop-brightness-200", - "backdrop-brightness-50", - "backdrop-brightness-75", - "backdrop-brightness-90", - "backdrop-brightness-95", "backdrop-contrast-0", + "backdrop-contrast-50", + "backdrop-contrast-75", "backdrop-contrast-100", "backdrop-contrast-125", "backdrop-contrast-150", "backdrop-contrast-200", - "backdrop-contrast-50", - "backdrop-contrast-75", "backdrop-grayscale", "backdrop-grayscale-0", - "backdrop-grayscale-100", "backdrop-grayscale-25", "backdrop-grayscale-50", "backdrop-grayscale-75", + "backdrop-grayscale-100", "backdrop-hue-rotate-0", "backdrop-hue-rotate-15", - "backdrop-hue-rotate-180", "backdrop-hue-rotate-30", "backdrop-hue-rotate-60", "backdrop-hue-rotate-90", + "backdrop-hue-rotate-180", "backdrop-invert", "backdrop-invert-0", - "backdrop-invert-100", "backdrop-invert-25", "backdrop-invert-50", "backdrop-invert-75", + "backdrop-invert-100", "backdrop-opacity-0", + "backdrop-opacity-5", "backdrop-opacity-10", - "backdrop-opacity-100", "backdrop-opacity-15", "backdrop-opacity-20", "backdrop-opacity-25", @@ -1738,7 +1738,6 @@ exports[`getClassList 1`] = ` "backdrop-opacity-35", "backdrop-opacity-40", "backdrop-opacity-45", - "backdrop-opacity-5", "backdrop-opacity-50", "backdrop-opacity-55", "backdrop-opacity-60", @@ -1749,54 +1748,57 @@ exports[`getClassList 1`] = ` "backdrop-opacity-85", "backdrop-opacity-90", "backdrop-opacity-95", + "backdrop-opacity-100", "backdrop-opacity-background", "backdrop-saturate-0", + "backdrop-saturate-50", "backdrop-saturate-100", "backdrop-saturate-150", "backdrop-saturate-200", - "backdrop-saturate-50", "backdrop-sepia", "backdrop-sepia-0", - "backdrop-sepia-100", "backdrop-sepia-50", + "backdrop-sepia-100", "backface-hidden", "backface-visible", "basis-0", "basis-0.5", "basis-1", "basis-1.5", + "basis-2", + "basis-2.5", + "basis-3", + "basis-3.5", + "basis-4", + "basis-5", + "basis-6", + "basis-7", + "basis-8", + "basis-9", "basis-10", "basis-11", "basis-12", "basis-14", "basis-16", - "basis-2", - "basis-2.5", "basis-20", "basis-24", "basis-28", - "basis-3", - "basis-3.5", "basis-32", "basis-36", - "basis-4", "basis-40", "basis-44", "basis-48", - "basis-5", "basis-52", "basis-56", - "basis-6", "basis-60", "basis-64", - "basis-7", "basis-72", - "basis-8", "basis-80", - "basis-9", "basis-96", "basis-auto", "basis-full", + "basis-lg", + "basis-md", "basis-px", "bg-auto", "bg-blend-color", @@ -1839,6 +1841,33 @@ exports[`getClassList 1`] = ` "bg-conic-0/shorter", "bg-conic-0/increasing", "bg-conic-0/decreasing", + "bg-conic-30", + "bg-conic-30/oklab", + "bg-conic-30/oklch", + "bg-conic-30/srgb", + "bg-conic-30/hsl", + "bg-conic-30/longer", + "bg-conic-30/shorter", + "bg-conic-30/increasing", + "bg-conic-30/decreasing", + "bg-conic-60", + "bg-conic-60/oklab", + "bg-conic-60/oklch", + "bg-conic-60/srgb", + "bg-conic-60/hsl", + "bg-conic-60/longer", + "bg-conic-60/shorter", + "bg-conic-60/increasing", + "bg-conic-60/decreasing", + "bg-conic-90", + "bg-conic-90/oklab", + "bg-conic-90/oklch", + "bg-conic-90/srgb", + "bg-conic-90/hsl", + "bg-conic-90/longer", + "bg-conic-90/shorter", + "bg-conic-90/increasing", + "bg-conic-90/decreasing", "bg-conic-120", "bg-conic-120/oklab", "bg-conic-120/oklch", @@ -1893,15 +1922,6 @@ exports[`getClassList 1`] = ` "bg-conic-270/shorter", "bg-conic-270/increasing", "bg-conic-270/decreasing", - "bg-conic-30", - "bg-conic-30/oklab", - "bg-conic-30/oklch", - "bg-conic-30/srgb", - "bg-conic-30/hsl", - "bg-conic-30/longer", - "bg-conic-30/shorter", - "bg-conic-30/increasing", - "bg-conic-30/decreasing", "bg-conic-300", "bg-conic-300/oklab", "bg-conic-300/oklch", @@ -1920,24 +1940,6 @@ exports[`getClassList 1`] = ` "bg-conic-330/shorter", "bg-conic-330/increasing", "bg-conic-330/decreasing", - "bg-conic-60", - "bg-conic-60/oklab", - "bg-conic-60/oklch", - "bg-conic-60/srgb", - "bg-conic-60/hsl", - "bg-conic-60/longer", - "bg-conic-60/shorter", - "bg-conic-60/increasing", - "bg-conic-60/decreasing", - "bg-conic-90", - "bg-conic-90/oklab", - "bg-conic-90/oklch", - "bg-conic-90/srgb", - "bg-conic-90/hsl", - "bg-conic-90/longer", - "bg-conic-90/shorter", - "bg-conic-90/increasing", - "bg-conic-90/decreasing", "bg-contain", "bg-cover", "bg-current", @@ -1997,6 +1999,33 @@ exports[`getClassList 1`] = ` "bg-linear-0/shorter", "bg-linear-0/increasing", "bg-linear-0/decreasing", + "bg-linear-30", + "bg-linear-30/oklab", + "bg-linear-30/oklch", + "bg-linear-30/srgb", + "bg-linear-30/hsl", + "bg-linear-30/longer", + "bg-linear-30/shorter", + "bg-linear-30/increasing", + "bg-linear-30/decreasing", + "bg-linear-60", + "bg-linear-60/oklab", + "bg-linear-60/oklch", + "bg-linear-60/srgb", + "bg-linear-60/hsl", + "bg-linear-60/longer", + "bg-linear-60/shorter", + "bg-linear-60/increasing", + "bg-linear-60/decreasing", + "bg-linear-90", + "bg-linear-90/oklab", + "bg-linear-90/oklch", + "bg-linear-90/srgb", + "bg-linear-90/hsl", + "bg-linear-90/longer", + "bg-linear-90/shorter", + "bg-linear-90/increasing", + "bg-linear-90/decreasing", "bg-linear-120", "bg-linear-120/oklab", "bg-linear-120/oklch", @@ -2051,51 +2080,24 @@ exports[`getClassList 1`] = ` "bg-linear-270/shorter", "bg-linear-270/increasing", "bg-linear-270/decreasing", - "bg-linear-30", - "bg-linear-30/oklab", - "bg-linear-30/oklch", - "bg-linear-30/srgb", - "bg-linear-30/hsl", - "bg-linear-30/longer", - "bg-linear-30/shorter", - "bg-linear-30/increasing", - "bg-linear-30/decreasing", "bg-linear-300", "bg-linear-300/oklab", "bg-linear-300/oklch", "bg-linear-300/srgb", "bg-linear-300/hsl", "bg-linear-300/longer", - "bg-linear-300/shorter", - "bg-linear-300/increasing", - "bg-linear-300/decreasing", - "bg-linear-330", - "bg-linear-330/oklab", - "bg-linear-330/oklch", - "bg-linear-330/srgb", - "bg-linear-330/hsl", - "bg-linear-330/longer", - "bg-linear-330/shorter", - "bg-linear-330/increasing", - "bg-linear-330/decreasing", - "bg-linear-60", - "bg-linear-60/oklab", - "bg-linear-60/oklch", - "bg-linear-60/srgb", - "bg-linear-60/hsl", - "bg-linear-60/longer", - "bg-linear-60/shorter", - "bg-linear-60/increasing", - "bg-linear-60/decreasing", - "bg-linear-90", - "bg-linear-90/oklab", - "bg-linear-90/oklch", - "bg-linear-90/srgb", - "bg-linear-90/hsl", - "bg-linear-90/longer", - "bg-linear-90/shorter", - "bg-linear-90/increasing", - "bg-linear-90/decreasing", + "bg-linear-300/shorter", + "bg-linear-300/increasing", + "bg-linear-300/decreasing", + "bg-linear-330", + "bg-linear-330/oklab", + "bg-linear-330/oklch", + "bg-linear-330/srgb", + "bg-linear-330/hsl", + "bg-linear-330/longer", + "bg-linear-330/shorter", + "bg-linear-330/increasing", + "bg-linear-330/decreasing", "bg-linear-to-b", "bg-linear-to-b/oklab", "bg-linear-to-b/oklch", @@ -2759,105 +2761,105 @@ exports[`getClassList 1`] = ` "border-spacing-0.5", "border-spacing-1", "border-spacing-1.5", + "border-spacing-2", + "border-spacing-2.5", + "border-spacing-3", + "border-spacing-3.5", + "border-spacing-4", + "border-spacing-5", + "border-spacing-6", + "border-spacing-7", + "border-spacing-8", + "border-spacing-9", "border-spacing-10", "border-spacing-11", "border-spacing-12", "border-spacing-14", "border-spacing-16", - "border-spacing-2", - "border-spacing-2.5", "border-spacing-20", "border-spacing-24", "border-spacing-28", - "border-spacing-3", - "border-spacing-3.5", "border-spacing-32", "border-spacing-36", - "border-spacing-4", "border-spacing-40", "border-spacing-44", "border-spacing-48", - "border-spacing-5", "border-spacing-52", "border-spacing-56", - "border-spacing-6", "border-spacing-60", "border-spacing-64", - "border-spacing-7", "border-spacing-72", - "border-spacing-8", "border-spacing-80", - "border-spacing-9", "border-spacing-96", "border-spacing-px", "border-spacing-x-0", "border-spacing-x-0.5", "border-spacing-x-1", "border-spacing-x-1.5", + "border-spacing-x-2", + "border-spacing-x-2.5", + "border-spacing-x-3", + "border-spacing-x-3.5", + "border-spacing-x-4", + "border-spacing-x-5", + "border-spacing-x-6", + "border-spacing-x-7", + "border-spacing-x-8", + "border-spacing-x-9", "border-spacing-x-10", "border-spacing-x-11", "border-spacing-x-12", "border-spacing-x-14", "border-spacing-x-16", - "border-spacing-x-2", - "border-spacing-x-2.5", "border-spacing-x-20", "border-spacing-x-24", "border-spacing-x-28", - "border-spacing-x-3", - "border-spacing-x-3.5", "border-spacing-x-32", "border-spacing-x-36", - "border-spacing-x-4", "border-spacing-x-40", "border-spacing-x-44", "border-spacing-x-48", - "border-spacing-x-5", "border-spacing-x-52", "border-spacing-x-56", - "border-spacing-x-6", "border-spacing-x-60", "border-spacing-x-64", - "border-spacing-x-7", "border-spacing-x-72", - "border-spacing-x-8", "border-spacing-x-80", - "border-spacing-x-9", "border-spacing-x-96", "border-spacing-x-px", "border-spacing-y-0", "border-spacing-y-0.5", "border-spacing-y-1", "border-spacing-y-1.5", + "border-spacing-y-2", + "border-spacing-y-2.5", + "border-spacing-y-3", + "border-spacing-y-3.5", + "border-spacing-y-4", + "border-spacing-y-5", + "border-spacing-y-6", + "border-spacing-y-7", + "border-spacing-y-8", + "border-spacing-y-9", "border-spacing-y-10", "border-spacing-y-11", "border-spacing-y-12", "border-spacing-y-14", "border-spacing-y-16", - "border-spacing-y-2", - "border-spacing-y-2.5", "border-spacing-y-20", "border-spacing-y-24", "border-spacing-y-28", - "border-spacing-y-3", - "border-spacing-y-3.5", "border-spacing-y-32", "border-spacing-y-36", - "border-spacing-y-4", "border-spacing-y-40", "border-spacing-y-44", "border-spacing-y-48", - "border-spacing-y-5", "border-spacing-y-52", "border-spacing-y-56", - "border-spacing-y-6", "border-spacing-y-60", "border-spacing-y-64", - "border-spacing-y-7", "border-spacing-y-72", - "border-spacing-y-8", "border-spacing-y-80", - "border-spacing-y-9", "border-spacing-y-96", "border-spacing-y-px", "border-t", @@ -3162,35 +3164,35 @@ exports[`getClassList 1`] = ` "bottom-0.5", "bottom-1", "bottom-1.5", + "bottom-2", + "bottom-2.5", + "bottom-3", + "bottom-3.5", + "bottom-4", + "bottom-5", + "bottom-6", + "bottom-7", + "bottom-8", + "bottom-9", "bottom-10", "bottom-11", "bottom-12", "bottom-14", "bottom-16", - "bottom-2", - "bottom-2.5", "bottom-20", "bottom-24", "bottom-28", - "bottom-3", - "bottom-3.5", "bottom-32", "bottom-36", - "bottom-4", "bottom-40", "bottom-44", "bottom-48", - "bottom-5", "bottom-52", "bottom-56", - "bottom-6", "bottom-60", "bottom-64", - "bottom-7", "bottom-72", - "bottom-8", "bottom-80", - "bottom-9", "bottom-96", "bottom-auto", "bottom-full", @@ -3224,16 +3226,16 @@ exports[`getClassList 1`] = ` "break-normal", "break-words", "brightness-0", + "brightness-50", + "brightness-75", + "brightness-90", + "brightness-95", "brightness-100", "brightness-105", "brightness-110", "brightness-125", "brightness-150", "brightness-200", - "brightness-50", - "brightness-75", - "brightness-90", - "brightness-95", "capitalize", "caption-bottom", "caption-top", @@ -3311,10 +3313,6 @@ exports[`getClassList 1`] = ` "clear-start", "col-auto", "col-end-1", - "col-end-10", - "col-end-11", - "col-end-12", - "col-end-13", "col-end-2", "col-end-3", "col-end-4", @@ -3323,11 +3321,12 @@ exports[`getClassList 1`] = ` "col-end-7", "col-end-8", "col-end-9", + "col-end-10", + "col-end-11", + "col-end-12", + "col-end-13", "col-end-auto", "col-span-1", - "col-span-10", - "col-span-11", - "col-span-12", "col-span-2", "col-span-3", "col-span-4", @@ -3336,12 +3335,11 @@ exports[`getClassList 1`] = ` "col-span-7", "col-span-8", "col-span-9", + "col-span-10", + "col-span-11", + "col-span-12", "col-span-full", "col-start-1", - "col-start-10", - "col-start-11", - "col-start-12", - "col-start-13", "col-start-2", "col-start-3", "col-start-4", @@ -3350,12 +3348,13 @@ exports[`getClassList 1`] = ` "col-start-7", "col-start-8", "col-start-9", + "col-start-10", + "col-start-11", + "col-start-12", + "col-start-13", "col-start-auto", "collapse", "columns-1", - "columns-10", - "columns-11", - "columns-12", "columns-2", "columns-3", "columns-4", @@ -3364,7 +3363,12 @@ exports[`getClassList 1`] = ` "columns-7", "columns-8", "columns-9", + "columns-10", + "columns-11", + "columns-12", "columns-auto", + "columns-lg", + "columns-md", "contain-content", "contain-inline-size", "contain-layout", @@ -3386,12 +3390,12 @@ exports[`getClassList 1`] = ` "content-stretch", "contents", "contrast-0", + "contrast-50", + "contrast-75", "contrast-100", "contrast-125", "contrast-150", "contrast-200", - "contrast-50", - "contrast-75", "cursor-alias", "cursor-all-scroll", "cursor-auto", @@ -3504,14 +3508,14 @@ exports[`getClassList 1`] = ` "decoration-transparent/95", "decoration-transparent/100", "decoration-wavy", + "delay-75", "delay-100", - "delay-1000", "delay-150", "delay-200", "delay-300", "delay-500", "delay-700", - "delay-75", + "delay-1000", "diagonal-fractions", "divide-current", "divide-current/0", @@ -3598,14 +3602,14 @@ exports[`getClassList 1`] = ` "divide-y-reverse", "drop-shadow-none", "drop-shadow-sm", + "duration-75", "duration-100", - "duration-1000", "duration-150", "duration-200", "duration-300", "duration-500", "duration-700", - "duration-75", + "duration-1000", "duration-initial", "ease-initial", "ease-linear", @@ -3613,35 +3617,35 @@ exports[`getClassList 1`] = ` "end-0.5", "end-1", "end-1.5", + "end-2", + "end-2.5", + "end-3", + "end-3.5", + "end-4", + "end-5", + "end-6", + "end-7", + "end-8", + "end-9", "end-10", "end-11", "end-12", "end-14", "end-16", - "end-2", - "end-2.5", "end-20", "end-24", "end-28", - "end-3", - "end-3.5", "end-32", "end-36", - "end-4", "end-40", "end-44", "end-48", - "end-5", "end-52", "end-56", - "end-6", "end-60", "end-64", - "end-7", "end-72", - "end-8", "end-80", - "end-9", "end-96", "end-auto", "end-full", @@ -3733,25 +3737,18 @@ exports[`getClassList 1`] = ` "float-right", "float-start", "flow-root", - "font-black", "font-bold", - "font-extrabold", - "font-extralight", - "font-light", - "font-medium", - "font-normal", "font-sans", - "font-semibold", + "font-stretch-50%", + "font-stretch-75%", + "font-stretch-90%", + "font-stretch-95%", "font-stretch-100%", "font-stretch-105%", "font-stretch-110%", "font-stretch-125%", "font-stretch-150%", "font-stretch-200%", - "font-stretch-50%", - "font-stretch-75%", - "font-stretch-90%", - "font-stretch-95%", "font-stretch-condensed", "font-stretch-expanded", "font-stretch-extra-condensed", @@ -3762,12 +3759,11 @@ exports[`getClassList 1`] = ` "font-stretch-ultra-condensed", "font-stretch-ultra-expanded", "font-superbold", - "font-thin", "forced-color-adjust-auto", "forced-color-adjust-none", "from-0%", + "from-5%", "from-10%", - "from-100%", "from-15%", "from-20%", "from-25%", @@ -3775,7 +3771,6 @@ exports[`getClassList 1`] = ` "from-35%", "from-40%", "from-45%", - "from-5%", "from-50%", "from-55%", "from-60%", @@ -3786,6 +3781,7 @@ exports[`getClassList 1`] = ` "from-85%", "from-90%", "from-95%", + "from-100%", "from-current", "from-current/0", "from-current/5", @@ -3856,118 +3852,115 @@ exports[`getClassList 1`] = ` "gap-0.5", "gap-1", "gap-1.5", + "gap-2", + "gap-2.5", + "gap-3", + "gap-3.5", + "gap-4", + "gap-5", + "gap-6", + "gap-7", + "gap-8", + "gap-9", "gap-10", "gap-11", "gap-12", "gap-14", "gap-16", - "gap-2", - "gap-2.5", "gap-20", "gap-24", "gap-28", - "gap-3", - "gap-3.5", "gap-32", "gap-36", - "gap-4", "gap-40", "gap-44", "gap-48", - "gap-5", "gap-52", "gap-56", - "gap-6", "gap-60", "gap-64", - "gap-7", "gap-72", - "gap-8", "gap-80", - "gap-9", "gap-96", "gap-px", "gap-x-0", "gap-x-0.5", "gap-x-1", "gap-x-1.5", + "gap-x-2", + "gap-x-2.5", + "gap-x-3", + "gap-x-3.5", + "gap-x-4", + "gap-x-5", + "gap-x-6", + "gap-x-7", + "gap-x-8", + "gap-x-9", "gap-x-10", "gap-x-11", "gap-x-12", "gap-x-14", "gap-x-16", - "gap-x-2", - "gap-x-2.5", "gap-x-20", "gap-x-24", "gap-x-28", - "gap-x-3", - "gap-x-3.5", "gap-x-32", "gap-x-36", - "gap-x-4", "gap-x-40", "gap-x-44", "gap-x-48", - "gap-x-5", "gap-x-52", "gap-x-56", - "gap-x-6", "gap-x-60", "gap-x-64", - "gap-x-7", "gap-x-72", - "gap-x-8", "gap-x-80", - "gap-x-9", "gap-x-96", "gap-x-px", "gap-y-0", "gap-y-0.5", "gap-y-1", "gap-y-1.5", + "gap-y-2", + "gap-y-2.5", + "gap-y-3", + "gap-y-3.5", + "gap-y-4", + "gap-y-5", + "gap-y-6", + "gap-y-7", + "gap-y-8", + "gap-y-9", "gap-y-10", "gap-y-11", "gap-y-12", "gap-y-14", "gap-y-16", - "gap-y-2", - "gap-y-2.5", "gap-y-20", "gap-y-24", "gap-y-28", - "gap-y-3", - "gap-y-3.5", "gap-y-32", "gap-y-36", - "gap-y-4", "gap-y-40", "gap-y-44", "gap-y-48", - "gap-y-5", "gap-y-52", "gap-y-56", - "gap-y-6", "gap-y-60", "gap-y-64", - "gap-y-7", "gap-y-72", - "gap-y-8", "gap-y-80", - "gap-y-9", "gap-y-96", "gap-y-px", "grayscale", "grayscale-0", - "grayscale-100", "grayscale-25", "grayscale-50", "grayscale-75", + "grayscale-100", "grid", "grid-cols-1", - "grid-cols-10", - "grid-cols-11", - "grid-cols-12", "grid-cols-2", "grid-cols-3", "grid-cols-4", @@ -3976,6 +3969,9 @@ exports[`getClassList 1`] = ` "grid-cols-7", "grid-cols-8", "grid-cols-9", + "grid-cols-10", + "grid-cols-11", + "grid-cols-12", "grid-cols-none", "grid-cols-subgrid", "grid-flow-col", @@ -3984,9 +3980,6 @@ exports[`getClassList 1`] = ` "grid-flow-row", "grid-flow-row-dense", "grid-rows-1", - "grid-rows-10", - "grid-rows-11", - "grid-rows-12", "grid-rows-2", "grid-rows-3", "grid-rows-4", @@ -3995,6 +3988,9 @@ exports[`getClassList 1`] = ` "grid-rows-7", "grid-rows-8", "grid-rows-9", + "grid-rows-10", + "grid-rows-11", + "grid-rows-12", "grid-rows-none", "grid-rows-subgrid", "grow", @@ -4003,35 +3999,35 @@ exports[`getClassList 1`] = ` "h-0.5", "h-1", "h-1.5", + "h-2", + "h-2.5", + "h-3", + "h-3.5", + "h-4", + "h-5", + "h-6", + "h-7", + "h-8", + "h-9", "h-10", "h-11", "h-12", "h-14", "h-16", - "h-2", - "h-2.5", "h-20", "h-24", "h-28", - "h-3", - "h-3.5", "h-32", "h-36", - "h-4", "h-40", "h-44", "h-48", - "h-5", "h-52", "h-56", - "h-6", "h-60", "h-64", - "h-7", "h-72", - "h-8", "h-80", - "h-9", "h-96", "h-auto", "h-dvh", @@ -4049,10 +4045,10 @@ exports[`getClassList 1`] = ` "hidden", "hue-rotate-0", "hue-rotate-15", - "hue-rotate-180", "hue-rotate-30", "hue-rotate-60", "hue-rotate-90", + "hue-rotate-180", "hyphens-auto", "hyphens-manual", "hyphens-none", @@ -4060,35 +4056,35 @@ exports[`getClassList 1`] = ` "indent-0.5", "indent-1", "indent-1.5", + "indent-2", + "indent-2.5", + "indent-3", + "indent-3.5", + "indent-4", + "indent-5", + "indent-6", + "indent-7", + "indent-8", + "indent-9", "indent-10", "indent-11", "indent-12", "indent-14", "indent-16", - "indent-2", - "indent-2.5", "indent-20", "indent-24", "indent-28", - "indent-3", - "indent-3.5", "indent-32", "indent-36", - "indent-4", "indent-40", "indent-44", "indent-48", - "indent-5", "indent-52", "indent-56", - "indent-6", "indent-60", "indent-64", - "indent-7", "indent-72", - "indent-8", "indent-80", - "indent-9", "indent-96", "indent-px", "inline", @@ -4100,35 +4096,35 @@ exports[`getClassList 1`] = ` "inset-0.5", "inset-1", "inset-1.5", + "inset-2", + "inset-2.5", + "inset-3", + "inset-3.5", + "inset-4", + "inset-5", + "inset-6", + "inset-7", + "inset-8", + "inset-9", "inset-10", "inset-11", "inset-12", "inset-14", "inset-16", - "inset-2", - "inset-2.5", "inset-20", "inset-24", "inset-28", - "inset-3", - "inset-3.5", "inset-32", "inset-36", - "inset-4", "inset-40", "inset-44", "inset-48", - "inset-5", "inset-52", "inset-56", - "inset-6", "inset-60", "inset-64", - "inset-7", "inset-72", - "inset-8", "inset-80", - "inset-9", "inset-96", "inset-auto", "inset-full", @@ -4278,35 +4274,35 @@ exports[`getClassList 1`] = ` "inset-x-0.5", "inset-x-1", "inset-x-1.5", + "inset-x-2", + "inset-x-2.5", + "inset-x-3", + "inset-x-3.5", + "inset-x-4", + "inset-x-5", + "inset-x-6", + "inset-x-7", + "inset-x-8", + "inset-x-9", "inset-x-10", "inset-x-11", "inset-x-12", "inset-x-14", "inset-x-16", - "inset-x-2", - "inset-x-2.5", "inset-x-20", "inset-x-24", "inset-x-28", - "inset-x-3", - "inset-x-3.5", "inset-x-32", "inset-x-36", - "inset-x-4", "inset-x-40", "inset-x-44", "inset-x-48", - "inset-x-5", "inset-x-52", "inset-x-56", - "inset-x-6", "inset-x-60", "inset-x-64", - "inset-x-7", "inset-x-72", - "inset-x-8", "inset-x-80", - "inset-x-9", "inset-x-96", "inset-x-auto", "inset-x-full", @@ -4315,45 +4311,45 @@ exports[`getClassList 1`] = ` "inset-y-0.5", "inset-y-1", "inset-y-1.5", + "inset-y-2", + "inset-y-2.5", + "inset-y-3", + "inset-y-3.5", + "inset-y-4", + "inset-y-5", + "inset-y-6", + "inset-y-7", + "inset-y-8", + "inset-y-9", "inset-y-10", "inset-y-11", "inset-y-12", "inset-y-14", "inset-y-16", - "inset-y-2", - "inset-y-2.5", "inset-y-20", "inset-y-24", "inset-y-28", - "inset-y-3", - "inset-y-3.5", "inset-y-32", "inset-y-36", - "inset-y-4", "inset-y-40", "inset-y-44", "inset-y-48", - "inset-y-5", "inset-y-52", "inset-y-56", - "inset-y-6", "inset-y-60", "inset-y-64", - "inset-y-7", "inset-y-72", - "inset-y-8", "inset-y-80", - "inset-y-9", "inset-y-96", "inset-y-auto", "inset-y-full", "inset-y-px", "invert", "invert-0", - "invert-100", "invert-25", "invert-50", "invert-75", + "invert-100", "invisible", "isolate", "isolation-auto", @@ -4386,35 +4382,35 @@ exports[`getClassList 1`] = ` "leading-0.5", "leading-1", "leading-1.5", + "leading-2", + "leading-2.5", + "leading-3", + "leading-3.5", + "leading-4", + "leading-5", + "leading-6", + "leading-7", + "leading-8", + "leading-9", "leading-10", "leading-11", "leading-12", "leading-14", "leading-16", - "leading-2", - "leading-2.5", "leading-20", "leading-24", "leading-28", - "leading-3", - "leading-3.5", "leading-32", "leading-36", - "leading-4", "leading-40", "leading-44", "leading-48", - "leading-5", "leading-52", "leading-56", - "leading-6", "leading-60", "leading-64", - "leading-7", "leading-72", - "leading-8", "leading-80", - "leading-9", "leading-96", "leading-none", "leading-px", @@ -4422,35 +4418,35 @@ exports[`getClassList 1`] = ` "left-0.5", "left-1", "left-1.5", + "left-2", + "left-2.5", + "left-3", + "left-3.5", + "left-4", + "left-5", + "left-6", + "left-7", + "left-8", + "left-9", "left-10", "left-11", "left-12", "left-14", "left-16", - "left-2", - "left-2.5", "left-20", "left-24", "left-28", - "left-3", - "left-3.5", "left-32", "left-36", - "left-4", "left-40", "left-44", "left-48", - "left-5", "left-52", "left-56", - "left-6", "left-60", "left-64", - "left-7", "left-72", - "left-8", "left-80", - "left-9", "left-96", "left-auto", "left-full", @@ -4476,35 +4472,35 @@ exports[`getClassList 1`] = ` "m-0.5", "m-1", "m-1.5", + "m-2", + "m-2.5", + "m-3", + "m-3.5", + "m-4", + "m-5", + "m-6", + "m-7", + "m-8", + "m-9", "m-10", "m-11", "m-12", "m-14", "m-16", - "m-2", - "m-2.5", "m-20", "m-24", "m-28", - "m-3", - "m-3.5", "m-32", "m-36", - "m-4", "m-40", "m-44", "m-48", - "m-5", "m-52", "m-56", - "m-6", "m-60", "m-64", - "m-7", "m-72", - "m-8", "m-80", - "m-9", "m-96", "m-auto", "m-px", @@ -4512,35 +4508,35 @@ exports[`getClassList 1`] = ` "max-h-0.5", "max-h-1", "max-h-1.5", + "max-h-2", + "max-h-2.5", + "max-h-3", + "max-h-3.5", + "max-h-4", + "max-h-5", + "max-h-6", + "max-h-7", + "max-h-8", + "max-h-9", "max-h-10", "max-h-11", "max-h-12", "max-h-14", "max-h-16", - "max-h-2", - "max-h-2.5", "max-h-20", "max-h-24", "max-h-28", - "max-h-3", - "max-h-3.5", "max-h-32", "max-h-36", - "max-h-4", "max-h-40", "max-h-44", "max-h-48", - "max-h-5", "max-h-52", "max-h-56", - "max-h-6", "max-h-60", "max-h-64", - "max-h-7", "max-h-72", - "max-h-8", "max-h-80", - "max-h-9", "max-h-96", "max-h-auto", "max-h-dvh", @@ -4560,44 +4556,46 @@ exports[`getClassList 1`] = ` "max-w-0.5", "max-w-1", "max-w-1.5", + "max-w-2", + "max-w-2.5", + "max-w-3", + "max-w-3.5", + "max-w-4", + "max-w-5", + "max-w-6", + "max-w-7", + "max-w-8", + "max-w-9", "max-w-10", "max-w-11", "max-w-12", "max-w-14", "max-w-16", - "max-w-2", - "max-w-2.5", "max-w-20", "max-w-24", "max-w-28", - "max-w-3", - "max-w-3.5", "max-w-32", "max-w-36", - "max-w-4", "max-w-40", "max-w-44", "max-w-48", - "max-w-5", "max-w-52", "max-w-56", - "max-w-6", "max-w-60", "max-w-64", - "max-w-7", "max-w-72", - "max-w-8", "max-w-80", - "max-w-9", "max-w-96", "max-w-auto", "max-w-dvh", "max-w-dvw", "max-w-fit", "max-w-full", + "max-w-lg", "max-w-lvh", "max-w-lvw", "max-w-max", + "max-w-md", "max-w-min", "max-w-none", "max-w-px", @@ -4608,35 +4606,35 @@ exports[`getClassList 1`] = ` "mb-0.5", "mb-1", "mb-1.5", + "mb-2", + "mb-2.5", + "mb-3", + "mb-3.5", + "mb-4", + "mb-5", + "mb-6", + "mb-7", + "mb-8", + "mb-9", "mb-10", "mb-11", "mb-12", "mb-14", "mb-16", - "mb-2", - "mb-2.5", "mb-20", "mb-24", "mb-28", - "mb-3", - "mb-3.5", "mb-32", "mb-36", - "mb-4", "mb-40", "mb-44", "mb-48", - "mb-5", "mb-52", "mb-56", - "mb-6", "mb-60", "mb-64", - "mb-7", "mb-72", - "mb-8", "mb-80", - "mb-9", "mb-96", "mb-auto", "mb-px", @@ -4644,35 +4642,35 @@ exports[`getClassList 1`] = ` "me-0.5", "me-1", "me-1.5", + "me-2", + "me-2.5", + "me-3", + "me-3.5", + "me-4", + "me-5", + "me-6", + "me-7", + "me-8", + "me-9", "me-10", "me-11", "me-12", "me-14", "me-16", - "me-2", - "me-2.5", "me-20", "me-24", "me-28", - "me-3", - "me-3.5", "me-32", "me-36", - "me-4", "me-40", "me-44", "me-48", - "me-5", "me-52", "me-56", - "me-6", "me-60", "me-64", - "me-7", "me-72", - "me-8", "me-80", - "me-9", "me-96", "me-auto", "me-px", @@ -4680,35 +4678,35 @@ exports[`getClassList 1`] = ` "min-h-0.5", "min-h-1", "min-h-1.5", + "min-h-2", + "min-h-2.5", + "min-h-3", + "min-h-3.5", + "min-h-4", + "min-h-5", + "min-h-6", + "min-h-7", + "min-h-8", + "min-h-9", "min-h-10", "min-h-11", "min-h-12", "min-h-14", "min-h-16", - "min-h-2", - "min-h-2.5", "min-h-20", "min-h-24", "min-h-28", - "min-h-3", - "min-h-3.5", "min-h-32", "min-h-36", - "min-h-4", "min-h-40", "min-h-44", "min-h-48", - "min-h-5", "min-h-52", "min-h-56", - "min-h-6", "min-h-60", "min-h-64", - "min-h-7", "min-h-72", - "min-h-8", "min-h-80", - "min-h-9", "min-h-96", "min-h-auto", "min-h-dvh", @@ -4719,7 +4717,6 @@ exports[`getClassList 1`] = ` "min-h-lvw", "min-h-max", "min-h-min", - "min-h-none", "min-h-px", "min-h-screen", "min-h-svh", @@ -4728,46 +4725,47 @@ exports[`getClassList 1`] = ` "min-w-0.5", "min-w-1", "min-w-1.5", + "min-w-2", + "min-w-2.5", + "min-w-3", + "min-w-3.5", + "min-w-4", + "min-w-5", + "min-w-6", + "min-w-7", + "min-w-8", + "min-w-9", "min-w-10", "min-w-11", "min-w-12", "min-w-14", "min-w-16", - "min-w-2", - "min-w-2.5", "min-w-20", "min-w-24", "min-w-28", - "min-w-3", - "min-w-3.5", "min-w-32", "min-w-36", - "min-w-4", "min-w-40", "min-w-44", "min-w-48", - "min-w-5", "min-w-52", "min-w-56", - "min-w-6", "min-w-60", "min-w-64", - "min-w-7", "min-w-72", - "min-w-8", "min-w-80", - "min-w-9", "min-w-96", "min-w-auto", "min-w-dvh", "min-w-dvw", "min-w-fit", "min-w-full", + "min-w-lg", "min-w-lvh", "min-w-lvw", "min-w-max", + "min-w-md", "min-w-min", - "min-w-none", "min-w-px", "min-w-screen", "min-w-svh", @@ -4794,35 +4792,35 @@ exports[`getClassList 1`] = ` "ml-0.5", "ml-1", "ml-1.5", + "ml-2", + "ml-2.5", + "ml-3", + "ml-3.5", + "ml-4", + "ml-5", + "ml-6", + "ml-7", + "ml-8", + "ml-9", "ml-10", "ml-11", "ml-12", "ml-14", "ml-16", - "ml-2", - "ml-2.5", "ml-20", "ml-24", "ml-28", - "ml-3", - "ml-3.5", "ml-32", "ml-36", - "ml-4", "ml-40", "ml-44", "ml-48", - "ml-5", "ml-52", "ml-56", - "ml-6", "ml-60", "ml-64", - "ml-7", "ml-72", - "ml-8", "ml-80", - "ml-9", "ml-96", "ml-auto", "ml-px", @@ -4830,35 +4828,35 @@ exports[`getClassList 1`] = ` "mr-0.5", "mr-1", "mr-1.5", + "mr-2", + "mr-2.5", + "mr-3", + "mr-3.5", + "mr-4", + "mr-5", + "mr-6", + "mr-7", + "mr-8", + "mr-9", "mr-10", "mr-11", "mr-12", "mr-14", "mr-16", - "mr-2", - "mr-2.5", "mr-20", "mr-24", "mr-28", - "mr-3", - "mr-3.5", "mr-32", "mr-36", - "mr-4", "mr-40", "mr-44", "mr-48", - "mr-5", "mr-52", "mr-56", - "mr-6", "mr-60", "mr-64", - "mr-7", "mr-72", - "mr-8", "mr-80", - "mr-9", "mr-96", "mr-auto", "mr-px", @@ -4866,35 +4864,35 @@ exports[`getClassList 1`] = ` "ms-0.5", "ms-1", "ms-1.5", + "ms-2", + "ms-2.5", + "ms-3", + "ms-3.5", + "ms-4", + "ms-5", + "ms-6", + "ms-7", + "ms-8", + "ms-9", "ms-10", "ms-11", "ms-12", "ms-14", "ms-16", - "ms-2", - "ms-2.5", "ms-20", "ms-24", "ms-28", - "ms-3", - "ms-3.5", "ms-32", "ms-36", - "ms-4", "ms-40", "ms-44", "ms-48", - "ms-5", "ms-52", "ms-56", - "ms-6", "ms-60", "ms-64", - "ms-7", "ms-72", - "ms-8", "ms-80", - "ms-9", "ms-96", "ms-auto", "ms-px", @@ -4902,35 +4900,35 @@ exports[`getClassList 1`] = ` "mt-0.5", "mt-1", "mt-1.5", + "mt-2", + "mt-2.5", + "mt-3", + "mt-3.5", + "mt-4", + "mt-5", + "mt-6", + "mt-7", + "mt-8", + "mt-9", "mt-10", "mt-11", "mt-12", "mt-14", "mt-16", - "mt-2", - "mt-2.5", "mt-20", "mt-24", "mt-28", - "mt-3", - "mt-3.5", "mt-32", "mt-36", - "mt-4", "mt-40", "mt-44", "mt-48", - "mt-5", "mt-52", "mt-56", - "mt-6", "mt-60", "mt-64", - "mt-7", "mt-72", - "mt-8", "mt-80", - "mt-9", "mt-96", "mt-auto", "mt-px", @@ -4938,35 +4936,35 @@ exports[`getClassList 1`] = ` "mx-0.5", "mx-1", "mx-1.5", + "mx-2", + "mx-2.5", + "mx-3", + "mx-3.5", + "mx-4", + "mx-5", + "mx-6", + "mx-7", + "mx-8", + "mx-9", "mx-10", "mx-11", "mx-12", "mx-14", "mx-16", - "mx-2", - "mx-2.5", "mx-20", "mx-24", "mx-28", - "mx-3", - "mx-3.5", "mx-32", "mx-36", - "mx-4", "mx-40", "mx-44", "mx-48", - "mx-5", "mx-52", "mx-56", - "mx-6", "mx-60", "mx-64", - "mx-7", "mx-72", - "mx-8", "mx-80", - "mx-9", "mx-96", "mx-auto", "mx-px", @@ -4974,35 +4972,35 @@ exports[`getClassList 1`] = ` "my-0.5", "my-1", "my-1.5", + "my-2", + "my-2.5", + "my-3", + "my-3.5", + "my-4", + "my-5", + "my-6", + "my-7", + "my-8", + "my-9", "my-10", "my-11", "my-12", "my-14", "my-16", - "my-2", - "my-2.5", "my-20", "my-24", "my-28", - "my-3", - "my-3.5", "my-32", "my-36", - "my-4", "my-40", "my-44", "my-48", - "my-5", "my-52", "my-56", - "my-6", "my-60", "my-64", - "my-7", "my-72", - "my-8", "my-80", - "my-9", "my-96", "my-auto", "my-px", @@ -5027,8 +5025,8 @@ exports[`getClassList 1`] = ` "object-top", "oldstyle-nums", "opacity-0", + "opacity-5", "opacity-10", - "opacity-100", "opacity-15", "opacity-20", "opacity-25", @@ -5036,7 +5034,6 @@ exports[`getClassList 1`] = ` "opacity-35", "opacity-40", "opacity-45", - "opacity-5", "opacity-50", "opacity-55", "opacity-60", @@ -5047,11 +5044,9 @@ exports[`getClassList 1`] = ` "opacity-85", "opacity-90", "opacity-95", + "opacity-100", "opacity-background", "order-1", - "order-10", - "order-11", - "order-12", "order-2", "order-3", "order-4", @@ -5060,6 +5055,9 @@ exports[`getClassList 1`] = ` "order-7", "order-8", "order-9", + "order-10", + "order-11", + "order-12", "order-first", "order-last", "order-none", @@ -5206,105 +5204,105 @@ exports[`getClassList 1`] = ` "p-0.5", "p-1", "p-1.5", + "p-2", + "p-2.5", + "p-3", + "p-3.5", + "p-4", + "p-5", + "p-6", + "p-7", + "p-8", + "p-9", "p-10", "p-11", "p-12", "p-14", "p-16", - "p-2", - "p-2.5", "p-20", "p-24", "p-28", - "p-3", - "p-3.5", "p-32", "p-36", - "p-4", "p-40", "p-44", "p-48", - "p-5", "p-52", "p-56", - "p-6", "p-60", "p-64", - "p-7", "p-72", - "p-8", "p-80", - "p-9", "p-96", "p-px", "pb-0", "pb-0.5", "pb-1", "pb-1.5", + "pb-2", + "pb-2.5", + "pb-3", + "pb-3.5", + "pb-4", + "pb-5", + "pb-6", + "pb-7", + "pb-8", + "pb-9", "pb-10", "pb-11", "pb-12", "pb-14", "pb-16", - "pb-2", - "pb-2.5", "pb-20", "pb-24", "pb-28", - "pb-3", - "pb-3.5", "pb-32", "pb-36", - "pb-4", "pb-40", "pb-44", "pb-48", - "pb-5", "pb-52", "pb-56", - "pb-6", "pb-60", "pb-64", - "pb-7", "pb-72", - "pb-8", "pb-80", - "pb-9", "pb-96", "pb-px", "pe-0", "pe-0.5", "pe-1", "pe-1.5", + "pe-2", + "pe-2.5", + "pe-3", + "pe-3.5", + "pe-4", + "pe-5", + "pe-6", + "pe-7", + "pe-8", + "pe-9", "pe-10", "pe-11", "pe-12", "pe-14", "pe-16", - "pe-2", - "pe-2.5", "pe-20", "pe-24", "pe-28", - "pe-3", - "pe-3.5", "pe-32", "pe-36", - "pe-4", "pe-40", "pe-44", "pe-48", - "pe-5", "pe-52", "pe-56", - "pe-6", "pe-60", "pe-64", - "pe-7", "pe-72", - "pe-8", "pe-80", - "pe-9", "pe-96", "pe-px", "perspective-dramatic", @@ -5323,35 +5321,35 @@ exports[`getClassList 1`] = ` "pl-0.5", "pl-1", "pl-1.5", + "pl-2", + "pl-2.5", + "pl-3", + "pl-3.5", + "pl-4", + "pl-5", + "pl-6", + "pl-7", + "pl-8", + "pl-9", "pl-10", "pl-11", "pl-12", "pl-14", "pl-16", - "pl-2", - "pl-2.5", "pl-20", "pl-24", "pl-28", - "pl-3", - "pl-3.5", "pl-32", "pl-36", - "pl-4", "pl-40", "pl-44", "pl-48", - "pl-5", "pl-52", "pl-56", - "pl-6", "pl-60", "pl-64", - "pl-7", "pl-72", - "pl-8", "pl-80", - "pl-9", "pl-96", "pl-px", "place-content-around", @@ -5444,35 +5442,35 @@ exports[`getClassList 1`] = ` "pr-0.5", "pr-1", "pr-1.5", + "pr-2", + "pr-2.5", + "pr-3", + "pr-3.5", + "pr-4", + "pr-5", + "pr-6", + "pr-7", + "pr-8", + "pr-9", "pr-10", "pr-11", "pr-12", "pr-14", "pr-16", - "pr-2", - "pr-2.5", "pr-20", "pr-24", "pr-28", - "pr-3", - "pr-3.5", "pr-32", "pr-36", - "pr-4", "pr-40", "pr-44", "pr-48", - "pr-5", "pr-52", "pr-56", - "pr-6", "pr-60", "pr-64", - "pr-7", "pr-72", - "pr-8", "pr-80", - "pr-9", "pr-96", "pr-px", "proportional-nums", @@ -5480,140 +5478,140 @@ exports[`getClassList 1`] = ` "ps-0.5", "ps-1", "ps-1.5", + "ps-2", + "ps-2.5", + "ps-3", + "ps-3.5", + "ps-4", + "ps-5", + "ps-6", + "ps-7", + "ps-8", + "ps-9", "ps-10", "ps-11", "ps-12", "ps-14", "ps-16", - "ps-2", - "ps-2.5", "ps-20", "ps-24", "ps-28", - "ps-3", - "ps-3.5", "ps-32", "ps-36", - "ps-4", "ps-40", "ps-44", "ps-48", - "ps-5", "ps-52", "ps-56", - "ps-6", "ps-60", "ps-64", - "ps-7", "ps-72", - "ps-8", "ps-80", - "ps-9", "ps-96", "ps-px", "pt-0", "pt-0.5", "pt-1", "pt-1.5", + "pt-2", + "pt-2.5", + "pt-3", + "pt-3.5", + "pt-4", + "pt-5", + "pt-6", + "pt-7", + "pt-8", + "pt-9", "pt-10", "pt-11", "pt-12", "pt-14", "pt-16", - "pt-2", - "pt-2.5", "pt-20", "pt-24", "pt-28", - "pt-3", - "pt-3.5", "pt-32", "pt-36", - "pt-4", "pt-40", "pt-44", "pt-48", - "pt-5", "pt-52", "pt-56", - "pt-6", "pt-60", "pt-64", - "pt-7", "pt-72", - "pt-8", "pt-80", - "pt-9", "pt-96", "pt-px", "px-0", "px-0.5", "px-1", "px-1.5", + "px-2", + "px-2.5", + "px-3", + "px-3.5", + "px-4", + "px-5", + "px-6", + "px-7", + "px-8", + "px-9", "px-10", "px-11", "px-12", "px-14", "px-16", - "px-2", - "px-2.5", "px-20", "px-24", "px-28", - "px-3", - "px-3.5", "px-32", "px-36", - "px-4", "px-40", "px-44", "px-48", - "px-5", "px-52", "px-56", - "px-6", "px-60", "px-64", - "px-7", "px-72", - "px-8", "px-80", - "px-9", "px-96", "px-px", "py-0", "py-0.5", "py-1", "py-1.5", + "py-2", + "py-2.5", + "py-3", + "py-3.5", + "py-4", + "py-5", + "py-6", + "py-7", + "py-8", + "py-9", "py-10", "py-11", "py-12", "py-14", "py-16", - "py-2", - "py-2.5", "py-20", "py-24", "py-28", - "py-3", - "py-3.5", "py-32", "py-36", - "py-4", "py-40", "py-44", "py-48", - "py-5", "py-52", "py-56", - "py-6", "py-60", "py-64", - "py-7", "py-72", - "py-8", "py-80", - "py-9", "py-96", "py-px", "relative", @@ -5625,35 +5623,35 @@ exports[`getClassList 1`] = ` "right-0.5", "right-1", "right-1.5", + "right-2", + "right-2.5", + "right-3", + "right-3.5", + "right-4", + "right-5", + "right-6", + "right-7", + "right-8", + "right-9", "right-10", "right-11", "right-12", "right-14", "right-16", - "right-2", - "right-2.5", "right-20", "right-24", "right-28", - "right-3", - "right-3.5", "right-32", "right-36", - "right-4", "right-40", "right-44", "right-48", - "right-5", "right-52", "right-56", - "right-6", "right-60", "right-64", - "right-7", "right-72", - "right-8", "right-80", - "right-9", "right-96", "right-auto", "right-full", @@ -5804,41 +5802,41 @@ exports[`getClassList 1`] = ` "ring-transparent/100", "rotate-0", "rotate-1", - "rotate-12", - "rotate-180", "rotate-2", "rotate-3", - "rotate-45", "rotate-6", + "rotate-12", + "rotate-45", "rotate-90", + "rotate-180", "rotate-none", "rotate-x-0", "rotate-x-1", - "rotate-x-12", - "rotate-x-180", "rotate-x-2", "rotate-x-3", - "rotate-x-45", "rotate-x-6", + "rotate-x-12", + "rotate-x-45", "rotate-x-90", + "rotate-x-180", "rotate-y-0", "rotate-y-1", - "rotate-y-12", - "rotate-y-180", "rotate-y-2", "rotate-y-3", - "rotate-y-45", "rotate-y-6", + "rotate-y-12", + "rotate-y-45", "rotate-y-90", + "rotate-y-180", "rotate-z-0", "rotate-z-1", - "rotate-z-12", - "rotate-z-180", "rotate-z-2", "rotate-z-3", - "rotate-z-45", "rotate-z-6", + "rotate-z-12", + "rotate-z-45", "rotate-z-90", + "rotate-z-180", "rounded-b-full", "rounded-b-none", "rounded-bl-full", @@ -5871,10 +5869,6 @@ exports[`getClassList 1`] = ` "rounded-tr-none", "row-auto", "row-end-1", - "row-end-10", - "row-end-11", - "row-end-12", - "row-end-13", "row-end-2", "row-end-3", "row-end-4", @@ -5883,11 +5877,12 @@ exports[`getClassList 1`] = ` "row-end-7", "row-end-8", "row-end-9", + "row-end-10", + "row-end-11", + "row-end-12", + "row-end-13", "row-end-auto", "row-span-1", - "row-span-10", - "row-span-11", - "row-span-12", "row-span-2", "row-span-3", "row-span-4", @@ -5896,12 +5891,11 @@ exports[`getClassList 1`] = ` "row-span-7", "row-span-8", "row-span-9", + "row-span-10", + "row-span-11", + "row-span-12", "row-span-full", "row-start-1", - "row-start-10", - "row-start-11", - "row-start-12", - "row-start-13", "row-start-2", "row-start-3", "row-start-4", @@ -5910,58 +5904,62 @@ exports[`getClassList 1`] = ` "row-start-7", "row-start-8", "row-start-9", + "row-start-10", + "row-start-11", + "row-start-12", + "row-start-13", "row-start-auto", "saturate-0", + "saturate-50", "saturate-100", "saturate-150", "saturate-200", - "saturate-50", "scale-0", + "scale-3d", + "scale-50", + "scale-75", + "scale-90", + "scale-95", "scale-100", "scale-105", "scale-110", "scale-125", "scale-150", "scale-200", - "scale-3d", - "scale-50", - "scale-75", - "scale-90", - "scale-95", "scale-none", "scale-x-0", + "scale-x-50", + "scale-x-75", + "scale-x-90", + "scale-x-95", "scale-x-100", "scale-x-105", "scale-x-110", "scale-x-125", "scale-x-150", "scale-x-200", - "scale-x-50", - "scale-x-75", - "scale-x-90", - "scale-x-95", "scale-y-0", + "scale-y-50", + "scale-y-75", + "scale-y-90", + "scale-y-95", "scale-y-100", "scale-y-105", "scale-y-110", "scale-y-125", "scale-y-150", "scale-y-200", - "scale-y-50", - "scale-y-75", - "scale-y-90", - "scale-y-95", "scale-z-0", + "scale-z-50", + "scale-z-75", + "scale-z-90", + "scale-z-95", "scale-z-100", "scale-z-105", "scale-z-110", "scale-z-125", "scale-z-150", "scale-z-200", - "scale-z-50", - "scale-z-75", - "scale-z-90", - "scale-z-95", "scheme-dark", "scheme-light", "scheme-light-dark", @@ -5973,630 +5971,630 @@ exports[`getClassList 1`] = ` "scroll-m-0.5", "scroll-m-1", "scroll-m-1.5", + "scroll-m-2", + "scroll-m-2.5", + "scroll-m-3", + "scroll-m-3.5", + "scroll-m-4", + "scroll-m-5", + "scroll-m-6", + "scroll-m-7", + "scroll-m-8", + "scroll-m-9", "scroll-m-10", "scroll-m-11", "scroll-m-12", "scroll-m-14", "scroll-m-16", - "scroll-m-2", - "scroll-m-2.5", "scroll-m-20", "scroll-m-24", "scroll-m-28", - "scroll-m-3", - "scroll-m-3.5", "scroll-m-32", "scroll-m-36", - "scroll-m-4", "scroll-m-40", "scroll-m-44", "scroll-m-48", - "scroll-m-5", "scroll-m-52", "scroll-m-56", - "scroll-m-6", "scroll-m-60", "scroll-m-64", - "scroll-m-7", "scroll-m-72", - "scroll-m-8", "scroll-m-80", - "scroll-m-9", "scroll-m-96", "scroll-m-px", "scroll-mb-0", "scroll-mb-0.5", "scroll-mb-1", "scroll-mb-1.5", + "scroll-mb-2", + "scroll-mb-2.5", + "scroll-mb-3", + "scroll-mb-3.5", + "scroll-mb-4", + "scroll-mb-5", + "scroll-mb-6", + "scroll-mb-7", + "scroll-mb-8", + "scroll-mb-9", "scroll-mb-10", "scroll-mb-11", "scroll-mb-12", "scroll-mb-14", "scroll-mb-16", - "scroll-mb-2", - "scroll-mb-2.5", "scroll-mb-20", "scroll-mb-24", "scroll-mb-28", - "scroll-mb-3", - "scroll-mb-3.5", "scroll-mb-32", "scroll-mb-36", - "scroll-mb-4", "scroll-mb-40", "scroll-mb-44", "scroll-mb-48", - "scroll-mb-5", "scroll-mb-52", "scroll-mb-56", - "scroll-mb-6", "scroll-mb-60", "scroll-mb-64", - "scroll-mb-7", "scroll-mb-72", - "scroll-mb-8", "scroll-mb-80", - "scroll-mb-9", "scroll-mb-96", "scroll-mb-px", "scroll-me-0", "scroll-me-0.5", "scroll-me-1", "scroll-me-1.5", + "scroll-me-2", + "scroll-me-2.5", + "scroll-me-3", + "scroll-me-3.5", + "scroll-me-4", + "scroll-me-5", + "scroll-me-6", + "scroll-me-7", + "scroll-me-8", + "scroll-me-9", "scroll-me-10", "scroll-me-11", "scroll-me-12", "scroll-me-14", "scroll-me-16", - "scroll-me-2", - "scroll-me-2.5", "scroll-me-20", "scroll-me-24", "scroll-me-28", - "scroll-me-3", - "scroll-me-3.5", "scroll-me-32", "scroll-me-36", - "scroll-me-4", "scroll-me-40", "scroll-me-44", "scroll-me-48", - "scroll-me-5", "scroll-me-52", "scroll-me-56", - "scroll-me-6", "scroll-me-60", "scroll-me-64", - "scroll-me-7", "scroll-me-72", - "scroll-me-8", "scroll-me-80", - "scroll-me-9", "scroll-me-96", "scroll-me-px", "scroll-ml-0", "scroll-ml-0.5", "scroll-ml-1", "scroll-ml-1.5", + "scroll-ml-2", + "scroll-ml-2.5", + "scroll-ml-3", + "scroll-ml-3.5", + "scroll-ml-4", + "scroll-ml-5", + "scroll-ml-6", + "scroll-ml-7", + "scroll-ml-8", + "scroll-ml-9", "scroll-ml-10", "scroll-ml-11", "scroll-ml-12", "scroll-ml-14", "scroll-ml-16", - "scroll-ml-2", - "scroll-ml-2.5", "scroll-ml-20", "scroll-ml-24", "scroll-ml-28", - "scroll-ml-3", - "scroll-ml-3.5", "scroll-ml-32", "scroll-ml-36", - "scroll-ml-4", "scroll-ml-40", "scroll-ml-44", "scroll-ml-48", - "scroll-ml-5", "scroll-ml-52", "scroll-ml-56", - "scroll-ml-6", "scroll-ml-60", "scroll-ml-64", - "scroll-ml-7", "scroll-ml-72", - "scroll-ml-8", "scroll-ml-80", - "scroll-ml-9", "scroll-ml-96", "scroll-ml-px", "scroll-mr-0", "scroll-mr-0.5", "scroll-mr-1", "scroll-mr-1.5", + "scroll-mr-2", + "scroll-mr-2.5", + "scroll-mr-3", + "scroll-mr-3.5", + "scroll-mr-4", + "scroll-mr-5", + "scroll-mr-6", + "scroll-mr-7", + "scroll-mr-8", + "scroll-mr-9", "scroll-mr-10", "scroll-mr-11", "scroll-mr-12", "scroll-mr-14", "scroll-mr-16", - "scroll-mr-2", - "scroll-mr-2.5", "scroll-mr-20", "scroll-mr-24", "scroll-mr-28", - "scroll-mr-3", - "scroll-mr-3.5", "scroll-mr-32", "scroll-mr-36", - "scroll-mr-4", "scroll-mr-40", "scroll-mr-44", "scroll-mr-48", - "scroll-mr-5", "scroll-mr-52", "scroll-mr-56", - "scroll-mr-6", "scroll-mr-60", "scroll-mr-64", - "scroll-mr-7", "scroll-mr-72", - "scroll-mr-8", "scroll-mr-80", - "scroll-mr-9", "scroll-mr-96", "scroll-mr-px", "scroll-ms-0", "scroll-ms-0.5", "scroll-ms-1", "scroll-ms-1.5", + "scroll-ms-2", + "scroll-ms-2.5", + "scroll-ms-3", + "scroll-ms-3.5", + "scroll-ms-4", + "scroll-ms-5", + "scroll-ms-6", + "scroll-ms-7", + "scroll-ms-8", + "scroll-ms-9", "scroll-ms-10", "scroll-ms-11", "scroll-ms-12", "scroll-ms-14", "scroll-ms-16", - "scroll-ms-2", - "scroll-ms-2.5", "scroll-ms-20", "scroll-ms-24", "scroll-ms-28", - "scroll-ms-3", - "scroll-ms-3.5", "scroll-ms-32", "scroll-ms-36", - "scroll-ms-4", "scroll-ms-40", "scroll-ms-44", "scroll-ms-48", - "scroll-ms-5", "scroll-ms-52", "scroll-ms-56", - "scroll-ms-6", "scroll-ms-60", "scroll-ms-64", - "scroll-ms-7", "scroll-ms-72", - "scroll-ms-8", "scroll-ms-80", - "scroll-ms-9", "scroll-ms-96", "scroll-ms-px", "scroll-mt-0", "scroll-mt-0.5", "scroll-mt-1", "scroll-mt-1.5", + "scroll-mt-2", + "scroll-mt-2.5", + "scroll-mt-3", + "scroll-mt-3.5", + "scroll-mt-4", + "scroll-mt-5", + "scroll-mt-6", + "scroll-mt-7", + "scroll-mt-8", + "scroll-mt-9", "scroll-mt-10", "scroll-mt-11", "scroll-mt-12", "scroll-mt-14", "scroll-mt-16", - "scroll-mt-2", - "scroll-mt-2.5", "scroll-mt-20", "scroll-mt-24", "scroll-mt-28", - "scroll-mt-3", - "scroll-mt-3.5", "scroll-mt-32", "scroll-mt-36", - "scroll-mt-4", "scroll-mt-40", "scroll-mt-44", "scroll-mt-48", - "scroll-mt-5", "scroll-mt-52", "scroll-mt-56", - "scroll-mt-6", "scroll-mt-60", "scroll-mt-64", - "scroll-mt-7", "scroll-mt-72", - "scroll-mt-8", "scroll-mt-80", - "scroll-mt-9", "scroll-mt-96", "scroll-mt-px", "scroll-mx-0", "scroll-mx-0.5", "scroll-mx-1", "scroll-mx-1.5", + "scroll-mx-2", + "scroll-mx-2.5", + "scroll-mx-3", + "scroll-mx-3.5", + "scroll-mx-4", + "scroll-mx-5", + "scroll-mx-6", + "scroll-mx-7", + "scroll-mx-8", + "scroll-mx-9", "scroll-mx-10", "scroll-mx-11", "scroll-mx-12", "scroll-mx-14", "scroll-mx-16", - "scroll-mx-2", - "scroll-mx-2.5", "scroll-mx-20", "scroll-mx-24", "scroll-mx-28", - "scroll-mx-3", - "scroll-mx-3.5", "scroll-mx-32", "scroll-mx-36", - "scroll-mx-4", "scroll-mx-40", "scroll-mx-44", "scroll-mx-48", - "scroll-mx-5", "scroll-mx-52", "scroll-mx-56", - "scroll-mx-6", "scroll-mx-60", "scroll-mx-64", - "scroll-mx-7", "scroll-mx-72", - "scroll-mx-8", "scroll-mx-80", - "scroll-mx-9", "scroll-mx-96", "scroll-mx-px", "scroll-my-0", "scroll-my-0.5", "scroll-my-1", "scroll-my-1.5", + "scroll-my-2", + "scroll-my-2.5", + "scroll-my-3", + "scroll-my-3.5", + "scroll-my-4", + "scroll-my-5", + "scroll-my-6", + "scroll-my-7", + "scroll-my-8", + "scroll-my-9", "scroll-my-10", "scroll-my-11", "scroll-my-12", "scroll-my-14", "scroll-my-16", - "scroll-my-2", - "scroll-my-2.5", "scroll-my-20", "scroll-my-24", "scroll-my-28", - "scroll-my-3", - "scroll-my-3.5", "scroll-my-32", "scroll-my-36", - "scroll-my-4", "scroll-my-40", "scroll-my-44", "scroll-my-48", - "scroll-my-5", "scroll-my-52", "scroll-my-56", - "scroll-my-6", "scroll-my-60", "scroll-my-64", - "scroll-my-7", "scroll-my-72", - "scroll-my-8", "scroll-my-80", - "scroll-my-9", "scroll-my-96", "scroll-my-px", "scroll-p-0", "scroll-p-0.5", "scroll-p-1", "scroll-p-1.5", + "scroll-p-2", + "scroll-p-2.5", + "scroll-p-3", + "scroll-p-3.5", + "scroll-p-4", + "scroll-p-5", + "scroll-p-6", + "scroll-p-7", + "scroll-p-8", + "scroll-p-9", "scroll-p-10", "scroll-p-11", "scroll-p-12", "scroll-p-14", "scroll-p-16", - "scroll-p-2", - "scroll-p-2.5", "scroll-p-20", "scroll-p-24", "scroll-p-28", - "scroll-p-3", - "scroll-p-3.5", "scroll-p-32", "scroll-p-36", - "scroll-p-4", "scroll-p-40", "scroll-p-44", "scroll-p-48", - "scroll-p-5", "scroll-p-52", "scroll-p-56", - "scroll-p-6", "scroll-p-60", "scroll-p-64", - "scroll-p-7", "scroll-p-72", - "scroll-p-8", "scroll-p-80", - "scroll-p-9", "scroll-p-96", "scroll-p-px", "scroll-pb-0", "scroll-pb-0.5", "scroll-pb-1", "scroll-pb-1.5", + "scroll-pb-2", + "scroll-pb-2.5", + "scroll-pb-3", + "scroll-pb-3.5", + "scroll-pb-4", + "scroll-pb-5", + "scroll-pb-6", + "scroll-pb-7", + "scroll-pb-8", + "scroll-pb-9", "scroll-pb-10", "scroll-pb-11", "scroll-pb-12", "scroll-pb-14", "scroll-pb-16", - "scroll-pb-2", - "scroll-pb-2.5", "scroll-pb-20", "scroll-pb-24", "scroll-pb-28", - "scroll-pb-3", - "scroll-pb-3.5", "scroll-pb-32", "scroll-pb-36", - "scroll-pb-4", "scroll-pb-40", "scroll-pb-44", "scroll-pb-48", - "scroll-pb-5", "scroll-pb-52", "scroll-pb-56", - "scroll-pb-6", "scroll-pb-60", "scroll-pb-64", - "scroll-pb-7", "scroll-pb-72", - "scroll-pb-8", "scroll-pb-80", - "scroll-pb-9", "scroll-pb-96", "scroll-pb-px", "scroll-pe-0", "scroll-pe-0.5", "scroll-pe-1", "scroll-pe-1.5", + "scroll-pe-2", + "scroll-pe-2.5", + "scroll-pe-3", + "scroll-pe-3.5", + "scroll-pe-4", + "scroll-pe-5", + "scroll-pe-6", + "scroll-pe-7", + "scroll-pe-8", + "scroll-pe-9", "scroll-pe-10", "scroll-pe-11", "scroll-pe-12", "scroll-pe-14", "scroll-pe-16", - "scroll-pe-2", - "scroll-pe-2.5", "scroll-pe-20", "scroll-pe-24", "scroll-pe-28", - "scroll-pe-3", - "scroll-pe-3.5", "scroll-pe-32", "scroll-pe-36", - "scroll-pe-4", "scroll-pe-40", "scroll-pe-44", "scroll-pe-48", - "scroll-pe-5", "scroll-pe-52", "scroll-pe-56", - "scroll-pe-6", "scroll-pe-60", "scroll-pe-64", - "scroll-pe-7", "scroll-pe-72", - "scroll-pe-8", "scroll-pe-80", - "scroll-pe-9", "scroll-pe-96", "scroll-pe-px", "scroll-pl-0", "scroll-pl-0.5", "scroll-pl-1", "scroll-pl-1.5", + "scroll-pl-2", + "scroll-pl-2.5", + "scroll-pl-3", + "scroll-pl-3.5", + "scroll-pl-4", + "scroll-pl-5", + "scroll-pl-6", + "scroll-pl-7", + "scroll-pl-8", + "scroll-pl-9", "scroll-pl-10", "scroll-pl-11", "scroll-pl-12", "scroll-pl-14", "scroll-pl-16", - "scroll-pl-2", - "scroll-pl-2.5", "scroll-pl-20", "scroll-pl-24", "scroll-pl-28", - "scroll-pl-3", - "scroll-pl-3.5", "scroll-pl-32", "scroll-pl-36", - "scroll-pl-4", "scroll-pl-40", "scroll-pl-44", "scroll-pl-48", - "scroll-pl-5", "scroll-pl-52", "scroll-pl-56", - "scroll-pl-6", "scroll-pl-60", "scroll-pl-64", - "scroll-pl-7", "scroll-pl-72", - "scroll-pl-8", "scroll-pl-80", - "scroll-pl-9", "scroll-pl-96", "scroll-pl-px", "scroll-pr-0", "scroll-pr-0.5", "scroll-pr-1", "scroll-pr-1.5", + "scroll-pr-2", + "scroll-pr-2.5", + "scroll-pr-3", + "scroll-pr-3.5", + "scroll-pr-4", + "scroll-pr-5", + "scroll-pr-6", + "scroll-pr-7", + "scroll-pr-8", + "scroll-pr-9", "scroll-pr-10", "scroll-pr-11", "scroll-pr-12", "scroll-pr-14", "scroll-pr-16", - "scroll-pr-2", - "scroll-pr-2.5", "scroll-pr-20", "scroll-pr-24", "scroll-pr-28", - "scroll-pr-3", - "scroll-pr-3.5", "scroll-pr-32", "scroll-pr-36", - "scroll-pr-4", "scroll-pr-40", "scroll-pr-44", "scroll-pr-48", - "scroll-pr-5", "scroll-pr-52", "scroll-pr-56", - "scroll-pr-6", "scroll-pr-60", "scroll-pr-64", - "scroll-pr-7", "scroll-pr-72", - "scroll-pr-8", "scroll-pr-80", - "scroll-pr-9", "scroll-pr-96", "scroll-pr-px", "scroll-ps-0", "scroll-ps-0.5", "scroll-ps-1", "scroll-ps-1.5", + "scroll-ps-2", + "scroll-ps-2.5", + "scroll-ps-3", + "scroll-ps-3.5", + "scroll-ps-4", + "scroll-ps-5", + "scroll-ps-6", + "scroll-ps-7", + "scroll-ps-8", + "scroll-ps-9", "scroll-ps-10", "scroll-ps-11", "scroll-ps-12", "scroll-ps-14", "scroll-ps-16", - "scroll-ps-2", - "scroll-ps-2.5", "scroll-ps-20", "scroll-ps-24", "scroll-ps-28", - "scroll-ps-3", - "scroll-ps-3.5", "scroll-ps-32", "scroll-ps-36", - "scroll-ps-4", "scroll-ps-40", "scroll-ps-44", "scroll-ps-48", - "scroll-ps-5", "scroll-ps-52", "scroll-ps-56", - "scroll-ps-6", "scroll-ps-60", "scroll-ps-64", - "scroll-ps-7", "scroll-ps-72", - "scroll-ps-8", "scroll-ps-80", - "scroll-ps-9", "scroll-ps-96", "scroll-ps-px", "scroll-pt-0", "scroll-pt-0.5", "scroll-pt-1", "scroll-pt-1.5", + "scroll-pt-2", + "scroll-pt-2.5", + "scroll-pt-3", + "scroll-pt-3.5", + "scroll-pt-4", + "scroll-pt-5", + "scroll-pt-6", + "scroll-pt-7", + "scroll-pt-8", + "scroll-pt-9", "scroll-pt-10", "scroll-pt-11", "scroll-pt-12", "scroll-pt-14", "scroll-pt-16", - "scroll-pt-2", - "scroll-pt-2.5", "scroll-pt-20", "scroll-pt-24", "scroll-pt-28", - "scroll-pt-3", - "scroll-pt-3.5", "scroll-pt-32", "scroll-pt-36", - "scroll-pt-4", "scroll-pt-40", "scroll-pt-44", "scroll-pt-48", - "scroll-pt-5", "scroll-pt-52", "scroll-pt-56", - "scroll-pt-6", "scroll-pt-60", "scroll-pt-64", - "scroll-pt-7", "scroll-pt-72", - "scroll-pt-8", "scroll-pt-80", - "scroll-pt-9", "scroll-pt-96", "scroll-pt-px", "scroll-px-0", "scroll-px-0.5", "scroll-px-1", "scroll-px-1.5", + "scroll-px-2", + "scroll-px-2.5", + "scroll-px-3", + "scroll-px-3.5", + "scroll-px-4", + "scroll-px-5", + "scroll-px-6", + "scroll-px-7", + "scroll-px-8", + "scroll-px-9", "scroll-px-10", "scroll-px-11", "scroll-px-12", "scroll-px-14", "scroll-px-16", - "scroll-px-2", - "scroll-px-2.5", "scroll-px-20", "scroll-px-24", "scroll-px-28", - "scroll-px-3", - "scroll-px-3.5", "scroll-px-32", "scroll-px-36", - "scroll-px-4", "scroll-px-40", "scroll-px-44", "scroll-px-48", - "scroll-px-5", "scroll-px-52", "scroll-px-56", - "scroll-px-6", "scroll-px-60", "scroll-px-64", - "scroll-px-7", "scroll-px-72", - "scroll-px-8", "scroll-px-80", - "scroll-px-9", "scroll-px-96", "scroll-px-px", "scroll-py-0", "scroll-py-0.5", "scroll-py-1", "scroll-py-1.5", + "scroll-py-2", + "scroll-py-2.5", + "scroll-py-3", + "scroll-py-3.5", + "scroll-py-4", + "scroll-py-5", + "scroll-py-6", + "scroll-py-7", + "scroll-py-8", + "scroll-py-9", "scroll-py-10", "scroll-py-11", "scroll-py-12", "scroll-py-14", "scroll-py-16", - "scroll-py-2", - "scroll-py-2.5", "scroll-py-20", "scroll-py-24", "scroll-py-28", - "scroll-py-3", - "scroll-py-3.5", "scroll-py-32", "scroll-py-36", - "scroll-py-4", "scroll-py-40", "scroll-py-44", "scroll-py-48", - "scroll-py-5", "scroll-py-52", "scroll-py-56", - "scroll-py-6", "scroll-py-60", "scroll-py-64", - "scroll-py-7", "scroll-py-72", - "scroll-py-8", "scroll-py-80", - "scroll-py-9", "scroll-py-96", "scroll-py-px", "scroll-smooth", @@ -6612,8 +6610,8 @@ exports[`getClassList 1`] = ` "self-stretch", "sepia", "sepia-0", - "sepia-100", "sepia-50", + "sepia-100", "shadow", "shadow-current", "shadow-current/0", @@ -6689,35 +6687,35 @@ exports[`getClassList 1`] = ` "size-0.5", "size-1", "size-1.5", + "size-2", + "size-2.5", + "size-3", + "size-3.5", + "size-4", + "size-5", + "size-6", + "size-7", + "size-8", + "size-9", "size-10", "size-11", "size-12", "size-14", "size-16", - "size-2", - "size-2.5", "size-20", "size-24", "size-28", - "size-3", - "size-3.5", "size-32", "size-36", - "size-4", "size-40", "size-44", "size-48", - "size-5", "size-52", "size-56", - "size-6", "size-60", "size-64", - "size-7", "size-72", - "size-8", "size-80", - "size-9", "size-96", "size-auto", "size-dvh", @@ -6733,22 +6731,22 @@ exports[`getClassList 1`] = ` "size-svw", "skew-0", "skew-1", - "skew-12", "skew-2", "skew-3", "skew-6", + "skew-12", "skew-x-0", "skew-x-1", - "skew-x-12", "skew-x-2", "skew-x-3", "skew-x-6", + "skew-x-12", "skew-y-0", "skew-y-1", - "skew-y-12", "skew-y-2", "skew-y-3", "skew-y-6", + "skew-y-12", "slashed-zero", "snap-align-none", "snap-always", @@ -6766,35 +6764,35 @@ exports[`getClassList 1`] = ` "space-x-0.5", "space-x-1", "space-x-1.5", + "space-x-2", + "space-x-2.5", + "space-x-3", + "space-x-3.5", + "space-x-4", + "space-x-5", + "space-x-6", + "space-x-7", + "space-x-8", + "space-x-9", "space-x-10", "space-x-11", "space-x-12", "space-x-14", "space-x-16", - "space-x-2", - "space-x-2.5", "space-x-20", "space-x-24", "space-x-28", - "space-x-3", - "space-x-3.5", "space-x-32", "space-x-36", - "space-x-4", "space-x-40", "space-x-44", "space-x-48", - "space-x-5", "space-x-52", "space-x-56", - "space-x-6", "space-x-60", "space-x-64", - "space-x-7", "space-x-72", - "space-x-8", "space-x-80", - "space-x-9", "space-x-96", "space-x-px", "space-x-reverse", @@ -6802,35 +6800,35 @@ exports[`getClassList 1`] = ` "space-y-0.5", "space-y-1", "space-y-1.5", + "space-y-2", + "space-y-2.5", + "space-y-3", + "space-y-3.5", + "space-y-4", + "space-y-5", + "space-y-6", + "space-y-7", + "space-y-8", + "space-y-9", "space-y-10", "space-y-11", "space-y-12", "space-y-14", "space-y-16", - "space-y-2", - "space-y-2.5", "space-y-20", "space-y-24", "space-y-28", - "space-y-3", - "space-y-3.5", "space-y-32", "space-y-36", - "space-y-4", "space-y-40", "space-y-44", "space-y-48", - "space-y-5", "space-y-52", "space-y-56", - "space-y-6", "space-y-60", "space-y-64", - "space-y-7", "space-y-72", - "space-y-8", "space-y-80", - "space-y-9", "space-y-96", "space-y-px", "space-y-reverse", @@ -6840,35 +6838,35 @@ exports[`getClassList 1`] = ` "start-0.5", "start-1", "start-1.5", + "start-2", + "start-2.5", + "start-3", + "start-3.5", + "start-4", + "start-5", + "start-6", + "start-7", + "start-8", + "start-9", "start-10", "start-11", "start-12", "start-14", "start-16", - "start-2", - "start-2.5", "start-20", "start-24", "start-28", - "start-3", - "start-3.5", "start-32", "start-36", - "start-4", "start-40", "start-44", "start-48", - "start-5", "start-52", "start-56", - "start-6", "start-60", "start-64", - "start-7", "start-72", - "start-8", "start-80", - "start-9", "start-96", "start-auto", "start-full", @@ -7039,8 +7037,8 @@ exports[`getClassList 1`] = ` "text-wrap", "text-xs", "to-0%", + "to-5%", "to-10%", - "to-100%", "to-15%", "to-20%", "to-25%", @@ -7048,7 +7046,6 @@ exports[`getClassList 1`] = ` "to-35%", "to-40%", "to-45%", - "to-5%", "to-50%", "to-55%", "to-60%", @@ -7059,6 +7056,7 @@ exports[`getClassList 1`] = ` "to-85%", "to-90%", "to-95%", + "to-100%", "to-current", "to-current/0", "to-current/5", @@ -7129,35 +7127,35 @@ exports[`getClassList 1`] = ` "top-0.5", "top-1", "top-1.5", + "top-2", + "top-2.5", + "top-3", + "top-3.5", + "top-4", + "top-5", + "top-6", + "top-7", + "top-8", + "top-9", "top-10", "top-11", "top-12", "top-14", "top-16", - "top-2", - "top-2.5", "top-20", "top-24", "top-28", - "top-3", - "top-3.5", "top-32", "top-36", - "top-4", "top-40", "top-44", "top-48", - "top-5", "top-52", "top-56", - "top-6", "top-60", "top-64", - "top-7", "top-72", - "top-8", "top-80", - "top-9", "top-96", "top-auto", "top-full", @@ -7196,36 +7194,36 @@ exports[`getClassList 1`] = ` "translate-0.5", "translate-1", "translate-1.5", + "translate-2", + "translate-2.5", + "translate-3", + "translate-3.5", + "translate-3d", + "translate-4", + "translate-5", + "translate-6", + "translate-7", + "translate-8", + "translate-9", "translate-10", "translate-11", "translate-12", "translate-14", "translate-16", - "translate-2", - "translate-2.5", "translate-20", "translate-24", "translate-28", - "translate-3", - "translate-3.5", "translate-32", "translate-36", - "translate-3d", - "translate-4", "translate-40", "translate-44", "translate-48", - "translate-5", "translate-52", "translate-56", - "translate-6", "translate-60", "translate-64", - "translate-7", "translate-72", - "translate-8", "translate-80", - "translate-9", "translate-96", "translate-full", "translate-none", @@ -7234,35 +7232,35 @@ exports[`getClassList 1`] = ` "translate-x-0.5", "translate-x-1", "translate-x-1.5", + "translate-x-2", + "translate-x-2.5", + "translate-x-3", + "translate-x-3.5", + "translate-x-4", + "translate-x-5", + "translate-x-6", + "translate-x-7", + "translate-x-8", + "translate-x-9", "translate-x-10", "translate-x-11", "translate-x-12", "translate-x-14", "translate-x-16", - "translate-x-2", - "translate-x-2.5", "translate-x-20", "translate-x-24", "translate-x-28", - "translate-x-3", - "translate-x-3.5", "translate-x-32", "translate-x-36", - "translate-x-4", "translate-x-40", "translate-x-44", "translate-x-48", - "translate-x-5", "translate-x-52", "translate-x-56", - "translate-x-6", "translate-x-60", "translate-x-64", - "translate-x-7", "translate-x-72", - "translate-x-8", "translate-x-80", - "translate-x-9", "translate-x-96", "translate-x-full", "translate-x-px", @@ -7270,35 +7268,35 @@ exports[`getClassList 1`] = ` "translate-y-0.5", "translate-y-1", "translate-y-1.5", + "translate-y-2", + "translate-y-2.5", + "translate-y-3", + "translate-y-3.5", + "translate-y-4", + "translate-y-5", + "translate-y-6", + "translate-y-7", + "translate-y-8", + "translate-y-9", "translate-y-10", "translate-y-11", "translate-y-12", "translate-y-14", "translate-y-16", - "translate-y-2", - "translate-y-2.5", "translate-y-20", "translate-y-24", "translate-y-28", - "translate-y-3", - "translate-y-3.5", "translate-y-32", "translate-y-36", - "translate-y-4", "translate-y-40", "translate-y-44", "translate-y-48", - "translate-y-5", "translate-y-52", "translate-y-56", - "translate-y-6", "translate-y-60", "translate-y-64", - "translate-y-7", "translate-y-72", - "translate-y-8", "translate-y-80", - "translate-y-9", "translate-y-96", "translate-y-full", "translate-y-px", @@ -7306,35 +7304,35 @@ exports[`getClassList 1`] = ` "translate-z-0.5", "translate-z-1", "translate-z-1.5", + "translate-z-2", + "translate-z-2.5", + "translate-z-3", + "translate-z-3.5", + "translate-z-4", + "translate-z-5", + "translate-z-6", + "translate-z-7", + "translate-z-8", + "translate-z-9", "translate-z-10", "translate-z-11", "translate-z-12", "translate-z-14", "translate-z-16", - "translate-z-2", - "translate-z-2.5", "translate-z-20", "translate-z-24", "translate-z-28", - "translate-z-3", - "translate-z-3.5", "translate-z-32", "translate-z-36", - "translate-z-4", "translate-z-40", "translate-z-44", "translate-z-48", - "translate-z-5", "translate-z-52", "translate-z-56", - "translate-z-6", "translate-z-60", "translate-z-64", - "translate-z-7", "translate-z-72", - "translate-z-8", "translate-z-80", - "translate-z-9", "translate-z-96", "translate-z-px", "truncate", @@ -7347,8 +7345,8 @@ exports[`getClassList 1`] = ` "underline-offset-auto", "uppercase", "via-0%", + "via-5%", "via-10%", - "via-100%", "via-15%", "via-20%", "via-25%", @@ -7356,7 +7354,6 @@ exports[`getClassList 1`] = ` "via-35%", "via-40%", "via-45%", - "via-5%", "via-50%", "via-55%", "via-60%", @@ -7367,6 +7364,7 @@ exports[`getClassList 1`] = ` "via-85%", "via-90%", "via-95%", + "via-100%", "via-current", "via-current/0", "via-current/5", @@ -7439,44 +7437,46 @@ exports[`getClassList 1`] = ` "w-0.5", "w-1", "w-1.5", + "w-2", + "w-2.5", + "w-3", + "w-3.5", + "w-4", + "w-5", + "w-6", + "w-7", + "w-8", + "w-9", "w-10", "w-11", "w-12", "w-14", "w-16", - "w-2", - "w-2.5", "w-20", "w-24", "w-28", - "w-3", - "w-3.5", "w-32", "w-36", - "w-4", "w-40", "w-44", "w-48", - "w-5", "w-52", "w-56", - "w-6", "w-60", "w-64", - "w-7", "w-72", - "w-8", "w-80", - "w-9", "w-96", "w-auto", "w-dvh", "w-dvw", "w-fit", "w-full", + "w-lg", "w-lvh", "w-lvw", "w-max", + "w-md", "w-min", "w-px", "w-screen", @@ -7504,13 +7504,6 @@ exports[`getClassList 1`] = ` exports[`getVariants 1`] = ` [ - { - "hasDash": true, - "isArbitrary": false, - "name": "force", - "selectors": [Function], - "values": [], - }, { "hasDash": true, "isArbitrary": false, @@ -8210,21 +8203,30 @@ exports[`getVariants 1`] = ` "isArbitrary": true, "name": "@max", "selectors": [Function], - "values": [], + "values": [ + "md", + "lg", + ], }, { - "hasDash": true, + "hasDash": false, "isArbitrary": true, "name": "@", "selectors": [Function], - "values": [], + "values": [ + "md", + "lg", + ], }, { "hasDash": true, "isArbitrary": true, "name": "@min", "selectors": [Function], - "values": [], + "values": [ + "md", + "lg", + ], }, { "hasDash": true, diff --git a/packages/tailwindcss/src/__snapshots__/utilities.test.ts.snap b/packages/tailwindcss/src/__snapshots__/utilities.test.ts.snap index 588311cf9079..0fe26f6582b5 100644 --- a/packages/tailwindcss/src/__snapshots__/utilities.test.ts.snap +++ b/packages/tailwindcss/src/__snapshots__/utilities.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`border-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -126,7 +126,7 @@ exports[`border-* 1`] = ` `; exports[`border-b-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -251,7 +251,7 @@ exports[`border-b-* 1`] = ` `; exports[`border-e-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -376,7 +376,7 @@ exports[`border-e-* 1`] = ` `; exports[`border-l-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -501,7 +501,7 @@ exports[`border-l-* 1`] = ` `; exports[`border-r-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -626,7 +626,7 @@ exports[`border-r-* 1`] = ` `; exports[`border-s-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -751,7 +751,7 @@ exports[`border-s-* 1`] = ` `; exports[`border-t-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -876,7 +876,7 @@ exports[`border-t-* 1`] = ` `; exports[`border-x-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -1001,7 +1001,7 @@ exports[`border-x-* 1`] = ` `; exports[`border-y-* 1`] = ` -":root { +":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; diff --git a/packages/tailwindcss/src/candidate.test.ts b/packages/tailwindcss/src/candidate.test.ts index 723ae0fc8e08..20f89a940d3c 100644 --- a/packages/tailwindcss/src/candidate.test.ts +++ b/packages/tailwindcss/src/candidate.test.ts @@ -570,6 +570,13 @@ it('should parse a utility with an arbitrary value with parens', () => { `) }) +it('should not parse a utility with an arbitrary value with parens that does not start with --', () => { + let utilities = new Utilities() + utilities.functional('bg', () => []) + + expect(run('bg-(my-color)', { utilities })).toMatchInlineSnapshot(`[]`) +}) + it('should parse a utility with an arbitrary value including a typehint', () => { let utilities = new Utilities() utilities.functional('bg', () => []) @@ -616,6 +623,13 @@ it('should parse a utility with an arbitrary value with parens including a typeh `) }) +it('should not parse a utility with an arbitrary value with parens including a typehint that does not start with --', () => { + let utilities = new Utilities() + utilities.functional('bg', () => []) + + expect(run('bg-(color:my-color)', { utilities })).toMatchInlineSnapshot(`[]`) +}) + it('should parse a utility with an arbitrary value with parens and a fallback', () => { let utilities = new Utilities() utilities.functional('bg', () => []) @@ -888,6 +902,8 @@ it('should not parse invalid arbitrary values in variants', () => { 'data-foo-(--value)/(number:--mod):flex', 'data-foo(--value)/(number:--mod):flex', + + 'data-(value):flex', ]) { expect(run(candidate, { utilities, variants })).toEqual([]) } @@ -945,6 +961,13 @@ it('should parse a utility with an implicit variable as the modifier using the s `) }) +it('should not parse a utility with an implicit invalid variable as the modifier using the shorthand', () => { + let utilities = new Utilities() + utilities.functional('bg', () => []) + + expect(run('bg-red-500/(value)', { utilities })).toMatchInlineSnapshot(`[]`) +}) + it('should parse a utility with an implicit variable as the modifier that is important', () => { let utilities = new Utilities() utilities.functional('bg', () => []) diff --git a/packages/tailwindcss/src/candidate.ts b/packages/tailwindcss/src/candidate.ts index abb230da005d..8238dfc2f0e9 100644 --- a/packages/tailwindcss/src/candidate.ts +++ b/packages/tailwindcss/src/candidate.ts @@ -517,6 +517,9 @@ function parseModifier(modifier: string): CandidateModifier | null { // ^^ if (arbitraryValue.length === 0 || arbitraryValue.trim().length === 0) return null + // Arbitrary values must start with `--` since it represents a CSS variable. + if (arbitraryValue[0] !== '-' && arbitraryValue[1] !== '-') return null + return { kind: 'arbitrary', value: `var(${arbitraryValue})`, @@ -651,6 +654,9 @@ export function parseVariant(variant: string, designSystem: DesignSystem): Varia // ^^ if (arbitraryValue.length === 0 || arbitraryValue.trim().length === 0) return null + // Arbitrary values must start with `--` since it represents a CSS variable. + if (arbitraryValue[0] !== '-' && arbitraryValue[1] !== '-') return null + return { kind: 'functional', root, diff --git a/packages/tailwindcss/src/compat/config.test.ts b/packages/tailwindcss/src/compat/config.test.ts index 7523b2f3410c..4b095c1724f6 100644 --- a/packages/tailwindcss/src/compat/config.test.ts +++ b/packages/tailwindcss/src/compat/config.test.ts @@ -322,7 +322,7 @@ describe('theme callbacks', () => { expect(compiler.build(['leading-base', 'leading-md', 'leading-xl', 'prose'])) .toMatchInlineSnapshot(` - ":root { + ":root, :host { --text-base: 100rem; --text-md--line-height: 101rem; } @@ -391,7 +391,7 @@ describe('theme overrides order', () => { }) expect(compiler.build(['bg-red', 'bg-blue'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-blue: blue; } .bg-blue { @@ -477,7 +477,7 @@ describe('theme overrides order', () => { 'hover-bg-slate-600', ]), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-slate-100: #000100; --color-slate-300: #000300; --color-slate-400: #100400; @@ -562,7 +562,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: Potato Sans; --default-font-feature-settings: normal; --default-font-variation-settings: normal; @@ -601,7 +601,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: Potato Sans; --default-font-feature-settings: "cv06"; --default-font-variation-settings: normal; @@ -641,7 +641,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: Potato Sans; --default-font-feature-settings: normal; --default-font-variation-settings: "XHGT" 0.7; @@ -684,7 +684,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: Potato Sans; --default-font-feature-settings: "cv06"; --default-font-variation-settings: "XHGT" 0.7; @@ -728,7 +728,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: var(--font-family-sans); --default-font-feature-settings: var(--font-family-sans--font-feature-settings); --default-font-variation-settings: var(--font-family-sans--font-variation-settings); @@ -768,7 +768,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: Inter, system-ui, sans-serif; --default-font-feature-settings: normal; --default-font-variation-settings: normal; @@ -807,7 +807,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-sans'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-font-family: var(--font-family-sans); --default-font-feature-settings: var(--font-family-sans--font-feature-settings); --default-font-variation-settings: var(--font-family-sans--font-variation-settings); @@ -841,7 +841,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: Potato Mono; --default-mono-font-feature-settings: normal; --default-mono-font-variation-settings: normal; @@ -880,7 +880,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: Potato Mono; --default-mono-font-feature-settings: "cv06"; --default-mono-font-variation-settings: normal; @@ -920,7 +920,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: Potato Mono; --default-mono-font-feature-settings: normal; --default-mono-font-variation-settings: "XHGT" 0.7; @@ -963,7 +963,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: Potato Mono; --default-mono-font-feature-settings: "cv06"; --default-mono-font-variation-settings: "XHGT" 0.7; @@ -1007,7 +1007,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: var(--font-mono); --default-mono-font-feature-settings: var(--font-mono--font-feature-settings); --default-mono-font-variation-settings: var(--font-mono--font-variation-settings); @@ -1047,7 +1047,7 @@ describe('default font family compatibility', () => { }) expect(compiler.build(['font-mono'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-mono-font-family: var(--font-family-mono); --default-mono-font-feature-settings: var(--font-family-mono--font-feature-settings); --default-mono-font-variation-settings: var(--font-family-mono--font-variation-settings); @@ -1179,7 +1179,7 @@ test('merges css breakpoints with js config screens', async () => { expect(compiler.build(['sm:flex', 'md:flex', 'lg:flex', 'min-sm:max-md:underline'])) .toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 50rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; @@ -1333,7 +1333,7 @@ test('Prefixes configured in CSS take precedence over those defined in JS config ) expect(compiler.build(['wat:custom'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --wat-color-red: #f00; --wat-color-green: #0f0; --wat-breakpoint-sm: 640px; diff --git a/packages/tailwindcss/src/compat/container-config.test.ts b/packages/tailwindcss/src/compat/container-config.test.ts index 965e79a21865..e2b9a0ca591f 100644 --- a/packages/tailwindcss/src/compat/container-config.test.ts +++ b/packages/tailwindcss/src/compat/container-config.test.ts @@ -31,7 +31,7 @@ test('creates a custom utility to extend the built-in container', async () => { }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -96,7 +96,7 @@ test('allows padding to be defined at custom breakpoints', async () => { }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -164,7 +164,7 @@ test('allows breakpoints to be overwritten', async () => { }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -237,7 +237,7 @@ test('padding applies to custom `container` screens', async () => { }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -307,7 +307,7 @@ test("an empty `screen` config will undo all custom media screens and won't appl }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -379,7 +379,7 @@ test('legacy container component does not interfere with new --container variabl }) expect(compiler.build(['max-w-sm'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --container-3xs: 16rem; --container-2xs: 18rem; --container-xs: 20rem; @@ -438,7 +438,7 @@ test('combines custom padding and screen overwrites', async () => { }) expect(compiler.build(['container', '!container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -557,7 +557,7 @@ test('filters out complex breakpoints', async () => { }) expect(compiler.build(['container'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; diff --git a/packages/tailwindcss/src/compat/legacy-utilities.test.ts b/packages/tailwindcss/src/compat/legacy-utilities.test.ts index 6db8b6df48cf..4c5dd99d0816 100644 --- a/packages/tailwindcss/src/compat/legacy-utilities.test.ts +++ b/packages/tailwindcss/src/compat/legacy-utilities.test.ts @@ -85,7 +85,7 @@ test('max-w-screen', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; diff --git a/packages/tailwindcss/src/compat/plugin-api.test.ts b/packages/tailwindcss/src/compat/plugin-api.test.ts index b1c04e655ce6..539c04a3c66c 100644 --- a/packages/tailwindcss/src/compat/plugin-api.test.ts +++ b/packages/tailwindcss/src/compat/plugin-api.test.ts @@ -293,7 +293,7 @@ describe('theme', async () => { .variable { color: color-mix(in oklab, #ef4444 var(--opacity), transparent); } - :root { + :root, :host { --color-red-500: #ef4444; } " @@ -379,7 +379,7 @@ describe('theme', async () => { .js-variable { color: color-mix(in oklab, rgb(255 0 0 / 1) var(--opacity), transparent); } - :root { + :root, :host { --color-custom-css: rgba(255 0 0 / ); } " @@ -1422,7 +1422,7 @@ describe('theme', async () => { .my-width-2\\.5 { width: 0.625rem; } - :root { + :root, :host { --width-1: 0.25rem; --width-1\\/2: 60%; --width-1\\.5: 0.375rem; @@ -1479,7 +1479,7 @@ describe('theme', async () => { .my-width-2\\.5 { width: 0.625rem; } - :root { + :root, :host { --width-1: 0.25rem; --width-1\\/2: 60%; --width-1\\.5: 0.375rem; @@ -3136,7 +3136,7 @@ describe('addUtilities()', () => { } } } - :root { + :root, :host { }" `, ) diff --git a/packages/tailwindcss/src/compat/screens-config.test.ts b/packages/tailwindcss/src/compat/screens-config.test.ts index 983b22ea0f3a..09ab97fc9f8a 100644 --- a/packages/tailwindcss/src/compat/screens-config.test.ts +++ b/packages/tailwindcss/src/compat/screens-config.test.ts @@ -46,7 +46,7 @@ test('CSS `--breakpoint-*` merge with JS config `screens`', async () => { 'print:items-end', ]), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 50rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; @@ -140,7 +140,7 @@ test('JS config `screens` extend CSS `--breakpoint-*`', async () => { 'print:items-end', ]), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 50rem; } .min-xs\\:flex { @@ -316,7 +316,7 @@ test('JS config `screens` overwrite CSS `--breakpoint-*`', async () => { 'print:items-end', ]), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -584,7 +584,7 @@ describe('complex screen configs', () => { 'print:items-end', ]), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 48rem; } .min-sm\\:flex { @@ -656,7 +656,7 @@ test('JS config `screens` can overwrite default CSS `--breakpoint-*`', async () expect( compiler.build(['min-sm:flex', 'min-md:flex', 'min-lg:flex', 'min-xl:flex', 'min-2xl:flex']), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { } " `) diff --git a/packages/tailwindcss/src/css-functions.test.ts b/packages/tailwindcss/src/css-functions.test.ts index e3747c7ba601..9d81b857ef77 100644 --- a/packages/tailwindcss/src/css-functions.test.ts +++ b/packages/tailwindcss/src/css-functions.test.ts @@ -72,7 +72,7 @@ describe('--spacing(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; } @@ -94,7 +94,7 @@ describe('--spacing(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; } @@ -157,7 +157,7 @@ describe('--theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -197,7 +197,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -218,7 +218,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -239,7 +239,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -260,7 +260,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -281,7 +281,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -302,7 +302,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -323,7 +323,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -344,7 +344,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -365,7 +365,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -386,7 +386,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -408,7 +408,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -429,7 +429,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-12: 3rem; } @@ -450,7 +450,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-2_5: .625rem; } @@ -471,7 +471,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-2_5: .625rem; } @@ -492,7 +492,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-lg: .5rem; } @@ -514,14 +514,14 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { - --blur: 8px; - } + ":root, :host { + --blur: 8px; + } - .default-blur { - filter: blur(8px); - }" - `) + .default-blur { + filter: blur(8px); + }" + `) }) test('theme(fontSize.xs[1].lineHeight)', async () => { @@ -537,7 +537,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --text-xs: 1337.75rem; --text-xs--line-height: 1337rem; } @@ -626,7 +626,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -684,7 +684,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; --color-foo: red; } @@ -707,7 +707,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; --color-foo: oklab(62.7955% .22486 .12584 / .5); } @@ -731,7 +731,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -752,7 +752,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -773,7 +773,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -796,7 +796,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --blur: 8px; } @@ -861,7 +861,7 @@ describe('theme(…)', () => { } } - :root { + :root, :host { --breakpoint-sm: 40rem; --color-red-500: red; }" @@ -921,7 +921,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 48rem; --breakpoint-lg: 64rem; } @@ -948,7 +948,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 48rem; --breakpoint-lg: 64rem; } @@ -976,7 +976,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 48rem; } @@ -1001,7 +1001,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-md: 48rem; } @@ -1026,7 +1026,7 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --font-size-xs: .75rem; } @@ -1187,7 +1187,7 @@ test('replaces CSS theme() function with values inside imported stylesheets', as }, ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -1212,7 +1212,7 @@ test('resolves paths ending with a 1', async () => { [], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: .25rem; } diff --git a/packages/tailwindcss/src/index.test.ts b/packages/tailwindcss/src/index.test.ts index 0b5851b70c8b..8fba63cfccef 100644 --- a/packages/tailwindcss/src/index.test.ts +++ b/packages/tailwindcss/src/index.test.ts @@ -25,7 +25,7 @@ describe('compiling CSS', () => { ['flex', 'md:grid', 'hover:underline', 'dark:bg-black'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-black: #000; --breakpoint-md: 768px; } @@ -133,7 +133,7 @@ describe('compiling CSS', () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1_5: 1.5rem; --spacing-2_5: 2.5rem; } @@ -245,7 +245,7 @@ describe('@apply', () => { } `), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-200: #fecaca; --color-red-500: #ef4444; --color-blue-500: #3b82f6; @@ -608,7 +608,7 @@ describe('important', () => { ['animate-spin!'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --animate-spin: spin 1s linear infinite; } @@ -646,7 +646,7 @@ describe('sorting', () => { ['pointer-events-none', 'flex', 'p-1', 'px-1', 'pl-1'].sort(() => Math.random() - 0.5), ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: .25rem; } @@ -709,7 +709,7 @@ describe('sorting', () => { ['mx-0', 'gap-4', 'space-x-2'].sort(() => Math.random() - 0.5), ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-0: 0px; --spacing-2: .5rem; --spacing-4: 1rem; @@ -771,7 +771,7 @@ describe('sorting', () => { ].sort(() => Math.random() - 0.5), ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: 1px; --spacing-2: 2px; --spacing-3: 3px; @@ -992,7 +992,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red-500'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; } @@ -1015,7 +1015,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red-500'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #f10; } @@ -1040,7 +1040,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red-500', 'accent-blue-500'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: red; --color-blue-500: #00f; } @@ -1069,7 +1069,7 @@ describe('Parsing themes values from CSS', () => { ['w-1/2', 'w-75%'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --width-1\\/2: 75%; --width-75\\%: 50%; } @@ -1105,7 +1105,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red', 'text-lg'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red: red; --animate-foo: foo 1s infinite; --text-lg: 20px; @@ -1159,7 +1159,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red', 'accent-blue', 'accent-green', 'text-sm', 'text-md'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --text-sm: 13px; --color-green: #0f0; } @@ -1206,7 +1206,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red', 'accent-blue', 'accent-green', 'text-sm', 'text-md'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --text-sm: 13px; --color-green: #0f0; } @@ -1242,7 +1242,7 @@ describe('Parsing themes values from CSS', () => { ['accent-red', 'accent-blue', 'accent-green', 'text-sm', 'text-md'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-green: #0f0; } @@ -1270,7 +1270,7 @@ describe('Parsing themes values from CSS', () => { ['font-bold', 'font-sans', 'font-serif', 'font-body'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --font-weight-bold: bold; --font-body: Inter; } @@ -1309,7 +1309,7 @@ describe('Parsing themes values from CSS', () => { ['inset-shadow-sm', 'inset-ring-thick', 'inset-lg', 'inset-sm', 'inset-md'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --inset-shadow-sm: inset 0 2px 4px #0000000d; --inset-md: 50px; } @@ -1420,7 +1420,7 @@ describe('Parsing themes values from CSS', () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --text-color-potato: brown; --text-underline-offset-potato: 4px; --text-indent-potato: 6px; @@ -1485,7 +1485,7 @@ describe('Parsing themes values from CSS', () => { ['animate-foo', 'animate-foobar'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --animate-foobar: foobar 1s infinite; } @@ -1516,7 +1516,7 @@ describe('Parsing themes values from CSS', () => { ['bg-tomato', 'bg-potato'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-tomato: #e10c04; } @@ -1566,7 +1566,7 @@ describe('Parsing themes values from CSS', () => { ['bg-potato'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-potato: #c794aa; } @@ -1596,7 +1596,7 @@ describe('Parsing themes values from CSS', () => { ['bg-tomato', 'bg-potato', 'bg-avocado'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-tomato: #e10c04; } @@ -1647,7 +1647,7 @@ describe('Parsing themes values from CSS', () => { ['bg-tomato', 'bg-potato', 'bg-primary'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-tomato: #e10c04; --color-potato: #ac855b; --color-primary: var(--primary); @@ -1684,7 +1684,7 @@ describe('Parsing themes values from CSS', () => { ['bg-tomato', 'bg-potato', 'bg-primary'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-tomato: #e10c04; --color-potato: #ac855b; --color-primary: var(--primary); @@ -1780,7 +1780,7 @@ describe('Parsing themes values from CSS', () => { ['bg-potato'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-potato: #ac855b; } @@ -1803,7 +1803,7 @@ describe('Parsing themes values from CSS', () => { ['bg-potato'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-potato: #efb46b; } @@ -1872,7 +1872,7 @@ describe('Parsing themes values from CSS', () => { ['bg-potato', 'bg-tomato'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-potato: #ac855b; --color-tomato: tomato; } @@ -1919,7 +1919,7 @@ describe('Parsing themes values from CSS', () => { ) expect(optimizeCss(build(['text-red', 'text-orange'])).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-orange: orange; } @@ -1965,7 +1965,7 @@ describe('Parsing themes values from CSS', () => { ) expect(optimizeCss(build(['text-red', 'text-orange'])).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-orange: orange; } @@ -2514,6 +2514,26 @@ describe('@custom-variant', () => { ).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: \`@custom-variant\` cannot be nested.]`) }) + test('@custom-variant must not have an empty selector', () => { + return expect( + compileCss(css` + @custom-variant foo (); + `), + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: \`@custom-variant foo ()\` selector is invalid.]`, + ) + }) + + test('@custom-variant with multiple selectors, cannot be empty', () => { + return expect( + compileCss(css` + @custom-variant foo (.foo, .bar, ); + `), + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: \`@custom-variant foo (.foo, .bar, )\` selector is invalid.]`, + ) + }) + test('@custom-variant with no body must include a selector', () => { return expect( compileCss(css` diff --git a/packages/tailwindcss/src/index.ts b/packages/tailwindcss/src/index.ts index 3e4bc5a3cce0..df6e09f90649 100644 --- a/packages/tailwindcss/src/index.ts +++ b/packages/tailwindcss/src/index.ts @@ -281,6 +281,11 @@ async function parseCss( } let selectors = segment(selector.slice(1, -1), ',') + if (selectors.length === 0 || selectors.some((selector) => selector.trim() === '')) { + throw new Error( + `\`@custom-variant ${name} (${selectors.join(',')})\` selector is invalid.`, + ) + } let atRuleParams: string[] = [] let styleRuleSelectors: string[] = [] @@ -473,7 +478,7 @@ async function parseCss( // Keep a reference to the first `@theme` rule to update with the full // theme later, and delete any other `@theme` rules. if (!firstThemeRule && !(themeOptions & ThemeOptions.REFERENCE)) { - firstThemeRule = styleRule(':root', node.nodes) + firstThemeRule = styleRule(':root, :host', node.nodes) replaceWith([firstThemeRule]) } else { replaceWith([]) diff --git a/packages/tailwindcss/src/intellisense.test.ts b/packages/tailwindcss/src/intellisense.test.ts index 48a30a80d7b4..b95c843fd9d0 100644 --- a/packages/tailwindcss/src/intellisense.test.ts +++ b/packages/tailwindcss/src/intellisense.test.ts @@ -2,12 +2,13 @@ import { expect, test } from 'vitest' import { __unstable__loadDesignSystem } from '.' import { buildDesignSystem } from './design-system' import plugin from './plugin' -import { Theme } from './theme' +import { Theme, ThemeOptions } from './theme' const css = String.raw function loadDesignSystem() { let theme = new Theme() + theme.add('--spacing', '0.25rem') theme.add('--colors-red-500', 'red') theme.add('--colors-blue-500', 'blue') theme.add('--breakpoint-sm', '640px') @@ -21,6 +22,9 @@ function loadDesignSystem() { theme.add('--opacity-background', '0.3') theme.add('--drop-shadow-sm', '0 1px 1px rgb(0 0 0 / 0.05)') theme.add('--inset-shadow-sm', 'inset 0 1px 1px rgb(0 0 0 / 0.05)') + theme.add('--font-weight-bold', '700') + theme.add('--container-md', '768px') + theme.add('--container-lg', '1024px') return buildDesignSystem(theme) } @@ -35,6 +39,25 @@ test('getClassList', () => { expect(classNames).toMatchSnapshot() }) +test('Spacing utilities do not suggest bare values when not using the multiplier-based spacing scale', () => { + let design = loadDesignSystem() + + // Remove spacing scale + design.theme.clearNamespace('--spacing', ThemeOptions.NONE) + + let classList = design.getClassList() + let classNames = classList.flatMap(([name, meta]) => [ + name, + ...meta.modifiers.map((m) => `${name}/${m}`), + ]) + + expect(classNames).not.toContain('p-0') + expect(classNames).not.toContain('p-1') + expect(classNames).not.toContain('p-2') + expect(classNames).not.toContain('p-3') + expect(classNames).not.toContain('p-4') +}) + test('Theme values with underscores are converted back to decimal points', () => { let design = loadDesignSystem() let classes = design.getClassList() diff --git a/packages/tailwindcss/src/intellisense.ts b/packages/tailwindcss/src/intellisense.ts index 5713afda43cd..006a0195e953 100644 --- a/packages/tailwindcss/src/intellisense.ts +++ b/packages/tailwindcss/src/intellisense.ts @@ -1,6 +1,7 @@ import { styleRule, walkDepth } from './ast' import { applyVariant } from './compile' import type { DesignSystem } from './design-system' +import { compare } from './utils/compare' interface ClassMetadata { modifiers: string[] @@ -33,7 +34,7 @@ export function getClassList(design: DesignSystem): ClassEntry[] { } } - list.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1)) + list.sort((a, b) => compare(a[0], b[0])) return list } @@ -57,11 +58,12 @@ export function getVariants(design: DesignSystem) { for (let [root, variant] of design.variants.entries()) { if (variant.kind === 'arbitrary') continue + let hasDash = root !== '@' let values = design.variants.getCompletions(root) function selectors({ value, modifier }: SelectorOptions = {}) { let name = root - if (value) name += `-${value}` + if (value) name += hasDash ? `-${value}` : value if (modifier) name += `/${modifier}` let variant = design.parseVariant(name) @@ -128,7 +130,7 @@ export function getVariants(design: DesignSystem) { name: root, values, isArbitrary: false, - hasDash: true, + hasDash, selectors, }) break @@ -138,7 +140,7 @@ export function getVariants(design: DesignSystem) { name: root, values, isArbitrary: true, - hasDash: true, + hasDash, selectors, }) break @@ -148,7 +150,7 @@ export function getVariants(design: DesignSystem) { name: root, values, isArbitrary: true, - hasDash: true, + hasDash, selectors, }) break diff --git a/packages/tailwindcss/src/prefix.test.ts b/packages/tailwindcss/src/prefix.test.ts index 27a71b6179f1..8fb0eec6a48f 100644 --- a/packages/tailwindcss/src/prefix.test.ts +++ b/packages/tailwindcss/src/prefix.test.ts @@ -106,7 +106,7 @@ test('CSS variables output by the theme are prefixed', async () => { // Prefixed utilities are generated expect(compiler.build(['tw:text-red'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tw-color-red: #f00; --tw-color-green: #0f0; --tw-breakpoint-sm: 640px; @@ -131,19 +131,19 @@ test('CSS theme functions do not use the prefix', async () => { expect(compiler.build(['tw:[color:theme(--color-red)]', 'tw:text-[theme(--color-red)]'])) .toMatchInlineSnapshot(` - ":root { - --tw-color-red: #f00; - --tw-color-green: #0f0; - --tw-breakpoint-sm: 640px; - } - .tw\\:\\[color\\:theme\\(--color-red\\)\\] { - color: #f00; - } - .tw\\:text-\\[theme\\(--color-red\\)\\] { - color: #f00; - } - " - `) + ":root, :host { + --tw-color-red: #f00; + --tw-color-green: #0f0; + --tw-breakpoint-sm: 640px; + } + .tw\\:\\[color\\:theme\\(--color-red\\)\\] { + color: #f00; + } + .tw\\:text-\\[theme\\(--color-red\\)\\] { + color: #f00; + } + " + `) compiler = await compile(css` @theme reference prefix(tw) { @@ -193,7 +193,7 @@ test('JS theme functions do not use the prefix', async () => { ) expect(compiler.build(['tw:my-custom'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tw-color-red: #f00; --tw-color-green: #0f0; --tw-breakpoint-sm: 640px; @@ -300,7 +300,7 @@ test('a prefix can be configured via @import prefix(…)', async () => { expect(compiler.build(['tw:underline', 'tw:bg-potato', 'tw:hover:line-through', 'tw:custom'])) .toMatchInlineSnapshot(` - ":root { + ":root, :host { --tw-color-potato: #7a4724; } .tw\\:bg-potato { @@ -338,7 +338,7 @@ test('a prefix can be configured via @import prefix(…)', async () => { }) expect(compiler.build(['underline', 'hover:line-through', 'custom'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tw-color-potato: #7a4724; } " diff --git a/packages/tailwindcss/src/utilities.test.ts b/packages/tailwindcss/src/utilities.test.ts index 9ecf38882316..8e40d3816317 100644 --- a/packages/tailwindcss/src/utilities.test.ts +++ b/packages/tailwindcss/src/utilities.test.ts @@ -145,7 +145,7 @@ test('inset', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadow-sm: inset 0 1px 1px #0000000d; --inset-shadowned: 1940px; @@ -295,7 +295,7 @@ test('inset-x', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -382,7 +382,7 @@ test('inset-y', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -469,7 +469,7 @@ test('start', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -556,7 +556,7 @@ test('end', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -644,7 +644,7 @@ test('top', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -731,7 +731,7 @@ test('right', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -818,7 +818,7 @@ test('bottom', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -905,7 +905,7 @@ test('left', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --inset-shadowned: 1940px; } @@ -1444,7 +1444,7 @@ test('margin', async () => { ['m-auto', 'm-4', 'm-[4px]', '-m-4', '-m-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -1498,7 +1498,7 @@ test('mx', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -1584,7 +1584,7 @@ test('my', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -1670,7 +1670,7 @@ test('mt', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -1756,7 +1756,7 @@ test('ms', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -1842,7 +1842,7 @@ test('me', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -1928,7 +1928,7 @@ test('mr', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -2014,7 +2014,7 @@ test('mb', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -2100,7 +2100,7 @@ test('ml', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -2173,7 +2173,7 @@ test('margin sort order', async () => { ['mb-4', 'me-4', 'mx-4', 'ml-4', 'ms-4', 'm-4', 'mr-4', 'mt-4', 'my-4'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -2477,7 +2477,7 @@ test('aspect-ratio', async () => { ['aspect-video', 'aspect-[10/9]', 'aspect-4/3'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --aspect-video: 16 / 9; } @@ -2531,7 +2531,7 @@ test('size', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -2624,7 +2624,7 @@ test('width', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --width-xl: 36rem; } @@ -2730,7 +2730,7 @@ test('min-width', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --container-xl: 36rem; } @@ -2806,7 +2806,7 @@ test('max-width', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; --container-xl: 36rem; } @@ -2881,7 +2881,7 @@ test('height', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -2983,7 +2983,7 @@ test('min-height', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -3075,7 +3075,7 @@ test('max-height', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -3160,7 +3160,7 @@ describe('container', () => { ['w-1/2', 'container', 'max-w-[var(--breakpoint-sm)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -3303,7 +3303,7 @@ describe('container', () => { ['w-1/2', 'container', 'max-w-[var(--breakpoint-sm)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; @@ -3500,7 +3500,7 @@ test('flex-basis', async () => { ['basis-auto', 'basis-full', 'basis-xl', 'basis-11/12', 'basis-[123px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --container-xl: 36rem; } @@ -3604,7 +3604,7 @@ test('border-spacing', async () => { ['border-spacing-1', 'border-spacing-[123px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: .25rem; } @@ -3655,7 +3655,7 @@ test('border-spacing-x', async () => { ['border-spacing-x-1', 'border-spacing-x-[123px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: .25rem; } @@ -3704,7 +3704,7 @@ test('border-spacing-y', async () => { ['border-spacing-y-1', 'border-spacing-y-[123px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-1: .25rem; } @@ -4045,7 +4045,7 @@ test('translate-x', async () => { ['translate-x-full', '-translate-x-full', 'translate-x-px', '-translate-x-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; } @@ -4173,7 +4173,7 @@ test('translate-y', async () => { ['translate-y-full', '-translate-y-full', 'translate-y-px', '-translate-y-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; } @@ -5113,7 +5113,7 @@ test('perspective', async () => { ['perspective-normal', 'perspective-dramatic', 'perspective-none', 'perspective-[456px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --perspective-dramatic: 100px; --perspective-normal: 500px; } @@ -5199,7 +5199,7 @@ test('cursor', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --cursor-custom: url("/my-cursor.png"); } @@ -5751,7 +5751,7 @@ test('scroll-m', async () => { ['scroll-m-4', 'scroll-m-[4px]', '-scroll-m-4', '-scroll-m-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -5794,7 +5794,7 @@ test('scroll-mx', async () => { ['scroll-mx-4', 'scroll-mx-[4px]', '-scroll-mx-4', '-scroll-mx-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -5837,7 +5837,7 @@ test('scroll-my', async () => { ['scroll-my-4', 'scroll-my-[4px]', '-scroll-my-4', '-scroll-my-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -5880,7 +5880,7 @@ test('scroll-ms', async () => { ['scroll-ms-4', 'scroll-ms-[4px]', '-scroll-ms-4', '-scroll-ms-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -5923,7 +5923,7 @@ test('scroll-me', async () => { ['scroll-me-4', 'scroll-me-[4px]', '-scroll-me-4', '-scroll-me-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -5966,7 +5966,7 @@ test('scroll-mt', async () => { ['scroll-mt-4', 'scroll-mt-[4px]', '-scroll-mt-4', '-scroll-mt-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6009,7 +6009,7 @@ test('scroll-mr', async () => { ['scroll-mr-4', 'scroll-mr-[4px]', '-scroll-mr-4', '-scroll-mr-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6052,7 +6052,7 @@ test('scroll-mb', async () => { ['scroll-mb-4', 'scroll-mb-[4px]', '-scroll-mb-4', '-scroll-mb-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6095,7 +6095,7 @@ test('scroll-ml', async () => { ['scroll-ml-4', 'scroll-ml-[4px]', '-scroll-ml-4', '-scroll-ml-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6138,7 +6138,7 @@ test('scroll-p', async () => { ['scroll-p-4', 'scroll-p-[4px]', '-scroll-p-4', '-scroll-p-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6173,7 +6173,7 @@ test('scroll-px', async () => { ['scroll-px-4', 'scroll-px-[4px]', '-scroll-px-4', '-scroll-px-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6208,7 +6208,7 @@ test('scroll-py', async () => { ['scroll-py-4', 'scroll-py-[4px]', '-scroll-py-4', '-scroll-py-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6243,7 +6243,7 @@ test('scroll-ps', async () => { ['scroll-ps-4', 'scroll-ps-[4px]', '-scroll-ps-4', '-scroll-ps-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6278,7 +6278,7 @@ test('scroll-pe', async () => { ['scroll-pe-4', 'scroll-pe-[4px]', '-scroll-pe-4', '-scroll-pe-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6313,7 +6313,7 @@ test('scroll-pt', async () => { ['scroll-pt-4', 'scroll-pt-[4px]', '-scroll-pt-4', '-scroll-pt-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6348,7 +6348,7 @@ test('scroll-pr', async () => { ['scroll-pr-4', 'scroll-pr-[4px]', '-scroll-pr-4', '-scroll-pr-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6383,7 +6383,7 @@ test('scroll-pb', async () => { ['scroll-pb-4', 'scroll-pb-[4px]', '-scroll-pb-4', '-scroll-pb-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6418,7 +6418,7 @@ test('scroll-pl', async () => { ['scroll-pl-4', 'scroll-pl-[4px]', '-scroll-pl-4', '-scroll-pl-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -6599,7 +6599,7 @@ test('columns', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --container-3xs: 16rem; --container-7xl: 80rem; } @@ -7467,7 +7467,7 @@ test('gap', async () => { ['gap-4', 'gap-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -7494,7 +7494,7 @@ test('gap-x', async () => { ['gap-x-4', 'gap-x-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -7523,7 +7523,7 @@ test('gap-y', async () => { ['gap-y-4', 'gap-y-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -7552,7 +7552,7 @@ test('space-x', async () => { ['space-x-4', 'space-x-[4px]', '-space-x-4'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -7595,7 +7595,7 @@ test('space-y', async () => { ['space-y-4', 'space-y-[4px]', '-space-y-4'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -7732,7 +7732,7 @@ test('divide-x with custom default border width', async () => { ['divide-x'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-border-width: 2px; } @@ -7838,7 +7838,7 @@ test('divide-y with custom default border width', async () => { ['divide-y'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-border-width: 2px; } @@ -7971,7 +7971,7 @@ test('accent', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -8086,7 +8086,7 @@ test('caret', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -8199,7 +8199,7 @@ test('divide-color', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -8863,7 +8863,7 @@ test('rounded', async () => { ['rounded', 'rounded-full', 'rounded-none', 'rounded-sm', 'rounded-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-sm: .125rem; --radius: .25rem; } @@ -8919,7 +8919,7 @@ test('rounded-s', async () => { ['rounded-s', 'rounded-s-full', 'rounded-s-none', 'rounded-s-sm', 'rounded-s-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -8982,7 +8982,7 @@ test('rounded-e', async () => { ['rounded-e', 'rounded-e-full', 'rounded-e-none', 'rounded-e-sm', 'rounded-e-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9045,7 +9045,7 @@ test('rounded-t', async () => { ['rounded-t', 'rounded-t-full', 'rounded-t-none', 'rounded-t-sm', 'rounded-t-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9112,7 +9112,7 @@ test('rounded-r', async () => { ['rounded-r', 'rounded-r-full', 'rounded-r-none', 'rounded-r-sm', 'rounded-r-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9179,7 +9179,7 @@ test('rounded-b', async () => { ['rounded-b', 'rounded-b-full', 'rounded-b-none', 'rounded-b-sm', 'rounded-b-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9246,7 +9246,7 @@ test('rounded-l', async () => { ['rounded-l', 'rounded-l-full', 'rounded-l-none', 'rounded-l-sm', 'rounded-l-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9313,7 +9313,7 @@ test('rounded-ss', async () => { ['rounded-ss', 'rounded-ss-full', 'rounded-ss-none', 'rounded-ss-sm', 'rounded-ss-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9371,7 +9371,7 @@ test('rounded-se', async () => { ['rounded-se', 'rounded-se-full', 'rounded-se-none', 'rounded-se-sm', 'rounded-se-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9429,7 +9429,7 @@ test('rounded-ee', async () => { ['rounded-ee', 'rounded-ee-full', 'rounded-ee-none', 'rounded-ee-sm', 'rounded-ee-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9487,7 +9487,7 @@ test('rounded-es', async () => { ['rounded-es', 'rounded-es-full', 'rounded-es-none', 'rounded-es-sm', 'rounded-es-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9545,7 +9545,7 @@ test('rounded-tl', async () => { ['rounded-tl', 'rounded-tl-full', 'rounded-tl-none', 'rounded-tl-sm', 'rounded-tl-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9605,7 +9605,7 @@ test('rounded-tr', async () => { ['rounded-tr', 'rounded-tr-full', 'rounded-tr-none', 'rounded-tr-sm', 'rounded-tr-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9665,7 +9665,7 @@ test('rounded-br', async () => { ['rounded-br', 'rounded-br-full', 'rounded-br-none', 'rounded-br-sm', 'rounded-br-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9725,7 +9725,7 @@ test('rounded-bl', async () => { ['rounded-bl', 'rounded-bl-full', 'rounded-bl-none', 'rounded-bl-sm', 'rounded-bl-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --radius-none: 0px; --radius-full: 9999px; --radius-sm: .125rem; @@ -9928,7 +9928,7 @@ test('border with custom default border width', async () => { ['border'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-border-width: 2px; } @@ -10089,7 +10089,7 @@ test('bg', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -10702,7 +10702,7 @@ test('from', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -10921,7 +10921,7 @@ test('via', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -11150,7 +11150,7 @@ test('to', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -11700,7 +11700,7 @@ test('fill', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -11821,7 +11821,7 @@ test('stroke', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -12074,7 +12074,7 @@ test('p', async () => { ['p-1', 'p-4', 'p-99', 'p-big', 'p-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12115,7 +12115,7 @@ test('px', async () => { ['px-1', 'px-99', 'px-2.5', 'px-big', 'px-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12156,7 +12156,7 @@ test('py', async () => { ['py-1', 'py-4', 'py-99', 'py-big', 'py-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12197,7 +12197,7 @@ test('pt', async () => { ['pt-1', 'pt-4', 'pt-99', 'pt-big', 'pt-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12238,7 +12238,7 @@ test('ps', async () => { ['ps-1', 'ps-4', 'ps-99', 'ps-big', 'ps-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12279,7 +12279,7 @@ test('pe', async () => { ['pe-1', 'pe-4', 'pe-99', 'pe-big', 'pe-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12320,7 +12320,7 @@ test('pr', async () => { ['pr-1', 'pr-4', 'pr-99', 'pr-big', 'pr-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12361,7 +12361,7 @@ test('pb', async () => { ['pb-1', 'pb-4', 'pb-99', 'pb-big', 'pb-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12402,7 +12402,7 @@ test('pl', async () => { ['pl-1', 'pl-4', 'pl-99', 'pl-big', 'pl-[4px]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --spacing-big: 100rem; } @@ -12594,7 +12594,7 @@ test('font', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-weight-bold: 650; } @@ -12811,7 +12811,7 @@ test('placeholder', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -12936,7 +12936,7 @@ test('decoration', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -13131,7 +13131,7 @@ test('animate', async () => { ['animate-spin', 'animate-none', 'animate-[bounce_1s_infinite]', 'animate-not-found'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --animate-spin: spin 1s linear infinite; } @@ -13207,7 +13207,7 @@ test('filter', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --blur-xl: 24px; --drop-shadow: 0 1px 1px #0000000d; --drop-shadow-xl: 0 9px 7px #0000001a; @@ -13522,7 +13522,7 @@ test('backdrop-filter', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --blur-xl: 24px; } @@ -13865,7 +13865,7 @@ test('transition', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-transition-timing-function: ease; --default-transition-duration: .1s; --transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; @@ -13934,7 +13934,7 @@ test('transition', async () => { ['transition', 'transition-all', 'transition-colors'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --default-transition-timing-function: ease; --default-transition-duration: .1s; } @@ -14082,7 +14082,7 @@ test('ease', async () => { ['ease-in', 'ease-out', 'ease-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --ease-in: cubic-bezier(.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, .2, 1); } @@ -14311,7 +14311,7 @@ test('leading', async () => { ['leading-tight', 'leading-6', 'leading-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --leading-tight: 1.25; --leading-6: 1.5rem; } @@ -14362,7 +14362,7 @@ test('tracking', async () => { ['tracking-normal', 'tracking-wide', 'tracking-[var(--value)]', '-tracking-[var(--value)]'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tracking-normal: 0em; --tracking-wide: .025em; } @@ -14591,7 +14591,7 @@ test('outline', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -14927,6 +14927,7 @@ test('text', async () => { --color-red-500: #ef4444; --text-sm: 0.875rem; --text-sm--line-height: 1.25rem; + --leading-snug: 1.375; } @tailwind utilities; `, @@ -14962,6 +14963,9 @@ test('text', async () => { // font-size / line-height / letter-spacing / font-weight 'text-sm', 'text-sm/6', + 'text-sm/none', + 'text-[10px]/none', + 'text-sm/snug', 'text-sm/[4px]', 'text-[12px]', 'text-[12px]/6', @@ -14981,11 +14985,12 @@ test('text', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: .25rem; --color-red-500: #ef4444; --text-sm: .875rem; --text-sm--line-height: 1.25rem; + --leading-snug: 1.375; } .text-sm { @@ -14993,6 +14998,11 @@ test('text', async () => { line-height: var(--tw-leading, var(--text-sm--line-height)); } + .text-\\[10px\\]\\/none { + font-size: 10px; + line-height: 1; + } + .text-\\[12px\\]\\/6 { font-size: 12px; line-height: calc(var(--spacing) * 6); @@ -15028,6 +15038,16 @@ test('text', async () => { line-height: 4px; } + .text-sm\\/none { + font-size: var(--text-sm); + line-height: 1; + } + + .text-sm\\/snug { + font-size: var(--text-sm); + line-height: var(--leading-snug); + } + .text-\\[12px\\] { font-size: 12px; } @@ -15121,29 +15141,39 @@ test('text', async () => { }" `) expect( - await run([ - 'text', - // color - '-text-red-500', - '-text-red-500/50', - '-text-red-500/[0.5]', - '-text-red-500/[50%]', - '-text-current', - '-text-current/50', - '-text-current/[0.5]', - '-text-current/[50%]', - '-text-inherit', - '-text-transparent', - '-text-[#0088cc]', - '-text-[#0088cc]/50', - '-text-[#0088cc]/[0.5]', - '-text-[#0088cc]/[50%]', - - // font-size / line-height / letter-spacing / font-weight - '-text-sm', - '-text-sm/6', - '-text-sm/[4px]', - ]), + await compileCss( + css` + @theme inline reference { + --text-sm: 0.875rem; + } + @tailwind utilities; + `, + [ + 'text', + // color + '-text-red-500', + '-text-red-500/50', + '-text-red-500/[0.5]', + '-text-red-500/[50%]', + '-text-current', + '-text-current/50', + '-text-current/[0.5]', + '-text-current/[50%]', + '-text-inherit', + '-text-transparent', + '-text-[#0088cc]', + '-text-[#0088cc]/50', + '-text-[#0088cc]/[0.5]', + '-text-[#0088cc]/[50%]', + + // font-size / line-height / letter-spacing / font-weight + '-text-sm', + '-text-sm/6', + 'text-sm/foo', + '-text-sm/[4px]', + 'text-[10px]/foo', + ], + ), ).toEqual('') }) @@ -15193,7 +15223,7 @@ test('shadow', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; --shadow-sm: 0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a; --shadow-xl: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a; @@ -15417,7 +15447,7 @@ test('inset-shadow', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; --inset-shadow: inset 0 2px 4px #0000000d; --inset-shadow-sm: inset 0 1px 1px #0000000d; @@ -15644,7 +15674,7 @@ test('ring', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -15900,7 +15930,7 @@ test('inset-ring', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -16149,7 +16179,7 @@ test('ring-offset', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --color-red-500: #ef4444; } @@ -16327,7 +16357,7 @@ describe('spacing utilities', () => { let compiled = build(['px-1', 'px-4']) expect(optimizeCss(compiled).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -16348,7 +16378,7 @@ describe('spacing utilities', () => { let compiled = build(['px-1', 'px-4']) expect(optimizeCss(compiled).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-4: 1rem; } @@ -16368,7 +16398,7 @@ describe('spacing utilities', () => { let compiled = build(['px-0.25', 'px-1.5', 'px-2.75', 'px-0.375', 'px-2.50', 'px-.75']) expect(optimizeCss(compiled).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: 4px; } @@ -16409,7 +16439,7 @@ describe('spacing utilities', () => { let compiled = build(['w-sm', 'max-w-sm', 'min-w-sm', 'basis-sm']) expect(optimizeCss(compiled).trim()).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing-sm: 8px; --container-sm: 256px; } @@ -17386,7 +17416,7 @@ describe('custom utilities', () => { ` expect(await compileCss(input, ['example-12'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --spacing: 4px; } @@ -17634,7 +17664,7 @@ describe('custom utilities', () => { ` expect(await compileCss(input, ['tab-github'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tab-size-github: 8; } @@ -17678,7 +17708,7 @@ describe('custom utilities', () => { ` expect(await compileCss(input, ['tab-github'])).toMatchInlineSnapshot(` - ":root { + ":root, :host { --tab-size-github: 8; } diff --git a/packages/tailwindcss/src/utilities.ts b/packages/tailwindcss/src/utilities.ts index 8de82f4cbbad..2fb717fae418 100644 --- a/packages/tailwindcss/src/utilities.ts +++ b/packages/tailwindcss/src/utilities.ts @@ -427,42 +427,44 @@ export function createUtilities(theme: Theme) { suggest(name, () => [ { - values: [ - '0', - '0.5', - '1', - '1.5', - '2', - '2.5', - '3', - '3.5', - '4', - '5', - '6', - '7', - '8', - '9', - '10', - '11', - '12', - '14', - '16', - '20', - '24', - '28', - '32', - '36', - '40', - '44', - '48', - '52', - '56', - '60', - '64', - '72', - '80', - '96', - ], + values: theme.get(['--spacing']) + ? [ + '0', + '0.5', + '1', + '1.5', + '2', + '2.5', + '3', + '3.5', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + '14', + '16', + '20', + '24', + '28', + '32', + '36', + '40', + '44', + '48', + '52', + '56', + '60', + '64', + '72', + '80', + '96', + ] + : [], supportsNegative, valueThemeKeys: themeKeys, }, @@ -896,9 +898,7 @@ export function createUtilities(theme: Theme) { staticUtility(`min-h-screen`, [['min-height', '100vh']]) staticUtility(`max-h-screen`, [['max-height', '100vh']]) - staticUtility(`min-w-none`, [['min-width', 'none']]) staticUtility(`max-w-none`, [['max-width', 'none']]) - staticUtility(`min-h-none`, [['min-height', 'none']]) staticUtility(`max-h-none`, [['max-height', 'none']]) spacingUtility( @@ -2936,17 +2936,7 @@ export function createUtilities(theme: Theme) { valueThemeKeys: ['--font'], }, { - values: [ - 'thin', - 'extralight', - 'light', - 'normal', - 'medium', - 'semibold', - 'bold', - 'extrabold', - 'black', - ], + values: [], valueThemeKeys: ['--font-weight'], }, ]) @@ -4042,9 +4032,16 @@ export function createUtilities(theme: Theme) { modifier = `calc(${multiplier} * ${candidate.modifier.value})` } + // Shorthand for `leading-none` + if (!modifier && candidate.modifier.value === 'none') { + modifier = '1' + } + if (modifier) { return [decl('font-size', value), decl('line-height', modifier)] } + + return null } return [decl('font-size', value)] @@ -4088,6 +4085,15 @@ export function createUtilities(theme: Theme) { modifier = `calc(${multiplier} * ${candidate.modifier.value})` } + // Shorthand for `leading-none` + if (!modifier && candidate.modifier.value === 'none') { + modifier = '1' + } + + if (!modifier) { + return null + } + let declarations = [decl('font-size', fontSize)] modifier && declarations.push(decl('line-height', modifier)) return declarations diff --git a/packages/tailwindcss/src/variants.test.ts b/packages/tailwindcss/src/variants.test.ts index e70970a92bed..be374dbd9196 100644 --- a/packages/tailwindcss/src/variants.test.ts +++ b/packages/tailwindcss/src/variants.test.ts @@ -6,15 +6,6 @@ import { Compounds, compoundsForSelectors } from './variants' const css = String.raw -test('force', async () => { - expect(await run(['force:flex'])).toMatchInlineSnapshot(` - ".force\\:flex { - display: flex; - }" - `) - expect(await run(['force/foo:flex'])).toEqual('') -}) - test('*', async () => { expect(await run(['*:flex'])).toMatchInlineSnapshot(` ":is(.\\*\\:flex > *) { @@ -233,7 +224,7 @@ test('target', async () => { test('open', async () => { expect(await run(['open:flex', 'group-open:flex', 'peer-open:flex'])).toMatchInlineSnapshot(` - ".group-open\\:flex:is(:where(.group):is([open], :popover-open) *), .peer-open\\:flex:is(:where(.peer):is([open], :popover-open) ~ *), .open\\:flex:is([open], :popover-open) { + ".group-open\\:flex:is(:where(.group):is([open], :popover-open, :open) *), .peer-open\\:flex:is(:where(.peer):is([open], :popover-open, :open) ~ *), .open\\:flex:is([open], :popover-open, :open) { display: flex; }" `) @@ -756,7 +747,7 @@ test('default breakpoints', async () => { ['sm:flex', 'md:flex', 'lg:flex', 'xl:flex', '2xl:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; @@ -824,7 +815,7 @@ test('custom breakpoint', async () => { ['10xl:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-10xl: 5000px; } @@ -851,7 +842,7 @@ test('max-*', async () => { ['max-lg:flex', 'max-sm:flex', 'max-md:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-lg: 1024px; --breakpoint-md: 768px; @@ -906,7 +897,7 @@ test('min-*', async () => { ['min-lg:flex', 'min-sm:flex', 'min-md:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-lg: 1024px; --breakpoint-md: 768px; @@ -963,7 +954,7 @@ test('sorting stacked min-* and max-* variants', async () => { ['min-sm:max-lg:flex', 'min-sm:max-xl:flex', 'min-md:max-lg:flex', 'min-xs:max-sm:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-lg: 1024px; --breakpoint-md: 768px; @@ -1018,7 +1009,7 @@ test('stacked min-* and max-* variants should come after unprefixed variants', a ['sm:flex', 'min-sm:max-lg:flex', 'md:flex', 'min-md:max-lg:flex'], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-lg: 1024px; --breakpoint-md: 768px; @@ -1080,7 +1071,7 @@ test('min, max and unprefixed breakpoints', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-lg: 1024px; --breakpoint-md: 768px; @@ -1465,7 +1456,7 @@ test('not', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; } @@ -1473,7 +1464,7 @@ test('not', async () => { display: flex; } - .not-open\\:flex:not([open], :popover-open) { + .not-open\\:flex:not([open], :popover-open, :open) { display: flex; } @@ -2011,7 +2002,7 @@ test('container queries', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --container-lg: 1024px; } @@ -2167,7 +2158,7 @@ test('variant order', async () => { ], ), ).toMatchInlineSnapshot(` - ":root { + ":root, :host { --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; @@ -2214,7 +2205,7 @@ test('variant order', async () => { display: flex; } - .first\\:flex:first-child, .last\\:flex:last-child, .only\\:flex:only-child, .odd\\:flex:nth-child(odd), .even\\:flex:nth-child(2n), .first-of-type\\:flex:first-of-type, .last-of-type\\:flex:last-of-type, .only-of-type\\:flex:only-of-type, .visited\\:flex:visited, .target\\:flex:target, .open\\:flex:is([open], :popover-open), .default\\:flex:default, .checked\\:flex:checked, .indeterminate\\:flex:indeterminate, .placeholder-shown\\:flex:placeholder-shown, .autofill\\:flex:autofill, .optional\\:flex:optional, .required\\:flex:required, .valid\\:flex:valid, .invalid\\:flex:invalid, .in-range\\:flex:in-range, .out-of-range\\:flex:out-of-range, .read-only\\:flex:read-only, .empty\\:flex:empty, .focus-within\\:flex:focus-within { + .first\\:flex:first-child, .last\\:flex:last-child, .only\\:flex:only-child, .odd\\:flex:nth-child(odd), .even\\:flex:nth-child(2n), .first-of-type\\:flex:first-of-type, .last-of-type\\:flex:last-of-type, .only-of-type\\:flex:only-of-type, .visited\\:flex:visited, .target\\:flex:target, .open\\:flex:is([open], :popover-open, :open), .default\\:flex:default, .checked\\:flex:checked, .indeterminate\\:flex:indeterminate, .placeholder-shown\\:flex:placeholder-shown, .autofill\\:flex:autofill, .optional\\:flex:optional, .required\\:flex:required, .valid\\:flex:valid, .invalid\\:flex:invalid, .in-range\\:flex:in-range, .out-of-range\\:flex:out-of-range, .read-only\\:flex:read-only, .empty\\:flex:empty, .focus-within\\:flex:focus-within { display: flex; } diff --git a/packages/tailwindcss/src/variants.ts b/packages/tailwindcss/src/variants.ts index d7a1ab5b1390..20f84c867453 100644 --- a/packages/tailwindcss/src/variants.ts +++ b/packages/tailwindcss/src/variants.ts @@ -365,7 +365,6 @@ export function createVariants(theme: Theme): Variants { ) } - variants.static('force', () => {}, { compounds: Compounds.Never }) staticVariant('*', [':is(& > *)'], { compounds: Compounds.Never }) staticVariant('**', [':is(& *)'], { compounds: Compounds.Never }) @@ -681,7 +680,7 @@ export function createVariants(theme: Theme): Variants { // State staticVariant('visited', ['&:visited']) staticVariant('target', ['&:target']) - staticVariant('open', ['&:is([open], :popover-open)']) + staticVariant('open', ['&:is([open], :popover-open, :open)']) // Forms staticVariant('default', ['&:default']) @@ -1117,6 +1116,11 @@ export function createVariants(theme: Theme): Variants { '@min', () => Array.from(widths.keys()).filter((key) => key !== null) as string[], ) + + variants.suggest( + '@', + () => Array.from(widths.keys()).filter((key) => key !== null) as string[], + ) } } diff --git a/packages/tailwindcss/tests/ui.spec.ts b/packages/tailwindcss/tests/ui.spec.ts index 5b3563ed2f03..2595d9982b93 100644 --- a/packages/tailwindcss/tests/ui.spec.ts +++ b/packages/tailwindcss/tests/ui.spec.ts @@ -639,6 +639,45 @@ test('explicit duration and ease utilities are respected when overriding transit expect(await getPropertyValue('#x', 'transition-duration')).toEqual('0.5s') }) +test('shadow DOM has access to variables', async ({ page }) => { + await render( + page, + html` + + + + `, + ) + + let gap = await page.evaluate(() => { + let shadowRoot = document.querySelector('#shadow')!.shadowRoot! + let x = shadowRoot.querySelector('#x')! + return window.getComputedStyle(x).getPropertyValue('gap') + }) + + expect(gap).toBe('8px') +}) + // --- const preflight = fs.readFileSync(path.resolve(__dirname, '..', 'preflight.css'), 'utf-8') @@ -673,14 +712,13 @@ async function render(page: Page, content: string, extraCss: string = '') { // mouse to before running the tests. content = `
${content}` - await page.setContent(content) - let scanner = new Scanner({}) let candidates = scanner.scanFiles([{ content, extension: 'html' }]) - await page.addStyleTag({ - content: optimizeCss(build(candidates)), - }) + let styles = optimizeCss(build(candidates)) + + content = `${content}` + await page.setContent(content) await page.locator('#mouse-park').hover() diff --git a/playgrounds/nextjs/package.json b/playgrounds/nextjs/package.json index 21748143e110..ccfbe6f500b9 100644 --- a/playgrounds/nextjs/package.json +++ b/playgrounds/nextjs/package.json @@ -11,17 +11,17 @@ "dependencies": { "@tailwindcss/postcss": "workspace:^", "fast-glob": "^3.3.3", - "next": "15.1.3", + "next": "15.1.4", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwindcss": "workspace:^" }, "devDependencies": { "@types/node": "catalog:", - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", - "eslint": "^9.17.0", - "eslint-config-next": "^15.1.3", + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", + "eslint": "^9.18.0", + "eslint-config-next": "^15.1.4", "typescript": "^5.5.4" } } diff --git a/playgrounds/v3/package.json b/playgrounds/v3/package.json index e3117cd0c974..2e727f46cc38 100644 --- a/playgrounds/v3/package.json +++ b/playgrounds/v3/package.json @@ -9,18 +9,18 @@ "upgrade": "node scripts/upgrade.mjs" }, "dependencies": { - "next": "15.1.3", + "next": "15.1.4", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwindcss": "^3" }, "devDependencies": { "@types/node": "^20.14.8", - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", "autoprefixer": "^10.4.20", - "eslint": "^9.17.0", - "eslint-config-next": "^15.1.3", + "eslint": "^9.18.0", + "eslint-config-next": "^15.1.4", "typescript": "^5.5.4" } } diff --git a/playgrounds/vite/package.json b/playgrounds/vite/package.json index 4144e52a2293..742893ef8b07 100644 --- a/playgrounds/vite/package.json +++ b/playgrounds/vite/package.json @@ -16,8 +16,8 @@ "tailwindcss": "workspace:^" }, "devDependencies": { - "@types/react": "^19.0.2", - "@types/react-dom": "^19.0.2", + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", "bun": "^1.1.29", "vite": "catalog:" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5f8d934cd99..3d70043b4ac5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -405,8 +405,8 @@ importers: specifier: ^3.3.3 version: 3.3.3 next: - specifier: 15.1.3 - version: 15.1.3(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.1.4 + version: 15.1.4(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -421,17 +421,17 @@ importers: specifier: 'catalog:' version: 20.14.13 '@types/react': - specifier: ^19.0.2 - version: 19.0.2 + specifier: ^19.0.7 + version: 19.0.7 '@types/react-dom': - specifier: ^19.0.2 - version: 19.0.2(@types/react@19.0.2) + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.7) eslint: - specifier: ^9.17.0 - version: 9.17.0(jiti@2.4.2) + specifier: ^9.18.0 + version: 9.18.0(jiti@2.4.2) eslint-config-next: - specifier: ^15.1.3 - version: 15.1.3(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) + specifier: ^15.1.4 + version: 15.1.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -439,8 +439,8 @@ importers: playgrounds/v3: dependencies: next: - specifier: 15.1.3 - version: 15.1.3(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 15.1.4 + version: 15.1.4(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -455,20 +455,20 @@ importers: specifier: ^20.14.8 version: 20.14.13 '@types/react': - specifier: ^19.0.2 - version: 19.0.2 + specifier: ^19.0.7 + version: 19.0.7 '@types/react-dom': - specifier: ^19.0.2 - version: 19.0.2(@types/react@19.0.2) + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.7) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) eslint: - specifier: ^9.17.0 - version: 9.17.0(jiti@2.4.2) + specifier: ^9.18.0 + version: 9.18.0(jiti@2.4.2) eslint-config-next: - specifier: ^15.1.3 - version: 15.1.3(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) + specifier: ^15.1.4 + version: 15.1.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -492,11 +492,11 @@ importers: version: link:../../packages/tailwindcss devDependencies: '@types/react': - specifier: ^19.0.2 - version: 19.0.2 + specifier: ^19.0.7 + version: 19.0.7 '@types/react-dom': - specifier: ^19.0.2 - version: 19.0.2(@types/react@19.0.2) + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.7) bun: specifier: ^1.1.29 version: 1.1.29 @@ -1180,24 +1180,24 @@ packages: resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -1355,56 +1355,56 @@ packages: engines: {node: '>= 10'} hasBin: true - '@next/env@15.1.3': - resolution: {integrity: sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==} + '@next/env@15.1.4': + resolution: {integrity: sha512-2fZ5YZjedi5AGaeoaC0B20zGntEHRhi2SdWcu61i48BllODcAmmtj8n7YarSPt4DaTsJaBFdxQAVEVzgmx2Zpw==} - '@next/eslint-plugin-next@15.1.3': - resolution: {integrity: sha512-oeP1vnc5Cq9UoOb8SYHAEPbCXMzOgG70l+Zfd+Ie00R25FOm+CCVNrcIubJvB1tvBgakXE37MmqSycksXVPRqg==} + '@next/eslint-plugin-next@15.1.4': + resolution: {integrity: sha512-HwlEXwCK3sr6zmVGEvWBjW9tBFs1Oe6hTmTLoFQtpm4As5HCdu8jfSE0XJOp7uhfEGLniIx8yrGxEWwNnY0fmQ==} - '@next/swc-darwin-arm64@15.1.3': - resolution: {integrity: sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==} + '@next/swc-darwin-arm64@15.1.4': + resolution: {integrity: sha512-wBEMBs+np+R5ozN1F8Y8d/Dycns2COhRnkxRc+rvnbXke5uZBHkUGFgWxfTXn5rx7OLijuUhyfB+gC/ap58dDw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.3': - resolution: {integrity: sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==} + '@next/swc-darwin-x64@15.1.4': + resolution: {integrity: sha512-7sgf5rM7Z81V9w48F02Zz6DgEJulavC0jadab4ZsJ+K2sxMNK0/BtF8J8J3CxnsJN3DGcIdC260wEKssKTukUw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.3': - resolution: {integrity: sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==} + '@next/swc-linux-arm64-gnu@15.1.4': + resolution: {integrity: sha512-JaZlIMNaJenfd55kjaLWMfok+vWBlcRxqnRoZrhFQrhM1uAehP3R0+Aoe+bZOogqlZvAz53nY/k3ZyuKDtT2zQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.3': - resolution: {integrity: sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==} + '@next/swc-linux-arm64-musl@15.1.4': + resolution: {integrity: sha512-7EBBjNoyTO2ipMDgCiORpwwOf5tIueFntKjcN3NK+GAQD7OzFJe84p7a2eQUeWdpzZvhVXuAtIen8QcH71ZCOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.3': - resolution: {integrity: sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==} + '@next/swc-linux-x64-gnu@15.1.4': + resolution: {integrity: sha512-9TGEgOycqZFuADyFqwmK/9g6S0FYZ3tphR4ebcmCwhL8Y12FW8pIBKJvSwV+UBjMkokstGNH+9F8F031JZKpHw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.3': - resolution: {integrity: sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==} + '@next/swc-linux-x64-musl@15.1.4': + resolution: {integrity: sha512-0578bLRVDJOh+LdIoKvgNDz77+Bd85c5JrFgnlbI1SM3WmEQvsjxTA8ATu9Z9FCiIS/AliVAW2DV/BDwpXbtiQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.3': - resolution: {integrity: sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==} + '@next/swc-win32-arm64-msvc@15.1.4': + resolution: {integrity: sha512-JgFCiV4libQavwII+kncMCl30st0JVxpPOtzWcAI2jtum4HjYaclobKhj+JsRu5tFqMtA5CJIa0MvYyuu9xjjQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.3': - resolution: {integrity: sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==} + '@next/swc-win32-x64-msvc@15.1.4': + resolution: {integrity: sha512-xxsJy9wzq7FR5SqPCUqdgSXiNXrMuidgckBa8nH9HtjjxsilgcN6VgXF6tZ3uEWuVEadotQJI8/9EQ6guTC4Yw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1857,13 +1857,13 @@ packages: '@types/postcss-import@14.0.3': resolution: {integrity: sha512-raZhRVTf6Vw5+QbmQ7LOHSDML71A5rj4+EqDzAbrZPfxfoGzFxMHRCq16VlddGIZpHELw0BG4G0YE2ANkdZiIQ==} - '@types/react-dom@19.0.2': - resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} + '@types/react-dom@19.0.3': + resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.2': - resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} + '@types/react@19.0.7': + resolution: {integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==} '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -2372,8 +2372,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.1.3: - resolution: {integrity: sha512-wGYlNuWnh4ujuKtZvH+7B2Z2vy9nONZE6ztd+DKF7hAsIabkrxmD4TzYHzASHENo42lmz2tnT2B+zN2sOHvpJg==} + eslint-config-next@15.1.4: + resolution: {integrity: sha512-u9+7lFmfhKNgGjhQ9tBeyCFsPJyq0SvGioMJBngPC7HXUpR0U+ckEwQR48s7TrRNHra1REm6evGL2ie38agALg==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -2458,8 +2458,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.18.0: + resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3113,8 +3113,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.1.3: - resolution: {integrity: sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==} + next@15.1.4: + resolution: {integrity: sha512-mTaq9dwaSuwwOrcu3ebjDYObekkxRnXpuVL21zotM8qE2W0HBOdVIdg2Li9QjMEZrj73LN96LcWcz62V19FjAg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4466,9 +4466,9 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.17.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.18.0(jiti@2.4.2))': dependencies: - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -4481,7 +4481,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.9.0': {} + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.2.0': dependencies: @@ -4497,12 +4499,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.18.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.3': + '@eslint/plugin-kit@0.2.5': dependencies: + '@eslint/core': 0.10.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -4627,34 +4630,34 @@ snapshots: '@napi-rs/cli@2.18.4': {} - '@next/env@15.1.3': {} + '@next/env@15.1.4': {} - '@next/eslint-plugin-next@15.1.3': + '@next/eslint-plugin-next@15.1.4': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.3': + '@next/swc-darwin-arm64@15.1.4': optional: true - '@next/swc-darwin-x64@15.1.3': + '@next/swc-darwin-x64@15.1.4': optional: true - '@next/swc-linux-arm64-gnu@15.1.3': + '@next/swc-linux-arm64-gnu@15.1.4': optional: true - '@next/swc-linux-arm64-musl@15.1.3': + '@next/swc-linux-arm64-musl@15.1.4': optional: true - '@next/swc-linux-x64-gnu@15.1.3': + '@next/swc-linux-x64-gnu@15.1.4': optional: true - '@next/swc-linux-x64-musl@15.1.3': + '@next/swc-linux-x64-musl@15.1.4': optional: true - '@next/swc-win32-arm64-msvc@15.1.3': + '@next/swc-win32-arm64-msvc@15.1.4': optional: true - '@next/swc-win32-x64-msvc@15.1.3': + '@next/swc-win32-x64-msvc@15.1.4': optional: true '@nodelib/fs.scandir@2.1.5': @@ -4971,11 +4974,11 @@ snapshots: dependencies: postcss: 8.4.41 - '@types/react-dom@19.0.2(@types/react@19.0.2)': + '@types/react-dom@19.0.3(@types/react@19.0.7)': dependencies: - '@types/react': 19.0.2 + '@types/react': 19.0.7 - '@types/react@19.0.2': + '@types/react@19.0.7': dependencies: csstype: 3.1.3 @@ -4983,15 +4986,15 @@ snapshots: dependencies: '@types/node': 20.14.13 - '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) '@typescript-eslint/scope-manager': 8.11.0 - '@typescript-eslint/type-utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) - '@typescript-eslint/utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/type-utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.11.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5001,15 +5004,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.11.0 - '@typescript-eslint/type-utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) - '@typescript-eslint/utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.11.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5019,27 +5022,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4)': + '@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.11.0 '@typescript-eslint/types': 8.11.0 '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.11.0 debug: 4.3.7 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3)': + '@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.11.0 '@typescript-eslint/types': 8.11.0 '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.11.0 debug: 4.3.7 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -5050,10 +5053,10 @@ snapshots: '@typescript-eslint/types': 8.11.0 '@typescript-eslint/visitor-keys': 8.11.0 - '@typescript-eslint/type-utils@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -5062,10 +5065,10 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/utils': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -5106,24 +5109,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4)': + '@typescript-eslint/utils@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.11.0 '@typescript-eslint/types': 8.11.0 '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.4) - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3)': + '@typescript-eslint/utils@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.11.0 '@typescript-eslint/types': 8.11.0 '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) transitivePeerDependencies: - supports-color - typescript @@ -5758,19 +5761,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.3(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4): + eslint-config-next@15.1.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4): dependencies: - '@next/eslint-plugin-next': 15.1.3 + '@next/eslint-plugin-next': 15.1.4 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) - eslint: 9.17.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.1(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.2(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.17.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.2(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.18.0(jiti@2.4.2)) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -5778,19 +5781,19 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@15.1.3(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3): + eslint-config-next@15.1.4(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3): dependencies: - '@next/eslint-plugin-next': 15.1.3 + '@next/eslint-plugin-next': 15.1.4 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) - eslint: 9.17.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.1(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.2(eslint@9.17.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.17.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.2(eslint@9.18.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.18.0(jiti@2.4.2)) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -5806,67 +5809,67 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.18.0 - eslint: 9.17.0(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) + eslint: 9.18.0(jiti@2.4.2) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) fast-glob: 3.3.3 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.17.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.18.0(jiti@2.4.2)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.18.0 - eslint: 9.17.0(jiti@2.4.2) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) + eslint: 9.18.0(jiti@2.4.2) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) fast-glob: 3.3.3 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) - eslint: 9.17.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) - eslint: 9.17.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint@9.18.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5875,9 +5878,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -5889,13 +5892,13 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.4) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5904,9 +5907,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.17.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.18.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -5918,13 +5921,13 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.11.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/parser': 8.11.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.1(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.1(eslint@9.18.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -5935,7 +5938,7 @@ snapshots: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.1.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -5944,11 +5947,11 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.0.0(eslint@9.18.0(jiti@2.4.2)): dependencies: - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) - eslint-plugin-react@7.37.2(eslint@9.17.0(jiti@2.4.2)): + eslint-plugin-react@7.37.2(eslint@9.18.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -5956,7 +5959,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.1.0 - eslint: 9.17.0(jiti@2.4.2) + eslint: 9.18.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5979,15 +5982,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@2.4.2): + eslint@9.18.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.18.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 - '@eslint/core': 0.9.0 + '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.3 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -6074,7 +6077,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-glob@3.3.3: dependencies: @@ -6629,9 +6632,9 @@ snapshots: natural-compare@1.4.0: {} - next@15.1.3(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.1.4(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.1.3 + '@next/env': 15.1.4 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -6641,14 +6644,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.3 - '@next/swc-darwin-x64': 15.1.3 - '@next/swc-linux-arm64-gnu': 15.1.3 - '@next/swc-linux-arm64-musl': 15.1.3 - '@next/swc-linux-x64-gnu': 15.1.3 - '@next/swc-linux-x64-musl': 15.1.3 - '@next/swc-win32-arm64-msvc': 15.1.3 - '@next/swc-win32-x64-msvc': 15.1.3 + '@next/swc-darwin-arm64': 15.1.4 + '@next/swc-darwin-x64': 15.1.4 + '@next/swc-linux-arm64-gnu': 15.1.4 + '@next/swc-linux-arm64-musl': 15.1.4 + '@next/swc-linux-x64-gnu': 15.1.4 + '@next/swc-linux-x64-musl': 15.1.4 + '@next/swc-win32-arm64-msvc': 15.1.4 + '@next/swc-win32-x64-msvc': 15.1.4 '@playwright/test': 1.49.1 sharp: 0.33.5 transitivePeerDependencies: @@ -6871,7 +6874,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 diff --git a/scripts/release-channel.js b/scripts/release-channel.js new file mode 100644 index 000000000000..15dc7df8213e --- /dev/null +++ b/scripts/release-channel.js @@ -0,0 +1,20 @@ +// Given a version, figure out what the release channel is so that we can publish to the correct +// channel on npm. +// +// E.g.: +// +// 1.2.3 -> latest (default) +// 0.0.0-insiders.ffaa88 -> insiders +// 4.1.0-alpha.4 -> alpha + +let version = + process.argv[2] || + process.env.npm_package_version || + require('../packages/tailwindcss/package.json').version + +let match = /\d+\.\d+\.\d+-(.*)\.\d+/g.exec(version) +if (match) { + console.log(match[1]) +} else { + console.log('latest') +} diff --git a/scripts/version-packages.mjs b/scripts/version-packages.mjs index 2e3d93a3e668..36f412cc377f 100644 --- a/scripts/version-packages.mjs +++ b/scripts/version-packages.mjs @@ -8,6 +8,7 @@ import prettier from 'prettier' const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) const root = path.resolve(__dirname, '..') +const version = process.argv[2] || null // The known workspace is: @tailwindcss/oxide // All the workspaces in `crates/node/npm/*` should always be in sync with @@ -46,80 +47,19 @@ for (let [name, paths] of syncedWorkspaces) { } } -exec('pnpm --silent --filter=!./playgrounds/* -r exec pwd', async (err, stdout) => { - if (err) { - console.error(err) - process.exit(1) - } - - let paths = stdout - .trim() - .split('\n') - .map((x) => path.resolve(x, 'package.json')) - // Workspaces that are in sync with another workspace should not be updated - // manually, they should be updated by updating the main workspace. - .filter((x) => !inverseSyncedWorkspaces.has(x)) - - let workspaces = new Map() - - // Track all the workspaces - for (let path of paths) { - let pkg = await fs.readFile(path, 'utf8').then(JSON.parse) - if (pkg.private) continue - workspaces.set(pkg.name, { version: pkg.version ?? '', path }) - } +exec( + "pnpm --silent --filter='!./playgrounds/*' --filter='!./integrations' --filter='!./packages/internal-example-plugin' -r exec pwd", + async (err, stdout) => { + if (err) { + console.error(err) + process.exit(1) + } - // Build the editable output - let lines = ['# Update the versions of the packages you want to change', ''] - for (let [name, info] of workspaces) { - lines.push(`${name}: ${info.version}`) - } - let output = lines.join('\n') - - // Edit the file - { - // Figure out which editor to use. - // - // In this case we still split on whitespace, because it can happen that the - // EDITOR env variable is configured as `code --wait`. This means that we - // want `code` as the editor, but `--wait` is one of the arguments. - let args = process.env.EDITOR.split(' ') - let editor = args.shift() - - // Create a temporary file which will be edited - let filepath = path.resolve(tmpdir(), `version-${randomUUID()}.txt`) - await fs.writeFile(filepath, output) - - // Edit the file, once the editor is closed, the file will be saved and we - // can read the changes - spawnSync(editor, [...args, filepath], { - stdio: 'inherit', - }) - - let newOutput = await fs.readFile(filepath, 'utf8').then((x) => x.trim().split('\n')) - - // Cleanup temporary file - await fs.unlink(filepath) - - // Update the package.json files - for (let line of newOutput) { - if (line[0] === '#') continue // Skip comment lines - if (line.trim() === '') continue // Skip empty lines - - let [name, version = ''] = line.split(':').map((x) => x.trim()) - - // Figure out all the paths to the package.json files that need to be - // updated with the new version - let paths = [ - // The package.json file of the main workspace - workspaces.get(name).path, - - // The package.json files of the workspaces that are in sync with the - // main workspace - ...(syncedWorkspaces.get(name) ?? []), - ] - - for (let pkgPath of paths) { + if (version !== null) { + for (let pkgPath of stdout + .trim() + .split('\n') + .map((x) => path.resolve(x, 'package.json'))) { let pkg = await fs.readFile(pkgPath, 'utf8').then(JSON.parse) let name = pkg.name if (version !== '') { @@ -138,8 +78,100 @@ exec('pnpm --silent --filter=!./playgrounds/* -r exec pwd', async (err, stdout) .then((x) => `${x.trim()}\n`), ) } + + console.log('Done.') + return + } + + let paths = stdout + .trim() + .split('\n') + .map((x) => path.resolve(x, 'package.json')) + // Workspaces that are in sync with another workspace should not be updated + // manually, they should be updated by updating the main workspace. + .filter((x) => !inverseSyncedWorkspaces.has(x)) + + let workspaces = new Map() + + // Track all the workspaces + for (let path of paths) { + let pkg = await fs.readFile(path, 'utf8').then(JSON.parse) + if (pkg.private) continue + workspaces.set(pkg.name, { version: pkg.version ?? '', path }) + } + + // Build the editable output + let lines = ['# Update the versions of the packages you want to change', ''] + for (let [name, info] of workspaces) { + lines.push(`${name}: ${info.version}`) + } + let output = lines.join('\n') + + // Edit the file + { + // Figure out which editor to use. + // + // In this case we still split on whitespace, because it can happen that the + // EDITOR env variable is configured as `code --wait`. This means that we + // want `code` as the editor, but `--wait` is one of the arguments. + let args = process.env.EDITOR.split(' ') + let editor = args.shift() + + // Create a temporary file which will be edited + let filepath = path.resolve(tmpdir(), `version-${randomUUID()}.txt`) + await fs.writeFile(filepath, output) + + // Edit the file, once the editor is closed, the file will be saved and we + // can read the changes + spawnSync(editor, [...args, filepath], { + stdio: 'inherit', + }) + + let newOutput = await fs.readFile(filepath, 'utf8').then((x) => x.trim().split('\n')) + + // Cleanup temporary file + await fs.unlink(filepath) + + // Update the package.json files + for (let line of newOutput) { + if (line[0] === '#') continue // Skip comment lines + if (line.trim() === '') continue // Skip empty lines + + let [name, version = ''] = line.split(':').map((x) => x.trim()) + + // Figure out all the paths to the package.json files that need to be + // updated with the new version + let paths = [ + // The package.json file of the main workspace + workspaces.get(name).path, + + // The package.json files of the workspaces that are in sync with the + // main workspace + ...(syncedWorkspaces.get(name) ?? []), + ] + + for (let pkgPath of paths) { + let pkg = await fs.readFile(pkgPath, 'utf8').then(JSON.parse) + let name = pkg.name + if (version !== '') { + // Ensure the version is set after the name and before everything else + delete pkg.name + delete pkg.version + + // This allows us to keep the order of the keys in the package.json + pkg = { name, version, ...pkg } + } + + await fs.writeFile( + pkgPath, + await prettier + .format(JSON.stringify(pkg, null, 2), { filepath: pkgPath }) + .then((x) => `${x.trim()}\n`), + ) + } + } } - } - console.log('Done.') -}) + console.log('Done.') + }, +)