--- type: SPEC asset_id: SPEC-REB-RevClub-DirectorioMiembros-v02 version: v02 status: Draft owner: Victor Heredia sherpa_owner: Jay fecha_creacion: 2026-05-20 fecha_ultima_actualizacion: 2026-05-20 fecha_migracion_bmf: 2026-05-20 intellbank: IB-REB-Rebelocity subbank: — proposito: SPEC · RevClub DirectorioMiembros · IB-REB-Rebelocity nota_migracion: Frontmatter BMF agregado en batch masivo 2026-05-20 · Workbench FASE 5C · proposito pendiente revisión manual --- # Directorio de Miembros — Revelocity Club **Spec de desarrollo · Fase 1 (MVP)** **Versión:** 2.0 | **Fecha:** Mayo 2026 | **Owner:** Anahí Martínez — EmpowerLabs --- ## TL;DR — Qué se construye y por qué Los atletas del evento 5150 Encarnación buscan compañeros de equipo de relevo (un participante por segmento: natación, ciclismo, carrera) a través de Instagram, 1 a 1, sin estructura. Revelocity Club tiene la comunidad exacta para resolver esto en la plataforma. Se construye un **Directorio de Miembros**: una vista filtrable de todos los usuarios registrados, con tarjetas de perfil deportivo y contacto directo vía mensajería interna. **Separación importante:** este directorio es distinto e independiente del directorio de proveedores/sponsors que ya existe en la plataforma. No se toca ese directorio. Se crea uno nuevo. --- ## Preguntas que deben responderse antes de arrancar > ⚠️ Estas dos definiciones impactan directamente el alcance de Fase 1. Responder antes de iniciar desarrollo. | # | Pregunta | Impacto si no se responde | |---|---|---| | 1 | ¿La mensajería interna entre usuarios ya existe? | Define si el botón "Enviar mensaje" conecta a algo real o necesita construirse | | 2 | ¿Los campos de perfil deportivo van en la sección de perfil existente o en una sección nueva "Perfil deportivo"? | Define el flujo de edición de datos del usuario | Las demás preguntas (URL, moderación, notificaciones) se pueden resolver durante o después de Fase 1. --- ## Fase 1 — MVP (2–3 semanas) ### Lo que incluye - Vista de grid con tarjetas de miembro (filtrable) - Filtros: Disciplina, Rol, País/Región, Evento objetivo, Nivel - Modal de perfil completo al hacer clic en una tarjeta - Botón de contacto (con y sin sesión activa) - Campos de perfil deportivo en configuración de usuario - Toggle de privacidad: el usuario puede desactivar su aparición en el directorio ### Lo que NO incluye en Fase 1 - Funcionalidad de relevo (toggle "Busca relevo", badges, sub-filtros) → Fase 2 - Perfil extendido de Coach o Club → Fase 3 - Notificaciones de compatibilidad → Fase 3 --- ## Pantalla: Vista de directorio ### URL sugerida `/comunidad/directorio` o `/directorio/miembros` — a definir con el equipo. ### Layout - Barra de filtros fija en la parte superior - Grid de tarjetas debajo (3 columnas en desktop, 2 en tablet, 1 en mobile) - Contador de resultados: `X miembros encontrados` - Botón "Limpiar filtros" visible cuando hay algún filtro activo - Los filtros son acumulativos (AND) y actualizan el grid en tiempo real sin recargar la página ### Filtros | Filtro | Tipo de input | Opciones | |---|---|---| | Disciplina | Select | Triatlón · Running · Ciclismo · Natación · Multi-sport · Todas | | Rol | Select | Atleta amateur · Atleta competitivo · Coach · Club · Organizador · Marca · Todos | | País / Región | Select | México · Paraguay · España · Argentina · Colombia · Otro · Todos | | Evento objetivo | Select | IRONMAN · IRONMAN 70.3 · 5150 Encarnación · L'Étape TDF · Otro · Todos | | Nivel | Select | Principiante · Amateur · Competitivo · Élite · Todos | ### Buscador por nombre - Input de texto: placeholder `Buscar por nombre...` - Filtra en tiempo real sobre el grid visible (no reemplaza los filtros — se acumula con ellos) ### Ordenamiento del grid Selector desplegable: - **Recientes** (default): por fecha de registro, más nuevo primero - **Alfabético**: A → Z por nombre ### Estado vacío `No encontramos miembros con esos filtros. Prueba ajustando tu búsqueda.` ### Paginación 20 perfiles por carga. Opción: infinite scroll con lazy loading o paginación clásica — a criterio del equipo. --- ## Componente: Tarjeta de miembro (grid) Información visible en la tarjeta: | Campo | Notas | |---|---| | Foto de perfil | Imagen circular. Sin foto → iniciales del nombre en fondo de color generado por el sistema | | Nombre | Nombre visible (nombre de pila + inicial de apellido, o nombre completo según lo que el usuario configuró) | | Género + Edad | `Femenino · 34 años` — solo si el usuario lo autorizó | | Ciudad, País | `Asunción, Paraguay` | | Disciplina(s) | Chips/tags: Triatlón, Running, Ciclismo, etc. | | Rol | Tag adicional si es Coach o Club (diferenciado visualmente del resto) | **Interacción:** - Clic en la tarjeta → abre modal de perfil completo - Hover → cambio sutil de borde (feedback visual) --- ## Componente: Modal de perfil completo Se abre sobre el grid (overlay). Dos columnas. ### Columna izquierda | Elemento | Descripción | |---|---| | Foto de perfil | Grande, circular (80–100px) | | Nombre completo | Según lo configurado por el usuario | | Género + Edad | Solo si fue autorizado | | Ciudad, País | Localización | ### Columna derecha — Perfil deportivo | Campo | Tipo | |---|---| | Disciplina(s) | Tags (multi) | | Rol en el ecosistema | Tag único | | Nivel | Tag único | | Evento objetivo 2026 | Tags (multi) | | Frase o motivación | Texto libre — máx. 120 caracteres. Ej: *"Cada carrera me recuerda por qué me levanto a las 5am"* | | Afiliación | Nombre del club o equipo (opcional) | | Busco coach | Indicador visible si el atleta lo activó | | Acepto atletas | Indicador visible solo si el rol es Coach y lo activó | ### Botón de contacto - **Usuario con sesión activa:** `Enviar mensaje` → abre mensajería interna con el perfil pre-seleccionado como destinatario - **Usuario sin sesión:** texto `Inicia sesión para contactar a este miembro` + CTA de login --- ## Acceso y visibilidad | Condición del visitante | Comportamiento | |---|---| | No registrado | Puede ver el directorio y las tarjetas. No puede contactar ni ver información de contacto | | Registrado con sesión | Acceso completo: ver perfiles, filtrar, enviar mensajes | | Perfil sin completar | Aparece en el directorio con nombre y foto, sin disciplina/evento | | Visibilidad desactivada | No aparece en el directorio. La desactiva desde su configuración de perfil | > **Privacidad:** El correo electrónico nunca es visible. El contacto ocurre únicamente a través del sistema de mensajería interno. --- ## Campos de perfil — Lo que completa el usuario Estos campos se agregan a la sección de configuración de perfil del usuario. El Rally de Bienvenida (Etapa 2) los solicita durante el onboarding, por lo que muchos miembros llegarán con estos datos ya cargados. ### Obligatorios para aparecer en el directorio | Campo | Tipo | |---|---| | Nombre visible | Texto | | Foto de perfil | Imagen | | Disciplina principal | Select (una o varias) | | País | Select | ### Opcionales (enriquecen el perfil) | Campo | Tipo | |---|---| | Edad | Número | | Ciudad | Texto | | Género | Select: Masculino / Femenino / Prefiero no decir | | Rol en el ecosistema | Select | | Nivel | Select | | Evento objetivo | Multi-select | | Frase / motivación | Texto corto (120 caracteres) | | Afiliación (club o equipo) | Texto | | Busco coach | Boolean (toggle) | | Acepto atletas | Boolean (toggle, solo visible si rol = Coach) | ### Privacidad | Campo | Tipo | Default | |---|---|---| | `visible_en_directorio` | Boolean | `true` | Texto del toggle en perfil: - ON: `Apareces en el directorio` - OFF: `No apareces en el directorio` --- ## Base de datos — Campos nuevos al modelo de usuario ``` users table — campos a agregar: disciplinas array (multi-select) rol_ecosistema string, enum nivel string, enum eventos_objetivo array (multi-select) frase_motivacion string, max 120 chars afiliacion string, optional busca_coach boolean, default: false acepta_atletas boolean, default: false link_linkedin url, optional link_strava url, optional link_instagram url, optional visible_en_directorio boolean, default: true ``` > Los campos de relevo (`busca_relevo`, `relevo_evento`, `relevo_posicion_disponible`, etc.) se agregan en Fase 2. --- ## API — Endpoints Fase 1 | Endpoint | Método | Auth | Descripción | |---|---|---|---| | `/directorio/miembros` | GET | Pública | Lista paginada con filtros como query params | | `/directorio/miembros/:id` | GET | Pública | Perfil completo de un miembro | | `/perfil/deportivo` | PUT | Requerida | Actualizar campos de perfil deportivo del usuario autenticado | | `/perfil/visibilidad` | PUT | Requerida | Activar / desactivar visibilidad en directorio | ### Query params para `GET /directorio/miembros` ``` ?disciplina=triatlon ?rol=coach ?pais=paraguay ?evento=5150 ?nivel=amateur ?nombre=carlos ← búsqueda por texto ?orden=recientes ← recientes | alfabetico ?page=1 ?limit=20 ``` --- ## Copywriting — Textos de UI | Elemento | Texto | |---|---| | Título de la sección | Directorio de miembros | | Subtítulo | Encuentra atletas, coaches y clubes de la comunidad endurance | | Placeholder buscador | Buscar por nombre... | | Contador | X miembros encontrados | | Sin resultados | No encontramos miembros con esos filtros. Prueba ajustando tu búsqueda. | | Botón contacto (con sesión) | Enviar mensaje | | Sin sesión | Inicia sesión para contactar a este miembro | | Toggle directorio ON | Apareces en el directorio | | Toggle directorio OFF | No apareces en el directorio | | CTA completar perfil | Completa tu perfil deportivo para aparecer en el directorio → | --- ## Lo que viene después de Fase 1 | Fase | Qué incluye | Cuándo | |---|---|---| | **Fase 2** | Toggle "Busca relevo", campos de relevo en perfil, badge en tarjetas, sub-filtro de posición buscada, bloque de relevo en modal | Antes del próximo 5150 Encarnación / IRONMAN 70.3 | | **Fase 3** | Perfil extendido de Coach, perfil de Club, badge "Miembro Fundador", seguir a un miembro, estadísticas del directorio | Post-lanzamiento | --- *Spec v2.0 — EmpowerLabs para Revelocity Club · Mayo 2026* *Para la spec completa de Fase 2 y Fase 3 ver: SPEC-RevClub-DirectorioMiembros-v01.md*