Skip to main content

Introduction

Windstitch is a 1.4kB, Simple Styling Library that helps you set when a className should be applied to a component.

By providing Powerful Types through forward declarations, Windstitch aims to be simple yet powerful by limiting itself to be a organizer API, letting Tailwind handle the styling part.


Performance

🔥 Zero Runtime

Windstitch is purely a className joiner function attached to a component. You do not need to add any Provider, Context or anything at all. Just install it and start using.

Key Features

💫 Variants

Stitches introduces variants as a first-class citizen, so you can design composable component APIs. Windstitch drinks from that to use the variants pattern as the form of declaring your styles.

🎨 Theming

Theming is handled entirely by Tailwind. Nothing different here

Utils

Windstitch offers you 2 way of declaring variants. You can either use a Record or a Function. So you can easily use create any utils that you want.

const textSize = {
small: 'text-sm',
large: 'text-lg',
} as const;

const isVisuallyEven = (value: boolean) =>
value ? 'bg-gray-100 dark:bg-gray-900' : 'bg-gray-200 dark:bg-gray-800';

const Td = w.td('px-2 py-2', {
variants: {
textSize,
isVisuallyEven,
},
});

Responsive Variants

Tailwind rocks when the subject is Responsiveness. Just use it as you wish:

const Button = w.button('px-2 py-2 w-full lg:text-lg xl:w-auto');

Developer Experience

Powerfull Types

const Button = w.button('text-sm', {
variants: {
color: { red: '', blue: '' },
size: { small: '', large: '' },
},
defaultVariants: {
size: 'small',
},
});
type ButtonProps = W.Infer<typeof Button>;

ButtonProps have all native button props with { color: 'red' | 'blue', size?: 'small' | 'large' }. You can set the as to set which component should be rendered. It also changes the expected prop types

<Button as="a" href="" />
// Now ButtonProps have all native `a` props merged the variants props.
// So passing `href` is now accepted
// And all callbacks now an anchor is expected

Simple API

w('a', { className: 'text-sm', variants: { ... } })
w(Component, { className: '...', variants: { ... } })
w.a('text-sm', { variants: { ... } })
w.a('text-sm')

Credits

Stitch has just be borned. It was created by me, Vinicius Pacheco. I go by vinpac on GitHub.