UNPKG

@helpwave/hightide

Version:

helpwave's component and theming library

265 lines 8.02 kB
// src/components/user-action/Button.tsx import { forwardRef } from "react"; import clsx from "clsx"; import { jsx, jsxs } from "react/jsx-runtime"; var ButtonColorUtil = { solid: ["primary", "secondary", "tertiary", "positive", "warning", "negative", "neutral"], text: ["primary", "negative", "neutral"], outline: ["primary"] }; var IconButtonUtil = { icon: [...ButtonColorUtil.solid, "transparent"] }; var paddingMapping = { small: "btn-sm", medium: "btn-md", large: "btn-lg" }; var iconPaddingMapping = { tiny: "icon-btn-xs", small: "icon-btn-sm", medium: "icon-btn-md", large: "icon-btn-lg" }; var ButtonUtil = { paddingMapping, iconPaddingMapping }; var SolidButton = forwardRef(function SolidButton2({ children, color = "primary", size = "medium", startIcon, endIcon, onClick, className, ...restProps }, ref) { const colorClasses = { primary: "not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text", secondary: "not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text", tertiary: "not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text", positive: "not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text", warning: "not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text", negative: "not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text", neutral: "not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text" }[color]; const iconColorClasses = { primary: "not-group-disabled:text-button-solid-primary-icon", secondary: "not-group-disabled:text-button-solid-secondary-icon", tertiary: "not-group-disabled:text-button-solid-tertiary-icon", positive: "not-group-disabled:text-button-solid-positive-icon", warning: "not-group-disabled:text-button-solid-warning-icon", negative: "not-group-disabled:text-button-solid-negative-icon", neutral: "not-group-disabled:text-button-solid-neutral-icon" }[color]; return /* @__PURE__ */ jsxs( "button", { ref, onClick, className: clsx( "group font-semibold", colorClasses, "not-disabled:hover:brightness-90", "disabled:text-disabled-text disabled:bg-disabled-background", ButtonUtil.paddingMapping[size], className ), ...restProps, children: [ startIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: startIcon } ), children, endIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: endIcon } ) ] } ); }); var OutlineButton = ({ children, color = "primary", size = "medium", startIcon, endIcon, onClick, className, ...restProps }) => { const colorClasses = { primary: "not-disabled:border-button-outline-primary-text not-disabled:text-button-outline-primary-text" }[color]; const iconColorClasses = { primary: "not-group-disabled:text-button-outline-primary-icon" }[color]; return /* @__PURE__ */ jsxs( "button", { onClick, className: clsx( "group font-semibold bg-transparent border-2 ", "not-disabled:hover:brightness-80", colorClasses, "disabled:text-disabled-text disabled:border-disabled-outline", ButtonUtil.paddingMapping[size], className ), ...restProps, children: [ startIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: startIcon } ), children, endIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: endIcon } ) ] } ); }; var TextButton = ({ children, color = "neutral", size = "medium", startIcon, endIcon, onClick, coloredHoverBackground = true, className, ...restProps }) => { const colorClasses = { primary: "not-disabled:bg-transparent not-disabled:text-button-text-primary-text", negative: "not-disabled:bg-transparent not-disabled:text-button-text-negative-text", neutral: "not-disabled:bg-transparent not-disabled:text-button-text-neutral-text" }[color]; const backgroundColor = { primary: "not-disabled:hover:bg-button-text-primary-text/20", negative: "not-disabled:hover:bg-button-text-negative-text/20", neutral: "not-disabled:hover:bg-button-text-neutral-text/20" }[color]; const iconColorClasses = { primary: "not-group-disabled:text-button-text-primary-icon", negative: "not-group-disabled:text-button-text-negative-icon", neutral: "not-group-disabled:text-button-text-neutral-icon" }[color]; return /* @__PURE__ */ jsxs( "button", { onClick, className: clsx( "group font-semibold", "disabled:text-disabled-text", colorClasses, { [backgroundColor]: coloredHoverBackground, "not-disabled:hover:bg-button-text-hover-background": !coloredHoverBackground }, ButtonUtil.paddingMapping[size], className ), ...restProps, children: [ startIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: startIcon } ), children, endIcon && /* @__PURE__ */ jsx( "span", { className: clsx( iconColorClasses, "group-disabled:text-disabled-icon" ), children: endIcon } ) ] } ); }; var IconButton = ({ children, color = "primary", size = "medium", className, ...restProps }) => { const colorClasses = { primary: "not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text", secondary: "not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text", tertiary: "not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text", positive: "not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text", warning: "not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text", negative: "not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text", neutral: "not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text", transparent: "not-disabled:bg-transparent" }[color]; return /* @__PURE__ */ jsx( "button", { className: clsx( colorClasses, "not-disabled:hover:brightness-90", "disabled:text-disabled-text", { "disabled:bg-disabled-background": color !== "transparent", "disabled:opacity-70": color === "transparent", "not-disabled:hover:bg-button-text-hover-background": color === "transparent" }, ButtonUtil.iconPaddingMapping[size], className ), ...restProps, children } ); }; export { ButtonColorUtil, ButtonUtil, IconButton, IconButtonUtil, OutlineButton, SolidButton, TextButton }; //# sourceMappingURL=Button.mjs.map