button.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. "use client";
  2. import React from "react";
  3. import { type ComponentRenderProps } from "@json-render/react";
  4. export function Button({ element, onAction, loading }: ComponentRenderProps) {
  5. const { label, variant, action, disabled } = element.props as {
  6. label: string;
  7. variant?: string | null;
  8. action: { name: string };
  9. disabled?: boolean | null;
  10. };
  11. const variants: Record<string, React.CSSProperties> = {
  12. primary: {
  13. background: "var(--foreground)",
  14. color: "var(--background)",
  15. border: "none",
  16. },
  17. secondary: {
  18. background: "transparent",
  19. color: "var(--foreground)",
  20. border: "1px solid var(--border)",
  21. },
  22. danger: { background: "#dc2626", color: "#fff", border: "none" },
  23. ghost: { background: "transparent", color: "var(--muted)", border: "none" },
  24. };
  25. return (
  26. <button
  27. onClick={() => !disabled && action && onAction?.(action)}
  28. disabled={!!disabled || loading}
  29. style={{
  30. padding: "8px 16px",
  31. borderRadius: "var(--radius)",
  32. fontSize: 14,
  33. fontWeight: 500,
  34. opacity: disabled ? 0.5 : 1,
  35. ...variants[variant || "primary"],
  36. }}
  37. >
  38. {loading ? "Loading..." : label}
  39. </button>
  40. );
  41. }