Vigia

Upgrading tailwind-variants from 3.x to 4.x

Comparison of the public API of tailwind-variants 3.3.1 and 4.0.0, computed automatically from their TypeScript types. A changed signature is a candidate for a breaking change, not a certainty.

Summary

Removed import paths0
Removed exports0
Changed signatures35
Removed class or interface members0
Changed class or interface members12
Newly deprecated0
Requirement changes (engines, peer dependencies)2
New exports32

Removed exports

None detected.

Changed signatures

exportBeforeAfter
tailwind-variants · TV<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…interface
tailwind-variants · cn<T extends CnOptions>(...classnames: T): CnReturn(...inputs: ClassValue[]): string
tailwind-variants · cx<T extends CnOptions>(...classnames: T): CnReturn<T extends CnOptions>(...classnames: T): string
tailwind-variants · tv<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…<V extends TVVariantsConstraint = {}, DV = {}, CV extends readonly object[] = [], B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> | TVExtendList | undefined = undefined, EV extends TVVariantsShape = VariantsOfExtend<E>, ES extends TVSlots = SlotsOfExtend<E>>(options: TVOptionsFields<V, DV, CV, B, S, EV, ES> & { extend?: E | undefined; compoundSlots?: TVCompoundSlots<NoInfer<V>, TVMergedSlots<NoInfer<S>, NoInfer<SlotsOfExtend<E>>>, NoInfer<B>, NoInfer<EV>> | undefined; }, config?: TVConfig | undefined): TVReturnType<V, S, B, EV, ES, E>
tailwind-variants · TVLite<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…interface
tailwind-variants · TVPropsEV extends undefined ? V extends undefined ? ClassProp<ClassNameValue> : { [K in keyof V]?: VariantValue<V, K> | undefined; } & ClassProp<ClassNameValue> : V extends undefined ? { [K in keyof EV]?: VariantValue<EV, K> | undefined; } & ClassProp<ClassNameValue> : { [K in keyof V | keyof EV]?: VariantValue<V, K> | VariantValue<EV, K> | undefined; } & ClassProp<ClassNameValue>[TVResolvedVariants<V, EV>] extends [undefined] ? ClassProp<ClassNameValue> : { [K in keyof ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: ClassNameValue; className?: undefined; })]: ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: ClassNameValue; className?: undefined; })[K]; } | { [K in keyof ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: undefined; className?: ClassNam…
tailwind-variants · cnMerge<T extends CnOptions>(...classnames: T): (config?: TWMConfig | undefined) => CnReturn<T extends CnOptions>(...classnames: T): (config?: TWMConfig | undefined) => string
tailwind-variants · CnReturnstring | undefinedstring
tailwind-variants · TVConfig{ twMerge?: boolean | undefined; twMergeConfig?: TWMergeConfig | undefined; }TWMConfig & { debug?: boolean | undefined; }
tailwind-variants · createTV(config: TWMConfig): TV(config: TVConfig): TV<TVConfig>
tailwind-variants · TWMConfig{ twMerge?: boolean | undefined; twMergeConfig?: TWMergeConfig | undefined; }{ twMerge?: boolean | TwMergeFn | undefined; }
tailwind-variants · TVVariantsEV extends undefined ? TVVariantsDefault<S, B> : TVVariantsDefault<S, B> | { [K in keyof EV]: { [K2 in keyof EV[K]]: S extends TVSlots ? ClassNameValue | SlotsClassValue<S, B> : ClassNameValue; }; }{ [x: string]: Record<string, VariantClassValue<TVMergedSlots<S, ES>, B>>; }
tailwind-variants · TVVariantKeysV extends undefined ? undefined : (keyof V)[][V] extends [undefined] ? undefined : Extract<keyof V, string>[]
tailwind-variants · defaultConfigTWMConfigTVConfig
tailwind-variants · StringToBooleanT extends "true" | "false" ? boolean : TT extends boolean | "true" | "false" ? boolean : T
tailwind-variants · TVCompoundSlots({ slots: TVSlotsWithBase<S, B>[]; } & ({ [K in keyof V]?: VariantValueWithBooleanUndefined<V, K> | VariantValueWithBooleanUndefined<V, K>[] | undefined; } & ClassProp<ClassNameValue>))[]({ slots: TVSlotsWithBase<S, B>[]; } & ({ [K in Exclude<keyof TVResolvedVariants<V, EV> & string, "slots" | "class" | "className">]?: VariantValueWithBooleanUndefined<TVResolvedVariants<V, EV>, K> | VariantValueWithBooleanUndefined<TVResolvedVariants<V, EV>, K>[] | undefined; } & ClassProp<ClassNameValue>))[]
tailwind-variants · TVDefaultVariants{ [K in keyof V | keyof EV]?: VariantValue<V, K> | VariantValue<EV, K> | undefined; }[TVResolvedVariants<V, EV>] extends [undefined] ? {} : { [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; }
tailwind-variants · TVCompoundVariants({ [K in keyof V | keyof EV]?: VariantValueWithBooleanUndefined<V, K> | VariantValueWithBooleanUndefined<EV, K> | (K extends keyof V ? VariantValueWithBooleanUndefined<V, K>[] : never) | undefined; } & ClassProp<ClassNameValue | SlotsClassValue<S, B>>)[]TVCompoundVariant<V, S, B, EV, ES>[]
tailwind-variants · TVScreenPropsValue{ initial?: StringToBoolean<keyof V[K]> | undefined; }{ initial?: StringToBoolean<keyof V[K] & string> | undefined; }
tailwind-variants/lite · TV<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…interface
tailwind-variants/lite · cn<T extends CnOptions>(...classnames: T): (config?: any) => CnReturn<T extends CnOptions>(...classnames: T): (config?: TVLiteConfig | undefined) => string
tailwind-variants/lite · cx<T extends CnOptions>(...classnames: T): CnReturn<T extends CnOptions>(...classnames: T): string
tailwind-variants/lite · tv<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…<V extends TVVariantsConstraint = {}, DV = {}, CV extends readonly object[] = [], B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> | TVExtendList | undefined = undefined, EV extends TVVariantsShape = VariantsOfExtend<E>, ES extends TVSlots = SlotsOfExtend<E>>(options: TVOptionsFields<V, DV, CV, B, S, EV, ES> & { extend?: E | undefined; compoundSlots?: TVCompoundSlots<NoInfer<V>, TVMergedSlots<NoInfer<S>, NoInfer<SlotsOfExtend<E>>>, NoInfer<B>, NoInfer<EV>> | undefined; }, config?: TVLiteConfig | undefined): TVReturnType<V, S, B, EV, ES, …
tailwind-variants/lite · TVLite<V extends TVVariants<S, B, EV>, CV extends TVCompoundVariants<V, S, B, EV, ES>, DV extends TVDefaultVariants<V, S, EV, ES>, B extends ClassNameValue = undefined, S extends TVSlots = undefined, E extends TVReturnTypeLike<any, any> = TVReturnTypeLike<V, S>, EV extends TVVariants<ES, B, E["variants"], ES> = E["variants"], ES extends TVSlots = E["slots"] extends TVSlots ? E["slots"] : undefined>(options: { extend?: E | undefined; base?: B | undefined; slots?: S | undefined; variants?: V | undefined; compoundVariants?: CV | undefined; compoundSlots?: TVCompoundSlots<V, S, B> | undefined; defaultVa…interface
tailwind-variants/lite · TVPropsEV extends undefined ? V extends undefined ? ClassProp<ClassNameValue> : { [K in keyof V]?: VariantValue<V, K> | undefined; } & ClassProp<ClassNameValue> : V extends undefined ? { [K in keyof EV]?: VariantValue<EV, K> | undefined; } & ClassProp<ClassNameValue> : { [K in keyof V | keyof EV]?: VariantValue<V, K> | VariantValue<EV, K> | undefined; } & ClassProp<ClassNameValue>[TVResolvedVariants<V, EV>] extends [undefined] ? ClassProp<ClassNameValue> : { [K in keyof ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: ClassNameValue; className?: undefined; })]: ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: ClassNameValue; className?: undefined; })[K]; } | { [K in keyof ({ [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; } & { class?: undefined; className?: ClassNam…
tailwind-variants/lite · CnReturnstring | undefinedstring
tailwind-variants/lite · createTV(): TVLite(config?: TVLiteConfig | undefined): TVLite
tailwind-variants/lite · TVVariantsEV extends undefined ? TVVariantsDefault<S, B> : TVVariantsDefault<S, B> | { [K in keyof EV]: { [K2 in keyof EV[K]]: S extends TVSlots ? ClassNameValue | SlotsClassValue<S, B> : ClassNameValue; }; }{ [x: string]: Record<string, VariantClassValue<TVMergedSlots<S, ES>, B>>; }
tailwind-variants/lite · TVVariantKeysV extends undefined ? undefined : (keyof V)[][V] extends [undefined] ? undefined : Extract<keyof V, string>[]
tailwind-variants/lite · StringToBooleanT extends "true" | "false" ? boolean : TT extends boolean | "true" | "false" ? boolean : T
tailwind-variants/lite · TVCompoundSlots({ slots: TVSlotsWithBase<S, B>[]; } & ({ [K in keyof V]?: VariantValueWithBooleanUndefined<V, K> | VariantValueWithBooleanUndefined<V, K>[] | undefined; } & ClassProp<ClassNameValue>))[]({ slots: TVSlotsWithBase<S, B>[]; } & ({ [K in Exclude<keyof TVResolvedVariants<V, EV> & string, "slots" | "class" | "className">]?: VariantValueWithBooleanUndefined<TVResolvedVariants<V, EV>, K> | VariantValueWithBooleanUndefined<TVResolvedVariants<V, EV>, K>[] | undefined; } & ClassProp<ClassNameValue>))[]
tailwind-variants/lite · TVDefaultVariants{ [K in keyof V | keyof EV]?: VariantValue<V, K> | VariantValue<EV, K> | undefined; }[TVResolvedVariants<V, EV>] extends [undefined] ? {} : { [K in keyof TVResolvedVariants<V, EV> & string]?: VariantValue<TVResolvedVariants<V, EV>, K> | undefined; }
tailwind-variants/lite · TVCompoundVariants({ [K in keyof V | keyof EV]?: VariantValueWithBooleanUndefined<V, K> | VariantValueWithBooleanUndefined<EV, K> | (K extends keyof V ? VariantValueWithBooleanUndefined<V, K>[] : never) | undefined; } & ClassProp<ClassNameValue | SlotsClassValue<S, B>>)[]TVCompoundVariant<V, S, B, EV, ES>[]
tailwind-variants/lite · TVScreenPropsValue{ initial?: StringToBoolean<keyof V[K]> | undefined; }{ initial?: StringToBoolean<keyof V[K] & string> | undefined; }
tailwind-variants/utils · cx<T extends CnOptions>(...classnames: T): CnReturn<T extends CnOptions>(...classnames: T): string

Removed class or interface members

None detected.

Changed class or interface members

memberBeforeAfter
TVReturnType.variantsTVMergedVariants<V, EV>MergeVariantMaps<V, EV>
TVReturnType.variantKeysTVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>>TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>>
TVReturnType.compoundSlotsTVCompoundSlots<V, S, B>TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV>
TVReturnProps.variantsTVMergedVariants<V, EV>MergeVariantMaps<V, EV>
TVReturnProps.variantKeysTVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>>TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>>
TVReturnProps.compoundSlotsTVCompoundSlots<V, S, B>TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV>
TVReturnType.variantsTVMergedVariants<V, EV>MergeVariantMaps<V, EV>
TVReturnType.variantKeysTVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>>TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>>
TVReturnType.compoundSlotsTVCompoundSlots<V, S, B>TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV>
TVReturnProps.variantsTVMergedVariants<V, EV>MergeVariantMaps<V, EV>
TVReturnProps.variantKeysTVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>>TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>>
TVReturnProps.compoundSlotsTVCompoundSlots<V, S, B>TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV>

Newly deprecated

None detected.

Requirement changes (engines, peer dependencies)

BeforeAfter
peerDependencies.tailwindcss*—
peerDependencies.tailwind-merge>=3.0.0—
New exports (32)
importexportkind
tailwind-variantsclsxvariable
tailwind-variantstwJoinvariable
tailwind-variantsdefaultvariable
tailwind-variantstwMergevariable
tailwind-variantsTVExtendtype
tailwind-variantsTVFactorytype
tailwind-variantsTwMergeFntype
tailwind-variantsClassArraytype
tailwind-variantsCnFunctiontype
tailwind-variantsTVExtendListtype
tailwind-variantsTVLiteConfigtype
tailwind-variantsTVExtendInputtype
tailwind-variantsClassNameArraytype
tailwind-variantsClassNameValuetype
tailwind-variantsTVCustomConfigtype
tailwind-variantsClassDictionaryinterface
tailwind-variantsTWMCustomConfigtype
tailwind-variantsTVCompoundVarianttype
tailwind-variants/liteclsxvariable
tailwind-variants/litedefaultvariable
tailwind-variants/liteTVConfigtype
tailwind-variants/liteTVExtendtype
tailwind-variants/litecreateCNvariable
tailwind-variants/liteTVFactorytype
tailwind-variants/liteTWMConfigtype
tailwind-variants/liteTwMergeFntype
tailwind-variants/liteTVExtendListtype
tailwind-variants/liteTVLiteConfigtype
tailwind-variants/liteTVExtendInputtype
tailwind-variants/liteTWMergeConfigtype
tailwind-variants/liteTVCompoundVarianttype
tailwind-variants/utilsnormalizeClassStringvariable

Give your AI agent these facts

Vigia is a free MCP server: your coding agent checks versions, breaking changes and vulnerabilities before it writes code. No signup, no API key.

claude mcp add --transport http vigia https://vigia.coredls.cloud/mcp

Add to CursorAdd to VS Code★ Star on GitHub

Any other MCP client
{ "mcpServers": { "vigia": { "url": "https://vigia.coredls.cloud/mcp" } } }

Agent skill (SKILL.md): tells the agent when to use Vigia · GitHub Action for pull requests

Frequently asked questions

What are the breaking changes when upgrading tailwind-variants from 3 to 4?

Between tailwind-variants 3.3.1 and 4.0.0, Vigia found 0 removed exports, 35 changed signatures and 12 removed or changed class or interface members.

What became deprecated in tailwind-variants 4?

0 exports or members are newly marked as deprecated in tailwind-variants 4.0.0.

For agents

GET https://vigia.coredls.cloud/v1/packages/npm/tailwind-variants/upgrade?from=3.3.1&to=4.0.0