1. html() — HTML directo
route "GET /"
give html("<h1>Almacén La Vecina</h1>")
Devuelve text/html con el contenido tal cual. Para páginas chicas o generadas.
2. render() — plantillas con diseño
route "GET /"
give render("inicio.html", {"titulo": "La Vecina", "productos": productos})
Una plantilla HTML aparte con huecos { titulo }, bucles { each p in productos }...{ end } y condicionales. Todo se escapa solo (a prueba de XSS). Con static "./public" sirves CSS, imágenes y JS.
3. content() — una fuente, tres formatos
route "GET /"
give content(page([
heading(1, "Almacén La Vecina"),
prose("Pedidos al 555-0199, entregamos en el barrio."),
list(["Yerba $4300", "Arroz $1450"])
], {"title": "Almacén La Vecina"}))
Describes el contenido como nodos semánticos y el runtime negocia: el navegador recibe HTML, un agente que pide Accept: text/markdown recibe Markdown, y /inicio.json devuelve los datos. La misma ruta sirve a humanos y agentes — muy Synsema.
¿Y usuarios con sesión? El bloque serve acepta auth with mi_tarea y rutas con requires auth: el runtime extrae el token (o cookie), llama a tu tarea y, si devuelve nothing, responde 401 solo. Lo usarás en la entrega.
Abajo: los nodos de content() también son valores — ejecuta y míralos por dentro.