diff --git a/src/components/Card.tsx b/src/components/Card.tsx new file mode 100644 index 0000000..7b04a4c --- /dev/null +++ b/src/components/Card.tsx @@ -0,0 +1,91 @@ +import React from 'react' + +interface CardProps { + children: React.ReactNode + full?: boolean // spans both grid columns + className?: string +} + +export function Card({ children, full, className }: CardProps) { + const [isHovered, setIsHovered] = React.useState(false) + + const baseStyles: React.CSSProperties = { + background: 'var(--surface)', + border: isHovered + ? '1px solid var(--border)' + : '1px solid var(--border-light)', + borderRadius: 'var(--radius)', + padding: '20px', + boxShadow: isHovered ? 'var(--shadow-md)' : 'var(--shadow-sm)', + transition: 'box-shadow 0.2s, border-color 0.2s', + gridColumn: full ? '1 / -1' : undefined, + } + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + {children} +
+ ) +} + +interface CardHeaderProps { + dotColor: 'teal' | 'amber' | 'green' | 'alert' | 'purple' + title: string + rightText?: string +} + +const dotColorMap: Record = { + teal: '#0D6E6E', + amber: '#D97706', + green: '#059669', + alert: '#DC2626', + purple: '#7C3AED', +} + +export function CardHeader({ dotColor, title, rightText }: CardHeaderProps) { + const headerStyles: React.CSSProperties = { + display: 'flex', + alignItems: 'center', + gap: '8px', + marginBottom: '16px', + } + + const dotStyles: React.CSSProperties = { + width: '8px', + height: '8px', + borderRadius: '50%', + backgroundColor: dotColorMap[dotColor], + flexShrink: 0, + } + + const titleStyles: React.CSSProperties = { + fontSize: '12px', + fontWeight: 600, + textTransform: 'uppercase', + letterSpacing: '0.06em', + color: 'var(--text-secondary)', + } + + const rightTextStyles: React.CSSProperties = { + fontSize: '10px', + fontWeight: 400, + textTransform: 'none', + letterSpacing: 'normal', + color: 'var(--text-tertiary)', + fontFamily: "'Geist Mono', monospace", + marginLeft: 'auto', + } + + return ( +
+
+ {title} + {rightText && {rightText}} +
+ ) +}