- now.txt · updated 09/2026
-
- I’m hosting an SMP — message me on Discord if you want in. I’m also cooking most days,
- bulking through the non-summer seasons.
+ {/* ----------------------------------------------------------- now */}
+
+
+
+
+
+
+
+
-
-
-
status
-
+
+
+
+
+ BENCH STATUS
+
+
+
+ smp · accepting players
+
+
+ maturita.c · in development
+
+
+ gym · PPL 3–5×/week
+
+
-
-
smp accepting players
-
bulk in progress
-
maturita.c in development
-
gym PPL · 3–5×/week
+
+
+
+
+
+
+ {/* ------------------------------------------------------ services */}
+
+
+
+
+
+
+
+
+ RACK 01 · SERVICES
+
+ health checked from this page
+
+
+
+
+
+
+ {SERVICES.map((s) => (
+
+ ))}
+
-
+
- {/* ----------------------------------------------------- services */}
-
-
-
-
- services
- checked through this site
-
- {SERVICES.map((s) => (
-
- ))}
-
+ {/* ------------------------------------------------------ projects */}
+
-
- {/* ----------------------------------------------------- projects */}
-
-
-
-
-
-
+
+
+
+
{codingProjects.map((p, i) => {
const { name, status } = splitStatus(p.title);
return (
@@ -332,131 +346,164 @@ export default function WebSite() {
href={p.url}
target="_blank"
rel="noopener noreferrer"
- className="w-caddy w-carbon"
+ className="w-drive"
+ style={{ "--tilt": `${i % 2 ? 0.5 : -0.6}deg` } as CSSProperties}
title={p.desc}
>
-
-
- {name}
-
+
+
+ {name}
+
{status ?? "unlabelled"} · {p.desc}
+
);
})}
-
-
-
-
- {/* ----------------------------------------------------- hardware */}
-
-
-
-
- {techProjects.map((t) => (
-
-
- {t.title}
- {t.desc}
-
- ))}
+
+
+
+
-
+
- {/* -------------------------------------------------- contributions */}
-
-
-
+ {/* ------------------------------------------------------ hardware */}
+
+
+
+
+
+ {techProjects.map((t) => (
+
+
+ {t.title}
+ {t.desc}
+
+ ))}
+
+
+
+
+
- {/* -------------------------------------------------------- friends */}
-
-
+ {/* -------------------------------------------------- activity feed */}
+
+
+ {/* ------------------------------------------------------- friends */}
+
- {/* ------------------------------------------------------------ gym */}
-
-
-
-
- {LIFTS.map((l) => (
-
-
- {l.weight}
-
{l.unit}
+ {/* ----------------------------------------------------------- gym */}
+
+
+
+
+
+
+
+
+
+ training log
+ 73 kg bodyweight
+
+
+ {LIFTS.map((l) => (
+
+ {l.lift}
+ {l.weight} kg
+ {l.date}
-
{l.lift}
-
{l.date} · 73 kg BW
-
- ))}
+ ))}
+
+
+ BEST SBD TOTAL · 401 KG · 165 + 111 + 125
+
-
+
- {/* -------------------------------------------------------- contact */}
-
-
-
-
- socials
- 12 ports
-
-
- {/* --------------------------------------------------------- footer */}
-
+ {/* ------------------------------------------------------------ footer */}
+
-
+
-
-
- dvorakmortonxd.local
-
-
- built with Next.js · textures CC0 via ambientCG ·{" "}
+
DVORAKMORTONXD.LOCAL
+
+ v3.2.0 · GPL-3.0-only · built with Next.js · textures CC0 via{" "}
credits
@@ -465,17 +512,17 @@ export default function WebSite() {
setTheme("skeuo")}
- className="w-btn desktop-toggle shrink-0"
+ className="w-keybtn desktop-toggle shrink-0 self-start sm:self-auto"
title="Flip to Desktop mode"
>
desktop mode
+
+
-
-
- v3.1.0 · © 2025–2026 Martin Dvořák
- GPL-3.0-only — follow it or don’t, I don’t mind
-
+
+ © 2025–2026 Martin Dvořák — follow the licence or don’t, I don’t mind
+
diff --git a/src/app/components/web-ui.tsx b/src/app/components/web-ui.tsx
index 32cf98b..4dc2477 100644
--- a/src/app/components/web-ui.tsx
+++ b/src/app/components/web-ui.tsx
@@ -31,7 +31,7 @@ export function Reveal({
}
}
},
- { rootMargin: "0px 0px -12% 0px", threshold: 0.08 }
+ { rootMargin: "0px 0px -12% 0px", threshold: 0.06 }
);
const rect = el.getBoundingClientRect();
@@ -58,51 +58,132 @@ export function Reveal({
/* ------------------------------------------------------------- hardware */
export function Led({
- kind = "green",
+ kind = "on",
pulse = false,
+ slow = false,
className = "",
- title,
+ style,
}: {
- kind?: "green" | "amber" | "red" | "blue" | "off";
+ kind?: "on" | "amber" | "off";
pulse?: boolean;
+ slow?: boolean;
className?: string;
- title?: string;
+ style?: CSSProperties;
}) {
return (
-
);
}
-/** Section header, mounted on the chassis. */
-export function Bay({
- id,
- index,
- label,
- title,
- children,
-}: {
- id: string;
- index: string;
- label: string;
- title: ReactNode;
- children: ReactNode;
-}) {
+export function Screws({ count = 2, brass = false, className = "" }: { count?: number; brass?: boolean; className?: string }) {
return (
-
-
-
-
- {index} / {label}
+
+ {Array.from({ length: count }).map((_, i) => (
+
+ ))}
+
+ );
+}
+
+/** Section heading: a brass tab screwed to the desk + painted title. */
+export function SectionHead({ index, label, title }: { index: string; label: string; title: string }) {
+ return (
+
+ {index} · {label}
+
{title}
+
+ );
+}
+
+/* ----------------------------------------------------------- the machine */
+
+export function Monitor({ children, className = "" }: { children: ReactNode; className?: string }) {
+ return (
+
+
+
{children}
+
+
+ DXD
+
+
+
+
-
{title}
-
-
{children}
-
+
+
+
+
+
+
+ );
+}
+
+const KEY_ROWS = ["1234567890-=".split(""), "qwertyuiop[]".split(""), "asdfghjkl;'".split("")];
+
+export function Keyboard() {
+ return (
+
+
+ {KEY_ROWS.map((row, i) => (
+
+ {row.map((k) => (
+
+ {k}
+
+ ))}
+
+ ))}
+
+
+
+
+
+ );
+}
+
+/** A small rack that sits on the desk in the hero. */
+export function MiniRack({ label = "DXD-01" }: { label?: string }) {
+ return (
+
+
+
+ {label}
+
+
+
+
+
+ {[0, 1, 2, 3].map((i) => (
+
+
+
+
+
+ {["pxe", "aio", "nas", "web"][i]}
+
+
+ ))}
+
+
+
+
+ );
+}
+
+/** A brass plate with one number stamped into it. */
+export function Plaque({ value, label }: { value: string; label: string }) {
+ return (
+
+ {value}
+ {label}
+
+
);
}
@@ -143,17 +224,10 @@ export function ServiceUnit({
};
}, [url, checkUrl, disabled]);
- const effective = disabled ? "up" : status;
- const kind = effective === "up" ? "green" : effective === "down" ? "red" : "off";
- const statusLabel = disabled
- ? "standby"
- : effective === "up"
- ? "online"
- : effective === "down"
- ? "offline"
- : "checking";
- const accessLabel =
- access === "public" ? "public" : access === "private" ? "private" : access === "on_request" ? "on request" : null;
+ const live = disabled ? "up" : status;
+ const kind = live === "up" ? "on" : live === "down" ? "off" : "amber";
+ const label = disabled ? "STANDBY" : live === "up" ? "ONLINE" : live === "down" ? "OFFLINE" : "POLLING";
+ const accessLabel = access === "public" ? "public" : access === "private" ? "private" : access === "on_request" ? "on request" : null;
const host = (() => {
try {
@@ -165,42 +239,39 @@ export function ServiceUnit({
const inner = (
<>
-
-
-
-
-
- {name}
-
- {host} {accessLabel ? `· ${accessLabel}` : ""}
+
+
+
+ {name}
+
+ {host}
+ {accessLabel ? ` · ${accessLabel}` : ""}
+ {desc}
-
- {desc}
-
-
- {statusLabel}
+
+
+ {label}
+
>
);
- const cls = "w-unit w-metal-flat";
-
if (disabled) {
return (
-
+
{inner}
);
}
return (
-
+
{inner}
);
}
-/* -------------------------------------------------------- contributions */
+/* -------------------------------------------------------- activity report */
interface HeatmapPoint {
timestamp: number;
@@ -213,7 +284,9 @@ interface Activity {
repo?: { full_name?: string };
}
-export function ContributionsPanel() {
+const DOT_OPACITY = [0.07, 0.3, 0.48, 0.64, 0.82];
+
+export function Report() {
const [weeks, setWeeks] = useState<{ date: string; contribs: number; level: number }[][]>([]);
const [total, setTotal] = useState(0);
const [activities, setActivities] = useState([]);
@@ -291,50 +364,52 @@ export function ContributionsPanel() {
};
}, []);
- // level 4 = brightest LED, level 0 = off
- const levelOn = (l: number) => (l <= 0 ? "0" : String(5 - l));
-
return (
-
-
- gitdxd.activity
-
-
- {state === "error" ? "link down" : "streaming"}
-
-
+
+
+
+
-
-
{total}
-
contributions / last year
-
+
+ GITDXD // ACTIVITY REPORT
+ {state === "ready" ? "PRINTED LIVE" : state === "error" ? "PRINTER OFFLINE" : "SPOOLING…"}
+
- {state === "loading" ? (
-
reading matrix…
- ) : state === "error" ? (
-
could not reach the forge.
- ) : (
- <>
-
- {weeks.map((w, i) => (
-
- {w.map((d) => (
-
- ))}
+ {state === "error" ? (
+
could not reach the forge.
+ ) : (
+ <>
+
+
+
TOTAL / 12 MONTHS
+
+ {state === "loading" ? "—" : total}
+
- ))}
-
-
- less
- {[4, 3, 2, 1, 0].map((l) => (
-
- ))}
- more
-
+
+ each dot = one day
+
+ darkest = busiest
+
+
- {activities.length > 0 ? (
-
-
+
+ {weeks.map((w, i) => (
+
+ {w.map((d) => (
+
+ ))}
+
+ ))}
+
+
+ {activities.length > 0 ? (
+
{activities.map((a, i) => {
let msg = "commit";
try {
@@ -353,15 +428,15 @@ export function ContributionsPanel() {
}
return (
- $ {a.repo?.full_name || "unknown"} — {msg}
+ > {a.repo?.full_name || "unknown"} — {msg}
);
})}
-
- ) : null}
- >
- )}
+ ) : null}
+ >
+ )}
+
);
}
diff --git a/src/app/credits/page.tsx b/src/app/credits/page.tsx
index 5e3121e..d684ca4 100644
--- a/src/app/credits/page.tsx
+++ b/src/app/credits/page.tsx
@@ -8,57 +8,58 @@ export const metadata: Metadata = {
};
const TEXTURES = [
- { file: "metal.jpg", asset: "Metal 051 C", id: "Metal051C" },
- { file: "paper.jpg", asset: "Paper 003", id: "Paper003" },
- { file: "carbon.jpg", asset: "Fabric 004", id: "Fabric004" },
- { file: "rubber.jpg", asset: "Rubber 004", id: "Rubber004" },
- { file: "plastic.jpg", asset: "Plastic 012 A", id: "Plastic012A" },
+ { file: "desk.jpg", asset: "Wood 027", id: "Wood027", use: "the desk the page sits on" },
+ { file: "metal.jpg", asset: "Metal 051 C", id: "Metal051C", use: "rack, monitor, panel hardware" },
+ { file: "paper.jpg", asset: "Paper 003", id: "Paper003", use: "sheets, labels, tape, the report" },
+ { file: "carbon.jpg", asset: "Fabric 004", id: "Fabric004", use: "the keyboard deck" },
+ { file: "plastic.jpg", asset: "Plastic 012 A", id: "Plastic012A", use: "the drawer interior" },
];
const FONTS = [
{
name: "Newsreader",
by: "Production Type",
- use: "headlines, paper copy",
+ use: "printed headlines, sheet copy, stamped numbers",
href: "https://fonts.google.com/specimen/Newsreader",
},
{
name: "IBM Plex Sans",
by: "IBM",
- use: "body text",
+ use: "body text on the desk",
href: "https://fonts.google.com/specimen/IBM+Plex+Sans",
},
{
name: "IBM Plex Mono",
by: "IBM",
- use: "labels, readouts, LEDs",
+ use: "engraved labels, terminal text, index cards",
href: "https://fonts.google.com/specimen/IBM+Plex+Mono",
},
];
export default function Credits() {
return (
-
-
- credits
- Everything borrowed, credited.
-
- The web theme is built out of a few CC0 textures and open-licensed typefaces. Nothing here is
- scraped or unlicensed — everything below is free to reuse, and the authors are named even where
- the licence does not require it.
+
+
+
+ credits
+
Everything borrowed, credited.
+
+
+ The desk is built out of five CC0 textures and three open-licensed typefaces. Nothing is scraped
+ or unlicensed — the authors are named even where the licence does not require it.
-
-
-
textures
-
ambientCG — CC0 1.0 (public domain)
+
-
-
-
type
-
Google Fonts — SIL Open Font License 1.1
+
+
+ type
+
Google Fonts — SIL OFL 1.1
-
+
{FONTS.map((f) => (
-
- {f.name}
-
- by {f.by} · {f.use}
+
+ {f.name}
+
+ by {f.by}
+
+ {f.use}
fonts.google.com
{" "}
· OFL 1.1
-
+
))}
-
-
-
notes
-
Other marks
+
+
+ notes
+
Other marks
-
- The social buttons use brand marks that remain the property of their owners and are used only
- to link to those accounts. The project and hardware text is my own. The desktop mode (KDE
- sim) uses separate assets credited inside it.
+
+ The social ports use brand marks that remain the property of their owners and are used only to
+ link to those accounts. Everything written on the paper is mine. The desktop mode (the KDE
+ simulation) uses its own separate assets.
-
-
- ← back to the rack
+
+
+ ← back to the desk
diff --git a/src/app/web.css b/src/app/web.css
index 3f91775..c186f62 100644
--- a/src/app/web.css
+++ b/src/app/web.css
@@ -1,560 +1,1212 @@
/* ============================================================
- WEB THEME — a skeuomorphic homelab desk.
+ WEB THEME — “the desk”
------------------------------------------------------------
- Modern dark hardware: anodised aluminium, OLED glass, carbon
- fibre, black rubber and matte plastic, with paper objects
- resting on it. Textures are CC0 (see /credits). Everything is
- scoped under `.w-root` so the KDE desktop is never affected.
+ A warm-lit workbench. One palette everywhere:
+ walnut desk → graphite hardware → cream paper → brass → amber
+ Every section is a physical object resting on that desk, not a
+ row of UI. Nothing on the page is pure white or pure black.
+
+ Textures are CC0 (see /credits).
+
+ NAMING RULE: never name a class after a Tailwind utility.
+ `.w-screen` once collided with Tailwind's `w-screen` (100vw)
+ and stretched every panel. Stay out of the width namespace.
+ Also: this file is unlayered, so its properties beat Tailwind
+ utilities on the same element — add a dedicated class for
+ hover states instead of fighting the cascade.
============================================================ */
html[data-theme="web"] {
color-scheme: dark;
- /* room + chassis */
- --room: #0f1113;
- --room-2: #15181a;
- --chassis: #24282b;
- --chassis-2: #1a1e20;
- --chassis-edge: #0a0c0d;
- --screen: #0b0e0f;
+ /* desk (walnut, dimmed) */
+ --wood: #2a1c11;
+ --wood-edge: #120b06;
- /* ink */
- --ink: #fbf1c7;
- --body: #d5c4a1;
- --muted: #a89984;
- --faint: #928374;
- --paper-ink: #2a2521;
- --paper-ink-soft: #5c544b;
+ /* graphite hardware */
+ --g1: #3d3831; /* lit face */
+ --g2: #2a2622; /* mid */
+ --g3: #171412; /* shade */
+ --rim: rgba(255, 226, 180, 0.14);
+ --edge: #0c0a08;
+
+ /* screen glass */
+ --s1: #17130f;
+ --s2: #0c0a08;
+
+ /* cream paper */
+ --paper: #e8ddc2;
+ --paper-2: #ded1b1;
+ --ink: #3a332a;
+ --ink-soft: #6d6350;
+
+ /* brass */
+ --brass-1: #d3ab6a;
+ --brass-2: #a87f3d;
+ --brass-3: #75541f;
+ --brass-ink: #3b2a0b;
/* signals */
- --accent: #fe8019;
- --accent-2: #fabd2f;
- --led-green: #b8bb26;
- --led-amber: #fabd2f;
- --led-red: #fb4934;
- --led-blue: #83a598;
+ --amber: #e69a3f;
+ --on: #a4b25f;
+ --off: #6d4a3a;
- --ease: cubic-bezier(0.22, 1, 0.36, 1);
+ /* text on dark */
+ --ftext: #e6dcc4;
+ --ftext-dim: #b1a48a;
+ --ftext-faint: #8b7e68;
+
+ /* one shadow language: light from above */
+ --drop: 0 2px 2px rgba(0, 0, 0, 0.45), 0 26px 38px -22px rgba(0, 0, 0, 0.85);
}
+/* ------------------------------------------------------------- the desk */
+
html[data-theme="web"] body {
- background:
- radial-gradient(120% 70% at 50% -15%, #191d20 0%, transparent 55%),
- linear-gradient(var(--room-2), var(--room));
- background-attachment: fixed;
- color: var(--body);
+ color: var(--ftext);
font-family: var(--font-plex), ui-sans-serif, system-ui, sans-serif;
font-size: 1rem;
- line-height: 1.65;
+ line-height: 1.6;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
+ background-color: var(--wood);
+ background-image:
+ radial-gradient(120% 68% at 50% -12%, rgba(255, 214, 158, 0.1) 0%, transparent 58%),
+ radial-gradient(150% 130% at 50% 40%, transparent 34%, rgba(0, 0, 0, 0.62) 100%),
+ linear-gradient(rgba(30, 19, 10, 0.55), rgba(13, 8, 4, 0.76)),
+ url("/textures/desk.jpg");
+ background-size: auto, auto, auto, 540px;
+ background-position: top center, center, center, center;
+ background-repeat: no-repeat, no-repeat, no-repeat, repeat;
+ background-attachment: fixed;
}
-/* ---------------------------------------------------------- materials */
+.w-page {
+ position: relative;
+ z-index: 1;
+}
-.w-metal {
+/* -------------------------------------------------------------- materials */
+
+/* graphite faceplate / chassis */
+.w-mt-metal {
background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(0, 0, 0, 0.16) 40%, rgba(0, 0, 0, 0.34)),
- linear-gradient(rgba(32, 36, 39, 0.8), rgba(18, 21, 23, 0.86)),
- url("/textures/metal.jpg") center / 420px;
- border: 1px solid var(--chassis-edge);
- border-radius: 10px;
+ linear-gradient(180deg, rgba(255, 235, 200, 0.07), rgba(0, 0, 0, 0.12) 46%, rgba(0, 0, 0, 0.34)),
+ linear-gradient(rgba(62, 56, 49, 0.82), rgba(30, 27, 23, 0.88)),
+ url("/textures/metal.jpg") center / 360px;
+ border: 1px solid var(--edge);
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.07),
+ inset 0 1px 0 var(--rim),
inset 0 -1px 0 rgba(0, 0, 0, 0.55),
- 0 18px 40px rgba(0, 0, 0, 0.45);
+ var(--drop);
}
-.w-metal-flat {
+/* same metal, no cast shadow (things mounted on other things) */
+.w-mt-metal-flush {
background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(0, 0, 0, 0.22)),
- linear-gradient(rgba(30, 34, 37, 0.86), rgba(20, 23, 25, 0.9)),
- url("/textures/metal.jpg") center / 380px;
- border: 1px solid #0b0d0e;
- border-radius: 8px;
+ linear-gradient(180deg, rgba(255, 235, 200, 0.06), rgba(0, 0, 0, 0.3)),
+ linear-gradient(rgba(58, 52, 46, 0.84), rgba(28, 25, 22, 0.9)),
+ url("/textures/metal.jpg") center / 320px;
+ border: 1px solid var(--edge);
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.05),
+ inset 0 1px 0 rgba(255, 226, 180, 0.1),
inset 0 -1px 0 rgba(0, 0, 0, 0.5);
}
-.w-carbon {
- background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.03), rgba(0, 0, 0, 0.4)),
- linear-gradient(rgba(26, 29, 31, 0.66), rgba(14, 16, 18, 0.78)),
- url("/textures/carbon.jpg") center / 150px, #14171a;
- border: 1px solid #0a0c0d;
- border-radius: 7px;
+.w-mt-plastic {
+ background: linear-gradient(180deg, #322d28, #1a1714);
+ border: 1px solid var(--edge);
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.06),
- 0 6px 14px rgba(0, 0, 0, 0.4);
+ inset 0 1px 0 rgba(255, 235, 200, 0.08),
+ var(--drop);
}
-.w-rubber {
+.w-mt-brass {
background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.02), rgba(0, 0, 0, 0.35)),
- linear-gradient(rgba(22, 25, 27, 0.66), rgba(12, 14, 15, 0.76)),
- url("/textures/rubber.jpg") center / 280px;
- border: 1px solid #090b0c;
- border-radius: 12px;
-}
-
-.w-plastic {
- background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(0, 0, 0, 0.3)),
- linear-gradient(rgba(34, 38, 41, 0.88), rgba(20, 23, 25, 0.92)),
- url("/textures/plastic.jpg") center / 240px;
- border: 1px solid #0a0c0d;
- border-radius: 9px;
-}
-
-.w-paper {
- background:
- linear-gradient(rgba(253, 250, 243, 0.88), rgba(243, 236, 223, 0.9)),
- url("/textures/paper.jpg") center / 340px;
- color: var(--paper-ink);
- border: 1px solid rgba(0, 0, 0, 0.14);
- border-radius: 4px;
+ linear-gradient(180deg, rgba(255, 240, 205, 0.42), rgba(255, 255, 255, 0) 36%, rgba(60, 38, 8, 0.42)),
+ linear-gradient(150deg, var(--brass-1), var(--brass-2) 46%, var(--brass-1) 64%, var(--brass-3));
+ border: 1px solid #593c12;
+ color: var(--brass-ink);
box-shadow:
- 0 1px 0 rgba(255, 255, 255, 0.6) inset,
- 0 10px 22px rgba(0, 0, 0, 0.42);
+ inset 0 1px 0 rgba(255, 244, 214, 0.55),
+ inset 0 -1px 0 rgba(70, 44, 10, 0.6),
+ 0 2px 2px rgba(0, 0, 0, 0.4),
+ 0 14px 20px -14px rgba(0, 0, 0, 0.8);
+ text-shadow: 0 1px 0 rgba(255, 240, 200, 0.35);
}
-.w-panel {
+.w-mt-paper {
+ background:
+ linear-gradient(rgba(255, 250, 236, 0.34), rgba(232, 220, 190, 0.46)),
+ url("/textures/paper.jpg") center / 330px,
+ var(--paper);
+ color: var(--ink);
+ border: 1px solid rgba(84, 67, 42, 0.22);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 255, 255, 0.55),
+ 0 1px 1px rgba(0, 0, 0, 0.3),
+ 0 20px 26px -20px rgba(0, 0, 0, 0.85);
+}
+
+/* dark glass panel */
+.w-mt-glass {
position: relative;
background:
- radial-gradient(130% 90% at 50% -10%, rgba(254, 128, 25, 0.07), transparent 62%),
- linear-gradient(var(--screen), #070a0b);
- border: 1px solid #000;
- border-radius: 8px;
+ radial-gradient(130% 100% at 26% -14%, rgba(255, 214, 158, 0.11), transparent 56%),
+ linear-gradient(158deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0) 34%),
+ linear-gradient(var(--s1), var(--s2));
+ border: 1px solid #070605;
box-shadow:
- inset 0 0 0 1px rgba(255, 255, 255, 0.045),
- inset 0 14px 34px rgba(0, 0, 0, 0.75),
- 0 1px 0 rgba(255, 255, 255, 0.05);
+ inset 0 0 0 1px rgba(255, 235, 200, 0.05),
+ inset 0 22px 44px rgba(0, 0, 0, 0.72),
+ 0 1px 0 rgba(255, 226, 180, 0.07);
overflow: hidden;
}
-/* faint scanlines so the glass reads as a panel, not a flat fill */
-.w-panel::after {
- content: "";
- position: absolute;
- inset: 0;
- pointer-events: none;
- background: repeating-linear-gradient(
- 180deg,
- rgba(255, 255, 255, 0.022) 0 1px,
- transparent 1px 3px
- );
- opacity: 0.7;
-}
-/* ------------------------------------------------------------- details */
-
-/* NOTE: no class in here may collide with a Tailwind utility name. `.w-screen`
- was a real bug: Tailwind's `w-screen` sets width:100vw and beat this file, so
- every "screen" panel was forced to full viewport width. Keep the `w-` names
- away from Tailwind's width namespace (`w-full`, `w-screen`, `w-min`, ...). */
+/* --------------------------------------------------------------- details */
.w-screw {
position: relative;
width: 11px;
height: 11px;
border-radius: 50%;
- background: radial-gradient(circle at 35% 30%, #767c7a, #2b2f30 68%);
+ flex: none;
+ background: radial-gradient(circle at 34% 28%, #8a8172, #2c2823 70%);
box-shadow:
inset 0 0 0 1px rgba(0, 0, 0, 0.65),
0 1px 1px rgba(0, 0, 0, 0.5);
- flex: none;
+}
+.w-screw--brass {
+ background: radial-gradient(circle at 34% 28%, #f0cf8e, #7a571d 70%);
}
.w-screw::after {
content: "";
position: absolute;
inset: 3px;
- background: linear-gradient(90deg, transparent 38%, #101314 38%, #101314 62%, transparent 62%);
+ background: linear-gradient(90deg, transparent 36%, #0e0c0a 36%, #0e0c0a 64%, transparent 64%);
transform: rotate(38deg);
}
-.w-vent {
- background-image: radial-gradient(circle, rgba(0, 0, 0, 0.85) 1.1px, transparent 1.3px);
+/* Screws are `position: relative` so the slot can be drawn, which means a
+ Tailwind `absolute` utility loses the cascade. Place them with these. */
+.w-corner-tl { position: absolute; top: 12px; left: 12px; }
+.w-corner-tr { position: absolute; top: 12px; right: 12px; }
+.w-corner-bl { position: absolute; bottom: 12px; left: 12px; }
+.w-corner-br { position: absolute; bottom: 12px; right: 12px; }
+
+.w-vents {
+ background-image: radial-gradient(circle, rgba(0, 0, 0, 0.88) 1.1px, transparent 1.35px);
background-size: 8px 8px;
- background-position: 0 0;
- opacity: 0.75;
+}
+
+.w-grille {
+ background-image: repeating-linear-gradient(
+ 180deg,
+ #12100d 0 2px,
+ #4a443b 2px 3px,
+ #221f1b 3px 5px,
+ #12100d 5px 7px
+ );
}
.w-led {
width: 8px;
height: 8px;
border-radius: 50%;
+ flex: none;
background: currentColor;
box-shadow:
0 0 7px currentColor,
- inset 0 0 2px rgba(255, 255, 255, 0.7);
- flex: none;
+ inset 0 0 2px rgba(255, 255, 255, 0.55);
}
-.w-led--green { color: var(--led-green); }
-.w-led--amber { color: var(--led-amber); }
-.w-led--red { color: var(--led-red); }
-.w-led--blue { color: var(--led-blue); }
-.w-led--off {
- color: #3a3f41;
- box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.8);
-}
-.w-led--pulse {
- animation: w-led-pulse 1.6s ease-in-out infinite;
-}
-@keyframes w-led-pulse {
+.w-led--on { color: var(--on); }
+.w-led--amber { color: var(--amber); }
+.w-led--off { color: var(--off); box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.8); }
+.w-led--pulse { animation: w-pulse 1.8s ease-in-out infinite; }
+.w-led--pulse-slow { animation: w-pulse 3.2s ease-in-out infinite; }
+@keyframes w-pulse {
0%, 100% { opacity: 1; }
- 50% { opacity: 0.35; }
+ 50% { opacity: 0.3; }
}
-/* etched / engraved label plate */
-.w-plate {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.28rem 0.6rem;
- border-radius: 5px;
- background: linear-gradient(180deg, #2a2e31, #1b1f21);
- border: 1px solid #0b0d0e;
- box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.07),
- inset 0 -1px 0 rgba(0, 0, 0, 0.5);
- color: var(--faint);
+/* printed label tape stuck onto hardware */
+.w-tape {
+ display: inline-block;
+ max-width: 100%;
+ padding: 0.16rem 0.5rem;
+ color: #4b4133;
font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.68rem;
- letter-spacing: 0.08em;
- text-transform: uppercase;
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.7);
-}
-
-/* push button */
-.w-btn {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.6rem 0.95rem;
- border-radius: 8px;
- background: linear-gradient(180deg, #3c4145, #24282b);
- border: 1px solid #0b0d0e;
- color: var(--ink);
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.78rem;
+ font-size: 0.66rem;
letter-spacing: 0.02em;
+ background:
+ linear-gradient(rgba(255, 252, 240, 0.5), rgba(238, 226, 198, 0.42)),
+ url("/textures/paper.jpg") center / 220px,
+ #e6dabc;
+ transform: rotate(-0.5deg);
+ border-left: 1px dashed rgba(90, 74, 50, 0.3);
+ border-right: 1px dashed rgba(90, 74, 50, 0.3);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
+}
+
+/* rack rails: a column of square-ish holes */
+.w-rails {
+ border-radius: 3px;
+ background-image:
+ radial-gradient(circle at 50% 50%, #070605 0 2.6px, rgba(0, 0, 0, 0) 3.1px),
+ linear-gradient(90deg, #2e2a25, #15130f 62%, #0c0b09);
+ background-size: 100% 22px, auto;
+ background-repeat: repeat, no-repeat;
+ background-position: 50% 8px, center;
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.14),
- 0 3px 0 #0a0c0d,
- 0 9px 18px rgba(0, 0, 0, 0.45);
- transition: filter 140ms ease-out, transform 90ms ease-out, box-shadow 90ms ease-out;
+ inset 0 0 0 1px rgba(0, 0, 0, 0.6),
+ inset 1px 0 0 rgba(255, 226, 180, 0.06);
}
-.w-btn:hover { filter: brightness(1.12); }
-.w-btn:active {
- transform: translateY(3px);
+
+/* engraved lettering in metal */
+.w-engrave {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ color: #cdc1a6;
+ text-shadow:
+ 0 1px 0 rgba(0, 0, 0, 0.9),
+ 0 -1px 0 rgba(255, 255, 255, 0.07);
+}
+
+/* ------------------------------------------------------ text & typography */
+
+.w-serif {
+ font-family: var(--font-news), Georgia, serif;
+ font-weight: 500;
+ letter-spacing: -0.012em;
+ line-height: 1.08;
+}
+.w-mono {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+}
+.w-kicker {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.66rem;
+ letter-spacing: 0.16em;
+ text-transform: uppercase;
+ color: var(--ftext-faint);
+}
+.w-prose {
+ font-size: 1rem;
+ line-height: 1.68;
+}
+.w-link {
+ color: var(--amber);
+ text-decoration: underline;
+ text-underline-offset: 3px;
+ text-decoration-thickness: 1px;
+ text-decoration-color: rgba(230, 154, 63, 0.45);
+}
+.w-link:hover { text-decoration-color: var(--amber); }
+.w-mt-paper .w-link,
+.w-sheet .w-link,
+.w-sticky .w-link {
+ color: #9a5410;
+ text-decoration-color: rgba(154, 84, 16, 0.4);
+}
+.w-mt-paper .w-link:hover { text-decoration-color: #9a5410; }
+.w-mt-brass .w-link {
+ color: #5c3d0e;
+ text-decoration-color: rgba(92, 61, 14, 0.45);
+}
+.w-mt-brass .w-link:hover { text-decoration-color: #5c3d0e; }
+
+/* painted/printed on a dark surface */
+.w-paint {
+ color: var(--ftext);
+ text-shadow:
+ 0 1px 0 rgba(0, 0, 0, 0.75),
+ 0 0 22px rgba(0, 0, 0, 0.5);
+}
+
+/* terminal text on a screen */
+.w-tft {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.8rem;
+ line-height: 1.75;
+ color: var(--ftext-dim);
+ position: relative;
+ z-index: 1;
+}
+.w-tft b { color: var(--ftext); font-weight: 400; }
+.w-tft .a { color: var(--amber); }
+.w-caret {
+ display: inline-block;
+ width: 0.55em;
+ height: 1.02em;
+ vertical-align: -0.16em;
+ background: var(--amber);
+ animation: w-blink 1.1s step-end infinite;
+}
+@keyframes w-blink {
+ 0%, 49% { opacity: 1; }
+ 50%, 100% { opacity: 0; }
+}
+.w-cmd {
+ display: inline-block;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.84rem;
+ color: var(--amber);
+ border-bottom: 1px solid rgba(230, 154, 63, 0.35);
+ padding-bottom: 2px;
+ transition: text-shadow 160ms ease-out, border-color 160ms ease-out;
+}
+.w-cmd:hover {
+ text-shadow: 0 0 12px rgba(230, 154, 63, 0.55);
+ border-bottom-color: var(--amber);
+}
+
+/* ------------------------------------------------------------ chunky keys */
+
+.w-keybtn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem 0.85rem;
+ border-radius: 7px;
+ background: linear-gradient(180deg, #3f3a33, #221f1b);
+ border: 1px solid #0d0b09;
+ color: var(--ftext);
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.72rem;
+ letter-spacing: 0.04em;
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.08),
- 0 0 0 #0a0c0d,
- 0 4px 10px rgba(0, 0, 0, 0.45);
+ inset 0 1px 0 rgba(255, 235, 200, 0.14),
+ 0 2px 0 #0b0a08,
+ 0 10px 16px -8px rgba(0, 0, 0, 0.75);
+ transition: filter 140ms ease-out, transform 80ms ease-out, box-shadow 80ms ease-out;
}
-.w-btn--accent {
- background: linear-gradient(180deg, #ff9a3d, #d65d0e);
- border-color: #6d2f06;
- color: #22160a;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+.w-keybtn:hover { filter: brightness(1.12); }
+.w-keybtn:active {
+ transform: translateY(2px);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.08),
+ 0 0 0 #0b0a08,
+ 0 5px 10px -6px rgba(0, 0, 0, 0.75);
}
-.w-btn--accent:hover { filter: brightness(1.06); }
/* rocker power switch */
-.w-switch {
+.w-rocker {
position: relative;
- width: 56px;
+ width: 58px;
height: 30px;
border-radius: 7px;
- background: linear-gradient(180deg, #0d0f10, #191d1f);
+ flex: none;
+ background: linear-gradient(180deg, #0d0b09, #1c1916);
border: 1px solid #000;
box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.85);
- flex: none;
}
-.w-switch__knob {
+.w-rocker__knob {
position: absolute;
top: 3px;
left: 3px;
- width: 24px;
+ width: 25px;
height: 22px;
border-radius: 5px;
- background: linear-gradient(180deg, #565d61, #2b3033);
+ background: linear-gradient(180deg, #5c554b, #2b2823);
box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.22),
+ inset 0 1px 0 rgba(255, 235, 200, 0.24),
0 2px 4px rgba(0, 0, 0, 0.6);
- transition: transform 180ms var(--ease);
+ transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1);
}
-.w-switch__knob::after {
+.w-rocker__knob::after {
content: "";
position: absolute;
inset: 6px 5px;
border-radius: 2px;
- background: repeating-linear-gradient(180deg, rgba(255, 255, 255, 0.18) 0 1px, transparent 1px 4px);
+ background: repeating-linear-gradient(180deg, rgba(255, 235, 200, 0.16) 0 1px, transparent 1px 4px);
}
-[data-desktop-mode="on"] .w-switch__knob { transform: translateX(26px); }
-.w-switch__led {
+.w-rocker__led {
position: absolute;
- right: 6px;
+ right: 7px;
top: 50%;
transform: translateY(-50%);
}
-[data-desktop-mode="on"] .w-switch__led { color: var(--led-green); }
-/* ------------------------------------------------------------ objects */
+/* ------------------------------------------------------------- THE SCREEN */
-/* top chassis rail */
-.w-rail {
- position: fixed;
- inset: 0 0 auto;
- z-index: 50;
- border-bottom: 1px solid #050607;
- box-shadow: 0 12px 30px rgba(0, 0, 0, 0.55);
+.w-monitor { position: relative; }
+
+.w-monitor__frame {
+ position: relative;
+ padding: 11px 11px 30px;
+ border-radius: 13px;
+ background: linear-gradient(180deg, #2f2a25, #14110e);
+ border: 1px solid #080706;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.1),
+ inset 0 -2px 0 rgba(0, 0, 0, 0.6),
+ var(--drop);
}
-/* the hero rack */
-.w-rack {
- padding: 14px;
+.w-monitor__glass {
+ border-radius: 6px;
+ padding: clamp(1.4rem, 3.4vw, 2.6rem);
+ min-height: clamp(320px, 42vw, 420px);
display: flex;
flex-direction: column;
- gap: 9px;
-}
-.w-rack__head {
- display: flex;
- align-items: center;
- gap: 10px;
- padding: 0 4px 6px;
- border-bottom: 1px solid rgba(255, 255, 255, 0.055);
-}
-.w-rack__title {
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.66rem;
- letter-spacing: 0.14em;
- text-transform: uppercase;
- color: var(--faint);
-}
-.w-rack__ears {
- display: flex;
- align-items: center;
- justify-content: space-between;
+ justify-content: center;
}
-/* a 1U unit */
-.w-unit {
+/* the faint diagonal reflection you get across a real panel */
+.w-monitor__glass::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ background: linear-gradient(114deg, rgba(255, 240, 210, 0.055) 0 18%, rgba(255, 240, 210, 0) 42%);
+}
+
+.w-monitor__chin {
+ position: absolute;
+ left: 16px;
+ right: 16px;
+ bottom: 9px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+.w-monitor__brand {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.6rem;
+ letter-spacing: 0.32em;
+ color: #7d7364;
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.8);
+}
+.w-monitor__osd {
+ margin-left: auto;
+ display: flex;
+ gap: 5px;
+}
+.w-osdkey {
+ width: 22px;
+ height: 12px;
+ border-radius: 3px;
+ background: linear-gradient(180deg, #413b34, #262220);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.14),
+ 0 1px 0 #0b0a08;
+}
+
+.w-monitor__stand {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+.w-monitor__neck {
+ width: 76px;
+ height: 54px;
+ margin-top: -2px;
+ background: linear-gradient(90deg, #201d19, #3b352e 38%, #17140f);
+ clip-path: polygon(22% 0, 78% 0, 100% 100%, 0 100%);
+ box-shadow: 0 8px 14px -8px rgba(0, 0, 0, 0.8);
+}
+.w-monitor__base {
+ width: min(260px, 62%);
+ height: 15px;
+ border-radius: 50% / 60%;
+ background: linear-gradient(180deg, #3d3730, #16130f);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.14),
+ 0 16px 22px -10px rgba(0, 0, 0, 0.85);
+}
+
+/* keyboard: real keycaps, seen slightly from above */
+.w-keyboard {
+ transform: perspective(760px) rotateX(17deg);
+ transform-origin: 50% 0;
+ filter: drop-shadow(0 22px 20px rgba(0, 0, 0, 0.55));
+}
+.w-keyboard__deck {
+ padding: 12px;
+ border-radius: 10px;
+ background:
+ linear-gradient(180deg, rgba(255, 235, 200, 0.04), rgba(0, 0, 0, 0.34)),
+ linear-gradient(rgba(34, 31, 28, 0.62), rgba(16, 14, 12, 0.72)),
+ url("/textures/carbon.jpg") center / 150px,
+ #171412;
+ border: 1px solid #0a0907;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.1),
+ inset 0 -3px 0 rgba(0, 0, 0, 0.5);
+}
+.w-keyboard__row {
+ display: flex;
+ gap: 6px;
+ justify-content: center;
+}
+.w-keyboard__row + .w-keyboard__row { margin-top: 7px; }
+.w-key {
+ flex: 1 1 0;
+ min-width: 0;
+ height: 34px;
+ border-radius: 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.58rem;
+ color: #8f8676;
+ background: linear-gradient(180deg, #423c35 0%, #2b2723 62%, #211e1a 100%);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.16),
+ inset 0 -1px 0 rgba(0, 0, 0, 0.6),
+ 0 2px 0 #100e0c,
+ 0 3px 4px rgba(0, 0, 0, 0.45);
+}
+.w-key--space { flex: 4.4 1 0; }
+
+/* ---------------------------------------------------------------- THE RACK */
+
+.w-rack { padding: 14px; border-radius: 14px; }
+.w-rack__top {
display: flex;
align-items: center;
gap: 12px;
- padding: 12px 14px;
- min-height: 58px;
+ padding: 0 4px 12px;
}
-.w-unit__leds {
+.w-rack__vent {
+ margin-left: auto;
+ width: clamp(60px, 18%, 150px);
+ height: 20px;
+ border-radius: 4px;
+ border: 1px solid #0a0908;
+ background-color: #14110e;
+ box-shadow: inset 0 0 0 1px rgba(255, 235, 200, 0.04);
+}
+.w-rack__grid {
+ display: grid;
+ grid-template-columns: 20px minmax(0, 1fr) 20px;
+ gap: 8px;
+ align-items: stretch;
+}
+
+/* one rack unit */
+.w-unit {
+ position: relative;
display: flex;
align-items: center;
- gap: 5px;
+ gap: 14px;
+ min-height: 66px;
+ padding: 10px 16px;
+ border-radius: 7px;
+ background:
+ linear-gradient(180deg, rgba(255, 235, 200, 0.05), rgba(0, 0, 0, 0.16) 52%, rgba(0, 0, 0, 0.32)),
+ linear-gradient(rgba(64, 57, 48, 0.86), rgba(30, 27, 23, 0.9)),
+ url("/textures/metal.jpg") center / 340px;
+ border: 1px solid var(--edge);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 226, 180, 0.11),
+ inset 0 -1px 0 rgba(0, 0, 0, 0.5),
+ 0 3px 5px -2px rgba(0, 0, 0, 0.6);
+ transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1), filter 180ms ease-out;
+}
+.w-unit + .w-unit { margin-top: 7px; }
+.w-unit--link:hover {
+ transform: translateX(4px);
+ filter: brightness(1.1);
+}
+/* the small vertical grip on the left of a rack unit */
+.w-unit__grip {
+ width: 12px;
+ height: 34px;
+ border-radius: 3px;
flex: none;
+ background:
+ repeating-linear-gradient(180deg, rgba(0, 0, 0, 0.55) 0 2px, rgba(255, 235, 200, 0.07) 2px 3px),
+ linear-gradient(90deg, #2b2723, #45403a 55%, #191613);
+}
+.w-unit__grille {
+ width: 54px;
+ height: 38px;
+ border-radius: 4px;
+ flex: none;
+ border: 1px solid #0a0908;
+ box-shadow: inset 0 0 0 1px rgba(255, 235, 200, 0.045);
+}
+.w-unit__id {
+ min-width: 0;
+ flex: 1 1 auto;
}
.w-unit__name {
+ display: block;
font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.9rem;
- color: var(--ink);
- letter-spacing: 0.01em;
+ font-size: 1rem;
+ letter-spacing: 0.03em;
}
-.w-unit__meta {
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.68rem;
- color: var(--faint);
-}
-.w-unit--link {
- transition: filter 150ms ease-out, transform 150ms ease-out;
-}
-.w-unit--link:hover {
- filter: brightness(1.14);
- transform: translateX(2px);
-}
-
-/* engraved brass-style nameplate */
-.w-nameplate {
- padding: 1.1rem 1.3rem;
- border-radius: 8px;
- background:
- linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(0, 0, 0, 0.22)),
- linear-gradient(rgba(38, 42, 45, 0.9), rgba(23, 26, 28, 0.94)),
- url("/textures/metal.jpg") center / 460px;
- border: 1px solid #0a0c0d;
- box-shadow:
- inset 0 1px 0 rgba(255, 255, 255, 0.09),
- inset 0 -1px 0 rgba(0, 0, 0, 0.6);
-}
-.w-nameplate h1 {
- font-family: var(--font-news), Georgia, serif;
- font-weight: 500;
- letter-spacing: -0.015em;
- line-height: 1.06;
- color: var(--ink);
- text-shadow:
- 0 1px 0 rgba(0, 0, 0, 0.85),
- 0 -1px 0 rgba(255, 255, 255, 0.12);
-}
-
-/* paper objects */
-.w-note {
- padding: 1.1rem 1.2rem;
- transform: rotate(-0.6deg);
-}
-.w-note--tilt { transform: rotate(0.7deg); }
-.w-card {
- padding: 1rem 1.1rem;
-}
-.w-grommet {
- width: 14px;
- height: 14px;
- border-radius: 50%;
- background: radial-gradient(circle at 40% 35%, #6d7371, #26292a 70%);
- box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.45), 0 1px 1px rgba(0, 0, 0, 0.4);
-}
-
-/* SSD caddy */
-.w-caddy {
+.w-unit__state {
display: flex;
align-items: center;
- gap: 12px;
- padding: 10px 12px;
- border-radius: 6px;
- transition: transform 150ms var(--ease), filter 150ms ease-out;
+ gap: 8px;
+ flex: none;
}
-.w-caddy:hover { transform: translateY(-2px); filter: brightness(1.15); }
-.w-caddy__label {
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.82rem;
- color: var(--ink);
-}
-.w-caddy__status {
+.w-unit__status {
font-family: var(--font-plexmono), ui-monospace, monospace;
font-size: 0.62rem;
- letter-spacing: 0.08em;
- text-transform: uppercase;
- color: var(--faint);
+ letter-spacing: 0.18em;
+}
+.w-unit__screws {
+ position: absolute;
+ top: 6px;
+ right: 7px;
+ bottom: 6px;
+ display: none;
+ flex-direction: column;
+ justify-content: space-between;
+}
+@media (min-width: 640px) {
+ .w-unit__screws { display: flex; }
+ .w-unit__state { margin-right: 16px; }
}
-/* drawer */
+/* ----------------------------------------------------------- brass plaques */
+
+.w-plaque {
+ padding: 0.85rem 1rem;
+ border-radius: 6px;
+ display: flex;
+ align-items: baseline;
+ gap: 0.7rem;
+}
+.w-plaque__value {
+ font-family: var(--font-news), Georgia, serif;
+ font-size: 1.9rem;
+ line-height: 1;
+ font-weight: 600;
+}
+.w-plaque__label {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.62rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ opacity: 0.75;
+}
+.w-plaque__screw {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+}
+
+/* --------------------------------------------------------- section headers */
+
+.w-sechead {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ flex-wrap: wrap;
+ margin-bottom: 1.35rem;
+}
+.w-sechead__tab {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.3rem 0.7rem;
+ border-radius: 4px;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.64rem;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ transform: rotate(-1.2deg);
+}
+.w-sechead__title {
+ font-size: clamp(1.45rem, 3.4vw, 2.05rem);
+}
+
+/* ------------------------------------------------------------------ paper */
+
+.w-sheet {
+ border-radius: 3px;
+ padding: clamp(1.4rem, 3vw, 2.1rem);
+}
+.w-sheet__head {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding-bottom: 0.7rem;
+ border-bottom: 1px solid rgba(90, 74, 50, 0.28);
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.64rem;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: var(--ink-soft);
+}
+
+.w-rule {
+ border-bottom: 1px solid rgba(90, 74, 50, 0.22);
+}
+
+/* small card, slightly off-square like a real card index */
+.w-cardindex {
+ border-radius: 3px;
+ padding: 1.05rem 1.1rem;
+ transform: rotate(-0.7deg);
+}
+.w-cardindex--alt { transform: rotate(0.8deg); }
+
+/* sticky note */
+.w-sticky {
+ position: relative;
+ padding: 1.15rem 1.2rem 1.35rem;
+ border-radius: 2px;
+ background:
+ linear-gradient(rgba(255, 248, 214, 0.44), rgba(226, 208, 150, 0.4)),
+ url("/textures/paper.jpg") center / 300px,
+ #e9d99e;
+ color: #4a4232;
+ border: 1px solid rgba(110, 92, 44, 0.25);
+ border-bottom-color: rgba(110, 92, 44, 0.4);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 255, 255, 0.5),
+ 0 2px 3px rgba(0, 0, 0, 0.35),
+ 0 18px 22px -16px rgba(0, 0, 0, 0.85);
+ transform: rotate(1.1deg);
+}
+/* the lifted corner */
+.w-sticky::after {
+ content: "";
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ width: 34px;
+ height: 34px;
+ background: linear-gradient(135deg, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0.22) 50%, rgba(255, 250, 225, 0.65) 54%);
+ border-bottom-right-radius: 2px;
+}
+
+/* a resting pencil */
+.w-pencil {
+ height: 11px;
+ border-radius: 3px;
+ background:
+ linear-gradient(180deg, rgba(255, 235, 200, 0.28), rgba(0, 0, 0, 0.28)),
+ linear-gradient(90deg, #6d5a35 0 76%, #d8c9a4 76% 82%, #3a332a 82% 88%, #d8c9a4 88% 92%, #b8562e 92% 100%),
+ #8a7442;
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.5);
+ transform: rotate(-2.4deg);
+}
+
+/* --------------------------------------------------------- drawer of drives */
+
.w-drawer {
+ border-radius: 12px;
padding: 12px;
}
-.w-drawer__handle {
- height: 16px;
+.w-drawer__inner {
border-radius: 8px;
- background: linear-gradient(180deg, #3a3f43, #22262a);
- border: 1px solid #0a0c0d;
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 2px 5px rgba(0, 0, 0, 0.5);
-}
-
-/* pegboard + hanging tag */
-.w-pegboard {
padding: 14px;
- background-image: radial-gradient(circle, rgba(0, 0, 0, 0.7) 1.4px, transparent 1.6px);
- background-size: 22px 22px;
-}
-.w-tag {
- padding: 0.9rem 1rem 0.9rem 2.6rem;
- position: relative;
-}
-.w-tag__ring {
- position: absolute;
- left: 12px;
- top: 14px;
- width: 14px;
- height: 14px;
- border-radius: 50%;
- background: radial-gradient(circle at 40% 35%, #6d7371, #26292a 70%);
+ border: 1px solid #0a0907;
+ background:
+ linear-gradient(180deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.18) 18%, rgba(0, 0, 0, 0.25)),
+ linear-gradient(rgba(38, 34, 30, 0.9), rgba(22, 20, 17, 0.94)),
+ url("/textures/plastic.jpg") center / 260px;
box-shadow:
- inset 0 0 0 2px rgba(0, 0, 0, 0.45),
- 0 1px 1px rgba(0, 0, 0, 0.4);
+ inset 0 14px 20px -12px rgba(0, 0, 0, 0.9),
+ inset 0 -20px 26px -20px rgba(0, 0, 0, 0.95),
+ inset 0 -2px 0 rgba(255, 235, 200, 0.04);
+ max-height: 540px;
+ overflow-y: auto;
+ scrollbar-gutter: stable;
+}
+.w-drawer__front {
+ margin-top: 12px;
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ padding: 10px 16px;
+ border-radius: 8px;
+}
+.w-drawer__handle {
+ flex: none;
+ width: 46%;
+ max-width: 300px;
+ height: 16px;
+ margin: 0 auto;
+ border-radius: 8px;
+ background: linear-gradient(180deg, #464038, #221f1b);
+ border: 1px solid #0a0907;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 235, 200, 0.16),
+ 0 3px 5px -2px rgba(0, 0, 0, 0.7);
}
-/* LED dashboard */
-.w-dashboard {
- padding: 14px;
+/* 2.5" drive with a printed sticker */
+.w-drive {
+ position: relative;
+ display: block;
+ /* rotation lives in --tilt so hover can still override the transform */
+ transform: rotate(var(--tilt, 0deg));
+ padding: 12px 14px 12px 12px;
+ border-radius: 5px;
+ background:
+ linear-gradient(180deg, rgba(255, 235, 200, 0.06), rgba(0, 0, 0, 0.2) 50%, rgba(0, 0, 0, 0.34)),
+ linear-gradient(rgba(52, 47, 41, 0.8), rgba(24, 22, 19, 0.88)),
+ url("/textures/metal.jpg") center / 300px;
+ border: 1px solid var(--edge);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 226, 180, 0.1),
+ 0 6px 10px -6px rgba(0, 0, 0, 0.85);
+ transition: transform 170ms cubic-bezier(0.22, 1, 0.36, 1), filter 170ms ease-out;
}
-.w-ledgrid {
+.w-drive:hover {
+ transform: translateY(-3px) rotate(0deg);
+ filter: brightness(1.12);
+}
+/* sata connector notch on the left edge */
+.w-drive__port {
+ position: absolute;
+ left: 5px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 5px;
+ height: 26px;
+ border-radius: 2px;
+ background: linear-gradient(180deg, #c9a95f 0 42%, #1b1916 42% 100%);
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.7);
+}
+.w-drive__sticker {
+ display: block;
+ border-radius: 2px;
+ padding: 0.55rem 0.65rem;
+ color: #3d3529;
+ background:
+ linear-gradient(rgba(255, 252, 240, 0.45), rgba(236, 224, 196, 0.35)),
+ url("/textures/paper.jpg") center / 240px,
+ #e6dabc;
+ border: 1px solid rgba(90, 74, 50, 0.28);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
+ transform: rotate(-0.4deg);
+}
+.w-drive__name {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.76rem;
+ color: #332c22;
+}
+.w-drive__meta {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin-top: 3px;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.6rem;
+ letter-spacing: 0.04em;
+ color: #6f6450;
+}
+.w-drive__led {
+ position: absolute;
+ right: 9px;
+ top: 9px;
+}
+
+/* ----------------------------------------------------- pegboard & hang tags */
+
+.w-pegboard {
+ border-radius: 12px;
+ padding: clamp(0.9rem, 2.2vw, 1.4rem);
+}
+.w-pegboard__face {
+ border-radius: 8px;
+ padding: clamp(0.9rem, 2.4vw, 1.5rem);
+ background-color: #16130f;
+ background-image: radial-gradient(circle at 50% 50%, rgba(0, 0, 0, 0.9) 1.6px, rgba(0, 0, 0, 0) 2.1px);
+ background-size: 26px 26px;
+ border: 1px solid #0a0908;
+ box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.8);
+}
+.w-hangtag {
+ position: relative;
+ border-radius: 2px;
+ padding: 1rem 1rem 1rem 2.5rem;
+ transform: rotate(-0.6deg);
+ transition: transform 170ms cubic-bezier(0.22, 1, 0.36, 1);
+}
+.w-hangtag:nth-child(3n + 2) { transform: rotate(0.9deg); }
+.w-hangtag:nth-child(3n + 3) { transform: rotate(-0.2deg); }
+.w-hangtag:hover { transform: rotate(0deg) translateY(-3px); }
+/* punched hole + brass eyelet */
+.w-hangtag__hole {
+ position: absolute;
+ left: 13px;
+ top: 15px;
+ width: 15px;
+ height: 15px;
+ border-radius: 50%;
+ background: radial-gradient(circle at 50% 50%, #241d14 0 4px, #b8893f 4px 6px, #6d4f1c 6px 100%);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+}
+
+/* ------------------------------------------------------- dot-matrix report */
+
+.w-printout { position: relative; }
+.w-printout__paper {
+ position: relative;
+ padding: 1.1rem clamp(2.1rem, 5vw, 2.6rem);
+ border-radius: 2px;
+ transform: rotate(-0.35deg);
+}
+.w-printout__perf {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: clamp(1.5rem, 3.6vw, 2rem);
+ background-image: radial-gradient(circle, rgba(58, 51, 42, 0.55) 2.4px, rgba(0, 0, 0, 0) 2.9px);
+ background-size: 100% 17px;
+ background-position: 0 8px;
+}
+.w-printout__perf--l { left: 0; border-right: 1px dashed rgba(90, 74, 50, 0.35); }
+.w-printout__perf--r { right: 0; border-left: 1px dashed rgba(90, 74, 50, 0.35); }
+
+.w-print__head {
+ display: flex;
+ align-items: baseline;
+ gap: 0.9rem;
+ flex-wrap: wrap;
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.68rem;
+ letter-spacing: 0.16em;
+ text-transform: uppercase;
+ color: #4a4133;
+ border-bottom: 2px solid rgba(58, 51, 42, 0.55);
+ padding-bottom: 0.55rem;
+}
+.w-dotgrid {
display: flex;
gap: 3px;
overflow-x: auto;
- padding-bottom: 4px;
+ padding: 1rem 0 0.35rem;
}
-.w-ledgrid__col { display: flex; flex-direction: column; gap: 3px; }
-.w-ledgrid__cell {
- width: 10px;
- height: 10px;
- border-radius: 2px;
- background: #23272a;
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.5);
+.w-dotgrid__col { display: flex; flex-direction: column; gap: 3px; }
+.w-dot {
+ width: 9px;
+ height: 9px;
+ border-radius: 1px;
+ background: #3a332a;
}
-.w-ledgrid__cell[data-on="1"] { background: var(--led-green); box-shadow: 0 0 6px rgba(184, 187, 38, 0.65); }
-.w-ledgrid__cell[data-on="2"] { background: #9ea22a; box-shadow: 0 0 6px rgba(158, 162, 42, 0.6); }
-.w-ledgrid__cell[data-on="3"] { background: #6f7420; }
-.w-ledgrid__cell[data-on="4"] { background: #4a4e16; }
-
-/* scoreboard digits */
-.w-digits {
+.w-print__log {
+ margin-top: 0.9rem;
+ padding-top: 0.7rem;
+ border-top: 1px dashed rgba(90, 74, 50, 0.4);
font-family: var(--font-plexmono), ui-monospace, monospace;
- font-weight: 500;
- color: var(--led-amber);
- text-shadow: 0 0 12px rgba(250, 189, 47, 0.45);
- font-variant-numeric: tabular-nums;
- letter-spacing: 0.02em;
+ font-size: 0.68rem;
+ line-height: 1.75;
+ color: #4f4636;
}
-/* patch panel */
-.w-patch {
- padding: 14px;
+/* --------------------------------------------------------- business cards */
+
+.w-bizcard {
+ position: relative;
+ display: block;
+ transform: rotate(var(--tilt, 0deg));
+ border-radius: 4px;
+ padding: 1.15rem 1.25rem;
+ transition: transform 170ms cubic-bezier(0.22, 1, 0.36, 1);
+}
+.w-bizcard::after {
+ /* the printed hairline a card has around its edge */
+ content: "";
+ position: absolute;
+ inset: 5px;
+ border: 1px solid rgba(90, 74, 50, 0.22);
+ border-radius: 2px;
+ pointer-events: none;
+}
+.w-bizcard:hover { transform: rotate(0deg) translateY(-4px); }
+
+/* ---------------------------------------------------- clipboard training log */
+
+.w-clipboard {
+ position: relative;
+ border-radius: 8px;
+ padding: 16px 16px 26px;
+ background:
+ linear-gradient(rgba(60, 40, 22, 0.35), rgba(30, 20, 10, 0.5)),
+ url("/textures/desk.jpg") center / 320px,
+ #4a3320;
+ border: 1px solid #120b06;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 226, 180, 0.08),
+ var(--drop);
+}
+.w-clipboard__clip {
+ position: absolute;
+ left: 50%;
+ top: -12px;
+ transform: translateX(-50%);
+ width: 132px;
+ height: 40px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.w-clipboard__clip::after {
+ content: "";
+ width: 54px;
+ height: 9px;
+ border-radius: 5px;
+ background: linear-gradient(180deg, #14120f, #2b2723);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.9);
+}
+.w-logsheet {
+ border-radius: 3px;
+ padding: 2.2rem clamp(1.1rem, 3vw, 2rem) clamp(1.2rem, 3vw, 1.8rem);
+}
+.w-logrow {
+ display: grid;
+ grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1.2fr);
+ align-items: baseline;
+ gap: 0.8rem;
+ padding: 0.85rem 0;
+ border-bottom: 1px solid rgba(90, 74, 50, 0.22);
+}
+.w-logrow:last-of-type { border-bottom: 0; }
+.w-logrow__lift {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.7rem;
+ letter-spacing: 0.16em;
+ text-transform: uppercase;
+ color: var(--ink-soft);
+}
+.w-logrow__weight {
+ font-family: var(--font-news), Georgia, serif;
+ font-size: 1.55rem;
+ font-weight: 600;
+ color: var(--ink);
+ white-space: nowrap;
+}
+.w-logrow__date {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.66rem;
+ color: var(--ink-soft);
+ text-align: right;
+}
+
+/* -------------------------------------------------------------- patch panel */
+
+.w-patch { border-radius: 12px; padding: 14px; }
+.w-patch__face {
+ border-radius: 8px;
+ padding: clamp(0.9rem, 2.4vw, 1.35rem);
+}
+.w-patch__head {
+ display: flex;
+ align-items: center;
+ gap: 0.8rem;
+ padding-bottom: 0.9rem;
+ margin-bottom: 1rem;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.5);
+ box-shadow: 0 1px 0 rgba(255, 226, 180, 0.05);
}
.w-port {
display: flex;
align-items: center;
- gap: 10px;
- padding: 9px 11px;
- border-radius: 6px;
- background: linear-gradient(180deg, #2c3134, #1c2022);
- border: 1px solid #0a0c0d;
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), inset 0 -2px 0 rgba(0, 0, 0, 0.45);
+ gap: 0.7rem;
+ padding: 0.6rem 0.7rem;
+ border-radius: 5px;
+ background: linear-gradient(180deg, rgba(255, 235, 200, 0.05), rgba(0, 0, 0, 0.22));
+ border: 1px solid rgba(0, 0, 0, 0.55);
+ box-shadow: inset 0 1px 0 rgba(255, 226, 180, 0.07);
transition: filter 140ms ease-out, transform 140ms ease-out;
}
-.w-port:hover { filter: brightness(1.16); transform: translateY(-1px); }
-.w-port__jack {
- width: 14px;
- height: 14px;
- border-radius: 3px;
- background: linear-gradient(180deg, #0b0d0e, #1a1e20);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.9);
- position: relative;
- flex: none;
+.w-port:hover {
+ filter: brightness(1.16);
+ transform: translateY(-1px);
}
-.w-port__jack::after {
+.w-port__jack {
+ position: relative;
+ width: 26px;
+ height: 22px;
+ border-radius: 3px;
+ flex: none;
+ background: linear-gradient(180deg, #353029, #1a1714);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 226, 180, 0.12),
+ inset 0 -2px 3px rgba(0, 0, 0, 0.6);
+}
+.w-port__slot {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ width: 15px;
+ height: 11px;
+ border-radius: 1px;
+ background: #070605;
+ box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.9);
+}
+.w-port__slot::after {
content: "";
position: absolute;
- left: 3px;
- right: 3px;
- top: 5px;
+ left: 4px;
+ right: 4px;
+ bottom: 2px;
height: 3px;
+ background: #4d463c;
border-radius: 1px;
- background: #3f4548;
}
.w-port__label {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.72rem;
- color: var(--body);
+ font-size: 0.7rem;
+ color: var(--ftext-dim);
}
+.w-port__icon { color: #8b7e68; flex: none; }
-/* nav link — its own class because these rules are unlayered and would beat
- Tailwind's hover utilities on the same element */
+/* ---------------------------------------------------------------- the rail */
+
+.w-rail {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 60;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.65);
+ box-shadow: 0 14px 26px -14px rgba(0, 0, 0, 0.9);
+}
+.w-wordmark {
+ font-family: var(--font-plexmono), ui-monospace, monospace;
+ font-size: 0.7rem;
+ letter-spacing: 0.2em;
+ text-transform: uppercase;
+}
.w-navlink {
font-family: var(--font-plexmono), ui-monospace, monospace;
font-size: 0.68rem;
- color: var(--faint);
+ letter-spacing: 0.1em;
+ color: var(--ftext-faint);
transition: color 140ms ease-out;
}
-.w-navlink:hover { color: var(--ink); }
+.w-navlink:hover { color: var(--amber); }
+
+/* --------------------------------------------------------- scrolling areas */
+
+.w-scroll { scrollbar-width: thin; scrollbar-color: #57503f #14110e; }
+.w-scroll::-webkit-scrollbar { width: 12px; height: 12px; }
+.w-scroll::-webkit-scrollbar-track {
+ background: #14110e;
+ border-radius: 8px;
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.6);
+}
+.w-scroll::-webkit-scrollbar-thumb {
+ border-radius: 8px;
+ background: linear-gradient(180deg, #57503f, #332e27);
+ border: 1px solid #0b0a08;
+}
+
+/* ------------------------------------------------------------------ socials */
-/* monochrome social icon: the SVG is an alpha mask painted with currentColor */
.social-mask {
display: inline-block;
background-color: currentColor;
@@ -566,69 +1218,17 @@ html[data-theme="web"] body {
mask-size: contain;
}
-/* screen text */
-.w-screen-text {
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.78rem;
- line-height: 1.7;
- color: var(--body);
- position: relative;
- z-index: 1;
-}
-.w-screen-text .k { color: var(--accent); }
-.w-screen-text .v { color: var(--ink); }
-
-.w-cursor {
- display: inline-block;
- width: 0.55em;
- height: 1em;
- background: var(--accent);
- vertical-align: -0.15em;
- animation: w-blink 1.05s step-end infinite;
-}
-@keyframes w-blink {
- 0%, 49% { opacity: 1; }
- 50%, 100% { opacity: 0; }
-}
-
-/* body copy on paper / machine */
-.w-serif {
- font-family: var(--font-news), Georgia, serif;
- font-weight: 500;
- letter-spacing: -0.01em;
- color: var(--ink);
-}
-.w-paper .w-serif { color: var(--paper-ink); }
-.w-prose {
- font-size: 0.98rem;
- line-height: 1.7;
-}
-.w-paper .w-prose { color: var(--paper-ink-soft); }
-.w-kicker {
- font-family: var(--font-plexmono), ui-monospace, monospace;
- font-size: 0.66rem;
- letter-spacing: 0.14em;
- text-transform: uppercase;
- color: var(--faint);
-}
-.w-link {
- color: var(--accent);
- text-decoration: underline;
- text-underline-offset: 3px;
- text-decoration-thickness: 1px;
- text-decoration-color: rgba(254, 128, 25, 0.45);
-}
-.w-link:hover { text-decoration-color: var(--accent); }
-.w-paper .w-link { color: #b1560c; text-decoration-color: rgba(177, 86, 12, 0.45); }
+/* -------------------------------------------------------------- motion off */
@media (prefers-reduced-motion: reduce) {
.w-led--pulse,
- .w-cursor { animation: none !important; }
- .w-btn,
- .w-btn:hover,
- .w-btn:active,
- .w-unit--link,
- .w-caddy,
+ .w-led--pulse-slow,
+ .w-caret { animation: none !important; }
+ .w-keybtn,
+ .w-unit,
+ .w-drive,
.w-port,
- .w-switch__knob { transition: none !important; }
+ .w-hangtag,
+ .w-bizcard,
+ .w-cmd { transition: none !important; }
}