From e994dc9674738f8bd3cde18b5802fd949e112d4a Mon Sep 17 00:00:00 2001 From: Aaron Krone Date: Thu, 18 Jun 2026 19:58:37 -0600 Subject: [PATCH 1/2] Adding 404 page --- assets/css/main.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/css/main.scss b/assets/css/main.scss index 06abd58..05f861d 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -4,3 +4,4 @@ @use "base"; @use "layout"; @use "glitch"; +@use "404" as *; From 22037cb06ff7ca31371ac5d7427adc9f2772710d Mon Sep 17 00:00:00 2001 From: Aaron Krone Date: Tue, 7 Jul 2026 21:27:18 -0600 Subject: [PATCH 2/2] Add 404 page content and styles 404.html and _sass/_404.scss were left uncommitted after the main.scss import was added. --- 404.html | 439 ++++++++++++++++++++++++++++++++++++++++++++++++ _sass/_404.scss | 261 ++++++++++++++++++++++++++++ 2 files changed, 700 insertions(+) create mode 100644 404.html create mode 100644 _sass/_404.scss diff --git a/404.html b/404.html new file mode 100644 index 0000000..5eed85d --- /dev/null +++ b/404.html @@ -0,0 +1,439 @@ +--- +layout: default +title: "404" +permalink: /404.html +--- +
+ +
+ +

ERR 404 · FRAGMENT NOT FOUND

+ +
+ +

404

+

No such fragment. The mechanism keeps no copy.

+

+ cd / — return to the surface +

+

+ Agrippa (A Book of the Dead) — William Gibson, 1992 +

