npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-style-mods

v2.1.1

Published

React library for creating style modifiers props

Downloads

36

Readme

React Style Mods

Why?

I found myself duplicate similar small pieces of styles, like add spacing or center element

<Component style={{ marginTop: 10, marginRight: 10 }}>...</Component>
<Component style={{ marginLeft: STYLE_GUIDE_CONST, marginRight: STYLE_GUIDE_CONST  }}>...</Component>
<Component style={{ display: 'flex', alignItems: 'center', justifyContent: 'center'}}>...</Component>

How can I solve these problems? I can add new props to my Component and describe how to compose styles

const Component = (props) => {
    styles = {
        ...props.style
        ...(props.center ? {display: 'flex', alignItems: 'center',justifyContent: 'center'} : {}),
        // etc
    }
    return ...
}

But it's too "imperatively" and it's difficult to reuse such logic between differents UI components.

Or I can create CSS classes and apply them, but you can't pass dynamic params into your classes. Finally I can extract repetitive styles pieces and create bunch of styles constructors, but I find uncomfortable to use such things So I decided to create general convenient solution

How does it work?

Create a map of modifiers and apply them to component via applyStyleMods HOC. Then use as a regular props like <Component mod1 mod2={<value>} ... /> when each prop name correspond to key in your map

Modifiers can be just a style value or a function that returns style value. In first case prop in your component use as boolean flag, if it function value of prop passed as first arg into modifier function

Ultimately all styles will be composed and passed as style prop to the component that you passed withStyleMods HOC

All types will be inferring for Typescript

Examples

Basic usage

import React, { FC } from "react";
import { createStyleMods, applyStyleMods } from "react-style-mods";

const _Component: FC<{ style?: React.CSSProperties }> = ({ style, ...props }) => {
    return <div style={style} {...props} />;
};

const mods = createStyleMods({
    center: { display: "flex", alignItems: "center", justifyContent: "center" },
    padding: (value: number = 44) => ({ padding: value }),
    margin: (value: number) => ({ margin: value }),
    // ...
});

const Component = applyStyleMods(mods)(_Component);

// cases
<Component center padding />; // ->  { padding: 44, display: 'flex', alignItems: 'center', justifyContent: 'center' }
<Component center padding={5} />; // ->  { padding: 5 , display: 'flex', alignItems: 'center', justifyContent: 'center' };
<Component style={{ padding: 5 }} padding={25} />; // -> { padding: 25  }
<Component padding={25} style={{ padding: 5 }} />; // ->  { padding: 5  }

Infer props type

import { ModsProps, createStyleMods } from "react-style-mods";

const mods = createStyleMods({
    padding: (value: number = 44) => ({ padding: value }),
    defaultMargin: { margin: 20 },
});

interface ComponentProps extends ModsProps<typeof mods> {
    myProps: number;
    style?: React.CSSProperties;
}

License

MIT License