chore: Button Component Tidy up (#9888)
Co-authored-by: Peer Richelsen <peeroke@gmail.com>pull/9963/head
parent
c8f7b36307
commit
207e0aac1f
|
@ -5,7 +5,6 @@ import Link from "next/link";
|
||||||
import React, { forwardRef } from "react";
|
import React, { forwardRef } from "react";
|
||||||
|
|
||||||
import classNames from "@calcom/lib/classNames";
|
import classNames from "@calcom/lib/classNames";
|
||||||
import { applyStyleToMultipleVariants } from "@calcom/lib/cva";
|
|
||||||
import type { SVGComponent } from "@calcom/types/SVGComponent";
|
import type { SVGComponent } from "@calcom/types/SVGComponent";
|
||||||
|
|
||||||
import { Plus } from "../icon";
|
import { Plus } from "../icon";
|
||||||
|
@ -24,6 +23,7 @@ export type ButtonBaseProps = {
|
||||||
shallow?: boolean;
|
shallow?: boolean;
|
||||||
/**Tool tip used when icon size is set to small */
|
/**Tool tip used when icon size is set to small */
|
||||||
tooltip?: string;
|
tooltip?: string;
|
||||||
|
disabled?: boolean;
|
||||||
flex?: boolean;
|
flex?: boolean;
|
||||||
} & Omit<InferredVariantProps, "color"> & {
|
} & Omit<InferredVariantProps, "color"> & {
|
||||||
color?: ButtonColor;
|
color?: ButtonColor;
|
||||||
|
@ -36,7 +36,7 @@ export type ButtonProps = ButtonBaseProps &
|
||||||
);
|
);
|
||||||
|
|
||||||
const buttonClasses = cva(
|
const buttonClasses = cva(
|
||||||
"inline-flex items-center text-sm font-medium relative rounded-md transition-colors",
|
"inline-flex items-center text-sm font-medium relative rounded-md transition-colors disabled:cursor-not-allowed ",
|
||||||
{
|
{
|
||||||
variants: {
|
variants: {
|
||||||
variant: {
|
variant: {
|
||||||
|
@ -45,10 +45,14 @@ const buttonClasses = cva(
|
||||||
fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
|
fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
|
||||||
},
|
},
|
||||||
color: {
|
color: {
|
||||||
primary: "",
|
primary:
|
||||||
secondary: "text-emphasis",
|
"bg-brand-default hover:bg-brand-emphasis focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-brand-default text-brand disabled:bg-brand-subtle disabled:text-brand-subtle disabled:opacity-40 disabled:hover:bg-brand-subtle disabled:hover:text-brand-default disabled:hover:opacity-40",
|
||||||
minimal: "text-emphasis",
|
secondary:
|
||||||
destructive: "",
|
"text-emphasis border border-default bg-default hover:bg-muted hover:border-emphasis focus-visible:bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-empthasis disabled:border-subtle disabled:bg-opacity-30 disabled:text-muted disabled:hover:bg-opacity-30 disabled:hover:text-muted disabled:hover:border-subtle disabled:hover:bg-default",
|
||||||
|
minimal:
|
||||||
|
"text-emphasis hover:bg-subtle focus-visible:bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-empthasis disabled:border-subtle disabled:bg-opacity-30 disabled:text-muted disabled:hover:bg-transparent disabled:hover:text-muted disabled:hover:border-subtle",
|
||||||
|
destructive:
|
||||||
|
"border border-default text-emphasis hover:text-red-700 focus-visible:text-red-700 hover:border-red-100 focus-visible:border-red-100 hover:bg-error focus-visible:bg-error focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-red-700 disabled:bg-red-100 disabled:border-red-200 disabled:text-red-700 disabled:hover:border-red-200 disabled:opacity-40",
|
||||||
},
|
},
|
||||||
size: {
|
size: {
|
||||||
sm: "px-3 py-2 leading-4 rounded-sm" /** For backwards compatibility */,
|
sm: "px-3 py-2 leading-4 rounded-sm" /** For backwards compatibility */,
|
||||||
|
@ -58,62 +62,26 @@ const buttonClasses = cva(
|
||||||
loading: {
|
loading: {
|
||||||
true: "cursor-wait",
|
true: "cursor-wait",
|
||||||
},
|
},
|
||||||
disabled: {
|
|
||||||
true: "cursor-not-allowed",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
compoundVariants: [
|
compoundVariants: [
|
||||||
// Primary variants
|
// Primary variants
|
||||||
...applyStyleToMultipleVariants({
|
|
||||||
disabled: [undefined, false],
|
|
||||||
color: "primary",
|
|
||||||
className:
|
|
||||||
"bg-brand-default hover:bg-brand-emphasis focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-brand-default text-brand",
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
disabled: true,
|
|
||||||
color: "primary",
|
|
||||||
className: "bg-brand-subtle text-brand-subtle opacity-40",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
loading: true,
|
loading: true,
|
||||||
color: "primary",
|
color: "primary",
|
||||||
className: "bg-brand-subtle text-brand-subtle",
|
className: "bg-brand-subtle text-brand-subtle",
|
||||||
},
|
},
|
||||||
// Secondary variants
|
// Secondary variants
|
||||||
{
|
|
||||||
disabled: true,
|
|
||||||
color: "secondary",
|
|
||||||
className: "border border-subtle bg-opacity-30 text-muted ",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
loading: true,
|
loading: true,
|
||||||
color: "secondary",
|
color: "secondary",
|
||||||
className: "bg-subtle text-emphasis/80",
|
className: "bg-subtle text-emphasis/80",
|
||||||
},
|
},
|
||||||
...applyStyleToMultipleVariants({
|
|
||||||
disabled: [undefined, false],
|
|
||||||
color: "secondary",
|
|
||||||
className:
|
|
||||||
"border border-default bg-default hover:bg-muted hover:border-emphasis focus-visible:bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-empthasis ",
|
|
||||||
}),
|
|
||||||
// Minimal variants
|
// Minimal variants
|
||||||
{
|
|
||||||
disabled: true,
|
|
||||||
color: "minimal",
|
|
||||||
className: "border-subtle bg-opacity-30 text-emphasis/30 ",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
loading: true,
|
loading: true,
|
||||||
color: "minimal",
|
color: "minimal",
|
||||||
className: "bg-subtle text-emphasis/30",
|
className: "bg-subtle text-emphasis/30",
|
||||||
},
|
},
|
||||||
...applyStyleToMultipleVariants({
|
|
||||||
disabled: [undefined, false],
|
|
||||||
color: "minimal",
|
|
||||||
className:
|
|
||||||
"hover:bg-subtle focus-visible:bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-empthasis",
|
|
||||||
}),
|
|
||||||
// Destructive variants
|
// Destructive variants
|
||||||
{
|
{
|
||||||
loading: true,
|
loading: true,
|
||||||
|
@ -121,13 +89,6 @@ const buttonClasses = cva(
|
||||||
className:
|
className:
|
||||||
"text-red-700/30 dark:text-red-700/30 hover:text-red-700/30 border border-default text-emphasis",
|
"text-red-700/30 dark:text-red-700/30 hover:text-red-700/30 border border-default text-emphasis",
|
||||||
},
|
},
|
||||||
...applyStyleToMultipleVariants({
|
|
||||||
disabled: [false, true, undefined],
|
|
||||||
color: "destructive",
|
|
||||||
className:
|
|
||||||
"border border-default text-emphasis hover:text-red-700 focus-visible:text-red-700 hover:border-red-100 focus-visible:border-red-100 hover:bg-error focus-visible:bg-error focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-red-700",
|
|
||||||
}),
|
|
||||||
// https://github.com/joe-bell/cva/issues/95 created an issue about using !p-2 on the icon variants as i would expect this to take priority
|
|
||||||
{
|
{
|
||||||
variant: "icon",
|
variant: "icon",
|
||||||
size: "base",
|
size: "base",
|
||||||
|
@ -180,10 +141,7 @@ export const Button = forwardRef<HTMLAnchorElement | HTMLButtonElement, ButtonPr
|
||||||
disabled,
|
disabled,
|
||||||
type: !isLink ? type : undefined,
|
type: !isLink ? type : undefined,
|
||||||
ref: forwardedRef,
|
ref: forwardedRef,
|
||||||
className: classNames(
|
className: classNames(buttonClasses({ color, size, loading, variant }), props.className),
|
||||||
buttonClasses({ color, size, loading, disabled: props.disabled, variant }),
|
|
||||||
props.className
|
|
||||||
),
|
|
||||||
// if we click a disabled button, we prevent going through the click handler
|
// if we click a disabled button, we prevent going through the click handler
|
||||||
onClick: disabled
|
onClick: disabled
|
||||||
? (e: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
? (e: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
||||||
|
|
Loading…
Reference in New Issue