109 lines
5.2 KiB
HTML
109 lines
5.2 KiB
HTML
<!-- Vista Pública: Lectura de una página de documentación -->
|
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
<!-- Highlight.js para bloques de código en Markdown -->
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github.min.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/lib/highlight.min.js"></script>
|
|
|
|
<div class="min-h-screen bg-gray-50 flex flex-col">
|
|
<!-- Topbar del SaaS -->
|
|
<div class="bg-white border-b shadow-sm sticky top-0 z-10">
|
|
<div class="max-w-6xl mx-auto px-6 py-3 flex items-center gap-3">
|
|
<a href="/docs/{{.saas.Slug}}" class="flex items-center gap-2 text-gray-600 hover:text-[#8eb02f] transition-colors text-sm">
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
|
|
</svg>
|
|
{{.saas.Nombre}}
|
|
</a>
|
|
<span class="text-gray-300">/</span>
|
|
<span class="text-sm text-gray-500 truncate">{{.pagina.Titulo}}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="max-w-6xl mx-auto px-4 py-6 w-full flex gap-6 flex-1">
|
|
|
|
<!-- Sidebar de navegación -->
|
|
<aside class="hidden lg:block w-56 flex-shrink-0">
|
|
<div class="sticky top-20 space-y-4">
|
|
{{range .grupos}}
|
|
<div>
|
|
<p class="text-xs font-semibold text-gray-400 uppercase tracking-wide mb-2">{{.Categoria.Nombre}}</p>
|
|
<ul class="space-y-0.5">
|
|
{{range .Paginas}}
|
|
<li>
|
|
<a href="/docs/{{$.saas.Slug}}/{{.Slug}}"
|
|
class="block text-sm px-2 py-1.5 rounded transition-colors
|
|
{{if eq .Slug $.pagina.Slug}}bg-[#8eb02f] text-white font-medium{{else}}text-gray-600 hover:bg-gray-100 hover:text-gray-800{{end}}">
|
|
{{.Titulo}}
|
|
</a>
|
|
</li>
|
|
{{end}}
|
|
</ul>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- Contenido principal -->
|
|
<main class="flex-1 min-w-0">
|
|
<div class="bg-white rounded-lg border border-gray-200 shadow-sm p-6 lg:p-8">
|
|
<div class="mb-6 pb-4 border-b border-gray-100">
|
|
<div class="flex items-center gap-2 mb-2">
|
|
<span class="text-xs text-gray-400 bg-gray-100 px-2 py-0.5 rounded">{{.pagina.Categoria.Nombre}}</span>
|
|
</div>
|
|
<h1 class="text-2xl font-bold text-gray-900">{{.pagina.Titulo}}</h1>
|
|
</div>
|
|
|
|
<!-- Renderizado del contenido -->
|
|
{{if eq .pagina.TipoContenido "markdown"}}
|
|
<div id="docContent" class="prose prose-gray max-w-none"
|
|
data-raw="{{.pagina.Contenido}}" data-type="markdown"></div>
|
|
{{else}}
|
|
<div class="prose prose-gray max-w-none">
|
|
{{.pagina.Contenido}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
|
|
<!-- Navegación anterior / siguiente -->
|
|
<div class="flex justify-between mt-4 text-sm">
|
|
<span></span>
|
|
<a href="/docs/{{.saas.Slug}}" class="text-[#8eb02f] hover:underline">← Volver al índice</a>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
|
|
<style>
|
|
/* Estilos de prosa para contenido Markdown */
|
|
.prose h1,.prose h2,.prose h3,.prose h4 { font-weight:700; margin-top:1.5em; margin-bottom:0.5em; color:#1f2937; }
|
|
.prose h1 { font-size:1.75rem; }
|
|
.prose h2 { font-size:1.35rem; border-bottom:1px solid #e5e7eb; padding-bottom:.25rem; }
|
|
.prose h3 { font-size:1.1rem; }
|
|
.prose p { margin-bottom:1em; line-height:1.7; color:#374151; }
|
|
.prose ul,.prose ol { margin:0.75em 0 0.75em 1.5em; color:#374151; }
|
|
.prose li { margin-bottom:.25em; }
|
|
.prose code { background:#f3f4f6; padding:2px 5px; border-radius:4px; font-size:.85em; font-family:monospace; }
|
|
.prose pre { background:#1e293b; color:#e2e8f0; padding:1rem; border-radius:.5rem; overflow-x:auto; margin:1em 0; }
|
|
.prose pre code { background:transparent; padding:0; font-size:.85em; }
|
|
.prose blockquote { border-left:4px solid #8eb02f; padding-left:1rem; color:#6b7280; font-style:italic; margin:1em 0; }
|
|
.prose a { color:#8eb02f; text-decoration:underline; }
|
|
.prose table { width:100%; border-collapse:collapse; margin:1em 0; }
|
|
.prose th,.prose td { border:1px solid #e5e7eb; padding:.5rem .75rem; text-align:left; }
|
|
.prose th { background:#f9fafb; font-weight:600; }
|
|
</style>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
const el = document.getElementById('docContent');
|
|
if (!el) return;
|
|
// El contenido viene como texto en el atributo data-raw para evitar doble escape
|
|
const raw = el.getAttribute('data-raw') || '';
|
|
el.removeAttribute('data-raw');
|
|
el.innerHTML = marked.parse(raw);
|
|
// Resaltado de código
|
|
if (window.hljs) {
|
|
el.querySelectorAll('pre code').forEach(block => hljs.highlightElement(block));
|
|
}
|
|
});
|
|
</script>
|