|
| 1 | +import * as React from "react" |
| 2 | +import { Slot } from "@radix-ui/react-slot" |
| 3 | +import { cva, type VariantProps } from "class-variance-authority" |
| 4 | + |
| 5 | +import { cn } from "@/lib/utils" |
| 6 | +// FROM: https://vscode.dev/github/trypear/pearai-submodule/blob/acorn/253-submodule-api-fixed/gui/src/pages/creator/ui/button/index.tsx#L1-L121 |
| 7 | +// TODO: UI LIBRARY COMPONENT SHARING SHIZZ HERE! |
| 8 | +const buttonVariants = cva( |
| 9 | + "inline-flex items-center justify-center gap-2 border-none whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[#a1a1aa] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", |
| 10 | + { |
| 11 | + variants: { |
| 12 | + variant: { |
| 13 | + default: "bg-[#18181b] text-[#fafafa] shadow hover:bg-[#27272a]", |
| 14 | + destructive: "bg-[#ef4444] text-[#fafafa] shadow-sm hover:bg-[#dc2626]", |
| 15 | + outline: "border border-[#e4e4e7] bg-[#ffffff] shadow-sm hover:bg-[#f4f4f5] hover:text-[#18181b]", |
| 16 | + secondary: "bg-[#f4f4f5] text-[#18181b] hover:bg-[#e4e4e7]", |
| 17 | + ghost: "hover:bg-[#f4f4f5] hover:text-[#18181b]", |
| 18 | + link: "text-[#18181b] underline-offset-4 hover:underline", |
| 19 | + }, |
| 20 | + size: { |
| 21 | + // default: "h-9 px-4 py-2", |
| 22 | + default: "h-7 rounded-md px-2 text-md", |
| 23 | + sm: "h-6 rounded-md px-2 text-xs", |
| 24 | + lg: "h-10 rounded-md px-8", |
| 25 | + icon: "h-9 w-9", |
| 26 | + }, |
| 27 | + toggled: { |
| 28 | + true: "", |
| 29 | + }, |
| 30 | + }, |
| 31 | + compoundVariants: [ |
| 32 | + { |
| 33 | + variant: "default", |
| 34 | + toggled: true, |
| 35 | + className: " bg-[#3030ad] text-[#0B84FF] hover:bg-[#3a3ad2]", // bg-[#27272a] text-[#fafafa] |
| 36 | + }, |
| 37 | + { |
| 38 | + variant: "destructive", |
| 39 | + toggled: true, |
| 40 | + className: "bg-[#dc2626] text-[#fafafa]", |
| 41 | + }, |
| 42 | + { |
| 43 | + variant: "outline", |
| 44 | + toggled: true, |
| 45 | + className: "bg-[#f4f4f5] text-[#18181b] border-[#a1a1aa]", |
| 46 | + }, |
| 47 | + { |
| 48 | + variant: "secondary", |
| 49 | + toggled: true, |
| 50 | + // className: "bg-[#e4e4e7] text-[#18181b]" |
| 51 | + className: "bg-[#E3EFFF] text-[#4388F8] hover:bg-[#D1E3FF]", |
| 52 | + }, |
| 53 | + { |
| 54 | + variant: "ghost", |
| 55 | + toggled: true, |
| 56 | + className: "bg-[#f4f4f5] text-[#18181b]", |
| 57 | + }, |
| 58 | + { |
| 59 | + variant: "link", |
| 60 | + toggled: true, |
| 61 | + className: "text-[#18181b] underline", |
| 62 | + }, |
| 63 | + ], |
| 64 | + defaultVariants: { |
| 65 | + variant: "default", |
| 66 | + size: "default", |
| 67 | + toggled: false, |
| 68 | + }, |
| 69 | + }, |
| 70 | +) |
| 71 | + |
| 72 | +export interface ButtonProps |
| 73 | + extends React.ButtonHTMLAttributes<HTMLButtonElement>, |
| 74 | + VariantProps<typeof buttonVariants> { |
| 75 | + asChild?: boolean |
| 76 | + onToggle?: (toggled: boolean) => void |
| 77 | +} |
| 78 | + |
| 79 | +const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( |
| 80 | + ( |
| 81 | + { className, variant, size, toggled: initialToggled = false, asChild = false, onToggle, onClick, ...props }, |
| 82 | + ref, |
| 83 | + ) => { |
| 84 | + const Comp = asChild ? Slot : "button" |
| 85 | + const [toggled, setToggled] = React.useState(initialToggled) |
| 86 | + |
| 87 | + const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { |
| 88 | + if (onToggle) { |
| 89 | + const newToggled = !toggled |
| 90 | + setToggled(newToggled) |
| 91 | + onToggle(newToggled) |
| 92 | + } |
| 93 | + |
| 94 | + onClick?.(event) |
| 95 | + } |
| 96 | + |
| 97 | + return ( |
| 98 | + <Comp |
| 99 | + className={cn( |
| 100 | + buttonVariants({ |
| 101 | + variant, |
| 102 | + size, |
| 103 | + toggled: onToggle ? toggled : initialToggled, |
| 104 | + className, |
| 105 | + }), |
| 106 | + )} |
| 107 | + ref={ref} |
| 108 | + onClick={onToggle ? handleClick : onClick} |
| 109 | + {...props} |
| 110 | + /> |
| 111 | + ) |
| 112 | + }, |
| 113 | +) |
| 114 | +Button.displayName = "Button" |
| 115 | + |
| 116 | +export { Button, buttonVariants } |
0 commit comments