Spaces:
Sleeping
Sleeping
| "use client"; | |
| import { cn } from "@/shared/utils/cn"; | |
| export default function Card({ | |
| children, | |
| title, | |
| subtitle, | |
| icon, | |
| action, | |
| padding = "md", | |
| hover = false, | |
| elev = false, | |
| className, | |
| ...props | |
| }) { | |
| const paddings = { | |
| none: "", | |
| xs: "p-3", | |
| sm: "p-4", | |
| md: "p-6", | |
| lg: "p-8", | |
| }; | |
| return ( | |
| <div | |
| className={cn( | |
| "bg-surface border border-border-subtle", | |
| elev ? "rounded-[14px] shadow-[var(--shadow-elev)]" : "rounded-[14px] shadow-[var(--shadow-soft)]", | |
| hover && "hover:shadow-[var(--shadow-warm)] hover:border-brand-500/30 transition-all cursor-pointer", | |
| paddings[padding], | |
| className | |
| )} | |
| {...props} | |
| > | |
| {(title || action) && ( | |
| <div className="flex items-center justify-between mb-4"> | |
| <div className="flex items-center gap-3"> | |
| {icon && ( | |
| <div className="p-2 rounded-[10px] bg-bg text-text-muted"> | |
| <span className="material-symbols-outlined text-[20px]">{icon}</span> | |
| </div> | |
| )} | |
| <div> | |
| {title && ( | |
| <h3 className="text-text-main font-semibold">{title}</h3> | |
| )} | |
| {subtitle && ( | |
| <p className="text-sm text-text-muted">{subtitle}</p> | |
| )} | |
| </div> | |
| </div> | |
| {action} | |
| </div> | |
| )} | |
| {children} | |
| </div> | |
| ); | |
| } | |
| Card.Section = function CardSection({ children, className, ...props }) { | |
| return ( | |
| <div | |
| className={cn( | |
| "p-4 rounded-[10px]", | |
| "bg-bg border border-border-subtle", | |
| className | |
| )} | |
| {...props} | |
| > | |
| {children} | |
| </div> | |
| ); | |
| }; | |
| Card.Row = function CardRow({ children, className, ...props }) { | |
| return ( | |
| <div | |
| className={cn( | |
| "p-3 -mx-3 px-3 transition-colors", | |
| "border-b border-border-subtle last:border-b-0", | |
| "hover:bg-surface-2/50", | |
| className | |
| )} | |
| {...props} | |
| > | |
| {children} | |
| </div> | |
| ); | |
| }; | |
| Card.ListItem = function CardListItem({ | |
| children, | |
| actions, | |
| className, | |
| ...props | |
| }) { | |
| return ( | |
| <div | |
| className={cn( | |
| "group flex items-center justify-between p-3 -mx-3 px-3", | |
| "border-b border-border-subtle last:border-b-0", | |
| "hover:bg-surface-2/50 transition-colors", | |
| className | |
| )} | |
| {...props} | |
| > | |
| <div className="flex-1 min-w-0">{children}</div> | |
| {actions && ( | |
| <div className="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity"> | |
| {actions} | |
| </div> | |
| )} | |
| </div> | |
| ); | |
| }; | |