Security News
pnpm 10.0.0 Blocks Lifecycle Scripts by Default
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
react-buttons
Advanced tools
A few common buttons with css and helpers.
Live example: react-buttons
$ npm install -S react-buttons
Include the css file or import the sass file
// symlink way
@import "vendors/react-buttons/react-buttons";
// or
@import "../some/path/to/node_modules/react-buttons/src/scss/react-buttons";
I personally prefer the symlink way. You can checkout my postinstall script for an example.
Each component can be disabled and not inluded in your compiled source by changing the variables $include-x Check the sass source
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import PureRenderMixin from 'react-addons-pure-render-mixin';
import { Button, IconButton, HamburgerButton, FloatingButton, FlatButton } from 'react-buttons';
class Example extends Component {
constructor(props) {
super(props);
this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);
}
render() {
return (
<div>
<Button faIcon="plus" onClick={/* sommething */}>New Thing</Button>
<Button materialIcon="favorite" iconBefore={true} onClick={/* sommething */}>Favorite</Button>
<IconButton faIcon="plus" label="Add a new thing" onClick={/* something */} />
<IconButton materialIcon="favorite" label="Add this as a favorite" onClick={/* something */} />
<HamburgerButton active={false} size="lg" onClick={/* something */} />
<HamburgerButton active={this.props.btnActive} onClick={/* toggle */} />
<FlatButton color="primary" onClick={/* something */} />
<FloatingButton faIcon="plus" label="Add a new thing" onClick={/* something */} />
</div>
)
}
}
ReactDOM.render(<Example />, document.getElementById('app'));
Check out the examples folder or the live demo for other ideas.
This is just a basic button that helps with placing icons on a button before or after the text.
static propTypes = {
iconBefore: PropTypes.bool,
faIcon: PropTypes.string,
materialIcon: PropTypes.string,
type: PropTypes.oneOf(['button', 'submit', 'reset']),
className: PropTypes.string,
onClick: PropTypes.func,
children: PropTypes.node,
ripple: PropTypes.bool,
rippleTime: PropTypes.number,
}
static defaultProps = {
iconBefore: false,
type: 'button',
onClick: () => {},
ripple: false,
rippleTime: 300,
}
When giving a font-awesome icon, do not pass in 'fa fa-whatever'. All that is needed is 'whatever'.
There is a corresponding css class names .icon-text-btn
that gets applied to this button that adds a margin to icons and their text.
There can be a ripple effect on the button if you change the value of ripple
to true. You just need a background color on the button to work.
This is a button that is only an icon with no text. There is some attempted accessibility built into this component as well. If you hover over the button, help text will appear describing what that button should be doing.
static propTypes = {
label: PropTypes.string.isRequired,
helpPosition: PropTypes.oneOf(['top', 'right', 'bottom', 'left']),
faIcon: PropTypes.string,
materialIcon: PropTypes.string,
type: PropTypes.oneOf(['button', 'reset', 'submit']),
helpTextTime: PropTypes.number,
onClick: PropTypes.func,
className: PropTypes.string,
children: PropTypes.node,
}
static defaultProps = {
helpPosition: 'bottom',
type: 'button',
helpTextTime: 1000,
onClick: () => {},
}
The prop label
is used as the text for the help text.
The prop helpPosition
is used to tell which side of the button the floating-box of text will appear
The corresponding css class name is .icon-btn
. The help text extends a class floating-box
.
HamburgerButton and FloatingButton both use IconButton and pass all props into it. So the propTypes here are valid for them as well.
This is just a pretty hamburger button that has the lines move into an X if you change the prop active
to true.
static propTypes = {
active: PropTypes.bool,
label: PropTypes.string.isRequired,
helpPosition: PropTypes.oneOf(['top', 'left', 'bottom', 'right']),
onClick: PropTypes.func,
className: PropTypes.string,
size: PropTypes.string,
}
static defaultProps = {
active: false,
size: 'md',
helpPosition: 'bottom',
}
The hamburger button is generated with some css and the corresponding class is .hamburger-btn
.
Since modifying the colors and changing the sizes is a bit of work, there are 3 sass mixins available.
hamburger-size
, hamburger-color
, hamburger-position
So if you wanted to create a new alternative color button,
.hamburger-btn.hamburger-btn-blue {
$background-color: #3498dbl
$line-color: #ecf0f1;
@include hamburger-color($background-color, $line-color);
}
.hamburger-btn.hamburger-btn-xs {
$icon-size: 12px;
$line-size: 2px;
@include hamburger-size($icon-size, $line-size);
@include hamburger-position($icon--size, $line-size);
}
I can't promise that custom sizes always work correctly. Even numbers usually worked ok.
Creates a 'flat' button that presses down when clicked.
static propTypes = {
color: PropTypes.string,
active: PropTypes.bool,
className: PropTypes.string,
}
static defaultProps = {
color: 'default',
active: false,
}
The color is any string that you want to add to the end of flat-btn-
.
There are 3 types available at the start default
, primary
, error
.
There is a mixin you can use to create a new button color alternative flat-btn
.flat-btn {
$name: 'irock',
$background-color: #95a5a6; // concrete
$text-color: #000;
$border-color: #7f8c8d; // asbestos
$border-size: $flat-btn-border-size;
@include($name, $background-color, $text-color, $border-color, $border-size);
}
// creates
.flat-btn.flat-btn-irock {
background-color: #95a5a6;
color: #000
border-bottom: 2px solid #7f8c8d;
box-shadow: inset 0 -2px #7f8c8d;
}
This is just a button that floats in the bottom right hand corner of the screen.
static propTypes = {
color: PropTypes.string,
className: PropTypes.string,
}
static defaultProps = {
color: 'default',
helpPosition: 'left',
}
The color is any string that you want to add to the end of floating-btn-
.
There are 3 types available at the start default
, primary
, error
.
There is no mixin for this one because it is easy enough to create your own here.
There is a reusable relative menu named .floating-box
. View src/scss/_helpers.scss
for more.
There are 2 helper functions for creating ripple effects if you do not want to use the buttons here.
import React from 'react';
import ReactDOM from 'react-dom';
import { initRipple, animateRipple } from 'react-buttons';
export default class RippleButton extends Component {
constructor(pros) {
super(props);
this.ripple = null;
this.rippleTimeout = null;
}
componentDidMount() {
this.ripple = initRipple(ReactDOM.findDOMNode(this));
}
componentWillUnmount() {
if(this.rippleTimeout) {
clearTimeout(this.rippleTimeout);
}
}
onClick = (e) => {
this.rippleTimeout = animateRipple(e, ReactDOM.findDOMNode(this), this.ripple, this.rippleTimeout);
}
render() {
return <button type="button" onClick={this.onClick}>I Am a Ripple Button</button>;
}
}
To run the local build and check for changes in the examples,
$ npm start
# or
$ gulp serve
To build for a release
$ npm run build
# or
$ gulp dist
FAQs
A few common buttons with css and helpers.
We found that react-buttons demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.
Product
Socket now supports uv.lock files to ensure consistent, secure dependency resolution for Python projects and enhance supply chain security.
Research
Security News
Socket researchers have discovered multiple malicious npm packages targeting Solana private keys, abusing Gmail to exfiltrate the data and drain Solana wallets.