{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "tu-perfil", "type": "registry:block", "title": "tu-perfil", "description": "Bloque Concorde tu-perfil — incluye sus 4 componentes.", "dependencies": [ "react" ], "registryDependencies": [], "files": [ { "path": "bloques/tu-perfil/desktop/dimensions.ts", "type": "registry:file", "target": "bloques/tu-perfil/desktop/dimensions.ts", "content": "/**\n * Dimensiones del bloque Tu Perfil — módulo PLANO (sin \"use client\") para que los\n * Server Components (catálogo /blocks, página del bloque) puedan importar estas\n * constantes sin que se evalúen a undefined → NaN en los cálculos de escala.\n *\n * Tu Perfil = Header (vault, 64) + área gris (placeholder) hasta 785 alto.\n */\n\nexport const TUPERFIL_WIDTH = 798;\n// 64 (header) + 24 + [120 banner + 16 + (239 + 24 + 157 cards) + 16 + 48 logout + 16 + 100 help] + 24\nexport const TUPERFIL_HEIGHT = 848;\n" }, { "path": "bloques/tu-perfil/desktop/ProfileCard.tsx", "type": "registry:file", "target": "bloques/tu-perfil/desktop/ProfileCard.tsx", "content": "\"use client\";\n\n/**\n * ProfileCard — cards del bloque «Tu Perfil».\n *\n * Card 1 «Tu Perfil» (766×239): título gradiente + fila de stats (riesgo, puntos\n * VMC, expiración) + botón primary «Canjear Puntos VMC» (200×40) + Información\n * Personal con 3 inputs (Nombres · Apellidos · N° documento, 228×48 c/u).\n * Card 2 «Información de Contacto» (766×157 hug): 2 columnas (Teléfono · Correo),\n * cada una con label + «Editar» + input (355×48).\n *\n * Reutiliza los componentes Input, Button, StarIcon, InfoIcon.\n */\n\nimport type { CSSProperties, JSX, ReactNode } from \"react\";\nimport Input from \"@/concorde/components/Input\";\nimport Button from \"@/concorde/components/Button\";\nimport StarIcon from \"@/concorde/components/StarIcon\";\nimport InfoIcon from \"@/concorde/components/InfoIcon\";\n\nconst CARD_BASE: CSSProperties = {\n boxSizing: \"border-box\",\n width: 766,\n background: \"#ffffff\",\n borderRadius: 16,\n // Sombra centrada y sutil (como el resto de cards del proyecto), no lateral/flotante.\n boxShadow: \"0 0 16px 4px rgba(0,0,0,0.08)\",\n fontFamily: 'var(--vmc-font-display, \"Plus Jakarta Sans\", -apple-system, sans-serif)',\n};\n\n// Título con gradiente morado (VYGradientPurple: #5F3ED8 → #340091 → #140046).\nconst GRADIENT_TITLE: CSSProperties = {\n margin: 0,\n fontSize: 18,\n lineHeight: \"24px\",\n fontWeight: 800,\n backgroundImage: \"linear-gradient(135deg, #5F3ED8 0%, #340091 55%, #140046 100%)\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n color: \"transparent\",\n WebkitTextFillColor: \"transparent\",\n};\n\n// Línea separadora bajo el título (gris #E1E3E2). En Figma va de x=32 a x=766\n// dentro de un card de 766 con padding 32 → sobresale 16px a cada lado del padding.\nconst DIVIDER: CSSProperties = { height: 1, background: \"#E1E3E2\", margin: \"14px -16px 0\" };\n\nconst LABEL: CSSProperties = { fontSize: 11, fontWeight: 700, letterSpacing: \"0.04em\", textTransform: \"uppercase\", color: \"#99A1AF\" };\nconst FIELD_LABEL: CSSProperties = { fontSize: 13, fontWeight: 500, color: \"#3B1782\" };\nconst EDITAR: CSSProperties = { fontSize: 13, fontWeight: 600, color: \"#3B1782\", cursor: \"pointer\", textDecoration: \"underline\", textUnderlineOffset: 2 };\n\ninterface FieldProps {\n label: string;\n width: number;\n defaultValue?: string;\n editable?: boolean;\n}\n\nfunction Field({ label, width, defaultValue, editable = false }: FieldProps): JSX.Element {\n return (\n
\n
\n {label}\n {editable ? Editar : null}\n
\n {/* Input a ancho completo de la columna (se alarga hasta el «Editar») */}\n \n
\n );\n}\n\nexport interface ProfileCardProps {\n className?: string;\n}\n\nexport default function ProfileCard({ className = \"\" }: ProfileCardProps): JSX.Element {\n return (\n
\n {/* Los Input reutilizados traen width fija (234); .pinput-fill los alarga al ancho de su columna */}\n