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 paths | 0 |
|---|---|
| Removed exports | 0 |
| Changed signatures | 35 |
| Removed class or interface members | 0 |
| Changed class or interface members | 12 |
| Newly deprecated | 0 |
| Requirement changes (engines, peer dependencies) | 2 |
| New exports | 32 |
Removed exports
None detected.
Changed signatures
| export | Before | After |
|---|---|---|
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 · TVProps | EV 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 · CnReturn | string | undefined | string |
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 · TVVariants | EV 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 · TVVariantKeys | V extends undefined ? undefined : (keyof V)[] | [V] extends [undefined] ? undefined : Extract<keyof V, string>[] |
tailwind-variants · defaultConfig | TWMConfig | TVConfig |
tailwind-variants · StringToBoolean | T extends "true" | "false" ? boolean : T | T 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 · TVProps | EV 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 · CnReturn | string | undefined | string |
tailwind-variants/lite · createTV | (): TVLite | (config?: TVLiteConfig | undefined): TVLite |
tailwind-variants/lite · TVVariants | EV 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 · TVVariantKeys | V extends undefined ? undefined : (keyof V)[] | [V] extends [undefined] ? undefined : Extract<keyof V, string>[] |
tailwind-variants/lite · StringToBoolean | T extends "true" | "false" ? boolean : T | T 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
| member | Before | After |
|---|---|---|
TVReturnType.variants | TVMergedVariants<V, EV> | MergeVariantMaps<V, EV> |
TVReturnType.variantKeys | TVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>> | TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>> |
TVReturnType.compoundSlots | TVCompoundSlots<V, S, B> | TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV> |
TVReturnProps.variants | TVMergedVariants<V, EV> | MergeVariantMaps<V, EV> |
TVReturnProps.variantKeys | TVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>> | TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>> |
TVReturnProps.compoundSlots | TVCompoundSlots<V, S, B> | TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV> |
TVReturnType.variants | TVMergedVariants<V, EV> | MergeVariantMaps<V, EV> |
TVReturnType.variantKeys | TVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>> | TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>> |
TVReturnType.compoundSlots | TVCompoundSlots<V, S, B> | TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV> |
TVReturnProps.variants | TVMergedVariants<V, EV> | MergeVariantMaps<V, EV> |
TVReturnProps.variantKeys | TVVariantKeys<TVMergedVariants<V, EV>, TVMergedSlots<S, ES>> | TVVariantKeys<MergeVariantMaps<V, EV>, TVMergedSlots<S, ES>> |
TVReturnProps.compoundSlots | TVCompoundSlots<V, S, B> | TVCompoundSlots<V, TVMergedSlots<S, ES>, B, EV> |
Newly deprecated
None detected.
Requirement changes (engines, peer dependencies)
| Before | After | |
|---|---|---|
peerDependencies.tailwindcss | * | — |
peerDependencies.tailwind-merge | >=3.0.0 | — |
New exports (32)
| import | export | kind |
|---|---|---|
tailwind-variants | clsx | variable |
tailwind-variants | twJoin | variable |
tailwind-variants | default | variable |
tailwind-variants | twMerge | variable |
tailwind-variants | TVExtend | type |
tailwind-variants | TVFactory | type |
tailwind-variants | TwMergeFn | type |
tailwind-variants | ClassArray | type |
tailwind-variants | CnFunction | type |
tailwind-variants | TVExtendList | type |
tailwind-variants | TVLiteConfig | type |
tailwind-variants | TVExtendInput | type |
tailwind-variants | ClassNameArray | type |
tailwind-variants | ClassNameValue | type |
tailwind-variants | TVCustomConfig | type |
tailwind-variants | ClassDictionary | interface |
tailwind-variants | TWMCustomConfig | type |
tailwind-variants | TVCompoundVariant | type |
tailwind-variants/lite | clsx | variable |
tailwind-variants/lite | default | variable |
tailwind-variants/lite | TVConfig | type |
tailwind-variants/lite | TVExtend | type |
tailwind-variants/lite | createCN | variable |
tailwind-variants/lite | TVFactory | type |
tailwind-variants/lite | TWMConfig | type |
tailwind-variants/lite | TwMergeFn | type |
tailwind-variants/lite | TVExtendList | type |
tailwind-variants/lite | TVLiteConfig | type |
tailwind-variants/lite | TVExtendInput | type |
tailwind-variants/lite | TWMergeConfig | type |
tailwind-variants/lite | TVCompoundVariant | type |
tailwind-variants/utils | normalizeClassString | variable |
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