From 8165e045641b94de151798cd36d12e6a9886a3f3 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 26 Aug 2025 10:25:35 -0400 Subject: [PATCH] Show suggestions for known `matchVariant` values (#18798) Given this variant: ```js matchVariant( "foo", (value) => `&:is([data-foo='${value}'])`, { values: { DEFAULT: "", bar: "bar", baz: "bar", }, } ) ``` We weren't listing `foo-bar` and `foo-baz` in IntelliSense. This PR fixes that. --- CHANGELOG.md | 1 + packages/tailwindcss/src/compat/plugin-api.ts | 4 ++ packages/tailwindcss/src/intellisense.test.ts | 37 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31913f416..d19e60de1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Don't transition `visibility` when using `transition` ([#18795](https://github.com/tailwindlabs/tailwindcss/pull/18795)) - Discard matched variants with unknown named values ([#18799](https://github.com/tailwindlabs/tailwindcss/pull/18799)) - Discard matched variants with non-string values ([#18799](https://github.com/tailwindlabs/tailwindcss/pull/18799)) +- Show suggestions for known `matchVariant` values ([#18798](https://github.com/tailwindlabs/tailwindcss/pull/18798)) ## [4.1.12] - 2025-08-13 diff --git a/packages/tailwindcss/src/compat/plugin-api.ts b/packages/tailwindcss/src/compat/plugin-api.ts index 321a245ee..c52693ef0 100644 --- a/packages/tailwindcss/src/compat/plugin-api.ts +++ b/packages/tailwindcss/src/compat/plugin-api.ts @@ -247,6 +247,10 @@ export function buildPluginApi({ return aValue < zValue ? -1 : 1 }, ) + + designSystem.variants.suggest(name, () => + Object.keys(options?.values ?? {}).filter((v) => v !== 'DEFAULT'), + ) }, addUtilities(utilities) { diff --git a/packages/tailwindcss/src/intellisense.test.ts b/packages/tailwindcss/src/intellisense.test.ts index f5902a261..f9aca65ce 100644 --- a/packages/tailwindcss/src/intellisense.test.ts +++ b/packages/tailwindcss/src/intellisense.test.ts @@ -675,3 +675,40 @@ test('Custom @utility and existing utility with names matching theme keys dont g expect(matches).toHaveLength(1) expect(classMap.get('text-header')?.modifiers).toEqual(['sm']) }) + +test('matchVariant', async () => { + let input = css` + @import 'tailwindcss/utilities'; + @plugin "./plugin.js"; + ` + + let design = await __unstable__loadDesignSystem(input, { + loadStylesheet: async (_, base) => ({ + path: '', + base, + content: '@tailwind utilities;', + }), + loadModule: async () => ({ + path: '', + base: '', + module: plugin(({ matchVariant }) => { + matchVariant('foo', (val) => `&:is(${val})`, { + values: { + DEFAULT: '1', + a: 'a', + b: 'b', + }, + }) + }), + }), + }) + + let variants = design.getVariants() + let v1 = variants.find((v) => v.name === 'foo')! + expect(v1).not.toBeUndefined() + + expect(v1.hasDash).toEqual(true) + expect(v1.isArbitrary).toEqual(true) + expect(v1.name).toEqual('foo') + expect(v1.values).toEqual(['a', 'b']) +})