📄 rtsport_mock.py 3,033 bytes Yesterday 01:05 📋 Raw

"""RTSport mock preview router — completely isolated from blog/admin code.

Mounts static files and HTML templates at /rtsport/* for mobile preview.
No database, no state, no backend logic — pure static mock.
"""

from pathlib import Path
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from starlette.staticfiles import StaticFiles

RTS_BASE = Path("/home/hoffmann_admin/.openclaw/shared/current/frontend")
RTS_TEMPLATES = RTS_BASE / "templates"
RTS_STATIC = RTS_BASE / "static"

router = APIRouter()

def setup_rtsport_mounts(app):
"""Mount RTSport static files and add routes."""
# Mount static CSS
app.mount("/rtsport/static", StaticFiles(directory=str(RTS_STATIC)), name="rtsport_static")

@app.get("/rtsport", response_class=HTMLResponse)
@app.get("/rtsport/", response_class=HTMLResponse)
async def rtsport_index():
    """RTSport mock landing page."""
    return _serve_html("index.html")

# @app.get("/rtsport/brand", response_class=HTMLResponse)
# async def rtsport_brand():
#     """AthleteFlow brand identity page."""
#     return _serve_html("brand.html")

@app.get("/rtsport/at", response_class=HTMLResponse)
async def rtsport_at():
    """AT dashboard."""
    return _serve_html("at/dashboard.html")

@app.get("/rtsport/coach", response_class=HTMLResponse)
async def rtsport_coach():
    """Coach dashboard."""
    return _serve_html("coach/dashboard.html")

@app.get("/rtsport/parent", response_class=HTMLResponse)
async def rtsport_parent():
    """Parent dashboard."""
    return _serve_html("parent/dashboard.html")

@app.get("/rtsport/ad", response_class=HTMLResponse)
async def rtsport_ad():
    """AD overview dashboard."""
    return _serve_html("ad/dashboard.html")

@app.get("/rtsport/timeline", response_class=HTMLResponse)
async def rtsport_timeline():
    """Shared timeline component."""
    return _serve_html("components/shared-timeline.html")

@app.get("/rtsport/at/sideline-entry", response_class=HTMLResponse)
async def rtsport_sideline_entry():
    """3-tap sideline entry component (HTMX fragment)."""
    return _serve_html("at/sideline-entry.html")

@app.get("/rtsport/athlete-detail", response_class=HTMLResponse)
async def rtsport_athlete_detail():
    """Athlete detail overlay component (data-backed)."""
    return _serve_html("components/athlete-detail.html")

@app.get("/rtsport/notifications", response_class=HTMLResponse)
async def rtsport_notifications():
    """Notifications mock."""
    return _serve_html("components/notifications.html")

def _serve_html(relative_path: str) -> str:
"""Read and return an HTML file from templates dir."""
file_path = RTS_TEMPLATES / relative_path
if not file_path.exists():
return HTMLResponse(content="

Not found

", status_code=404)
content = file_path.read_text(encoding="utf-8")
return content