veza/apps/web/src/components/base/Card.tsx
senke 230286e073 refactor: Phase 1 — SUMI token foundation
- Rewrite index.css with complete SUMI token system (dark + light themes)
- All --sumi-* variables: backgrounds, surfaces, borders, text, pigments,
  spacing, radius, shadows, glass, scrollbar, motion, z-index, layout
- shadcn/Radix semantic mapping (--background, --foreground, etc.)
- Tailwind @theme mapping with new fonts (Inter, Space Grotesk, JetBrains Mono)
- SUMI keyframe animations (sumi-fade-in, sumi-slide-up, sumi-scale-in, etc.)
- Delete 11 redundant CSS files (design-system.css, design-tokens.css,
  button.css, card.css, input.css, badge-avatar.css, header.css,
  fix-input-focus.css, fix-login-form.css, visual-enhancements.css,
  premium-utilities.css)
- Update main.tsx: single CSS import (index.css only)
- Update ThemeProvider: data-theme attribute instead of .dark class toggle
- Update index.html FOUC script: data-theme attribute

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 01:48:01 +01:00

112 lines
2.3 KiB
TypeScript

import React from 'react';
import type { BaseComponentProps } from '../types';
/**
* Props for Card component
* Enhanced with Fusion Design System variants
*/
export interface CardProps extends BaseComponentProps {
children: React.ReactNode;
variant?: 'default' | 'manga' | 'neon' | 'nature' | 'elevated' | 'glass';
interactive?: boolean;
spacing?: 'compact' | 'normal' | 'spacious';
borderless?: boolean;
flat?: boolean;
}
export interface CardHeaderProps extends BaseComponentProps {
children: React.ReactNode;
}
export interface CardBodyProps extends BaseComponentProps {
children: React.ReactNode;
}
export interface CardFooterProps extends BaseComponentProps {
children: React.ReactNode;
}
export const Card = ({
children,
variant = 'default',
interactive = false,
spacing = 'normal',
borderless = false,
flat = false,
className = '',
...props
}: CardProps) => {
const baseClass = 'card-veza';
const variantClass = `card-veza--${variant}`;
const interactiveClass = interactive ? 'card-veza--interactive' : '';
const spacingClass = spacing !== 'normal' ? `card-veza--${spacing}` : '';
const borderlessClass = borderless ? 'card-veza--borderless' : '';
const flatClass = flat ? 'card-veza--flat' : '';
const classes = [
baseClass,
variantClass,
interactiveClass,
spacingClass,
borderlessClass,
flatClass,
className,
]
.filter(Boolean)
.join(' ');
return (
<div className={classes} {...props}>
{children}
</div>
);
};
export const CardHeader = ({
children,
className = '',
...props
}: CardHeaderProps) => {
return (
<div className={`card-veza__header ${className}`} {...props}>
{children}
</div>
);
};
export const CardTitle = ({
children,
className = '',
...props
}: CardHeaderProps) => {
return (
<h3 className={`card-veza__title ${className}`} {...props}>
{children}
</h3>
);
};
export const CardBody = ({
children,
className = '',
...props
}: CardBodyProps) => {
return (
<div className={`card-veza__body ${className}`} {...props}>
{children}
</div>
);
};
export const CardFooter = ({
children,
className = '',
...props
}: CardFooterProps) => {
return (
<div className={`card-veza__footer ${className}`} {...props}>
{children}
</div>
);
};