{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "walletbalancecard", "type": "registry:component", "title": "WalletBalanceCard", "description": "Componente Concorde WalletBalanceCard — un solo archivo, WalletBalanceCard.tsx.", "dependencies": [ "react" ], "registryDependencies": [], "files": [ { "path": "components/WalletBalanceCard.tsx", "type": "registry:file", "target": "components/WalletBalanceCard.tsx", "content": "\"use client\";\n\n/**\n * WalletBalanceCard — Generado por Concorde\n * Fuente: Figma VOYAGER · \"WalletBalanceCard\" (nodo 2020:13635)\n *\n * Tarjeta «Billetera» 375×221 (blanca, radius 16, drop shadow suave):\n * · Header: CardTitle «BILLETERA» (brackets) + ProfileButton «Transacciones ›»\n * · Divisor #E1E3E2\n * · Filas SubasCoins / Saldo (label morado + valor morado bold)\n * · CTA «Adquiere SubasCoins» (Button sm-guest, círculo + texto, centrado)\n */\n\nimport type { JSX, MouseEventHandler } from \"react\";\nimport CardTitle from \"@/concorde/components/CardTitle\";\nimport ProfileButton from \"@/concorde/components/ProfileButton\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface WalletBalanceCardProps {\n /** Título de la tarjeta (default \"BILLETERA\"). */\n title?: string;\n /** Valor de SubasCoins (default \">S< 0\"). */\n subasCoins?: string;\n /** Valor de Saldo (default \"US$ 0\"). */\n saldo?: string;\n /** Acción / enlace del acceso «Transacciones». */\n onTransactions?: MouseEventHandler;\n transactionsHref?: string;\n /** Click del CTA «Adquiere SubasCoins». */\n onAcquire?: MouseEventHandler;\n className?: string;\n}\n\n// ─── Self-contained CSS ───────────────────────────────────────────────────────\n\nconst STYLE_ID = \"concorde-walletbalancecard-styles\";\n\nconst STYLES = `\n.wbc {\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.wbc__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.wbc__divider {\n height: 1px;\n background: #E1E3E2;\n margin-top: 8px;\n}\n.wbc__body {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding-top: 18px;\n}\n.wbc__rows {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0 4px;\n}\n.wbc__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.wbc__row-label { font-size: 15px; font-weight: 500; color: #3B1782; }\n.wbc__row-value { font-size: 15px; font-weight: 700; color: #3B1782; }\n.wbc__cta {\n margin-top: auto;\n display: flex;\n justify-content: center;\n padding-bottom: 4px;\n}\n/* Botón CTA autónomo — mismo look que sm-guest, texto realmente centrado */\n.wbc__acquire {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n width: 250px;\n height: 40px;\n padding: 0 16px;\n border-radius: 9999px;\n border: 2px solid transparent;\n cursor: pointer;\n overflow: hidden;\n font-family: var(--vmc-font-display, \"Plus Jakarta Sans\", sans-serif);\n font-size: 14px;\n font-weight: 600;\n color: #ffffff;\n text-shadow: rgba(0,0,0,0.2) 0 1px 2px;\n background-image:\n linear-gradient(135deg, #ED8936 0%, #ED8936 40%, #8460e5 100%),\n linear-gradient(135deg, #ffffff 0%, #fbc47d 25%, #ae8eff 75%, #ffffff 100%);\n background-origin: padding-box, border-box;\n background-clip: padding-box, border-box;\n box-shadow: rgba(255,255,255,0.25) 0 1px 0 2px inset, rgba(237,137,54,0.25) 0 2px 6px;\n transition: transform 0.2s cubic-bezier(0.25,0.8,0.25,1), box-shadow 0.25s;\n}\n.wbc__acquire::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 9999px;\n background: linear-gradient(rgba(255,255,255,0.15) 0%, transparent 55%);\n pointer-events: none;\n}\n.wbc__acquire-circle {\n position: absolute;\n left: 4px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(255,255,255,0.2);\n}\n.wbc__acquire:hover {\n transform: translateY(-1px) scale(1.02);\n box-shadow: rgba(255,255,255,0.2) 0 1px 0 2px inset, rgba(132,96,229,0.3) 0 6px 18px, rgba(237,137,54,0.35) 0 3px 8px;\n}\n.wbc__acquire:active {\n transform: scale(0.97) translateY(1px);\n box-shadow: rgba(0,0,0,0.22) 0 2px 4px 2px inset;\n}\n@media (prefers-reduced-motion: reduce) { .wbc__acquire { transition: none; } }\n`;\n\nlet _stylesInjected = false;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport default function WalletBalanceCard({\n title = \"BILLETERA\",\n subasCoins = \">S< 0\",\n saldo = \"US$ 0\",\n onTransactions,\n transactionsHref,\n onAcquire,\n className = \"\",\n}: WalletBalanceCardProps): JSX.Element {\n if (typeof document !== \"undefined\" && !_stylesInjected) {\n if (!document.getElementById(STYLE_ID)) {\n const el = document.createElement(\"style\");\n el.id = STYLE_ID;\n el.textContent = STYLES;\n document.head.appendChild(el);\n }\n _stylesInjected = true;\n }\n\n return (\n <>\n