+ +
+ + diff --git a/_sass/_404.scss b/_sass/_404.scss new file mode 100644 index 0000000..60778a7 --- /dev/null +++ b/_sass/_404.scss @@ -0,0 +1,261 @@ +@use 'sass:color'; +@use 'variables' as *; + +// ─── 404 page shell ────────────────────────────────────────────────────────── + +.err404 { + max-width: 38rem; + margin: $spacing-unit auto ($spacing-unit * 3); + text-align: center; +} + +.err404__module { + margin-bottom: $spacing-unit * 1.5; +} + +.err404__code { + font-family: $font-mono; + font-size: 0.7rem; + letter-spacing: 0.25em; + text-transform: uppercase; + color: $color-primary; + text-shadow: 0 0 8px rgba($color-primary, 0.5); + margin: 0 0 ($spacing-unit * 1.5); +} + +.err404__title { + font-family: $font-display; + font-weight: 800; + font-size: clamp(4rem, 18vw, 8rem); + line-height: 1; + letter-spacing: 0.06em; + color: $color-primary; + margin: 0; + text-shadow: 0 0 18px rgba($color-primary, 0.6), + 0 0 60px rgba($color-primary, 0.2); +} + +.err404__sub { + font-family: $font-mono; + font-size: 0.9rem; + color: $color-muted; + margin: ($spacing-unit * 0.75) 0 ($spacing-unit * 1.75); +} + +.err404__return { + margin: 0; + + a { + font-family: $font-display; + font-size: 0.72rem; + letter-spacing: 0.12em; + text-transform: uppercase; + color: $color-primary; + padding: 0.55rem 1.1rem; + border: 1px solid rgba($color-primary, 0.4); + transition: border-color 0.2s, box-shadow 0.2s, text-shadow 0.2s; + + &:hover { + border-color: $color-primary; + box-shadow: 0 0 12px rgba($color-primary, 0.3); + text-shadow: 0 0 8px rgba($color-primary, 0.6); + } + } +} + +.err404__attribution { + margin: $spacing-unit 0 0; + font-family: $font-mono; + font-size: 0.7rem; + color: $color-muted; + + a { + color: $color-muted; + border-bottom: 1px solid rgba($color-muted, 0.3); + transition: color 0.2s, border-bottom-color 0.2s; + + &:hover { + color: $color-primary; + border-bottom-color: rgba($color-primary, 0.5); + } + } +} + +.err404__cursor { + display: inline-block; + width: 0.6ch; + margin-left: 0.1ch; + color: $color-primary; + animation: err404-blink 1.1s step-end infinite; +} + +@keyframes err404-blink { + 0%, 49% { opacity: 1; } + 50%, 100% { opacity: 0; } +} + +// ── Progressive enhancement ─────────────────────────────────────────────────── +// With JS: shell elements are hidden until the module animation calls onDone. +// Without JS / reduced motion: everything is immediately visible. + +.err404.js { + .err404__title, + .err404__sub, + .err404__return, + .err404__attribution { + opacity: 0; + transition: opacity 1.2s ease; + } + + &.is-resolved { + .err404__title, + .err404__sub, + .err404__return, + .err404__attribution { opacity: 1; } + } +} + +@media (prefers-reduced-motion: reduce) { + .err404.js { + .err404__title, + .err404__sub, + .err404__return, + .err404__attribution { opacity: 1; } + } + .err404__cursor { animation: none; } +} + +// ─── Module: Agrippa ───────────────────────────────────────────────────────── + +.agrippa__poem { + font-family: $font-mono; + font-size: 0.95rem; + line-height: 1.9; + color: $color-muted; + margin: 0 0 ($spacing-unit * 1.5); + white-space: pre-wrap; + text-align: left; +} + +.agrippa-line { + margin: 0; + min-height: 1.9em; +} + +.agrippa-char--decaying { + color: $color-primary; + text-shadow: 0 0 8px rgba($color-primary, 0.7); +} + +.agrippa-char--locked { + color: color.adjust($color-muted, $lightness: -12%); +} + +// ─── Module: Traceroute ────────────────────────────────────────────────────── + +.traceroute { + text-align: left; + font-family: $font-mono; + font-size: 0.82rem; + line-height: 1.75; + margin-bottom: $spacing-unit * 1.5; +} + +.traceroute__header { + color: color.adjust($color-muted, $lightness: 8%); + margin-bottom: 0.3rem; + white-space: pre; +} + +.traceroute__hop { + color: $color-muted; + white-space: pre; +} + +.traceroute__timeout { + color: color.adjust($color-muted, $lightness: -10%); + white-space: pre; +} + +.traceroute__error { + color: $color-primary; + text-shadow: 0 0 6px rgba($color-primary, 0.4); + margin-top: 0.5rem; +} + +// ─── Module: Zork ──────────────────────────────────────────────────────────── + +.zork { + text-align: left; + font-family: $font-mono; + font-size: 0.85rem; + line-height: 1.85; + margin-bottom: $spacing-unit * 1.5; +} + +.zork__line { + color: $color-muted; + white-space: pre-wrap; + margin: 0; + min-height: 1.85em; +} + +.zork__line--dim { + color: color.adjust($color-muted, $lightness: -10%); +} + +.zork__line--narration { + color: color.adjust($color-muted, $lightness: 8%); +} + +.zork__prompt { + color: $color-primary; + text-shadow: 0 0 6px rgba($color-primary, 0.4); + user-select: none; +} + +// ─── Module: Bad Horse (tracert) ───────────────────────────────────────────── + +.tracert { + text-align: left; + font-family: $font-mono; + font-size: 0.72rem; + line-height: 1.75; + margin-bottom: $spacing-unit * 1.5; +} + +.tracert__header { + color: color.adjust($color-muted, $lightness: 8%); + white-space: pre; +} + +.tracert__hop { + color: $color-muted; + white-space: pre; +} + +.tracert__timeout { + color: color.adjust($color-muted, $lightness: -10%); + white-space: pre; +} + +// bad.horse hops before the lyrics — glow builds as you arrive +.tracert__destination { + color: $color-primary; + text-shadow: 0 0 6px rgba($color-primary, 0.3); + white-space: pre; +} + +// The lyric hops — full Signal Yellow, brighter glow +.tracert__lyric { + color: $color-primary; + text-shadow: 0 0 10px rgba($color-primary, 0.6), + 0 0 30px rgba($color-primary, 0.2); + white-space: pre; +} + +.tracert__complete { + color: color.adjust($color-muted, $lightness: 8%); + margin-top: 0.5rem; + white-space: pre; +}