From 80f9578bfad25e6b3e1ddf20f517998c35ff8fff Mon Sep 17 00:00:00 2001
From: Justin Wong <11310624+wongjn@users.noreply.github.com>
Date: Thu, 3 Apr 2025 10:15:30 +0100
Subject: [PATCH] Fix multi-value arbitrary inset shadow (#17523)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #17520
Fixes multi-value inset shadows to apply the `inset` prefix to each
component instead of only the first.
Feel free to make the code nicer 😄
## Test plan
Ensure that a multi-value inset shadow now applies each shadow _inset_:
---------
Co-authored-by: Philipp Spiess
---
CHANGELOG.md | 1 +
packages/tailwindcss/src/utilities.test.ts | 19 +++++++++++++++++++
packages/tailwindcss/src/utilities.ts | 13 ++++++++++---
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e64c196b2..7ba96dab5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Don't rely on `@layer base` for the `@property` polyfills ([#17506](https://github.com/tailwindlabs/tailwindcss/pull/17506))
+- Fix multi-value inset shadow ([#17523](https://github.com/tailwindlabs/tailwindcss/pull/17523))
## [4.1.1] - 2025-04-02
diff --git a/packages/tailwindcss/src/utilities.test.ts b/packages/tailwindcss/src/utilities.test.ts
index be5becf61..fd75f6a94 100644
--- a/packages/tailwindcss/src/utilities.test.ts
+++ b/packages/tailwindcss/src/utilities.test.ts
@@ -23263,11 +23263,13 @@ test('inset-shadow', async () => {
'inset-shadow-[10px_10px]',
'inset-shadow-[var(--value)]',
'inset-shadow-[shadow:var(--value)]',
+ 'inset-shadow-[12px_12px_#0088cc,12px_12px_var(--value,#0088cc)]',
'inset-shadow-sm/25',
'inset-shadow-[12px_12px_#0088cc]/25',
'inset-shadow-[12px_12px_var(--value)]/25',
'inset-shadow-[10px_10px]/25',
+ 'inset-shadow-[12px_12px_#0088cc,12px_12px_var(--value,#0088cc)]/25',
// Colors
'inset-shadow-red-500',
@@ -23319,6 +23321,18 @@ test('inset-shadow', async () => {
--color-red-500: #ef4444;
}
+ .inset-shadow-\\[12px_12px_\\#0088cc\\,12px_12px_var\\(--value\\,\\#0088cc\\)\\]\\/25 {
+ --tw-inset-shadow-alpha: 25%;
+ --tw-inset-shadow: inset 12px 12px var(--tw-inset-shadow-color, #08c), inset 12px 12px var(--tw-inset-shadow-color, var(--value, #08c));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ @supports (color: lab(from red l a b)) {
+ .inset-shadow-\\[12px_12px_\\#0088cc\\,12px_12px_var\\(--value\\,\\#0088cc\\)\\]\\/25 {
+ --tw-inset-shadow: inset 12px 12px var(--tw-inset-shadow-color, oklab(59.9824% -.067 -.124 / .25)), inset 12px 12px var(--tw-inset-shadow-color, oklab(from var(--value, #08c) l a b / 25%));
+ }
+ }
+
.inset-shadow-\\[12px_12px_var\\(--value\\)\\]\\/25 {
--tw-inset-shadow-alpha: 25%;
--tw-inset-shadow: inset 12px 12px var(--tw-inset-shadow-color, var(--value));
@@ -23359,6 +23373,11 @@ test('inset-shadow', async () => {
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
}
+ .inset-shadow-\\[12px_12px_\\#0088cc\\,12px_12px_var\\(--value\\,\\#0088cc\\)\\] {
+ --tw-inset-shadow: inset 12px 12px var(--tw-inset-shadow-color, #08c), inset 12px 12px var(--tw-inset-shadow-color, var(--value, #08c));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
.inset-shadow-\\[12px_12px_\\#0088cc\\] {
--tw-inset-shadow: inset 12px 12px var(--tw-inset-shadow-color, #08c);
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
diff --git a/packages/tailwindcss/src/utilities.ts b/packages/tailwindcss/src/utilities.ts
index a4359c53a..88f9a1fbc 100644
--- a/packages/tailwindcss/src/utilities.ts
+++ b/packages/tailwindcss/src/utilities.ts
@@ -6183,13 +6183,20 @@ function alphaReplacedShadowProperties(
return varInjector(replaceAlpha(color, alpha))
})
+ function applyPrefix(x: string) {
+ if (!prefix) return x
+ return segment(x, ',')
+ .map((value) => prefix + value)
+ .join(',')
+ }
+
if (requiresFallback) {
return [
- decl(property, prefix + replaceShadowColors(value, varInjector)),
- rule('@supports (color: lab(from red l a b))', [decl(property, prefix + replacedValue)]),
+ decl(property, applyPrefix(replaceShadowColors(value, varInjector))),
+ rule('@supports (color: lab(from red l a b))', [decl(property, applyPrefix(replacedValue))]),
]
} else {
- return [decl(property, prefix + replacedValue)]
+ return [decl(property, applyPrefix(replacedValue))]
}
}