bootstrap: iniciar bitácora operativa

This commit is contained in:
2026-08-13 00:43:15 -06:00
commit 1ecfb022b1
85 changed files with 7967 additions and 0 deletions
+131
View File
@@ -0,0 +1,131 @@
:root {
--ops-bg: #08131f;
--ops-panel: #102437;
--ops-panel-2: #17324a;
--ops-text: #eef6f7;
--ops-muted: #a9bec9;
--ops-accent: #5df2c2;
--ops-warning: #ffd166;
--ops-danger: #ff6b6b;
--ops-border: #3c6277;
--ops-shadow: 6px 6px 0 #02070b;
}
html { scroll-behavior: smooth; }
body { background: var(--ops-bg); color: var(--ops-text); }
a { color: var(--ops-accent); text-decoration-thickness: 2px; text-underline-offset: 3px; }
code, kbd, pre { font-family: "Lucida Console", Monaco, monospace; }
code { overflow-wrap: anywhere; }
.container { width: min(1180px, calc(100% - 2rem)); margin-inline: auto; }
.ops-header { position: sticky; top: 0; z-index: 20; background: rgba(8, 19, 31, .97); border-bottom: 3px double var(--ops-border); }
.ops-header__inner { min-height: 72px; display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; padding-block: .6rem; }
.ops-brand { color: var(--ops-text); font-size: 1.15rem; font-weight: 800; text-decoration: none; text-transform: uppercase; letter-spacing: .04em; }
.ops-prompt { color: var(--ops-accent); font-family: monospace; font-size: .8rem; }
.ops-nav { margin-left: auto; display: flex; flex-wrap: wrap; gap: .25rem .75rem; align-items: center; }
.ops-nav a { color: var(--ops-text); text-decoration: none; padding: .35rem .1rem; border-bottom: 2px solid transparent; }
.ops-nav a:hover, .ops-nav a:focus { color: var(--ops-accent); border-color: var(--ops-accent); }
.ops-nav__review { color: var(--ops-warning) !important; }
.ops-nav__review span { display: inline-grid; place-items: center; min-width: 1.5rem; min-height: 1.5rem; border: 1px solid currentColor; }
.ops-search { padding-top: 1rem; }
.ops-search > label { display: block; color: var(--ops-muted); font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; margin-bottom: .3rem; }
.ops-search__row { display: flex; align-items: center; background: #02070b; border: 2px solid var(--ops-border); }
.ops-search input { flex: 1; min-width: 0; background: transparent; color: var(--ops-text); border: 0; padding: .7rem .8rem; font: inherit; outline: none; }
.ops-search input:focus { box-shadow: inset 0 0 0 2px var(--ops-accent); }
.ops-search kbd { margin-right: .55rem; color: var(--ops-muted); }
.ops-search-results { position: relative; z-index: 10; background: var(--ops-panel); border: 2px solid var(--ops-border); border-top: 0; box-shadow: var(--ops-shadow); max-height: 65vh; overflow: auto; }
.ops-search-result { display: block; color: var(--ops-text); text-decoration: none; padding: .7rem .9rem; border-bottom: 1px solid var(--ops-border); }
.ops-search-result:hover, .ops-search-result:focus { background: var(--ops-panel-2); }
.ops-search-result strong { display: block; color: var(--ops-accent); }
.ops-search-result small { color: var(--ops-muted); }
.ops-main { padding-block: 2.5rem 4rem; min-height: 70vh; }
.ops-hero { border: 4px double var(--ops-border); background: linear-gradient(135deg, var(--ops-panel), #0a1a29); padding: clamp(1.4rem, 4vw, 3.5rem); box-shadow: var(--ops-shadow); }
.ops-hero h1, .ops-page-header h1 { margin: .1em 0 .35em; line-height: 1.04; text-wrap: balance; }
.ops-lead { color: var(--ops-muted); font-size: 1.08rem; max-width: 72ch; }
.ops-eyebrow { margin: 0; color: var(--ops-accent); font-family: monospace; font-size: .8rem; letter-spacing: .08em; text-transform: uppercase; }
.ops-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: .85rem; margin: 1.5rem 0 2.5rem; }
.ops-stat { display: flex; flex-direction: column; gap: .1rem; padding: 1rem; background: var(--ops-panel); border: 2px solid var(--ops-border); color: var(--ops-text); text-decoration: none; }
.ops-stat strong { color: var(--ops-accent); font-size: 1.9rem; }
.ops-stat span { color: var(--ops-muted); }
.ops-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; }
.ops-grid--sections { margin-bottom: 3rem; }
.ops-panel { min-height: 165px; padding: 1.15rem; background: var(--ops-panel); border: 2px solid var(--ops-border); box-shadow: 4px 4px 0 #02070b; color: var(--ops-text); text-decoration: none; transition: transform .12s ease; }
.ops-panel:hover { transform: translate(-2px, -2px); border-color: var(--ops-accent); }
.ops-panel h2 { color: var(--ops-text); margin: .55rem 0 .35rem; }
.ops-panel p { color: var(--ops-muted); }
.ops-panel__code { color: var(--ops-accent); font-family: monospace; border: 1px solid currentColor; padding: .15rem .35rem; }
.ops-panel--attention { border-color: var(--ops-warning); }
.ops-panel--attention .ops-panel__code { color: var(--ops-warning); }
.ops-section-heading { display: flex; justify-content: space-between; align-items: end; gap: 1rem; margin: 2rem 0 1rem; border-bottom: 2px solid var(--ops-border); }
.ops-section-heading h2 { margin-top: .1rem; }
.ops-page-header { padding-bottom: 1.5rem; margin-bottom: 1.5rem; border-bottom: 4px double var(--ops-border); }
.ops-page-header > p:not(.ops-eyebrow) { color: var(--ops-muted); max-width: 78ch; }
.ops-meta { display: flex; flex-wrap: wrap; gap: .5rem 1rem; color: var(--ops-muted); font-size: .9rem; }
.ops-tags { display: flex; flex-wrap: wrap; gap: .4rem .65rem; margin-top: .7rem; color: var(--ops-accent); font-family: monospace; font-size: .86rem; }
.ops-tags a, .ops-tags span { color: inherit; }
.ops-list { display: grid; gap: 1rem; }
.ops-list-item { padding: 1rem 1.1rem; background: var(--ops-panel); border-left: 5px solid var(--ops-border); }
.ops-list-item:hover { border-left-color: var(--ops-accent); }
.ops-list-item h2, .ops-list-item h3 { margin: .45rem 0 .3rem; }
.ops-list-item p { color: var(--ops-muted); margin: .25rem 0; }
.ops-list-item__meta { display: flex; flex-wrap: wrap; gap: .4rem .75rem; align-items: center; color: var(--ops-muted); font-size: .82rem; }
.ops-list-item__meta code { color: var(--ops-accent); }
.ops-list-item--review { border-left-color: var(--ops-warning); }
.badge { display: inline-block; font-family: monospace; font-size: .72rem; padding: .14rem .35rem; border: 1px solid currentColor; text-transform: uppercase; }
.badge--low { color: var(--ops-accent); }
.badge--medium { color: #80d8ff; }
.badge--high { color: var(--ops-warning); }
.badge--critical { color: var(--ops-danger); }
.badge--status { color: var(--ops-warning); }
.ops-board { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; align-items: start; }
.ops-card { background: var(--ops-panel); border: 2px solid var(--ops-border); padding: 1rem; box-shadow: 4px 4px 0 #02070b; }
.ops-card__top { display: flex; justify-content: space-between; align-items: center; gap: .5rem; }
.ops-card h2 { font-size: 1.15rem; margin: .8rem 0 .35rem; }
.ops-card p { color: var(--ops-muted); }
.ops-card dl { display: grid; grid-template-columns: auto 1fr; gap: .25rem .7rem; font-size: .88rem; }
.ops-card dt { color: var(--ops-muted); }
.ops-card dd { margin: 0; text-align: right; }
.ops-running { color: var(--ops-accent) !important; font-family: monospace; }
.ops-article { max-width: 900px; }
.ops-prose { line-height: 1.72; }
.ops-prose h2 { margin-top: 2em; border-bottom: 1px solid var(--ops-border); padding-bottom: .2em; }
.ops-prose h3 { margin-top: 1.6em; }
.ops-prose blockquote { border-left: 4px solid var(--ops-accent); margin-left: 0; padding: .6rem 1rem; background: var(--ops-panel); }
pre { overflow: auto; background: #02070b; color: var(--ops-text); padding: .9rem; border: 1px solid var(--ops-border); }
.ops-callout { margin: 1rem 0 1.5rem; padding: 1rem; background: #1b2b25; border: 2px solid var(--ops-accent); }
.ops-source { display: grid; gap: .3rem; margin-top: 2.5rem; padding-top: 1rem; border-top: 1px solid var(--ops-border); color: var(--ops-muted); }
.ops-review-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 1rem; }
.ops-review-grid > div { display: grid; gap: .25rem; padding: .7rem; background: #091723; }
.reviewer { color: var(--ops-muted); }
.reviewer--done { color: var(--ops-accent); }
.reviewer--missing { color: var(--ops-warning); }
.ops-error { color: var(--ops-danger) !important; font-weight: 700; }
.ops-empty { padding: 2rem; border: 2px dashed var(--ops-border); color: var(--ops-muted); text-align: center; }
.ops-empty--success { border-color: var(--ops-accent); color: var(--ops-accent); }
.ops-footer { display: flex; justify-content: space-between; gap: 1rem; border-top: 3px double var(--ops-border); padding-block: 1.5rem 2.5rem; color: var(--ops-muted); font-size: .85rem; }
@media (max-width: 920px) {
.ops-stats, .ops-grid, .ops-board { grid-template-columns: repeat(2, 1fr); }
.ops-nav { width: 100%; margin-left: 0; }
}
@media (max-width: 620px) {
.ops-stats, .ops-grid, .ops-board, .ops-review-grid { grid-template-columns: 1fr; }
.ops-header { position: static; }
.ops-footer { flex-direction: column; }
.ops-panel { min-height: 0; }
}
.ops-meeting-section {
margin-top: 3rem;
padding-top: 1.5rem;
border-top: 2px dashed currentColor;
}
+142
View File
@@ -0,0 +1,142 @@
(() => {
"use strict";
const input = document.getElementById("ops-search-input");
const results = document.getElementById("ops-search-results");
if (!input || !results) return;
const indexURL = input.dataset.indexUrl;
let documentsPromise = null;
const normalize = (value) => String(value ?? "")
.normalize("NFD")
.replace(/\p{Diacritic}/gu, "")
.toLocaleLowerCase("es")
.replace(/\s+/g, " ")
.trim();
const loadDocuments = () => {
if (documentsPromise) return documentsPromise;
documentsPromise = fetch(indexURL, { credentials: "same-origin" })
.then((response) => {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
})
.then((index) => {
const docs = index?.documentStore?.docs ?? {};
return Object.entries(docs).map(([ref, doc]) => ({ ref, ...doc }));
});
return documentsPromise;
};
const scoreDocument = (doc, tokens, wholeQuery) => {
const title = normalize(doc.title);
const description = normalize(doc.description);
const content = normalize(doc.content ?? doc.body);
const path = normalize(doc.path ?? doc.ref);
const fullText = `${title} ${description} ${path} ${content}`;
if (!tokens.every((token) => fullText.includes(token))) return -1;
let score = 0;
if (title === wholeQuery) score += 100;
if (title.startsWith(wholeQuery)) score += 40;
if (title.includes(wholeQuery)) score += 25;
if (description.includes(wholeQuery)) score += 12;
for (const token of tokens) {
if (title.includes(token)) score += 12;
if (description.includes(token)) score += 6;
if (path.includes(token)) score += 4;
if (content.includes(token)) score += 2;
}
return score;
};
const clearResults = () => {
results.hidden = true;
results.replaceChildren();
};
const appendMessage = (title, detail) => {
const item = document.createElement("div");
item.className = "ops-search-result";
const strong = document.createElement("strong");
strong.textContent = title;
const small = document.createElement("small");
small.textContent = detail;
item.append(strong, small);
results.replaceChildren(item);
results.hidden = false;
};
const renderMatches = (matches) => {
const fragment = document.createDocumentFragment();
for (const { doc } of matches) {
const link = document.createElement("a");
link.className = "ops-search-result";
link.href = doc.permalink ?? doc.ref ?? doc.path ?? "/";
const title = document.createElement("strong");
title.textContent = doc.title || link.href;
const detail = document.createElement("small");
detail.textContent = doc.description || doc.path || "";
link.append(title, detail);
fragment.append(link);
}
results.replaceChildren(fragment);
results.hidden = false;
};
let requestSerial = 0;
const render = async (rawQuery) => {
const serial = ++requestSerial;
const query = normalize(rawQuery);
const tokens = [...new Set(query.split(" ").filter((token) => token.length > 1))];
if (query.length < 2 || tokens.length === 0) {
clearResults();
return;
}
try {
const documents = await loadDocuments();
if (serial !== requestSerial) return;
const matches = documents
.map((doc) => ({ doc, score: scoreDocument(doc, tokens, query) }))
.filter((item) => item.score >= 0)
.sort((a, b) => b.score - a.score || String(a.doc.title).localeCompare(String(b.doc.title), "es"))
.slice(0, 12);
if (matches.length === 0) {
appendMessage("Sin resultados", "Pruebe otro término o una etiqueta más corta.");
return;
}
renderMatches(matches);
} catch (error) {
console.warn("No se pudo cargar el índice de búsqueda", error);
appendMessage("Búsqueda no disponible", "Compruebe que el sitio se construyó con el índice habilitado.");
}
};
let debounceTimer = null;
input.addEventListener("input", () => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => render(input.value), 100);
});
input.addEventListener("keydown", (event) => {
if (event.key === "Escape") {
input.value = "";
clearResults();
input.blur();
}
});
document.addEventListener("keydown", (event) => {
if (event.key === "/" && document.activeElement !== input && !event.metaKey && !event.ctrlKey && !event.altKey) {
event.preventDefault();
input.focus();
}
});
document.addEventListener("click", (event) => {
if (!results.contains(event.target) && event.target !== input) results.hidden = true;
});
})();
+2
View File
@@ -0,0 +1,2 @@
User-agent: *
Disallow: /