/ src / components / Card.tsx
Card.tsx
  1  /**
  2   * ACDC Card Component
  3   * Chain-aware card with all variants
  4   */
  5  
  6  import React from 'react'
  7  import type { Chain } from '../tokens'
  8  
  9  export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
 10    variant?: 'default' | 'interactive' | 'featured' | 'selected'
 11    size?: 'sm' | 'md' | 'lg'
 12    chain?: Chain
 13    disabled?: boolean
 14    children: React.ReactNode
 15  }
 16  
 17  export const Card = React.forwardRef<HTMLDivElement, CardProps>(
 18    (
 19      {
 20        variant = 'default',
 21        size = 'md',
 22        chain,
 23        disabled = false,
 24        className = '',
 25        children,
 26        ...props
 27      },
 28      ref
 29    ) => {
 30      // Wise-inspired: clean, airy, generous padding, soft shadows
 31      const baseStyles = `
 32        bg-[var(--bg-elevated)]
 33        border border-[var(--border-subtle)]
 34        shadow-sm
 35        transition-all duration-300 ease-out
 36      `
 37  
 38      const sizeStyles = {
 39        sm: 'p-5 rounded-2xl',
 40        md: 'p-8 rounded-3xl',
 41        lg: 'p-10 rounded-3xl',
 42      }
 43  
 44      const variantStyles = {
 45        default: '',
 46        interactive: `
 47          cursor-pointer
 48          hover:shadow-lg
 49          hover:-translate-y-1
 50          hover:border-[var(--border-default)]
 51          active:translate-y-0 active:shadow-md
 52        `,
 53        featured: chain === 'delta'
 54          ? 'border-2 border-[rgba(245,158,11,0.5)] bg-gradient-to-br from-[var(--bg-elevated)] to-[rgba(245,158,11,0.05)]'
 55          : 'border-2 border-[rgba(43,135,255,0.5)] bg-gradient-to-br from-[var(--bg-elevated)] to-[rgba(43,135,255,0.05)]',
 56        selected: chain === 'delta'
 57          ? 'border-2 border-[var(--delta-primary)] shadow-lg'
 58          : 'border-2 border-[var(--alpha-primary)] shadow-lg',
 59      }
 60  
 61      const disabledStyles = disabled ? 'opacity-50 pointer-events-none' : ''
 62  
 63      return (
 64        <div
 65          ref={ref}
 66          data-chain={chain}
 67          className={`${baseStyles} ${sizeStyles[size]} ${variantStyles[variant]} ${disabledStyles} ${className}`}
 68          {...props}
 69        >
 70          {children}
 71        </div>
 72      )
 73    }
 74  )
 75  
 76  Card.displayName = 'Card'
 77  
 78  // Card subcomponents - Wise-inspired generous spacing
 79  export const CardHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
 80    className = '',
 81    children,
 82    ...props
 83  }) => (
 84    <div
 85      className={`px-8 py-6 border-b border-[var(--border-subtle)] flex items-center justify-between ${className}`}
 86      {...props}
 87    >
 88      {children}
 89    </div>
 90  )
 91  
 92  export const CardBody: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
 93    className = '',
 94    children,
 95    ...props
 96  }) => (
 97    <div className={`px-8 py-6 ${className}`} {...props}>
 98      {children}
 99    </div>
100  )
101  
102  export const CardFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
103    className = '',
104    children,
105    ...props
106  }) => (
107    <div
108      className={`px-8 py-6 border-t border-[var(--border-subtle)] bg-[var(--bg-secondary)] rounded-b-3xl ${className}`}
109      {...props}
110    >
111      {children}
112    </div>
113  )