v12-ui
Version:
A React component library with a focus on utility-first design and accessibility.
97 lines (96 loc) • 4.25 kB
JavaScript
import { jsx as l } from "react/jsx-runtime";
import { forwardRef as m } from "react";
import { cn as w } from "../utils/utils.js";
import { cva as p } from "class-variance-authority";
const x = p("size-text-button font-weight-button flex justify-center items-center hover:cursor-pointer disabled:opacity-50 whitespace-nowrap transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-inherit active:ring-active", {
variants: {
variant: {
primary: "text-text-primary bg-bg-primary hover:bg-bg-primary-hover focus-visible:ring-border-primary",
secondary: "text-text-secondary bg-bg-secondary hover:bg-bg-secondary-hover focus-visible:ring-border-secondary",
muted: "text-text-muted bg-bg-muted hover:bg-bg-muted-hover focus-visible:ring-border-muted",
accent: "text-text-accent bg-bg-accent hover:bg-bg-accent-hover focus-visible:ring-border-accent",
success: "text-text-success bg-bg-success hover:bg-bg-success-hover focus-visible:ring-border-success",
warning: "text-text-warning bg-bg-warning hover:bg-bg-warning-hover focus-visible:ring-border-warning",
error: "text-text-error bg-bg-error hover:bg-bg-error-hover focus-visible:ring-border-error",
info: "text-text-info bg-bg-info hover:bg-bg-info-hover focus-visible:ring-border-info",
ghost: "text-text-ghost bg-bg-ghost hover:bg-bg-ghost-hover focus-visible:ring-border-ghost"
},
border: {
true: "border-1"
},
shadow: {
default: "shadow-custom-lg",
success: "shadow-shadow-success",
warning: "shadow-shadow-warning",
error: "shadow-shadow-error",
info: "shadow-shadow-info"
},
rounded: {
none: "rounded-none",
sm: "rounded-sm",
md: "rounded-md",
lg: "rounded-lg",
pill: "rounded-4xl",
circle: "rounded-full aspect-square"
},
size: {
sm: "px-3 py-1 w-20 h-9",
md: "px-6 py-2 w-30 h-11",
lg: "px-10 py-3 w-35 h-14",
fit: "px-8 py-3 w-fit h-fit",
full: "px-10 py-3 w-full h-14"
}
},
compoundVariants: [
{ variant: "primary", border: !0, className: "border-border-primary hover:border-primary-hover" },
{ variant: "secondary", border: !0, className: "border-border-secondary hover:border-secondary-hover" },
{ variant: "muted", border: !0, className: "border-border-muted" },
{ variant: "accent", border: !0, className: "border-border-accent hover:border-accent-hover" },
{ variant: "success", border: !0, className: "border-border-success hover:border-success-hover" },
{ variant: "warning", border: !0, className: "border-border-warning hover:border-warning-hover" },
{ variant: "error", border: !0, className: "border-border-error hover:border-error-hover" },
{ variant: "info", border: !0, className: "border-border-info hover:border-info-hover" },
{ variant: "ghost", border: !0, className: "border-border-ghost hover:border-ghost-hover" }
],
defaultVariants: {
variant: "primary",
border: !0,
shadow: "default",
rounded: "pill",
size: "fit"
}
});
function y({ as: e, disabled: o, children: i, variant: a, border: b, shadow: d, rounded: c, size: u, className: g, ...t }, h) {
const s = e || "button", v = s === "button";
if (process.env.NODE_ENV !== "production") {
if (e === "a" && !("href" in t))
throw new Error('When using "as" prop with "a" tag, "href" must be provided.');
if (e === "button" && "href" in t)
throw new Error('When using "as" prop with "button" tag, "href" should not be provided.');
}
function f(r) {
const n = r.currentTarget;
!n || n.tagName === "BUTTON" || (r.key === "Enter" || r.key === " ") && (r.preventDefault(), n.click());
}
return /* @__PURE__ */ l(
s,
{
role: v ? void 0 : "button",
tabIndex: o ? -1 : 0,
onKeyDown: f,
ref: h,
"aria-disabled": o,
...t,
className: w(
x({ variant: a, border: b, shadow: d, rounded: c, size: u }),
o && "bg-bg-disabled hover:cursor-not-allowed hover:bg-bg-disabled border-border-disabled",
g
),
children: i
}
);
}
const k = m(y);
export {
k as Button
};