43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
'use client';
|
|
|
|
import { bool, string } from 'prop-types';
|
|
import { RippleArea } from '../../ripple/ripple-area';
|
|
import { ButtonLayoutProps } from './button-layout.types';
|
|
import useRippleEffect from '../../ripple/hooks/useRippleEffect';
|
|
import React, { forwardRef, useId, useRef, useState } from 'react';
|
|
|
|
export const ButtonLayout = forwardRef<HTMLButtonElement, ButtonLayoutProps>(
|
|
({ centralRipple = false, ...props }, ref) => {
|
|
const [isActive, setIsActive] = useState<boolean>(false),
|
|
ripplesRef = useRef(null),
|
|
buttonId = useId(),
|
|
events = useRippleEffect(ripplesRef, setIsActive);
|
|
|
|
const classes =
|
|
`m3${isActive ? ' is-active' : ''} ${props.className ?? ''}`.trimEnd();
|
|
|
|
return (
|
|
<button
|
|
{...props}
|
|
{...events}
|
|
className={classes}
|
|
disabled={props.disabled}
|
|
id={buttonId}
|
|
ref={ref}
|
|
>
|
|
{props.children}
|
|
<RippleArea
|
|
callback={setIsActive}
|
|
central={centralRipple}
|
|
ref={ripplesRef}
|
|
/>
|
|
</button>
|
|
);
|
|
},
|
|
);
|
|
|
|
ButtonLayout.propTypes = {
|
|
children: string,
|
|
centralRipple: bool,
|
|
};
|