1.1.0 • Published 1 year ago

component-variants v1.1.0

Weekly downloads
4
License
MIT
Repository
github
Last release
1 year ago

Component Variants

Why this package?

To style different variants of a single component has so far been a hassle. This package greatly simplifies the way you define and type your variants of a component, while it keeps you in the same control as you have with styled components. Just a simple addon to styled-components.

Installation

With yarn

yarn add component-variants

or with NPM

npm i component-variants

Usage

We will assume the following imports

import React from "react";
import styled, { css } from "styled-components";
import { componentVariants, Variants } from "component-variants";

To express our variants on a certain option, we create a nested styling object where the first level is the option (size) and its children is the variants (small, medium, large).

const variants = componentVariants({
  size: {
    small: css`
      padding: 0;
    `,
    medium: css`
      padding: 2px;
    `,
    large: css`
      padding: 10px;
    `,
  },
});

To extract the typings required by the mixin, we utilize the provided typings helper, Variants.

type ButtonProps = Variants<typeof variants>;

We can then use this styling object (variants) as a mixin in our styled-component (MyStyledButton). Not that we've added ButtonProps to our styled button, to allow the usage to pass in the required props.

const StyledButton = styled.button<ButtonProps>`
  ${variants}
`;

interface Props extends ButtonProps {}

export const Button: React.FC<Props> = ({ size }) => {
  return <StyledButton size={size} />;
};

Variants

Variants can be described with string, enum, number or a string-represented boolean.

String

{
  size: {
    small: css``;
  }
}

Enums

{
  size: {
    [MyEnum.Small]: css``
  }
}

#### Numbers

{
  size: {
    0: css``
  }
}

#### String-represented boolean

{
  size: {
    false: css``,
    true: css``
  }
}

Theme

You can still utilize theme the same way as you are used to.

{
  size: {
    small: css`
      background-color: ${props => props.theme.colors.white};
    `,
  }
}

If you have not set up theme yet, please follow the instructions by (styled-components)https://styled-components.com/docs/advanced.

Syntax

componentVariants(styledObject)

Parameters

styledObject | required

{
  option: {
    variant: Interpolation
  }
}

option is a string that describes the option you want to style. For example size

variant can be either a string, enum, number or a string-represented boolean.

Interpolation is the styled-components interpolation type that supports all styling you are used to do within your styled components