Commit graph

5318 commits

Author SHA1 Message Date
Adam Wathan
4aefd26f44
Don't reset ::first-letter in Preflight (#13408)
* Don't reset ::first-letter in Preflight

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-30 08:06:53 -04:00
Jordan Pittman
a79fa45bf2
Make isColor faster (#13404)
When the arrays of colors were split, both smaller, and had different values to lookup an `includes` check was faster. Since they’ve been merged a Set is now beneficial.
2024-03-29 09:15:09 -04:00
Jordan Pittman
500372e728
Enable Vite's waitForRequestsIdle() for client requests only (#13394)
* Enable `waitForRequestsIdle` but only when not doing SSR

* Cleanup comment

* Update changelog
2024-03-28 22:57:16 -04:00
Jordan Pittman
855cd94ff0
Prepare next release: 4.0.0-alpha.11 (#13382)
* bump versions to `4.0.0-alpha.11`

* Update changelog

* Update changelog

* Update changelog

* Update changelog
2024-03-27 13:32:10 -04:00
Kris Braun
94d68255da
Changelog for #13380 (Vite serve fix) (#13381) 2024-03-27 13:04:32 -04:00
Kris Braun
89eb1ba060
Fix Vite serve issues (#13380)
* Temporarily disable waitForRequestIdle

* Only apply vite:css-post in build mode
2024-03-27 12:31:54 -04:00
Robin Malfait
c815221249
Ensure build command is executed when using --output instead of -o (#13369) 2024-03-27 16:10:55 +01:00
Robin Malfait
99c4afd9cd
update comments to better describe what's going on (#13348) 2024-03-25 15:49:14 -04:00
Robin Malfait
19c8fe34fd
remove Rust benchmarks and fixtures (#13335)
We currently don't use these, and they are tested via the benchmarks we
run as an end-to-end benchmark.
2024-03-23 16:16:40 +01:00
Robin Malfait
1c48683a23
Hoist oxide/crates to just crates (#13333)
* move `oxide/crates` to `crates`

* ignore `target/` folder

* ensure pnpm points to `crates` instead of `oxide/crates`

* ensure all paths point to `crates` instead of `oxide/crates`

* update `oxide/crates` -> `crates` path in workflows

* use correct path in .prettierignore

* rename `crates/core` to `crates/oxide`

* remove oxide folder

* fix test script to run `cargo test` directly
2024-03-23 09:00:48 -04:00
Jordan Pittman
fee039d82f
Inherit letter spacing in form controls (#13328)
* Inherit letter spacing in form controls

* Update changelog

* Update snapshots
2024-03-22 16:01:39 -04:00
Adam Wathan
59038c5734
Include :popover-open in open variant (#13331)
* Include :popover-open in open variant

Co-Authored-By: Luke Warlow <lwarlow@igalia.com>

* Update changelog

* Remove accidental package.json change

* Revert playground changes

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
Co-authored-by: Luke Warlow <lwarlow@igalia.com>
2024-03-22 16:00:07 -04:00
Adam Wathan
de79455b0e
Add variant for @starting-style (#13329)
* Add variant for @starting-style

Co-Authored-By: Han Yeong-woo <han@yeongwoo.dev>

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
Co-authored-by: Han Yeong-woo <han@yeongwoo.dev>
2024-03-22 15:38:06 -04:00
Kris Braun
3249777383
Process Tailwind output with Vite CSS plugins (#13218)
Transform Tailwind-generated CSS with Vite CSS plugins. vite:css does useful things like transforming url() paths and inlining images. vite:css-post generates bundle hashes. Before this change, the CSS bundle hash wasn't changing when the generated CSS changed.

Also adds Vite 5.2 peerDependancy.

---------

Co-authored-by: Jordan Pittman <jordan@cryptica.me>
2024-03-22 14:57:44 -04:00
Robin Malfait
fcdb3279ea
Fix incorrect syntax for translate-z's @property definition (#13327)
* fix incorrect syntax for `translate-z`

This used to be `<length-percentage>`, but we dropped percentage support
because it's not valid in #13321 and I forgot about this one.

* update changelog
2024-03-22 19:49:46 +01:00
Adam Wathan
0f69d4fe6e
[v4] Make 3D rotations composable (#13319)
* Reorganize to co-locate rotate/skew/transform

* Make 3D rotations composable

* Uppercase axis in rotate functions

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-22 13:31:57 -04:00
Robin Malfait
86dd6976f0
Remove percentage values for translate-z utilities (#13321)
* handle `translate-z` separately

* do not support fractions for `translate-z`

* update changelog
2024-03-22 17:19:18 +01:00
Robin Malfait
8840019efa
Prepare next release: 4.0.0-alpha.10 (#13281)
* bump versions to `4.0.0-alpha.10`

* update changelog

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-21 13:32:03 -04:00
Adam Wathan
b5df5e9202
Use variables with fallbacks for utility classes (#13177)
* Use variables with fallbacks for utility classes

* Update playwright test

* rename `resolveBare` to `resolveValue`

* make private methods really private

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
2024-03-21 18:25:43 +01:00
Robin Malfait
a3cedf253a
Improve transform, transform-cpu and transform-gpu utilities (#13290)
* fix `transform-gpu` translate syntax

* move `skewX` and `skewY` functions into the variable

* use `transform-[…]` with arbitrary values as-is

This will not have any fallbacks to the `skewX` or `skewY` functions.
The arbitrary values will be the only value that's used.

* use `--tw-skew-{x,y}` variables in `transform-cpu` and `transform-gpu`

* update tests

* drop `skewX` and `skewY` functions because they are embedded in the `--tw-skew-x` and `--tw-skew-y` CSS variables

* drop `transform-cpu` and `transform-gpu`

* add `translate-none`, `transform-none`, `rotate-none` and `scale-none`

* ensure `transform` creates a stacking context

* use `<transform-function>` instead of `<angle>`

* re-add `transform-gpu`

* drop the `,`, because `--tw-skew-x` and `--tw-skew-y` will always be defined by the `@property`

* `translate(0)` is not necessary because `--tw-skew-{x,y}` will always be defined

* add skew variables to `transform-gpu`

Otherwise skew's will be gone

* re-add `transform-cpu`
2024-03-21 17:51:15 +01:00
Robin Malfait
6a6186c24a
Remove bare value support for translate utilities (#13289)
* make `themeKeys` optional and default to `[]`

* remove `themeKeys` that already map 1:1 to a number or percentage

These can be handled by bare values without issues.

* remove fallback theme key lookup

- In case of `columns`, bare values can be used for the amount of columns
- In case of `divide-width`, we can always look at `--border-width`

* drop theme keys from suggestions

* drop bare value support for `translate-{axis}`

* add todo

* Revert "remove `themeKeys` that already map 1:1 to a number or percentage"

This reverts commit ef3b47aaee.

* Revert "remove fallback theme key lookup"

This reverts commit 0a5fc2dd39.

* Revert "drop theme keys from suggestions"

This reverts commit 7179a19517.

* Revert "add todo"

This reverts commit 7340cdfcf8.
2024-03-21 17:40:19 +01:00
Robin Malfait
ec72fb6510
rename release-oxide to release (#13301) 2024-03-21 13:35:08 +01:00
Kris Braun
85c3b2b6a2
Use Vite waitForRequestsIdle (#13291) 2024-03-20 16:40:50 -04:00
Adam Wathan
89a0b86e73
Remove bare value handling for perspective utilities (#13288)
* Remove bare value handling for perspective utilities

* move `perspective-123` example

This is now moved to the spot where we ensure that nothing is generated
at all. This prevents us from accidentally updating a snapshot and
missing a potential bug.

* update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
2024-03-20 15:25:24 +01:00
Robin Malfait
d25fe81da8
update CHANGELOG 2024-03-19 17:52:51 +01:00
Kris Braun
dadb096da2
3D transform utilities (#13248)
* 3D rotation utilities

* Validate rotate values

* Replace forEach with for loop

* transform-style, transform-box, and backface-visibility utilities

* Tests for transform utilities

* 'perspective' utility

* Fix tests

* Remove unnecessary suggestion; move function comments

* scale-z

* Fix Intellisense test

* perspective-origin

* scale-3d

* Only include the z component of scale if it's defined

We want to avoid triggerring unnecessary 3D transformations.

* Comment the reason for setting --tw-rotate

* Test full bare rotate

* Fix merge

* Comment on rotate arbitrary value

* perspective bare values

Support `perspective-123` (but not `perspective-potato`)

* scale-3d as a static modifier to scale

Instead of scale-3d taking a separate scale, it modifies scale to apply in three dimensions.

* Test that scale-x overrides scale

* scale arbitrary values

Support arbitrary value for scale (e.g. `scale-[1_2_3.5]`).

* Specify rotation axis using a modifier

Support single rotation angles in line with the [CSS `rotate` property](https://developer.mozilla.org/en-US/docs/Web/CSS/rotate). Using modifiers (e.g. `rotate-45/x`) makes it clearer that the axis of rotation is modified. Thanks @adamwathan for this suggestion.

Composing angles is only supported in CSS via a pipeline of `transform` functions. I'll add arbitrary value support to `transform` next as an escape hatch for those cases that need more complex transformations.

* Use property defaults for scale-3d

* `transform` arbitrary values

Support arbitrary values for `transform`. The `skew-x` and `skew-y` transforms are applied before any arbitrary transformations.

* Add translate-z and translate-3d

Both work the same way as scale-z and scale-3d.

* Add translate-[xyz]-px

* Comment on how skewX and skewY are applied

* Remove unnecessary suggest

* Simplify translate

* Fix up comment on rotate syntax

* Back to rotate-x and rotate-y rather than rotate modifiers

* 3D transform test fixes
2024-03-19 17:52:32 +01:00
Robin Malfait
d2be632635
Skip newlines when parsing selectors (#13280)
* replace "\n" with " " when parsing CSS

* add test to ensure important whitespace is preserved
2024-03-19 16:23:14 +01:00
Robin Malfait
f3e78807af
Parse candidates in .svelte files with class:abc="condition" syntax (#13274)
* handle `.svelte` file

In svelte there is a convention where you can use `<div
class:px-4="condition" />` which means that we extract `class:px-4` as a
utility where `class` is a variant.

This is obviously incorrect, to solve this we can ignore the `class:`
part before parsing the whole file.

This is also what we do in v3.

Ideally we have completely separate parsers for various programming
languages (based on file type) and fallback to the generic one we have
now.

Implementing that, is a much bigger scope.

* flatten match arms

* add test to verify we can parse `class:px-4="condition"`

* explicitly ingore everything but the svelte file

* merge tests

There is some funky stuff happening when running `cargo test` where it
sees contents from another test. Maybe a bug in the tmpdir crate.

I don't see this problem locally when running `cargo nextest run`, but
when using the native `cargo test` command it fails.

* update changelog

* run prettier

* Update oxide/crates/core/src/lib.rs

Co-authored-by: Jordan Pittman <jordan@cryptica.me>

* fixup syntax errors

---------

Co-authored-by: Jordan Pittman <jordan@cryptica.me>
2024-03-18 23:24:22 +01:00
Robin Malfait
cdb0997d6e
Add inherit as a universal color (#13258)
* add `inherit` as a hardcoded color

* add `inherit` to suggestions

* update changelog

* re-order changelog sections
2024-03-15 19:31:36 +01:00
Robin Malfait
1933d8eb76
Fix typos (#13257)
* fix typos

* update test, due to typo in property order list
2024-03-15 18:13:02 +01:00
Robin Malfait
154164d97c
Validate bare values (#13245)
* add validation for bare values

* add bare value validation to `row-span`, `row-start`, `row-end`, `row-span`, `row-start`, and `row-end`

* update changelog

* validate bare values in `utilities.functional` utilities

* mark candidates as invalid if the leftover value is an empty string

* Update packages/tailwindcss/src/candidate.ts

Co-authored-by: Jordan Pittman <jordan@cryptica.me>

* validate `from`, `via` and `to`

This way we make sure that the bare value ends with `%`, and the value
before it is a number.

---------

Co-authored-by: Jordan Pittman <jordan@cryptica.me>
2024-03-15 15:08:26 +01:00
Robin Malfait
9fc5aa16a3
Inline the tailwindcss/index.css contents at publish time (#13233)
* add `pre-publish-optimizations` script

* handle `@import` ourselves

This implementation is fairly simple right now, because we don't have
to worry about resolving folders or modules since we don't use them.

* pretty print index.css file

* update changelog

* Revert "handle `@import` ourselves"

This reverts commit 13a46404c1.

* drop the `1.`

* Update scripts/pre-publish-optimizations.mjs

Co-authored-by: Jordan Pittman <jordan@cryptica.me>

* Update CHANGELOG.md

Co-authored-by: Adam Wathan <adam.wathan@gmail.com>

* run prettier

---------

Co-authored-by: Jordan Pittman <jordan@cryptica.me>
Co-authored-by: Adam Wathan <adam.wathan@gmail.com>
2024-03-13 22:26:10 +01:00
Robin Malfait
44394b164a
Prepare 4.0.0-alpha.9 release (#13231)
* update changelog

* bump versions to `4.0.0-alpha.9`

* move the optimizeCss change to `Changed`
2024-03-13 13:11:06 -04:00
Robin Malfait
0ee3508179
Move optimizeCss to the packages where it's used (#13230)
* add `@tailwindcss/optimize` as a separate package

* remove lightningcss from `tailwindcss`

* import `optimizeCss` from `@tailwindcss/optimize`

* ensure we use `src/` files in development

* move `devDependencies` after `dependencies`

Just for consistency

* inline `optimizeCss` in leaf packages

Instead of introducing a custom `@tailwindcss/optimize` package

* update changelog

* fix changelog
2024-03-13 17:25:16 +01:00
Adam Wathan
91fca13981
Don't rely on existence of --default-transition-* variables in transition utilities (#13219)
* Don't rely on existence of --default-transition-* variables in transition utilities

* Update changelog

* Add test with no default transition values defined

* Inline value for --default-transition-timing-function

This is more consistent with how things worked in v3 and ensures things will still work if the user suppresses the output of all CSS variables.

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-13 12:14:05 -04:00
Nick Kosarev
7452425505
Fix incorrect properties in line-clamp utilities (#13220)
* Overflow fix for https://github.com/tailwindlabs/tailwindcss/issues/13217

* webkit-box-orient and webkit-line-clamp fix for https://github.com/tailwindlabs/tailwindcss/issues/13217

* tests fix https://github.com/tailwindlabs/tailwindcss/issues/13217

* update changelog

---------

Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
2024-03-12 23:02:59 +01:00
Adam Wathan
4e1f98141a
Support @theme reference without @import (#13222)
* Support `@theme reference` without `@import`

* Fix test

* Update tests

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-12 14:07:01 -04:00
Adam Wathan
65f6f7c1ca
Prepare alpha.8 release (#13203)
Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-11 15:10:21 -04:00
Robin Malfait
172bc5d822
Add incremental rebuilds to @tailwindcss/postcss (#13170)
* rename PostCSS plugin name from `tailwindcss-v4` to `@tailwindcss/postcss`

* add incremental rebuilds to `@tailwindcss/postcss`

* improve comment

* update changelog

* Simplify nested conditionals

* Simplify more conditionals

* Refactor file modification tracking

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-11 15:01:28 -04:00
Robin Malfait
a458e5ddda
Add incremental rebuilds to @tailwindcss/cli (#13169)
* ensure the root CSS file part of the `cssImportPaths`

* add incremental rebuilds to `@tailwindcss/cli`

* update changelog
2024-03-11 14:32:41 -04:00
Robin Malfait
d230f2e13b
Improve incremental builds (#13168)
* ensure we don't crash on deleted files

* change return type of `compile` to include a `rebuild()` function

This will allow us in the future to perform incremental rebuilds after
the initial rebuild. This is purely the API change so that we can
prepare all the call sites to use this new API.

* set `@tailwind utilities` nodes

Instead of replacing the node that represents the `@tailwind utilities`
with the generated AST nodes from the rawCandidates, we will set the
nodes of the `@tailwind utilities` rule to the AST nodes instead.

This way we dont' have to remove and replace the `@tailwind utilities`
rule with `n` new nodes. This will later allow us to track the
`@tailwindcss utilities` rule itself and update its `nodes` for
incremental rebuilds.

This also requires a small change to the printer where we now need to
print the children of the `@tailwind utilities` rule. Note: we keep the
same `depth` as-if the `@tailwindcss utilities` rule was not there.
Otherwise additional indentation would be present.

* move sorting to the `ast.sort()` call

This will allow us to keep sorting AST nodes in a single spot.

* move parser functions to the `DesignSystem`

This allows us to put all the parsers in the `DesignSystem`, this allows
us to scope the parsers to the current design system (the current theme,
current utility values and variants).

The implementation of these parsers are also using a `DefaultMap`
implementation. This allows us to make use of caching and only parse a
candidate, parse a variant or compile AST nodes for a given raw
candidate once if we've already done this work in the past.

Again, this is scoped to the `DesignSystem` itself. This means that if
the corresponding theme changes, then we will create a new
`DesignSystem` entirely and the caches will be garbage collected. This
is important because a candidate like `bg-primary` can be invalid in
`DesignSystem` A, but can be valid in `DesignSystem` B and vice versa.

* ensure we sort variants alphabetically by root

For incremental rebuilds we don't know all the used variants upfront,
which means that we can't sort them upfront either (what we used to do).

This code now allows us to sort the variants deterministically when
sorting the variants themselves instead of relying on the fact that they
used to be sorted before.

The sort itself could change slightly compared to the previous
implementation (especially when you used stacked variants in your
candidates), but it will still be deterministic.

* replace `localeCompare` comparisons

Use cheaper comparisons than `localeCompare` when comparing 2 strings.
We currently don't care if it is 100% correctly sorted, but we just want
consistent sorting. This is currently faster compared to
`localeCompare`.

Another benefit is that `localeCompare` could result in
non-deterministic results if the CSS was generated on 2 separate
computers where the `locale` is different.

We could solve that by adding a dedicated locale, but it would still be
slower compared to this.

* track invalid candidates

When an incoming raw candidates doesn't produce any output, then we can
mark it as an invalid candidate. This will allow us to reduce the amount
of candidates to handle in incremental rebuilds.

* add initial incremental rebuild implementation

This includes a number of steps:

1. Track the `@tailwind utilities` rule, so that we can adjust its nodes
   later without re-parsing the full incoming CSS.
2. Add the new incoming raw candidates to the existing set of
   candidates.
3. Parse the merged set to `compileCandidates` (this can accept any
   `Iterable<string>`, which means `string[]`, `Set<string>`, ...)
4. Get the new AST nodes, update the `@tailwind utilities` rule's nodes
   and re-print the AST to CSS.

* improvement 1: ignore known invalid candidates

This will reduce the amount of candidates to handle. They would
eventually be skipped anyway, but now we don't even have to re-parse
(and hit a cache) at all.

* improvement 2: skip work, when generated AST is the same

Currently incremental rebuilds are additive, which means that we are not
keeping track if we should remove CSS again in development.

We can exploit this information, because now we can quickly check the
amoutn of generated AST nodes.

- If they are the same then nothing new is generated — this means that
  we can re-use the previous compiled CSS. We don't even have to
  re-print the AST because we already did do that work in the past.
- If there are more AST nodes, something new is generated — this means
  that we should update the `@tailwind utilities` rule and re-print the
  CSS. We can store the result for future incremental rebuilds.

* improvement 3: skip work if no new candidates are detected

- We already know a set of candidates from previous runs.
- We also already know a set of candidates that are invalid and don't
  produce anything.

This means that an incremental rebuild could give us a new set of
candidates that either already exist or are invalid.

If nothing changes, then we can re-use the compiled CSS.

This actually happens more often than you think, and the bigger your
project is the better this optimization will be.

For example:

```
// Imagine file A exists:
<div class="flex items-center justify-center"></div>
<button class="text-red-500">Delete</button>
```

```
// Now you add a second file B:
<div class="text-red-500 flex"></div>
```

You just created a brand new file with a bunch of HTML elements and
classes, yet all of the candidates in file B already exist in file A, so
nothing changes to the actual generated CSS.

Now imagine the other hundreds of files that already contain hundreds of
classes.

The beauty of this optimization is two-fold:

- On small projects, compiling is very fast even without this check.
  This means it is performant.
- On bigger projects, we will be able to re-use existing candidates.
  This means it stays performant.

* remove `getAstNodeSize`

We can move this up the tree and move it to the `rebuild` function
instead.

* remove invalid candidate tracking from `DesignSystem`

This isn't used anywhere but only in the `rebuild` of the compile step.
This allows us to remove it entirely from core logic, and move it up the
chain where it is needed.

* replace `throwOnInvalidCandidate` with `onInvalidCanidate`

This was only needed for working with `@apply`, now this logic _only_
exists in the code path where we are handling `@apply`.

* update `compile` API signature

* update callsite of `compile()` function

* fix typo
2024-03-11 14:24:49 -04:00
Adam Wathan
78d1c50f1c
Reset borders, padding, and margin universally (#13189)
* Reset borders, padding, and margin universally

Noticed iframes have a default border we weren't resetting, feels safest to just remove borders across the board and reintroduce them for form controls.

We were also resetting padding on an element by element basis but I can't think of any elements we are actually trying to avoid resetting padding on, so just reset it everywhere.

This also removes the left margin on file buttons that separates the button from the meta data about the currently selected file but I think this is fine, let the user decide how much space to put there intentionally like we do with other things.

* Include ::first-letter

Supports margin/padding/border (but not box-sizing) so should be in reset list.

* Update changelog

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-11 14:17:19 -04:00
Adam Wathan
d863de7abf
Prevent content-none from being overridden when conditionally styling ::before/::after (#13187)
* Prevent content-none from being overridden when conditionally styling before/after

* Update changelog

* Fix changelog entry

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-11 14:09:50 -04:00
Adam Wathan
8309b47266
Remove static radius values from theme (#13186)
* Remove static radius values from theme

* Update snapshots

* Update changelog

* Use static utilities + a big loop

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
2024-03-11 14:02:18 -04:00
Robin Malfait
b7dd979735
when using { optimize: true }, also minify the CSS (#13201)
If you don't want to minify, but you do want to optimize, then you can
use `{ optimize: { minify: false} }` instead.
2024-03-11 18:29:21 +01:00
Kris Braun
8123fa513a
Vite plugin: stop checking CSS files that no longer exist (#13197)
* Vite plugin: stop checking CSS files that no longer exist

Fix a potential memory leak in the Vite plugin. If CSS files are created that include `@tailwind` and later deleted, remove them from the list of files checked.

Thanks to @timneutkens for highlighting this issue.

* Vite plugin: don't log when files are removed
2024-03-11 13:24:01 -04:00
Adam Wathan
5c5037d9b5
Ensure scale utilities support percentages (#13182)
* Ensure scale utilities support percentages

* Update changelog

* Fix changelog entry

---------

Co-authored-by: Adam Wathan <4323180+adamwathan@users.noreply.github.com>
Co-authored-by: wongjn <11310624+wongjn@users.noreply.github.com>
2024-03-11 13:14:10 -04:00
Robin Malfait
388d1b0298
add "access": "public" to publishConfig (#13164) 2024-03-08 22:04:05 +01:00
Robin Malfait
d68a4af58e
Prepare next 4.0.0-alpha.7 release (#13163)
* bump versions to `4.0.0-alpha.7`

* update changelog
2024-03-08 21:46:03 +01:00
Adam Wathan
4c598d002a Tweak changelog entries 2024-03-08 15:38:03 -05:00