{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "activitycard", "type": "registry:component", "title": "ActivityCard", "description": "Componente Concorde ActivityCard — un solo archivo, ActivityCard.tsx.", "dependencies": [ "react" ], "registryDependencies": [], "files": [ { "path": "components/ActivityCard.tsx", "type": "registry:file", "target": "components/ActivityCard.tsx", "content": "\"use client\";\n\n/**\n * ActivityCard — Generado por Concorde\n * Fuente: Figma VOYAGER · \"Activity Card\" (nodo 2020:13636)\n *\n * Tarjeta «Tu actividad» 375×221 (blanca, radius 16, drop shadow suave):\n * · Header: CardTitle «TU ACTIVIDAD» (brackets)\n * · Divisor #E1E3E2\n * · Grid 2×2 de pills de conteo (badge translúcido + label):\n * Ganadas (gradiente naranja→lila) · Consignaciones · Procesos de compra ·\n * Rechazadas (gradiente lila). Cada pill 142×40, borde gradiente.\n */\n\nimport type { JSX, ReactNode } from \"react\";\nimport CardTitle from \"@/concorde/components/CardTitle\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ActivityCardProps {\n /** Título de la tarjeta (default \"TU ACTIVIDAD\"). */\n title?: string;\n /** Conteo «Ganadas» (default 1). */\n won?: number | string;\n /** Conteo «Consignaciones» (default 1). */\n consignments?: number | string;\n /** Conteo «Procesos de compra» (default 1). */\n purchases?: number | string;\n /** Conteo «Rechazadas» (default 1). */\n rejected?: number | string;\n className?: string;\n}\n\n// ─── Self-contained CSS ───────────────────────────────────────────────────────\n\nconst STYLE_ID = \"concorde-activitycard-styles\";\n\nconst STYLES = `\n.actcard {\n box-sizing: border-box;\n width: 375px;\n height: 221px;\n border-radius: 16px;\n background: #ffffff;\n box-shadow: 0 0 8px 4px rgba(0,0,0,0.08);\n padding: 16px;\n display: flex;\n flex-direction: column;\n font-family: var(--vmc-font-display, \"Plus Jakarta Sans\", -apple-system, sans-serif);\n}\n.actcard__header { display: flex; align-items: center; }\n.actcard__divider { height: 1px; background: #E1E3E2; margin-top: 8px; }\n.actcard__grid {\n flex: 1;\n width: 318px;\n margin: 0 auto;\n display: grid;\n grid-template-columns: 1fr 1fr;\n column-gap: 34px;\n row-gap: 28px;\n align-content: center;\n}\n/* ── Pill de actividad — badge absoluto izquierda + label centrado ── */\n.actpill {\n display: flex;\n align-items: center;\n height: 40px;\n padding: 0 8px 0 40px;\n border-radius: 9999px;\n border: 2px solid transparent;\n position: relative;\n color: #ffffff;\n}\n.actpill--orange {\n /* Fill VYGradientOrange (#ED8936 → #8460E5) + borde white→#FBC47D→#AE8EFF→white */\n background:\n linear-gradient(131deg, #ED8936 0%, #ED8936 40%, #8460E5 100%) padding-box,\n linear-gradient(135deg, #FFFFFF 0%, #FBC47D 25%, #AE8EFF 75%, #FFFFFF 100%) border-box;\n box-shadow: 0 4px 10px rgba(237,137,54,0.30), inset 0 1px 0 rgba(255,255,255,0.25);\n}\n.actpill--purple {\n /* Fill vault (#8460E5 → #3B1782) + borde #CFBAFF→white→#AE8EFF→#CFBAFF */\n background:\n linear-gradient(159deg, #8460E5 0%, #3B1782 100%) padding-box,\n linear-gradient(135deg, #CFBAFF 0%, #FFFFFF 35%, #AE8EFF 65%, #CFBAFF 100%) border-box;\n box-shadow: 0 4px 10px rgba(59,23,130,0.32), inset 0 1px 0 rgba(255,255,255,0.22);\n}\n/* Badge absoluto — no ocupa espacio flex, siempre pegado a la izquierda */\n.actpill__badge {\n position: absolute;\n left: 4px;\n top: 4px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(255,255,255,0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 15px;\n font-weight: 600;\n color: #ffffff;\n}\n/* Label centrado respecto al ancho total del pill */\n.actpill__label {\n flex: 1;\n min-width: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.15;\n letter-spacing: -0.01em;\n text-align: center;\n}\n`;\n\nlet _stylesInjected = false;\n\n// ─── Pill ───────────────────────────────────────────────────────────────────\n\nfunction ActivityPill({ tone, count, label }: { tone: \"orange\" | \"purple\"; count: ReactNode; label: string }): JSX.Element {\n return (\n
{subtitle}
: null}\n