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-common-ts

v6.3.0

Published

## Setup

Downloads

3

Readme

react-common-ts

Setup

We highly recommend nvm https://github.com/nvm-sh/nvm

1 - Go terminal and type nvm use otherwise you should use node v12

2 - yarn install

3 - yarn setup

Component playground

yarn storybook

How to use Styles in a Project

  • Import StylesProvider component.
  • Wrap your root component with this provider like so:
import { StylesProvider } from 'react-common-ts';

<StylesProvider>
  <App />
</StylesProvider>;

Doing this you will get the global styles setup and also access to theme specific configuration variables.

Contributing

Migrating from react-common

Consider doing the following when migrating components:

  • Transform .js and .jsx to .ts and .tsx respectively.
  • Remove PropTypes usage in favour of Types.
  • Add comments for each prop so that storybook can take it as a docstring and show it as a description.
  • Move the styles from SASS to styled-components inside your component file.
  • Sometimes is not possible to move every style to styled-components, in that case don't include SASS files inside your component. Instead let the end user to do so when using your component. For storybook purposes you can add the route to your SASS file inside src/index.scss.
  • Also see considerations for Creating new components.

Creating new components

Considerations:

  • Export the component as default.
  • Each component will live in its own folder inside ./src/components
  • Shape of a component's folder
    • index.tsx where the component lives.
    • index.module.scss styles that can't be migrated to styled components.
    • ComponentName.stories.mdx storybook markup file.
    • ComponentName.spec.tsx Jest test file.

      If you need to split the component definition in several files, create one child folder for each subcomponent. Each folder should follow the same shape.

  • Export your component in src/index.ts.
  • Avoid using class names for styling purposes, instead use styled-components.
  • When using styled-components we aim to use css tag. You can find a good example of how to implement styled components and mixins in this PR.

Migrating from ipsy-core-styles

Motivation

We want to move away from ipsp-core-styles and embrace css-in-js, reason: see css support section in nextjs repo.

General Approach

Most react-common components convert boolean props to classnames for rendering different style variants/states. We would like their typescript versions to accept similar sets of props but no more ipsy-core-styles classnames, instead use styled-components to conditional include styles as per boolean props.

Caveats

  1. Comply with style guides: If there is any style conflicts between react-common code and style guides, we should respect style guides, we can also reach out to designers for details. Ask for help in #design slack channel.

  2. Refer to storybook: In react-common repo, the main sass file(Button component for example: _button.sass) may contain many unused or unrelated sass code, refer to storybook and style guide to focus on necessary parts.

  3. Correct storybook: Meanwhile, the main sass file may not contain all related styles (in Button component, for example, there is a line-height definition nested inside _typography.scss .ux class), make sure components are wrapped with necessary global classes in react-common storybook to find them out.

  4. Migrate nested styles last: Nested styles mean a prop may not take effect without another prop, which can be confusing. Migrate the outermost styles first, then one layer nested styles, until the innermost styles, like BFS traverse.

  5. Modify prop names if necessary: If a prop associated variant/state is not used anymore(no example in style guide or storybook), feel free to remove it. And if a prop name doesn't match style guide, modify it. But don't forget to add notes to ts storybook Breaking changes section.

Typical Workflow

  1. Make sure to create dir, files and add exports to main entry, as per Creating new components section.

  2. Switch to react-common repo, find base styles first by looking into imported sass file, storybook and zeplin style guide (if present), then add to react-common-ts repo.

  3. Repeat step 2 for each variant/state, from outermost styles to innermost nested styles, If there is any style conflict between js repo and style guides, comply with style guides or ask designer.

Writing stories with Storybook

Storybook uses mdx syntax to define its stories. Is like markdown with JSX support.

Here you have a template:

import { Meta, Story, Preview, Props } from '@storybook/addon-docs/blocks';
import { action } from '@storybook/addon-actions';

import { StylesProvider } from '../../styles/global';
import MyComponent from '.';

<Meta title="MyComponent" component={MyComponent} />

# MyComponent

MyComponent component

## Props

<Props of={MyComponent} />

## Examples

<Preview>
  <Story
    name="My story"
    decorators={[
      (storyFn) => (
        <StylesProvider>
          <div style={{ padding: 25, background: 'white' }}>{storyFn()}</div>
        </StylesProvider>
      ),
    ]}
  >
    <MyComponent />
  </Story>
</Preview>

Testing

We have 2 ways of test that are complementary between them.

Snapshots

When the test runs creates an snapshot of the generated code. This snapshot will be tested against future changes in order to check if some unvoluntary change has been made.

it('renders without crashing', () => {
  const { container } = renderWithTheme(
    <Carousel layout="MOBILE">{content}</Carousel>
  );
  expect(container).toMatchSnapshot();
});

Note: This also generates snapshot of styles when working with styled components.

@testing-library/react

This package allows to create complex tests easily, and encourages good testing practices. You can find docs and samples here.

Note: when writing test suites have a11y in mind.

Release Process (versioning)

We use semantic versioning.

  1. Once your PR gets approved, make sure version inside package.json is bumped before merging.
  2. After merging, fetch and checkout latest master branch on local.
  3. Create a tag: git tag -a vX.X.X -m "message".
  4. Push the created tag to remote: git push --tags.
  5. Create a release here. Link it to your recently created tag.

Releases should have a meaningful title following this recommended pattern Fix: [APPS-XXXX] Ticket title or Feature: [APPS-XXXX] Ticket title.