tailwind-variants icon indicating copy to clipboard operation
tailwind-variants copied to clipboard

TypeScript Variants Type Information Lost When Extending

Open ryanelian opened this issue 10 months ago • 7 comments

Describe the bug

variants declared in a variant is not carried over to subsequent variants when extended.

Before I get chastised for doing this, I want to let everyone know that the reason I'm doing this is because Tailwind VS Code Intellisense breaks down and stop working when your variant gets too big, and I don't know how to fix it.

To Reproduce

Steps to reproduce the behavior:

import { VariantProps, tv } from 'tailwind-variants';

export const buttonBaseVariants = tv({
  base: '',
  variants: {
    mode: {
      contained: '',
      text: '',
    },
  },
});

export const buttonIntentVariants = tv({
  extend: buttonBaseVariants,
  variants: {
    intent: {
      primary: '',
      secondary: '',
      danger: '',
    },
  },
});

export const buttonVariants = tv({
  extend: buttonIntentVariants,
  variants: {
    size: {
      small: '',
      medium: '',
      large: '',
    },
  },
});

Expected behavior I expect the final function to contain the variants extended from the original and subsequent variants. Note below that mode is missing from the type information:

Screenshots

image

Additional context

Using Visual Studio Code with TypeScript 5.4.5 in the project package.json

Version: 1.88.1 (Universal)
Commit: e170252f762678dec6ca2cc69aba1570769a5d39
Date: 2024-04-10T17:42:52.765Z
Electron: 28.2.8
ElectronBuildId: 27744544
Chromium: 120.0.6099.291
Node.js: 18.18.2
V8: 12.0.267.19-electron.0
OS: Darwin arm64 23.4.0

ryanelian avatar Apr 22 '24 17:04 ryanelian

@ryanelian This is a known issue that I'm still trying to decide how to solve. There is a way I know fixes it, but sadly that's a breaking change to how extending works, so I'm not yet sure if that's the route I want to go, but we'll see.

mskelton avatar Apr 26 '24 01:04 mskelton

We have the same issue. Multiple levels of inheritance seem like a pretty important use case; our case is also for buttons.

Razinsky avatar May 09 '24 17:05 Razinsky

I too have this same issue. Would be great to get >1 level of inheritance for extended components.

will be watching this thread

w0ofy avatar May 13 '24 01:05 w0ofy

Any advice on an interim solution?

ian-os avatar Jul 15 '24 12:07 ian-os

Any advice on an interim solution?

My only advice here would be to extend plain objects before finally passing to tv

blowsie avatar Jul 15 '24 13:07 blowsie

We had a similar issue with extending, and one way of patching it for now was spread

image

gregoryporebski avatar Aug 09 '24 17:08 gregoryporebski

@ryanelian This is a known issue that I'm still trying to decide how to solve. There is a way I know fixes it, but sadly that's a breaking change to how extending works, so I'm not yet sure if that's the route I want to go, but we'll see.

Would be nice to have an option to pass a custom extend function, similar to how you can pass a custom twMergeConfig into createTV

gregoryporebski avatar Aug 09 '24 17:08 gregoryporebski