Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeScript Variants Type Information Lost When Extending #185

Open
ryanelian opened this issue Apr 22, 2024 · 8 comments
Open

TypeScript Variants Type Information Lost When Extending #185

ryanelian opened this issue Apr 22, 2024 · 8 comments
Labels
bug Something isn't working

Comments

@ryanelian
Copy link

ryanelian commented Apr 22, 2024

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 ryanelian added the bug Something isn't working label Apr 22, 2024
@mskelton
Copy link
Collaborator

@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.

@Razinsky
Copy link

Razinsky commented May 9, 2024

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

@w0ofy
Copy link
Contributor

w0ofy commented May 13, 2024

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

will be watching this thread

@ian-os
Copy link

ian-os commented Jul 15, 2024

Any advice on an interim solution?

@blowsie
Copy link

blowsie commented Jul 15, 2024

Any advice on an interim solution?

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

@gregoryporebski
Copy link

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

image

@gregoryporebski
Copy link

@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

@dvzrd
Copy link

dvzrd commented Nov 16, 2024

@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 you like some help with this? I'm willing to contribute some time to spike on some more backwards compatible solutions, but I'd like to sync up first to understand the full scope of this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

8 participants