{
  "version": 3,
  "purpose": "Numbered sections for Jorge + agent feedback. Always read /portal-index.json first when logged in.",
  "url": "https://sportyland.jmautomated.com",
  "agent": {
    "fetch_first": ["/portal-index.json", "/section-map.json"],
    "role_dom": "body[data-portal-role] — guest | member | staff",
    "view_dom": "body[data-portal-view] — e.g. staff-home, member-courts",
    "on_screen_badges": "HIDDEN in production. Read #portalAgentState JSON or [data-section-code]. ?debug=sections shows pills.",
    "live_state": "#portalAgentState (application/json, updates on navigation; element is display:none but always attached)",
    "dom_selectors": ["#portalAgentState", "[data-portal-role]", "[data-section-code]", "body[data-portal-view]"],
    "demo_urls": { "member": "/?demo=member", "staff": "/?demo=staff" },
    "requires_js": "Portal state syncs after app.js. Parse #portalAgentState — do not wait for visible .section-num pills.",
    "namespaces": "landing 0–7 | view M*/S*/C*/… | dock MD*/SD* — see /portal-index.json"
  },
  "chrome": {
    "0": { "id": "topbar", "name": "Barra superior", "selector": "#topbar", "file": "index.html" },
    "7": { "id": "footer", "name": "Pie de página", "selector": "#foot", "file": "index.html" },
    "dock_member": { "prefix": "MD", "name": "Dock socio", "selector": "#dock[data-portal-role=member]" },
    "dock_staff": { "prefix": "SD", "name": "Dock staff", "selector": "#dock[data-portal-role=staff]" }
  },
  "views": {
    "landing": {
      "role": "guest",
      "title": "Portada",
      "prefix": "",
      "sections": [
        { "n": 1, "code": "1", "name": "Hero", "contains": "Video, titular, CTAs" },
        { "n": 2, "code": "2", "name": "El lugar", "contains": "Carrusel IG @sportyland_lm (10 fotos, auto-slide)" },
        { "n": 3, "code": "3", "name": "Deportes y áreas", "contains": "Tarjetas centradas Tenis, Gym, Fútbol, Natación, Campamentos" },
        { "n": 4, "code": "4", "name": "Coaches", "contains": "Retratos del equipo" },
        { "n": 5, "code": "5", "name": "Portal features", "contains": "Tarjetas centradas con CTAs al portal" },
        { "n": 6, "code": "6", "name": "Demo CTA", "contains": "Entrar socio / staff" }
      ]
    },
    "login": {
      "role": "guest",
      "title": "Login",
      "prefix": "L",
      "sections": [
        { "n": 1, "code": "L1", "name": "Bienvenida", "contains": "Título portal" },
        { "n": 2, "code": "L2", "name": "Formulario", "contains": "Email, contraseña, entrar" },
        { "n": 3, "code": "L3", "name": "Demo y volver", "contains": "Demo Partner / Demo Staff" }
      ]
    },
    "member-home": {
      "role": "member",
      "title": "Socio · Inicio",
      "prefix": "M",
      "sections": [
        { "n": 1, "code": "M1", "name": "Saludo", "contains": "Hola + fecha" },
        { "n": 2, "code": "M2", "name": "Siguiente", "contains": "Up Next card" },
        { "n": 3, "code": "M3", "name": "Accesos", "contains": "Grid Reservar / Clases / Privada / Tiendita" },
        { "n": 4, "code": "M4", "name": "Avisos", "contains": "Feed avisos del club" },
        { "n": 5, "code": "M5", "name": "Reservas", "contains": "Tus reservas" }
      ]
    },
    "staff-home": {
      "role": "staff",
      "title": "Staff · Bandeja",
      "prefix": "S",
      "sections": [
        { "n": 1, "code": "S1", "name": "Stats", "contains": "Por confirmar, clases, pedidos" },
        { "n": 2, "code": "S2", "name": "Cola privadas", "contains": "Confirmar / rechazar" },
        { "n": 3, "code": "S3", "name": "Clases y cocina", "contains": "Dos columnas hoy" },
        { "n": 4, "code": "S4", "name": "Ocupación", "contains": "Matriz canchas hoy" },
        { "n": 5, "code": "S5", "name": "Publicar aviso", "contains": "CTA a avisos" }
      ]
    },
    "member-courts": {
      "role": "member",
      "title": "Socio · Canchas",
      "prefix": "C",
      "sections": [
        { "n": 1, "code": "C1", "name": "Encabezado", "contains": "Título reservar" },
        { "n": 2, "code": "C2", "name": "Selector", "contains": "Área, día, horarios" },
        { "n": 3, "code": "C3", "name": "QR cancha", "contains": "Código post-reserva" },
        { "n": 4, "code": "C4", "name": "Mis reservas", "contains": "Feed reservaciones" }
      ]
    },
    "staff-courts": {
      "role": "staff",
      "title": "Staff · Canchas",
      "prefix": "SO",
      "sections": [
        { "n": 1, "code": "SO1", "name": "Encabezado", "contains": "Ocupación solo lectura" },
        { "n": 2, "code": "SO2", "name": "Calendario", "contains": "Strip 7 días" },
        { "n": 3, "code": "SO3", "name": "Matriz", "contains": "Tabla ocupación" }
      ]
    },
    "member-classes": {
      "role": "member",
      "title": "Socio · Clases",
      "prefix": "CL",
      "sections": [
        { "n": 1, "code": "CL1", "name": "Encabezado", "contains": "Título + membresía" },
        { "n": 2, "code": "CL2", "name": "Filtros", "contains": "Día + deporte" },
        { "n": 3, "code": "CL3", "name": "Lista", "contains": "Cards de clases" }
      ]
    },
    "staff-classes": {
      "role": "staff",
      "title": "Staff · Hoy",
      "prefix": "ST",
      "sections": [
        { "n": 1, "code": "ST1", "name": "Encabezado", "contains": "Clases del día" },
        { "n": 2, "code": "ST2", "name": "Calendario", "contains": "Strip 7 días" },
        { "n": 3, "code": "ST3", "name": "Lista", "contains": "Cupo y coach" }
      ]
    },
    "member-private": {
      "role": "member",
      "title": "Socio · Privada",
      "prefix": "P",
      "sections": [
        { "n": 1, "code": "P1", "name": "Encabezado", "contains": "Título clase privada" },
        { "n": 2, "code": "P2", "name": "Solicitud", "contains": "Formulario pedir privada" },
        { "n": 3, "code": "P3", "name": "Historial", "contains": "Tus solicitudes" }
      ]
    },
    "member-snacks": {
      "role": "member",
      "title": "Socio · Tiendita",
      "prefix": "T",
      "sections": [
        { "n": 1, "code": "T1", "name": "Encabezado", "contains": "Tiendita y HK" },
        { "n": 2, "code": "T2", "name": "Vendor", "contains": "Segmento tiendita / HK" },
        { "n": 3, "code": "T3", "name": "Menú", "contains": "Productos + entregar en" },
        { "n": 4, "code": "T4", "name": "Carrito", "contains": "Total + enviar" },
        { "n": 5, "code": "T5", "name": "Pedidos", "contains": "Tus pedidos" }
      ]
    },
    "staff-kitchen": {
      "role": "staff",
      "title": "Staff · Pedidos",
      "prefix": "K",
      "sections": [
        { "n": 1, "code": "K1", "name": "Encabezado", "contains": "Cocina / pedidos" },
        { "n": 2, "code": "K2", "name": "Cola", "contains": "Pedidos por vendor" }
      ]
    },
    "staff-avisos": {
      "role": "staff",
      "title": "Staff · Avisos",
      "prefix": "A",
      "sections": [
        { "n": 1, "code": "A1", "name": "Encabezado", "contains": "Publicar avisos" },
        { "n": 2, "code": "A2", "name": "Nuevo", "contains": "Formulario aviso" },
        { "n": 3, "code": "A3", "name": "Publicados", "contains": "Lista avisos" },
        { "n": 4, "code": "A4", "name": "Herramientas", "contains": "Links + reset demo" }
      ]
    },
    "member-account": {
      "role": "member",
      "title": "Socio · Cuenta",
      "prefix": "U",
      "sections": [
        { "n": 1, "code": "U1", "name": "Perfil", "contains": "Nombre, email, membresía" },
        { "n": 2, "code": "U2", "name": "Tu mes", "contains": "Stats canchas/clases/pedidos" },
        { "n": 3, "code": "U3", "name": "Acciones", "contains": "WhatsApp, reset, portada" }
      ]
    }
  }
}