OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
HASH      d266a4563e71
DATE      2026-07-17
SUBJECT   web: 404 as a retrieval report
FILES     1 CHANGED
HASH      d266a4563e71
DATE      2026-07-17
SUBJECT   web: 404 as a retrieval report
FILES     1 CHANGED
 

diff --git a/ooknet-design/src/pages/404.astro b/ooknet-design/src/pages/404.astro
new file mode 100644
index 0000000..1567d50
--- /dev/null
+++ b/ooknet-design/src/pages/404.astro
@@ -0,0 +1,37 @@
+---
+import ArticleLayout from "../layouts/ArticleLayout/ArticleLayout.astro";
+import TopHeader from "../components/TopHeader/TopHeader.astro";
+import Frame from "../components/Frame/Frame.astro";
+import Pre from "../components/Pre/Pre.astro";
+import Button from "../components/Button/Button.astro";
+import ArticleFooter from "../components/ArticleFooter/ArticleFooter.astro";
+import { kv, pad, row2, ruleD } from "../lib/ascii";
+
+const buildHeader = (w: number) =>
+  [row2("RETRIEVAL REPORT", "NOTE 404", w), ruleD(w)].join("\n");
+---
+<ArticleLayout title="OOKNET KB - 404 NOT ON FILE">
+  <TopHeader />
+  <Frame build={buildHeader} />
+  <Pre>{" "}</Pre>
+  <div class="frame-wide"><Pre>{pad("REQUESTED", 12)}<span data-notfound-path dat
a-cells="72">?</span></Pre></div>
+  <div class="frame-narrow"><Pre>{pad("REQUESTED", 12)}<span data-notfound-path d
ata-cells="34">?</span></Pre></div>
+  <Pre>{kv("RECORDS", "0", 12, 48).trimEnd()}</Pre>
+  <Pre>{" "}</Pre>
+  <Pre>*** NO DOCUMENT ON FILE ***</Pre>
+  <Pre>{" "}</Pre>
+  <Pre><Button label="< INDEX" href="/" />{"   press / to search"}</Pre>
+  <Pre>{" "}</Pre>
+  <Pre>*** END OF REPORT ***</Pre>
+  <Pre>{" "}</Pre>
+  <ArticleFooter page={404} />
+</ArticleLayout>
+
+<script is:inline>
+  for (const el of document.querySelectorAll("[data-notfound-path]")) {
+    const max = Number(el.dataset.cells) || 34;
+    let p = window.location.pathname;
+    if (p.length > max) p = p.slice(0, max - 1) + "...";
+    el.textContent = p;
+  }
+</script>

diff --git a/ooknet-design/src/pages/404.ast
ro b/ooknet-design/src/pages/404.astro
new file mode 100644
index 0000000..1567d50
--- /dev/null
+++ b/ooknet-design/src/pages/404.astro
@@ -0,0 +1,37 @@
+---
+import ArticleLayout from "../layouts/Artic
leLayout/ArticleLayout.astro";
+import TopHeader from "../components/TopHea
der/TopHeader.astro";
+import Frame from "../components/Frame/Fram
e.astro";
+import Pre from "../components/Pre/Pre.astr
o";
+import Button from "../components/Button/Bu
tton.astro";
+import ArticleFooter from "../components/Ar
ticleFooter/ArticleFooter.astro";
+import { kv, pad, row2, ruleD } from "../li
b/ascii";
+
+const buildHeader = (w: number) =>
+  [row2("RETRIEVAL REPORT", "NOTE 404", w),
 ruleD(w)].join("\n");
+---
+<ArticleLayout title="OOKNET KB - 404 NOT O
N FILE">
+  <TopHeader />
+  <Frame build={buildHeader} />
+  <Pre>{" "}</Pre>
+  <div class="frame-wide"><Pre>{pad("REQUES
TED", 12)}<span data-notfound-path data-cell
s="72">?</span></Pre></div>
+  <div class="frame-narrow"><Pre>{pad("REQU
ESTED", 12)}<span data-notfound-path data-ce
lls="34">?</span></Pre></div>
+  <Pre>{kv("RECORDS", "0", 12, 48).trimEnd(
)}</Pre>
+  <Pre>{" "}</Pre>
+  <Pre>*** NO DOCUMENT ON FILE ***</Pre>
+  <Pre>{" "}</Pre>
+  <Pre><Button label="< INDEX" href="/" />{
"   press / to search"}</Pre>
+  <Pre>{" "}</Pre>
+  <Pre>*** END OF REPORT ***</Pre>
+  <Pre>{" "}</Pre>
+  <ArticleFooter page={404} />
+</ArticleLayout>
+
+<script is:inline>
+  for (const el of document.querySelectorAl
l("[data-notfound-path]")) {
+    const max = Number(el.dataset.cells) ||
 34;
+    let p = window.location.pathname;
+    if (p.length > max) p = p.slice(0, max 
- 1) + "...";
+    el.textContent = p;
+  }
+</script>
 
[ BACK TO LOG ]
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET