import React from 'react';
import styled from 'styled-components';
import v from '../../styles/Variables';
interface Props {
/**
* The hex background color of the button.
*/
backgroundColor?: string;
/**
* A valid JSX set of elements.
*/
children: React.ReactNode;
/**
* The callback when the button is clicked.
*/
clickCb?: () => void;
/**
* TThe callback function when the mouse enters the button.
*/
enterCb?: () => void;
/**
* Toggle to show the content inside the button.
*/
fabOpen: boolean;
/**
* The callback function when the mouse leaves the button.
*/
leaveCb?: () => void;
/**
* The color of the text of the button.
*/
textColor?: string;
/**
* The classes applied to the button itself.
*/
theme?: string;
/**
* The text shown next to the main button.
*/
title?: string;
}
interface FabStyles {
backgroundColor: string;
textColor: string;
}
const Fab = ({ backgroundColor = v.colors.dark, children, clickCb, enterCb, fabOpen, leaveCb, textColor = v.colors.light, theme = '', title = '+' }: Props) => {
return (
(enterCb ? enterCb() : null)}
onMouseLeave={() => (leaveCb ? leaveCb() : null)}
onClick={() => (clickCb ? clickCb() : null)}
className={`nwc--fab-wrapper nwc--docked ${theme}`}
>
{children}
{title}
);
};
export default Fab;
/* styles */
const Wrapper = styled.span`
display: inline-block;
position: relative;
text-align: right;
right: 25px;
&.nwc--docked {
position: fixed;
bottom: 25px;
}
`;
const FloatinActionButton = styled.button`
display: inline-block;
min-width: 56px;
height: 56px;
text-align: center;
line-height: 56px;
padding: 0 20px;
border-radius: 300px;
transition: all 0.4s linear;
box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
background: ${({ backgroundColor }) => backgroundColor};
color: ${({ textColor }) => textColor};
z-index: 999;
position: relative;
font-size: 24px;
&:hover {
cursor: pointer;
opacity: 0.7;
transform: rotate(45deg);
box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.1), 0px 6px 7px 0px rgba(0, 0, 0, 0.1), 0px 1px 10px 0px rgba(0, 0, 0, 0.1);
}
`;
const FabMenu = styled.div`
position: absolute;
bottom: 65px;
right: 10px;
z-index: 99;
transition: all 0.2s linear;
opacity: 1;
text-align: right;
.nwc--fab-image:hover,
.nwc--fab-item:hover {
cursor: pointer;
opacity: 0.7;
}
.nwc--fab-item {
display: inline-block;
padding: 0 10px;
min-width: 40px;
height: 40px;
background: #fff;
box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
border-radius: 300px;
text-align: center;
line-height: 40px;
margin-bottom: 15px;
white-space: nowrap;
transition: all 0.2s linear;
}
.nwc--fab-image {
img {
display: inline-block;
padding: 0;
width: 40px;
height: 40px;
background: #fff;
box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
border-radius: 300px;
margin-bottom: 15px;
overflow: hidden;
transition: all 0.2s linear;
}
span {
position: absolute;
right: 55px;
padding-top: 5px;
color: #fff;
}
}
.nwc--fab-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
transition: background 0.4s linear;
&.opacity--0 {
height: 0;
}
}
`;