From e544966bd02d4a2849db765d56176d61cc5aa462 Mon Sep 17 00:00:00 2001 From: Ruggero Cino Date: Tue, 19 Sep 2023 17:33:50 +0200 Subject: [PATCH] Start implementation of button loading state --- src/components/button/button.tsx | 33 +++++++++++++++++++++++++----- src/components/spinner/spinner.tsx | 2 +- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/components/button/button.tsx b/src/components/button/button.tsx index 540886a9a..03f9bd315 100644 --- a/src/components/button/button.tsx +++ b/src/components/button/button.tsx @@ -2,6 +2,8 @@ import classNames from 'classnames'; import type { ButtonHTMLAttributes } from 'react'; import { Icon, type IconType } from '../icon'; import type { IconSize } from '../icon/icon'; +import { Spinner } from '../spinner'; +import type { SpinnerSize, SpinnerVariant } from '../spinner/spinner'; export type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'success' | 'warning' | 'critical'; export type ButtonSize = 'lg' | 'md' | 'sm'; @@ -68,10 +70,19 @@ const variantToClassNames: Record = { ], }; +const variantToSpinnerVariant: Record = { + primary: 'primary', + secondary: 'neutral', + tertiary: 'neutral', + success: 'success', + warning: 'warning', + critical: 'critical', +}; + const sizeToClassNames: Record = { - lg: 'h-[48px] rounded-xl px-4 gap-1', - md: 'h-[40px] rounded-xl px-3 gap-1', - sm: 'h-[32px] rounded-lg px-2 gap-0.5', + lg: 'h-[48px] rounded-xl px-4 gap-2', + md: 'h-[40px] rounded-xl px-3 gap-2', + sm: 'h-[32px] rounded-lg px-2 gap-1.5', }; const sizeToIconSize: Record = { @@ -80,16 +91,28 @@ const sizeToIconSize: Record = { sm: 'sm', }; +const sizeToSpinnerSize: Record = { + lg: 'md', + md: 'md', + sm: 'sm', +}; + export const Button: React.FC = (props) => { const { variant, size, iconRight, iconLeft, className, children, state, ...otherProps } = props; - const commonClasses = 'flex flex-row border items-center focus:outline enabled:hover:shadow-md'; + const commonClasses = 'flex flex-row border items-center focus:outline'; const variantClasses = variantToClassNames[variant].join(' '); - const classes = classNames(commonClasses, variantClasses, sizeToClassNames[size], className); + const classes = classNames(commonClasses, variantClasses, sizeToClassNames[size], className, { + 'hover:shadow-md': state !== 'disabled' && state != 'loading', + 'cursor-progress': state === 'loading', + }); return ( diff --git a/src/components/spinner/spinner.tsx b/src/components/spinner/spinner.tsx index 471b24b0d..6215245bd 100644 --- a/src/components/spinner/spinner.tsx +++ b/src/components/spinner/spinner.tsx @@ -24,7 +24,7 @@ const sizeToDimension: Record = { const variantToClassNames: Record = { neutral: 'border-neutral-100 border-t-primary-400', - primary: 'border-neutral-0 border-t-primary-300', + primary: 'border-primary-300 border-t-neutral-0', success: 'border-success-300 border-t-success-800', warning: 'border-warning-300 border-t-warning-800', critical: 'border-critical-300 border-t-critical-800',