Skip to content

Commit d6b11b3

Browse files
authored
Group variant stacking (#4551)
* make group variant stacking work * simplify stacking group variants
1 parent a3db3a4 commit d6b11b3

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

src/jit/corePlugins.js

+23-2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export default {
156156
)
157157
}
158158

159+
let baseGroupSelector = prefixSelector(config('prefix'), '.group')
159160
for (let variant of pseudoVariants) {
160161
let [variantName, state] = Array.isArray(variant) ? variant : [variant, variant]
161162
let groupVariantName = `group-${variantName}`
@@ -164,16 +165,36 @@ export default {
164165
groupVariantName,
165166
transformAllSelectors((selector) => {
166167
let variantSelector = updateAllClasses(selector, (className) => {
168+
if (`.${className}` === baseGroupSelector) return className
167169
return `${groupVariantName}${config('separator')}${className}`
168170
})
169171

170172
if (variantSelector === selector) {
171173
return null
172174
}
173175

174-
let groupSelector = prefixSelector(config('prefix'), `.group:${state}`)
176+
let states = [state]
175177

176-
return `${groupSelector} ${variantSelector}`
178+
// Stack group variants
179+
let baseGroupIdx = variantSelector.indexOf(baseGroupSelector + ':')
180+
if (baseGroupIdx !== -1) {
181+
let groupClassName = variantSelector.slice(
182+
baseGroupIdx,
183+
variantSelector.indexOf(' ', baseGroupIdx)
184+
)
185+
186+
// Pick all the states
187+
states = states.concat(
188+
variantSelector
189+
.slice(baseGroupIdx + baseGroupSelector.length + 1, groupClassName.length)
190+
.split(':')
191+
)
192+
193+
// Remove the base `.group:...`
194+
variantSelector = variantSelector.replace(groupClassName, '')
195+
}
196+
197+
return `${[baseGroupSelector, ...states].join(':')} ${variantSelector}`
177198
})
178199
)
179200
}

tests/jit/variants.test.css

+21
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,11 @@
347347
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
348348
var(--tw-shadow);
349349
}
350+
.group:focus:hover .group-focus\:group-hover\:shadow-md {
351+
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
352+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
353+
var(--tw-shadow);
354+
}
350355
.group:focus-visible .group-focus-visible\:shadow-md {
351356
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
352357
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
@@ -362,6 +367,17 @@
362367
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
363368
var(--tw-shadow);
364369
}
370+
.group:disabled:focus:hover .group-disabled\:group-focus\:group-hover\:shadow-md {
371+
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
372+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
373+
var(--tw-shadow);
374+
}
375+
.group:disabled:focus:hover
376+
.group-disabled\:group-focus\:group-hover\:first\:shadow-md:first-child {
377+
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
378+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
379+
var(--tw-shadow);
380+
}
365381
[dir='ltr'] .ltr\:shadow-md {
366382
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
367383
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
@@ -391,6 +407,11 @@
391407
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
392408
var(--tw-shadow);
393409
}
410+
.dark .group:disabled:focus:hover .dark\:group-disabled\:group-focus\:group-hover\:shadow-md {
411+
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
412+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
413+
var(--tw-shadow);
414+
}
394415
@media (min-width: 640px) {
395416
.sm\:shadow-md {
396417
--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);

tests/jit/variants.test.html

+6
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,11 @@
103103
<div class="lg:dark:shadow-md"></div>
104104
<div class="xl:dark:disabledshadow-md"></div>
105105
<div class="2xl:dark:motion-safe:focus-within:shadow-md"></div>
106+
107+
<!-- Stacked group variants -->
108+
<div class="group-focus:group-hover:shadow-md"></div>
109+
<div class="group-disabled:group-focus:group-hover:shadow-md"></div>
110+
<div class="dark:group-disabled:group-focus:group-hover:shadow-md"></div>
111+
<div class="group-disabled:group-focus:group-hover:first:shadow-md"></div>
106112
</body>
107113
</html>

0 commit comments

Comments
 (0)