{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "agregar-subascoins", "type": "registry:block", "title": "agregar-subascoins", "description": "Bloque Concorde agregar-subascoins — incluye sus 2 componentes.", "dependencies": [ "react" ], "registryDependencies": [], "files": [ { "path": "bloques/agregar-subascoins/desktop/AgregarSubascoins.tsx", "type": "registry:file", "target": "bloques/agregar-subascoins/desktop/AgregarSubascoins.tsx", "content": "/**\n * AgregarSubascoins — Bloque de Concorde (Voyager DS)\n *\n * Pantalla «Agregar SubasCoins»: Header logueado + un área gris placeholder\n * (mismo gris que los banners de los demás bloques) que ocupa el resto del alto.\n *\n * Bloque = composición de componentes existentes (reusa el bloque Header).\n */\n\nimport type { CSSProperties, JSX } from \"react\";\nimport AppHeader from \"@/concorde/bloques/header/desktop/Header\";\nimport { HEADER_HEIGHT } from \"@/concorde/bloques/header/desktop/dimensions\";\nimport SubasCoinsCard from \"./SubasCoinsCard\";\nimport { AGREGARSUBASCOINS_WIDTH, AGREGARSUBASCOINS_HEIGHT } from \"./dimensions\";\n\nexport { AGREGARSUBASCOINS_WIDTH, AGREGARSUBASCOINS_HEIGHT } from \"./dimensions\";\n\nexport interface AgregarSubascoinsProps {\n /** Usuario logueado — alimenta el CTA del header. */\n username?: string;\n /** Renderiza el AppHeader interno. `false` cuando el visor lo dibuja aparte. Default `true`. */\n renderHeader?: boolean;\n className?: string;\n}\n\n// Banner placeholder gris 766×120 (igual estilo que los banners de Homepage / Zona).\nconst BANNER_PLACEHOLDER: CSSProperties = {\n width: 766,\n height: 120,\n borderRadius: 8,\n background: \"#E9EAEC\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 13,\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n color: \"#9AA1AC\",\n};\n\nexport default function AgregarSubascoins({ username = \"ZAEX5G\", renderHeader = true, className = \"\" }: AgregarSubascoinsProps): JSX.Element {\n return (\n \n {renderHeader ? : null}\n\n {/* Área blanca: columna de 766 (16px a cada lado = 798), gap 16 entre secciones */}\n
\n
\n {/* Banner superior 766×120 */}\n
\n BANNER\n
\n\n {/* Card «Adquiere SubasCoins» 766×437 */}\n \n\n {/* Banner Centro de ayuda 766×100 */}\n
\n CENTRO DE AYUDA\n
\n
\n
\n \n );\n}\n" }, { "path": "bloques/agregar-subascoins/desktop/dimensions.ts", "type": "registry:file", "target": "bloques/agregar-subascoins/desktop/dimensions.ts", "content": "/**\n * Dimensiones del bloque Agregar Subascoins — módulo PLANO (sin \"use client\")\n * para que los Server Components (catálogo /blocks, página del bloque) puedan\n * importar estas constantes sin que se evalúen a undefined → NaN en los cálculos\n * de escala.\n *\n * Agregar Subascoins = Header (vault, 64) + área gris (placeholder) hasta 785 alto.\n */\n\nexport const AGREGARSUBASCOINS_WIDTH = 798;\n// 64 (header) + 24 + [120 banner + 16 + 437 card + 16 + 100 help] + 24\nexport const AGREGARSUBASCOINS_HEIGHT = 801;\n" }, { "path": "bloques/agregar-subascoins/desktop/SubasCoinsCard.tsx", "type": "registry:file", "target": "bloques/agregar-subascoins/desktop/SubasCoinsCard.tsx", "content": "\"use client\";\n\n/**\n * SubasCoinsCard — card 766×437 del bloque «Agregar Subascoins».\n *\n * 2 columnas:\n * · Izquierda → título + SubasCoinsInfoCard (beneficios) + nota del valor >S<\n * · Derecha → AmountOptionGroup (montos 30/50/80/130 + monto personalizado) + botón «Sigamos»\n */\n\nimport { useState } from \"react\";\nimport type { JSX } from \"react\";\nimport AmountOptionGroup, { type AmountSelection } from \"@/concorde/components/AmountOptionGroup\";\nimport Button from \"@/concorde/components/Button\";\nimport SubasCoinsInfoCard from \"./SubasCoinsInfoCard\";\n\nexport const SUBASCOINSCARD_WIDTH = 766;\nexport const SUBASCOINSCARD_HEIGHT = 437;\n\nexport interface SubasCoinsCardProps {\n className?: string;\n}\n\nexport default function SubasCoinsCard({ className = \"\" }: SubasCoinsCardProps): JSX.Element {\n const [sel, setSel] = useState(2); // \">S< 80\" preseleccionado\n\n return (\n \n {/* ── Columna izquierda ── */}\n
\n \n ¡Adquiere{\" \"}\n \n SubasCoins\n {\" \"}\n y disfruta de sus beneficios!\n \n\n \n\n

\n El valor de {\">S<\"} 1 es equivalente a US$ 1 (un Dólar Americano).\n

\n
\n\n {/* ── Columna derecha ── */}\n
\n \n
\n \n
\n
\n \n );\n}\n" }, { "path": "bloques/agregar-subascoins/desktop/SubasCoinsInfoCard.tsx", "type": "registry:file", "target": "bloques/agregar-subascoins/desktop/SubasCoinsInfoCard.tsx", "content": "\"use client\";\n\n/**\n * SubasCoinsInfoCard — sub-componente del bloque «Agregar Subascoins».\n *\n * Card morado «Selecciona los SubasCoins que deseas adquirir» con:\n * · header gradiente (#8460E5 → #3B1782) + ícono $ circular gradiente\n * · lista de beneficios (pills con bullet gradiente naranja→morado)\n * Recreado en HTML/CSS (no SVG) para que sea editable y escalable.\n */\n\nimport type { JSX } from \"react\";\n\nconst STYLE_ID = \"concorde-subascoinsinfocard-styles\";\n\nconst STYLES = `\n.scinfo {\n box-sizing: border-box;\n width: 392px;\n max-width: 100%;\n border-radius: 16px;\n background: #ffffff;\n box-shadow: 0 0 16px 4px rgba(0,0,0,0.10);\n overflow: hidden;\n font-family: var(--vmc-font-display, \"Plus Jakarta Sans\", -apple-system, sans-serif);\n}\n.scinfo__head {\n box-sizing: border-box;\n position: relative;\n height: 88px;\n padding: 0 24px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n background: linear-gradient(115deg, #8460E5 0%, #3B1782 100%);\n overflow: hidden;\n}\n.scinfo__eyebrow { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.85); margin: 0; }\n.scinfo__title { font-size: 22px; font-weight: 800; letter-spacing: -0.01em; color: #ffffff; margin: 2px 0 0; }\n.scinfo__sub { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.85); margin: 2px 0 0; }\n.scinfo__coin {\n position: absolute;\n top: 20px;\n right: 24px;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: linear-gradient(135deg, #ED8936 0%, #ED8936 40%, #8460E5 100%);\n border: 1px solid rgba(255,255,255,0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ffffff;\n font-size: 22px;\n font-weight: 800;\n box-shadow: 0 2px 6px rgba(237,137,54,0.3);\n}\n.scinfo__body {\n box-sizing: border-box;\n height: 157px;\n padding: 20px 24px 24px;\n}\n.scinfo__benefitslabel {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: #99A1AF;\n margin: 0 0 14px;\n}\n.scinfo__pill {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n height: 40px;\n padding: 0 16px;\n border-radius: 20px;\n border: 1px solid transparent;\n background-image: linear-gradient(#ffffff, #ffffff), linear-gradient(135deg, #CFBAFF 0%, #ffffff 35%, #AE8EFF 65%, #CFBAFF 100%);\n background-origin: border-box;\n background-clip: padding-box, border-box;\n box-shadow: 0 0 16px 4px rgba(0,0,0,0.06);\n}\n.scinfo__pill + .scinfo__pill { margin-top: 16px; }\n.scinfo__bullet {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: linear-gradient(135deg, #ED8936 0%, #ED8936 40%, #8460E5 100%);\n border: 1.5px solid;\n border-image: linear-gradient(135deg, #ffffff, #FBC47D 25%, #AE8EFF 75%, #ffffff) 1;\n box-shadow: 0 2px 6px rgba(237,137,54,0.3), inset 0 1px 0 rgba(255,255,255,0.28);\n}\n.scinfo__pilltext { font-size: 14px; font-weight: 700; color: #3B1782; }\n`;\n\nlet _injected = false;\n\nexport interface SubasCoinsInfoCardProps {\n benefits?: string[];\n className?: string;\n}\n\nexport default function SubasCoinsInfoCard({\n benefits = [\"Consignaciones más bajas\", \"Disponibilidad instantánea\"],\n className = \"\",\n}: SubasCoinsInfoCardProps): JSX.Element {\n if (typeof document !== \"undefined\" && !_injected) {\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 _injected = true;\n }\n\n return (\n <>\n