diff --git a/packages/tailwindcss-react-aria-components/src/index.js b/packages/tailwindcss-react-aria-components/src/index.js index 464bd9f58b7..742379cc544 100644 --- a/packages/tailwindcss-react-aria-components/src/index.js +++ b/packages/tailwindcss-react-aria-components/src/index.js @@ -70,26 +70,34 @@ let getSelector = (prefix, attributeName, attributeValue) => { } }; +let mapSelector = (selector, fn) => { + if (Array.isArray(selector)) { + return selector.map(fn); + } else { + return fn(selector); + } +}; + module.exports = plugin.withOptions((options) => (({addVariant}) => { let prefix = options?.prefix ? `${options.prefix}-` : ''; attributes.boolean.forEach((attribute) => { let variantName = Array.isArray(attribute) ? attribute[0] : attribute; variantName = `${prefix}${variantName}`; let attributeName = Array.isArray(attribute) ? attribute[1] : attribute; - let selector = getSelector(prefix, attributeName); - addVariant(variantName, selector); - addVariant(`group-${variantName}`, `:merge(.group)${selector.slice(1)} &`); - addVariant(`peer-${variantName}`, `:merge(.peer)${selector.slice(1)} ~ &`); + let selectors = getSelector(prefix, attributeName); + addVariant(variantName, selectors); + addVariant(`group-${variantName}`, mapSelector(selectors, selector => `:merge(.group)${selector.slice(1)} &`)); + addVariant(`peer-${variantName}`, mapSelector(selectors, selector => `:merge(.peer)${selector.slice(1)} ~ &`)); }); Object.keys(attributes.enum).forEach((attributeName) => { attributes.enum[attributeName].forEach( (attributeValue) => { let name = shortNames[attributeName] || attributeName; let variantName = `${prefix}${name}-${attributeValue}`; - let selector = getSelector(prefix, attributeName, attributeValue); - addVariant(variantName, selector); - addVariant(`group-${variantName}`, `:merge(.group)${selector.slice(1)} &`); - addVariant(`peer-${variantName}`, `:merge(.peer)${selector.slice(1)} ~ &`); + let selectors = getSelector(prefix, attributeName, attributeValue); + addVariant(variantName, selectors); + addVariant(`group-${variantName}`, mapSelector(selectors, selector => `:merge(.group)${selector.slice(1)} &`)); + addVariant(`peer-${variantName}`, mapSelector(selectors, selector => `:merge(.peer)${selector.slice(1)} ~ &`)); } ); }); diff --git a/packages/tailwindcss-react-aria-components/src/index.test.js b/packages/tailwindcss-react-aria-components/src/index.test.js index c7474c6cc3d..84602f316ee 100644 --- a/packages/tailwindcss-react-aria-components/src/index.test.js +++ b/packages/tailwindcss-react-aria-components/src/index.test.js @@ -23,7 +23,7 @@ function run({options, content}) { } test('variants', async () => { - let content = html`
`; + let content = html``; return run({content}).then((result) => { expect(result.css).toContain(css` .hover\:bg-red:where([data-rac])[data-hovered] { @@ -34,6 +34,14 @@ test('variants', async () => { --tw-bg-opacity: 1; background-color: rgb(255 0 0 / var(--tw-bg-opacity)) } +.group:where([data-rac])[data-hovered] .group-hover\:bg-red { + --tw-bg-opacity: 1; + background-color: rgb(255 0 0 / var(--tw-bg-opacity)) +} +.group:where(:not([data-rac])):hover .group-hover\:bg-red { + --tw-bg-opacity: 1; + background-color: rgb(255 0 0 / var(--tw-bg-opacity)) +} .focus\:bg-red:where([data-rac])[data-focused] { --tw-bg-opacity: 1; background-color: rgb(255 0 0 / var(--tw-bg-opacity))