Add peer-* variants - #4556
Conversation
146e9ea to
1070df8
Compare
|
Will a peer grouping work as well? Sometimes a child element needs to know that a parent was selected by a sibling combinator. I have a couple of scrappy plugins I used for this already, see https://play.tailwindcss.com/BvQpg9QWEe |
|
@inopinatus No easy way to do that with just this + the existing group API but it's something we could explore as an improvement down the road for sure, either by finding ways to make this stuff composable or just adding a dedicated new variant type, maybe something like: <input class="peer" type="checkbox">
<div class="group">
<span class="group-peer-checked:bg-blue-500 ...">
<!-- ... -->
</span>
</div> |
|
I would be interested in having a new variant type |
|
@adamwathan @seb-jean: This can be solved with a custom plugin: tailwind.config.js const plugin = require("tailwindcss/plugin");
/**
* @type {import('tailwindcss').Config}
*/
module.exports = {
....
plugins: [
plugin(function groupPeer({ addVariant }) {
let pseudoVariants = [
//... Any other pseudo variants you want to support. See https://github.com/tailwindlabs/tailwindcss/blob/6729524185b48c9e25af62fc2372911d66e7d1f0/src/corePlugins.js#L78
"checked",
].map((variant) =>
Array.isArray(variant) ? variant : [variant, `&:${variant}`],
);
for (let [variantName, state] of pseudoVariants) {
addVariant(`group-peer-${variantName}`, (ctx) => {
let result = typeof state === "function" ? state(ctx) : state;
return result.replace(/&(\S+)/, ":merge(.peer)$1 ~ .group &");
});
}
}),
],
};Implementation: <div>
<input class="peer" type="radio" />
<label class="group">
<span class="group-peer-checked:hidden">☐</span>
<span class="hidden group-peer-checked:block">☑</span>
Some label
</label>
</div> |
|
@adamwathan @seb-jean @wolthers I used some black magic🤣 OR |
then how we can achive that |
This PR adds new
peer-*variants to the JIT engine that behave much like thegroup-*variants, but target sibling elements instead of parent elements.This is useful for things like targeting siblings when a checkbox is checked, doing things like floating labels, etc.
This generates CSS like this:
So you can only do it based on previous siblings, which you are probably already used to because of how CSS works.