button.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  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: { background: 'var(--foreground)', color: 'var(--background)', border: 'none' },
  13. secondary: { background: 'transparent', color: 'var(--foreground)', border: '1px solid var(--border)' },
  14. danger: { background: '#dc2626', color: '#fff', border: 'none' },
  15. ghost: { background: 'transparent', color: 'var(--muted)', border: 'none' },
  16. };
  17. return (
  18. <button
  19. onClick={() => !disabled && action && onAction?.(action)}
  20. disabled={!!disabled || loading}
  21. style={{
  22. padding: '8px 16px',
  23. borderRadius: 'var(--radius)',
  24. fontSize: 14,
  25. fontWeight: 500,
  26. opacity: disabled ? 0.5 : 1,
  27. ...variants[variant || 'primary'],
  28. }}
  29. >
  30. {loading ? 'Loading...' : label}
  31. </button>
  32. );
  33. }