--- type: SPEC asset_id: SPEC-REB-RClub-DirectorioMiembros-v01 version: v01 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 · RClub DirectorioMiembros · IB-REB-Rebelocity nota_migracion: Frontmatter BMF agregado en batch masivo 2026-05-20 · Workbench FASE 5C · proposito pendiente revisión manual --- # SPEC-RClub-DirectorioMiembros-v01.md **Especificación Funcional — Directorio de Miembros** **Revelocity Club · Para equipo de programación** **Versión:** 1.0 | **Fecha:** Mayo 2026 --- ## 1. Contexto y problema que resuelve ### Problema real identificado En el evento **5150 Encarnación**, múltiples atletas buscaban compañeros para formar equipos de **relevo** (un participante por segmento: natación, ciclismo, carrera). Al no existir un directorio propio, esa búsqueda se hacía 1 a 1 vía Instagram, con pérdida de tiempo, alcance limitado y sin estructura. Revelocity Club es el espacio natural para resolver este problema: una comunidad de atletas de resistencia que ya están en la misma plataforma y comparten el mismo ecosistema de eventos. ### Lo que existe actualmente - **Directorio de proveedores/sponsors**: directorio general de empresas y marcas del ecosistema. Este directorio **no se modifica** — sigue operando igual. - **Perfiles de usuario**: cada miembro tiene un perfil en la plataforma (nombre, foto, bio básica). ### Lo que se construye Un **Directorio de Miembros** independiente: una vista filtrable y searchable de todos los miembros registrados en Revelocity Club, con tarjetas de perfil con información deportiva relevante y una funcionalidad específica de **búsqueda de compañero de relevo** para eventos del ecosistema. --- ## 2. Objetivo de la vista **Objetivo principal:** Permitir que los miembros de Revelocity Club se encuentren entre sí, conozcan el perfil deportivo de otros atletas y puedan conectar directamente dentro de la plataforma — especialmente para formación de equipos de relevo en eventos del ecosistema (5150 Encarnación, IRONMAN 70.3, L'Étape). **Objetivos secundarios:** - Dar visibilidad a coaches que buscan atletas y a atletas que buscan coach - Fortalecer la identidad de comunidad endurance al hacer visible quién forma parte del club - Reducir la fricción de conexión entre miembros (actualmente ocurre fuera de la plataforma, en Instagram o WhatsApp) --- ## 3. Acceso y permisos | Condición | Comportamiento | |---|---| | Usuario no registrado | Puede ver el directorio y las tarjetas, pero **no puede contactar** ni ver información de contacto | | Usuario registrado (sesión activa) | Acceso completo: ver perfiles, usar filtros, enviar mensajes | | Usuario que no completó su perfil deportivo | Aparece en el directorio con información básica (nombre, foto) pero sin disciplina/evento | | Usuario que desactivó su visibilidad | No aparece en el directorio (opción en configuración de perfil) | --- ## 4. Filtros de búsqueda ### 4.1 Filtros principales (visibles en la barra de filtros) | Filtro | Tipo | Opciones | |---|---|---| | **Disciplina** | Select | Triatlón, Running, Ciclismo, Natación, Multi-sport, Todas | | **Rol** | Select | Atleta amateur, Atleta competitivo, Coach, Club, Organizador, Marca, Todos | | **Evento objetivo** | Select | IRONMAN, IRONMAN 70.3, 5150 Encarnación, L'Étape TDF, Otro, Todos | | **País / Región** | Select | México, Paraguay, España, Argentina, Colombia, Otro, Todos | | **Nivel** | Select | Principiante, Amateur, Competitivo, Élite, Todos | ### 4.2 Filtro especial — Busca relevo (toggle destacado) Este filtro es el de mayor prioridad estratégica y debe diferenciarse visualmente del resto. - **Toggle independiente**: botón/chip con ícono de equipo y texto "Busca compañero de relevo" - **Al activarse**: filtra solo los miembros que tienen activo el flag `busca_relevo = true` - **Sub-filtro opcional** (aparece al activar el toggle): Posición buscada → Natación / Ciclismo / Carrera / Cualquiera ### 4.3 Comportamiento de filtros - Los filtros son acumulativos (AND): si selecciono Triatlón + México + Busca relevo, muestra solo miembros que cumplen las tres condiciones - Cada cambio de filtro actualiza el grid en tiempo real (sin recargar página) - Mostrar contador de resultados: "X miembros encontrados" - Botón "Limpiar filtros" siempre visible cuando hay algún filtro activo --- ## 5. Vista de grid — Tarjeta de miembro ### 5.1 Información visible en la tarjeta (grid) | Campo | Descripción | |---|---| | **Foto de perfil** | Imagen circular. Si no tiene foto: iniciales del nombre en fondo de color | | **Nombre** | Nombre visible (puede ser solo nombre de pila + inicial del apellido) | | **Género + Edad** | "Femenino · 34 años" (si el usuario lo autorizó en su perfil) | | **Ciudad, País** | Localización | | **Disciplina(s)** | Chips/tags: Triatlón, Running, Ciclismo, etc. | | **Rol** | Tag adicional si es Coach o Club (diferenciado visualmente) | | **Badge "Busca relevo"** | Solo visible si `busca_relevo = true` — destacado con color de acento (rojo/naranja) | ### 5.2 Interacción con la tarjeta - Al hacer clic en una tarjeta → abre el **modal de perfil completo** (ver Sección 6) - Hover sobre la tarjeta → ligero cambio de borde (feedback visual) - Las tarjetas con `busca_relevo = true` tienen un borde sutil de color acento para distinguirse en el grid sin el filtro activo ### 5.3 Ordenamiento del grid Opciones de orden (selector visible): - **Recientes** (default): por fecha de registro, más nuevo primero - **Busca relevo primero**: miembros con el flag activo aparecen al inicio - **Alfabético**: A → Z por nombre --- ## 6. Modal de perfil completo Al hacer clic en una tarjeta se abre un modal (overlay) con el perfil completo del miembro. ### 6.1 Sección izquierda del modal | Elemento | Descripción | |---|---| | Foto de perfil (grande) | Circular, 80-100px | | Nombre completo | Nombre y apellido visible | | Género + Edad | Si fue autorizado | | Ciudad, País | Localización | ### 6.2 Sección derecha del modal — Información deportiva | Campo | Tipo | Descripción | |---|---|---| | **Disciplina(s)** | Multi-select | Triatlón, Running, Ciclismo, Natación, Multi-sport | | **Rol en el ecosistema** | Select | Atleta amateur / Atleta competitivo / Élite / Coach / Club / Organizador / Marca | | **Nivel** | Select | Principiante / Amateur / Competitivo / Élite | | **Evento objetivo 2026** | Multi-select | IRONMAN, IRONMAN 70.3, 5150 Encarnación, L'Étape, Otro | | **Frase o motivación** | Texto libre (máx. 120 caracteres) | Ej: "Cada carrera me recuerda por qué me levanto a las 5am" | | **Afiliación** | Texto libre | Nombre del club o equipo (opcional) | | **Coach buscado** | Boolean | "Busco coach" — visible si el atleta lo activó | | **Atletas disponibles** | Boolean | "Acepto atletas" — solo visible si el rol es Coach | ### 6.3 Bloque de relevo (visible solo si busca_relevo = true) Este bloque aparece al inicio de la sección derecha, destacado con fondo de color: ``` 🔴 Busca compañero de relevo Evento: 5150 Encarnación 2026 Posición disponible en su equipo: Ciclismo Posición que cubre él/ella: Natación ``` ### 6.4 Botón de contacto - **Si el visitante tiene sesión activa:** botón "Enviar mensaje" → abre el sistema de mensajería interno de la plataforma con el perfil pre-seleccionado como destinatario - **Si el visitante no tiene sesión:** texto "Inicia sesión para contactar a este miembro" con CTA de login --- ## 7. Campos del perfil del usuario — Lo que debe completar el miembro Estos campos se completan en la sección de **Configuración de perfil** del usuario y alimentan directamente el Directorio de Miembros. Se recomienda incorporarlos en el flujo de onboarding (Rally — Etapa 2). ### 7.1 Campos obligatorios (sin estos no aparece en el directorio) | Campo | Tipo | |---|---| | Nombre visible | Texto | | Foto de perfil | Imagen | | Disciplina principal | Select (una o varias) | | País | Select | ### 7.2 Campos 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 | | LinkedIn | URL | | Strava | URL | | Instagram deportivo | URL | ### 7.3 Campos específicos de relevo | Campo | Tipo | Descripción | |---|---|---| | `busca_relevo` | Boolean | Toggle: Sí / No | | `relevo_evento` | Select | ¿Para qué evento? (IRONMAN 70.3, 5150, L'Étape, otro) | | `relevo_posicion_disponible` | Multi-select | ¿Qué posición ofrece? (Natación, Ciclismo, Carrera) | | `relevo_posicion_buscada` | Multi-select | ¿Qué posición necesita? (Natación, Ciclismo, Carrera) | | `relevo_nota` | Texto corto | Nota adicional (ej: "Tengo bici de TT, busco corredor sub-50min en 10K") | ### 7.4 Campo de privacidad | Campo | Tipo | Descripción | |---|---|---| | `visible_en_directorio` | Boolean | Default: Sí. El usuario puede desactivar su visibilidad en el directorio desde su perfil | --- ## 8. Integración con el sistema existente ### 8.1 Relación con el directorio de proveedores/sponsors El **Directorio de Miembros** es una **vista completamente separada** del directorio general de proveedores: | Directorio de proveedores | Directorio de miembros | |---|---| | Empresas, marcas, sponsors | Personas registradas en la plataforma | | Categoría: B2B / ecosistema comercial | Categoría: B2C / comunidad atletas | | Filtros: categoría de producto, país, tipo de empresa | Filtros: disciplina, rol, evento, busca relevo | | Publicado manualmente por el equipo | Generado automáticamente desde perfiles de usuario | ### 8.2 Relación con el onboarding y el Rally La **Etapa 2 del Rally** (Perfil de Atleta) pide exactamente los campos que alimentan este directorio. Es decir: el Rally ya está diseñado para que al completarlo, el perfil del miembro quede enriquecido y visible en el directorio con información real. **No es trabajo duplicado** — el Rally hace el trabajo de onboarding de datos, el Directorio los consume. ### 8.3 Integración con KatIA KatIA puede referenciar el directorio en sus respuestas. Ejemplos de frases que KatIA puede incluir: - *"En el Directorio de Miembros puedes buscar atletas que están formando equipos de relevo para el 5150."* - *"Si buscas coach, activa el filtro 'Coach' en el Directorio — ahí aparecen los coaches registrados en la comunidad."* --- ## 9. Plan de implementación — Fases ### Fase 1 — MVP del Directorio (prioritaria) **Objetivo:** Directorio funcional antes del Rally de Bienvenida. **Incluye:** - Vista de grid con tarjetas de miembro - Filtros: Disciplina, Rol, País, Evento objetivo - Modal de perfil completo con campos básicos - Botón "Enviar mensaje" (integrado con mensajería existente) - Campos de perfil en la sección de configuración del usuario - Flag de visibilidad (on/off en el directorio) **No incluye en Fase 1:** - Flag de busca relevo (se agrega en Fase 2) - Ordenamiento avanzado **Tiempo estimado de desarrollo:** 2–3 semanas (dependiendo de si la mensajería interna ya existe) --- ### Fase 2 — Funcionalidad de Relevo (antes del próximo 5150 / 70.3) **Objetivo:** Resolver el problema concreto de formación de equipos de relevo antes del siguiente evento. **Incluye:** - Toggle y campos de relevo en el perfil del usuario - Badge visual en tarjetas del grid para miembros que buscan relevo - Filtro especial "Busca relevo" con sub-filtro de posición - Bloque de relevo en el modal de perfil - Notificación/alerta para miembros que buscan relevo cuando alguien que encaja se registra (opcional) **Tiempo estimado de desarrollo:** 1–2 semanas adicionales --- ### Fase 3 — Enriquecimiento y engagement (post-lanzamiento) **Objetivo:** Mejorar la utilidad del directorio con el tiempo. **Incluye:** - Perfil de Coach con sección específica (especialidad, disponibilidad, disciplinas que entrena) - Perfil de Club con sección de miembros del club - Indicador "Miembro Fundador" en perfiles del Rally - Estadísticas del directorio visibles para el equipo (total de miembros, disciplinas más comunes, países) - Posibilidad de "seguir" a un miembro (notificaciones opcionales) --- ## 10. Requisitos técnicos para el equipo de programación ### 10.1 Base de datos — Campos nuevos a agregar al modelo de usuario ``` users table — campos nuevos: - disciplinas [] (array, multi-select) - rol_ecosistema (string, enum) - nivel (string, enum) - eventos_objetivo [] (array, multi-select) - frase_motivacion (string, max 120) - afiliacion (string, optional) - link_linkedin (url, optional) - link_strava (url, optional) - link_instagram (url, optional) - visible_en_directorio (boolean, default: true) - busca_relevo (boolean, default: false) - relevo_evento (string, optional) - relevo_posicion_disponible [] (array) - relevo_posicion_buscada [] (array) - relevo_nota (string, max 200, optional) ``` ### 10.2 Endpoints necesarios (API) | Endpoint | Método | Descripción | |---|---|---| | `/directorio/miembros` | GET | Lista paginada de miembros con filtros como query params | | `/directorio/miembros/:id` | GET | Perfil completo de un miembro | | `/perfil/relevo` | PUT | Actualizar campos de relevo del usuario autenticado | | `/perfil/visibilidad` | PUT | Activar / desactivar visibilidad en directorio | ### 10.3 Consideraciones de privacidad - El **correo electrónico** nunca es visible en el directorio — el contacto se hace a través del sistema de mensajería interno - La **edad** solo se muestra si el usuario la ingresó - El **género** solo se muestra si el usuario seleccionó una opción distinta a "Prefiero no decir" - El usuario puede desactivar su visibilidad en el directorio en cualquier momento desde su perfil ### 10.4 Paginación - Mostrar **20 perfiles por página** (o grid infinito con lazy loading) - Ordenamiento default: fecha de registro descendente (más recientes primero) - Los miembros con `busca_relevo = true` tienen opción de aparecen primero cuando ese filtro está activo --- ## 11. Copywriting — Textos de la interfaz | 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..." | | Sin resultados | "No encontramos miembros con esos filtros. Prueba ajustando tu búsqueda." | | Badge relevo | "Busca relevo" | | Botón contacto (con sesión) | "Enviar mensaje" | | Texto sin sesión | "Inicia sesión para contactar a este miembro" | | Toggle visibilidad ON | "Apareces en el directorio" | | Toggle visibilidad OFF | "No apareces en el directorio" | | Límite del perfil alcanzado | "Completa tu perfil deportivo para aparecer en el directorio →" | --- ## 12. Preguntas abiertas para el equipo Antes de comenzar el desarrollo, definir: - [ ] ¿La mensajería interna entre usuarios ya existe en la plataforma? Si no, ¿qué alternativa de contacto se usa en Fase 1? - [ ] ¿Los campos de perfil deportivo se agregan a la sección de perfil existente o se crea una sección separada "Perfil deportivo"? - [ ] ¿El directorio de miembros vive en la misma URL del directorio general o tiene su propia URL? (Recomendado: URL propia, ej: `/directorio/miembros`) - [ ] ¿Se necesita moderación de perfiles? (¿Puede alguien reportar un perfil?) - [ ] Para la Fase 2: ¿se notificará por email o en-app cuando alguien compatible en relevo se registre? --- *Documento generado para el equipo de programación de Revelocity Club.* *Versión inicial para revisión y aprobación antes de comenzar desarrollo.* *Referencia de diseño: otilloswimrun.com/find-a-teammate/ (concepto de tarjetas + modal + filtros)*