/react-awesome-button

React button component. Awesome button is a 3D UI, progress, social and share enabled, animated at 60fps, light weight, performant, production ready react UI button component. 🖥️ 📱

Primary LanguageJavaScriptMIT LicenseMIT

React <AwesomeButton /> UI Component

Travis NPM

react-awesome-button is a performant, extendable, highly customisable, production ready React Component that renders an animated set of 3D UI buttons. Bundled together with a social share and progress enabled components.

react-awesome-button demo

Key Features

  • 60fps 3D animated button
  • Animated progress button
  • Social icons and network specific share methods
  • OnPress ripple effect
  • Look and feel customisable and extendable in two ways: via CSS custom properties or SASS variables and lists (scss config file).
  • Use it with CSSModules or **Plain CSS

Live demo

Checkout the live demo with the CSS customizer at my web portfolio page.

You can run this demo locally on 8080 by cloning this repository and running npm start

Storybook

Checkout the Storybook at my web portfolio page.

Figma File

Import it directly into your Figma project.

You can run the storybook locally on 6006 by cloning this repository and running npm run storybook

Installation

npm install --save react-awesome-button

Styling with plain CSS and CSS Modules

Plain CSS

import { AwesomeButton } from "react-awesome-button";
import "react-awesome-button/dist/styles.css";

function Button() {
  return <AwesomeButton type="primary">Button</AwesomeButton>;
}

CSS Modules

import { AwesomeButton } from "react-awesome-button";
import AwesomeButtonStyles from "react-awesome-button/src/styles/styles.scss";

function Button() {
  return (
    <AwesomeButton cssModule={AwesomeButtonStyles} type="primary">
      Button
    </AwesomeButton>
  );
}

AwesomeButton rendered with a button tag

Renders the component with a Button tag and an onPress prop called on animation release. Checkout this example live on the storyboard.

import { AwesomeButton } from "react-awesome-button";
import AwesomeButtonStyles from "react-awesome-button/src/styles/styles.scss";

function Button() {
  return (
    <AwesomeButton
      cssModule={AwesomeButtonStyles}
      type="primary"
      ripple
      onPress={() => {
        // do something
      }}
    >
      Button
    </AwesomeButton>
  );
}

AwesomeButton rendered with an anchor tag

Render the component with an anchor tag setting the href and target attributes.

Checkout this example live on the storyboard.

import { AwesomeButton } from "react-awesome-button";
import AwesomeButtonStyles from "react-awesome-button/src/styles/styles.scss";

function Button() {
  return (
    <AwesomeButton
      cssModule={AwesomeButtonStyles}
      type="primary"
      href="https://google.com"
      target="_blank"
    >
      Button
    </AwesomeButton>
  );
}

AwesomeButton props

Attribute Type Default Description
type string primary Render a specific button type, styled by the .scss type list
size string auto Render a specific button size, styled by the .scss size list
element node null Overwrites the default container element renderer, useful for using it with react-router Link component.
disabled bool false Should render a disabled button
visible bool true Should the button be visible
ripple bool false Should render the animated ripple effect
onPress function null Default click/press function
href string null Forces the button to be rendered on an anchor container and sets the href to the specified value
target string null When used together with href renders an anchor with a specific target attribute

AwesomeButtonProgress basic example

Checkout this example live on the storyboard.

  import { AwesomeButtonProgress } from 'react-awesome-button';
  import AwesomeButtonStyles from 'react-awesome-button/src/styles/styles.scss'

  function Button() {
    return (
      <AwesomeButtonProgress
        cssModule={AwesomeButtonStyles}
        type="primary"
        onPress={next => {
          // do a sync/async task then call `next()`
        }}
      >
        Button
      </AwesomeButtonProgress>
    );
  }

AwesomeButtonProgress specific props

Being a wrapper on the AwesomeButton component, it accepts its props plus the following ones.

Attribute Type Default Description
loadingLabel string Wait .. Progress button loading label text
resultLabel string Success Progress button success label text
releaseDelay number 500 Delay for releasing the button after the progress animation
fakePress boolean false When set to true triggers a fake button press

AwesomeButtonSocial basic example

Checkout this example live on the storyboard.

  import { AwesomeButtonSocial } from 'react-awesome-button';
  import AwesomeButtonStyles from 'react-awesome-button/src/styles/styles.scss'

  function Button() {
    return (
      <AwesomeButtonSocial
        cssModule={AwesomeButtonStyles}
        type="facebook"
        url="https://caferati.me"
      >
        Button
      </AwesomeButton>
    );
  }

AwesomeButtonSocial specific props

Being a wrapper on the AwesomeButton component, it accepts its props plus the following ones.

Attribute Type Default Description
type string primary Render a specific button type. Bundled with Facebook, Instagram, Twitter, Github, Youtube, Linkedin, Pinterest, Reddit, Messenger, Whatsapp and Google Plus (RIP) types and share methods
icon bool false Should render the social icon relative to the button type
iconHeight number 23 Rendered icon height
icon number 30 Rendered icon width
url string null Url string to be used on the sharer
image string null Image url to be rendered on the sharer
message string null Message string to be rendered on the share post
phone string null Phone number to be used when using the Whatsapp sharer
user string null Username to be redirected to when using the Messenger sharer

Adding Custom Button Colors

There are two ways to accomplish this. Which one is easier might depend on your specific use case.

Method 1: Add a New Button Type

This works well if you expect to re-use the same color over and over again.

You can but an arbitrary string in the type attribute, e.g. <AwesomeButton type="plain">Button</AwesomeButton>. The generated HTML will create an element with CSS class name aws-btn--plain.

You can then create a bunch of CSS rules that will style the color for that button. There's a good reference commit illustrating how to do that in https://github.com/michael616kriel/react-awesome-button/commit/2ccbfd6e82d70f1d14568c8fcc3e85aeff9eeb36 but it'll look something like this:

.aws-btn {
  --button-plain-color: #ffffff;
  --button-plain-color-dark: #1360a4;
  --button-plain-color-light: #1E88E5;
  --button-plain-color-hover: #f2f2f2;
  --button-plain-color-active: #e6e6e6;
  --button-plain-border: 2px solid #1E88E5;
}
.aws-btn--plain .aws-btn__wrapper:before {
  background: var(--button-plain-color-dark);
}
.aws-btn--plain .aws-btn__content {
  background: var(--button-plain-color);
  color: var(--button-plain-color-light);
  border: var(--button-plain-border);
}
.aws-btn--plain .aws-btn__content path {
  fill: var(--button-plain-color-light);
}
.aws-btn--plain .aws-btn__wrapper:hover .aws-btn__content {
  background: var(--button-plain-color-hover);
}
.aws-btn--plain.aws-btn--active .aws-btn__wrapper .aws-btn__content {
  background: var(--button-plain-color-active);
}

Method 2: Use Inline CSS to Override the Colors

This works well if you have a single button whose color you want to be a special color.

You can use the style attribute to provide arbitrary CSS overrides, and in particular, you can override the color variables used by the system. It would look something like this:

<AwesomeButton type="secondary" style={{
  '--button-secondary-color': "#ff8585",
  '--button-secondary-color-dark': "#722222",
  '--button-secondary-color-light': "#4b1616",
  '--button-secondary-color-hover': "#ff0000",
  '--button-secondary-color-active': "#ff0505",
}}>Button</AwesomeButton>

React Native Version

Checkout the React Native version of the Awesome Button UI Component at rcaferati/react-native-really-awesome-button

Author

Rafael Caferati

License

MIT. Copyright (c) 2019 Rafael Caferati.