Liminal Space is a digital aesthetic rooted in the unsettling familiarity of transitional, in-between environments devoid of human presence. Derived from the Latin “limen” (threshold), the style captures the eerie quality of places designed for occupancy but found empty – abandoned malls at 3am, fluorescent-lit office corridors after hours, drained hotel pools, endless airport terminals, and school hallways during summer break. The aesthetic surged in internet culture after the 2019 “Backrooms” phenomenon and draws its visual power from the uncanny valley of architecture: spaces that feel deeply familiar yet profoundly wrong. On the web, Liminal Space design translates this atmosphere through washed-out institutional color palettes, degraded visual quality (noise, blur, compression artifacts), oppressively repetitive layouts, artificial lighting effects, and typography that evokes late-1990s to early-2000s signage systems. The goal is not comfort or usability in the traditional sense, but the cultivation of an ambient unease – a digital environment that feels like somewhere you have been before, in a dream you cannot quite remember.
The Liminal Space palette draws from institutional architecture, fluorescent lighting, and the washed-out memory of transitional environments. Colors are desaturated, slightly sickly, and avoid warmth or vibrancy. The dominant impression should be of artificial light on aging surfaces.
| Swatch | Hex | Role |
|---|---|---|
#C8C29D |
Backrooms yellow – the iconic mono-yellow of fluorescent-lit wallpaper and aged office walls | |
#E8E4D0 |
Institutional cream – drop ceiling tiles, laminate surfaces, and off-white wall paint | |
#D4CDB6 |
Carpet beige – commercial-grade loop carpet and waiting room upholstery | |
#A8B5A2 |
Fluorescent green cast – the subtle green tint that cheap fluorescent tubes throw on white surfaces | |
#7A8B8F |
Corridor gray-blue – institutional hallway paint, hospital blues faded by decades of fluorescent exposure | |
#4D5A5E |
Shadow teal – the dark recesses of empty stairwells and unlit storage rooms | |
#2C2E33 |
Void charcoal – deep darkness beyond the reach of overhead lighting, doorways leading nowhere | |
#F5F0E1 |
Blown-out white – overexposed fluorescent glare on smooth surfaces | |
#B8A88A |
Water stain tan – aged acoustic tile, ceiling leaks, oxidized fixtures | |
#6B7F5E |
Muted institutional green – school hallway tiles, hospital corridors, public bathroom surfaces | |
#8E7C68 |
Worn laminate brown – fake wood grain on cafeteria tables and reception desks | |
#5C6B8A |
Pool tile blue – the unsettling cyan of drained swimming pools and empty water parks lit from below | |
#9B9880 |
Concrete neutral – poured concrete floors, parking garage surfaces, loading dock walls | |
#D1C4A1 |
Linoleum gold – the yellowed, wax-coated institutional floor under buzzing lights |
:root {
/* Core liminal palette */
--liminal-backrooms-yellow: #c8c29d;
--liminal-cream: #e8e4d0;
--liminal-carpet-beige: #d4cdb6;
--liminal-fluorescent-green: #a8b5a2;
--liminal-corridor-blue: #7a8b8f;
--liminal-shadow-teal: #4d5a5e;
--liminal-void: #2c2e33;
--liminal-blown-white: #f5f0e1;
--liminal-stain-tan: #b8a88a;
--liminal-institutional-green: #6b7f5e;
--liminal-worn-laminate: #8e7c68;
--liminal-pool-blue: #5c6b8a;
--liminal-concrete: #9b9880;
--liminal-linoleum-gold: #d1c4a1;
/* Functional tokens */
--liminal-bg: var(--liminal-cream);
--liminal-bg-deep: var(--liminal-void);
--liminal-text: var(--liminal-void);
--liminal-text-muted: var(--liminal-corridor-blue);
--liminal-text-faded: var(--liminal-concrete);
--liminal-border: var(--liminal-carpet-beige);
--liminal-border-strong: var(--liminal-stain-tan);
--liminal-accent: var(--liminal-backrooms-yellow);
--liminal-accent-cool: var(--liminal-pool-blue);
--liminal-surface: var(--liminal-blown-white);
--liminal-surface-dark: var(--liminal-shadow-teal);
/* Lighting effects */
--liminal-fluorescent-glow: rgba(200, 194, 157, 0.15);
--liminal-fluorescent-flicker: rgba(168, 181, 162, 0.08);
--liminal-shadow-fade: rgba(44, 46, 51, 0.4);
}
Liminal Space typography evokes institutional wayfinding systems, emergency exit signage, outdated building directories, and the generic sans-serif faces found on 1990s-2000s office suite default installations. Fonts should feel familiar but slightly off – clean enough to read, generic enough to be placeless, dated enough to feel like a memory.
| Font | Style | Best For |
|---|---|---|
| Inter | 300, 400, 600 | Primary body text – clean, generic, slightly institutional; its optical sizing creates the anonymous feel of a building directory |
| Roboto Condensed | 300, 400, 700 | Headlines and signage-style text – the condensed width evokes wayfinding systems and directory boards |
| IBM Plex Mono | 300, 400 | System readouts, timestamps, metadata – references building management systems and security infrastructure |
| DM Sans | 400, 500, 700 | Secondary body text and navigation – slightly geometric, slightly generic, slightly forgettable |
| Space Grotesk | 400, 500, 700 | Display text and section headers – a geometric grotesk that feels like it belongs on a 2003 office building lobby sign |
| Overpass | 300, 400, 600 | Wayfinding and directional text – originally designed for highway signage, it carries the feeling of transitional infrastructure |
| Share Tech Mono | 400 | Terminal displays, status indicators – evokes the monochrome screens of building access systems |
| Heading | Body | Vibe |
|---|---|---|
| Roboto Condensed (700) | Inter (300) | Institutional wayfinding sign above a building directory listing – authoritative yet anonymous |
| Space Grotesk (700) | DM Sans (400) | Modern office lobby signage with a generic corporate body – clean but soulless |
| Overpass (600) | IBM Plex Mono (300) | Highway exit sign meets building management terminal – infrastructure speaking to infrastructure |
| DM Sans (700) | Inter (300) | Generic corporate heading over equally generic body text – the typographic equivalent of a beige cubicle |
| Space Grotesk (500) | Share Tech Mono (400) | Slightly futuristic directory paired with system readout text – an empty building that still has power |
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400&family=Inter:wght@300;400;600&family=Roboto+Condensed:wght@300;400;700&display=swap');
/* === Base Typography === */
body {
font-family: 'Inter', 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
font-size: 16px;
font-weight: 300;
line-height: 1.7;
color: var(--liminal-text);
letter-spacing: 0.01em;
-webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
line-height: 1.1;
color: var(--liminal-text);
}
h1 {
font-size: clamp(2.5rem, 6vw, 5rem);
letter-spacing: 0.12em;
}
h2 {
font-size: clamp(1.5rem, 3.5vw, 2.5rem);
letter-spacing: 0.1em;
}
h3 {
font-size: clamp(1.1rem, 2vw, 1.5rem);
}
/* Monospaced system text */
.system-text, .timestamp, .meta {
font-family: 'IBM Plex Mono', 'Courier New', monospace;
font-size: 0.75rem;
font-weight: 300;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--liminal-text-muted);
}
a {
color: var(--liminal-accent-cool);
text-decoration: none;
border-bottom: 1px solid transparent;
transition: border-color 0.6s ease, color 0.6s ease;
}
a:hover {
color: var(--liminal-text);
border-bottom-color: var(--liminal-text-muted);
}
blockquote {
border-left: 2px solid var(--liminal-border-strong);
padding: 1rem 1.5rem;
color: var(--liminal-text-muted);
font-style: italic;
background: var(--liminal-fluorescent-glow);
}
A full-page overlay that simulates the flat, slightly green-tinted wash of institutional fluorescent lighting, with a subtle animated flicker.
.fluorescent-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 1000;
background: linear-gradient(
180deg,
rgba(168, 181, 162, 0.04) 0%,
rgba(200, 194, 157, 0.06) 50%,
rgba(168, 181, 162, 0.03) 100%
);
animation: fluorescent-flicker 8s ease-in-out infinite;
}
@keyframes fluorescent-flicker {
0%, 100% { opacity: 1; }
47% { opacity: 1; }
48% { opacity: 0.92; }
49% { opacity: 1; }
72% { opacity: 1; }
72.5% { opacity: 0.95; }
73% { opacity: 1; }
}
A content card that resembles a notice pinned to a corridor bulletin board or a directory listing in a building lobby – institutional, flat, and slightly faded.
.liminal-card {
background-color: var(--liminal-surface);
border: 1px solid var(--liminal-border);
padding: 2rem;
position: relative;
transition: box-shadow 0.6s ease, border-color 0.6s ease;
}
.liminal-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(
90deg,
var(--liminal-carpet-beige) 0%,
var(--liminal-backrooms-yellow) 50%,
var(--liminal-carpet-beige) 100%
);
opacity: 0.6;
}
.liminal-card:hover {
border-color: var(--liminal-border-strong);
box-shadow: 0 0 30px var(--liminal-fluorescent-glow);
}
.liminal-card .card-label {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--liminal-text-faded);
margin-bottom: 1rem;
}
.liminal-card h3 {
font-size: 1.1rem;
margin-bottom: 0.75rem;
}
.liminal-card p {
color: var(--liminal-text-muted);
font-size: 0.9rem;
}
A button inspired by institutional signage and elevator call buttons – flat, bordered, and unadorned, with a slow, eerie hover transition.
.liminal-button {
display: inline-block;
font-family: 'Roboto Condensed', sans-serif;
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 0.75rem 2rem;
border: 1px solid var(--liminal-text-muted);
background-color: transparent;
color: var(--liminal-text);
cursor: pointer;
text-decoration: none;
position: relative;
overflow: hidden;
transition: all 0.8s ease;
}
.liminal-button::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: var(--liminal-fluorescent-glow);
transition: left 0.8s ease;
}
.liminal-button:hover {
border-color: var(--liminal-text);
color: var(--liminal-text);
}
.liminal-button:hover::before {
left: 0;
}
.liminal-button--filled {
background-color: var(--liminal-shadow-teal);
color: var(--liminal-blown-white);
border-color: var(--liminal-shadow-teal);
}
.liminal-button--filled:hover {
background-color: var(--liminal-void);
border-color: var(--liminal-void);
color: var(--liminal-backrooms-yellow);
}
A navigation bar that resembles the wayfinding strip along the top of an institutional corridor wall – minimal, uppercase, evenly spaced.
.liminal-nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.25rem 3rem;
border-bottom: 1px solid var(--liminal-border);
background-color: var(--liminal-surface);
position: relative;
}
.liminal-nav::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--liminal-backrooms-yellow) 50%,
transparent 100%
);
opacity: 0.3;
}
.liminal-nav .brand {
font-family: 'Roboto Condensed', sans-serif;
font-weight: 700;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--liminal-text);
}
.liminal-nav ul {
list-style: none;
display: flex;
gap: 0;
margin: 0;
padding: 0;
}
.liminal-nav a {
display: block;
padding: 0.5rem 1.25rem;
font-family: 'Inter', sans-serif;
font-size: 0.7rem;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--liminal-text-muted);
text-decoration: none;
border: none;
transition: color 0.5s ease, background-color 0.5s ease;
}
.liminal-nav a:hover {
color: var(--liminal-text);
background-color: var(--liminal-fluorescent-glow);
}
A vast, empty hero that establishes atmosphere through scale and emptiness, like standing at the end of a long corridor and seeing only space ahead.
.liminal-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 3rem;
position: relative;
background-color: var(--liminal-bg);
overflow: hidden;
}
.liminal-hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 98px,
rgba(180, 170, 140, 0.08) 98px,
rgba(180, 170, 140, 0.08) 100px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 98px,
rgba(180, 170, 140, 0.08) 98px,
rgba(180, 170, 140, 0.08) 100px
);
pointer-events: none;
}
.liminal-hero::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(
ellipse at 50% 40%,
rgba(200, 194, 157, 0.1) 0%,
transparent 70%
);
pointer-events: none;
}
.liminal-hero h1 {
font-size: clamp(3rem, 8vw, 7rem);
letter-spacing: 0.15em;
position: relative;
z-index: 1;
}
.liminal-hero .subtitle {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.8rem;
font-weight: 300;
letter-spacing: 0.08em;
color: var(--liminal-text-muted);
margin-top: 2rem;
max-width: 50ch;
line-height: 1.8;
position: relative;
z-index: 1;
}
.liminal-hero .timestamp {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
color: var(--liminal-text-faded);
letter-spacing: 0.12em;
text-transform: uppercase;
margin-top: 3rem;
position: relative;
z-index: 1;
}
A subtle film grain / noise texture applied via CSS to simulate the degraded visual quality of old photographs, security camera footage, or compressed digital images.
.noise-overlay {
position: fixed;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
pointer-events: none;
z-index: 999;
opacity: 0.035;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
background-repeat: repeat;
animation: noise-shift 0.5s steps(10) infinite;
}
@keyframes noise-shift {
0% { transform: translate(0, 0); }
10% { transform: translate(-5%, -5%); }
20% { transform: translate(3%, -8%); }
30% { transform: translate(-8%, 2%); }
40% { transform: translate(5%, 5%); }
50% { transform: translate(-3%, 8%); }
60% { transform: translate(8%, -2%); }
70% { transform: translate(-5%, 5%); }
80% { transform: translate(2%, -5%); }
90% { transform: translate(-2%, 3%); }
100% { transform: translate(0, 0); }
}
A horizontal divider between content sections that suggests a doorway or threshold between rooms – a line of light beneath a closed door.
.corridor-divider {
width: 100%;
height: 40px;
position: relative;
margin: 0;
background-color: var(--liminal-carpet-beige);
overflow: hidden;
}
.corridor-divider::before {
content: '';
position: absolute;
top: 50%;
left: 10%;
right: 10%;
height: 1px;
background: linear-gradient(
90deg,
transparent,
var(--liminal-backrooms-yellow),
var(--liminal-blown-white),
var(--liminal-backrooms-yellow),
transparent
);
opacity: 0.5;
}
.corridor-divider::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 4px;
height: 4px;
background: var(--liminal-stain-tan);
border-radius: 50%;
box-shadow: 0 0 8px var(--liminal-backrooms-yellow);
opacity: 0.4;
}
A grid of identical content modules that creates the unsettling sense of infinite repetition – every room looks the same.
.room-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1px;
background-color: var(--liminal-border);
border: 1px solid var(--liminal-border);
}
.room-grid .room {
background-color: var(--liminal-surface);
padding: 2.5rem 2rem;
position: relative;
transition: background-color 1.2s ease;
}
.room-grid .room::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60%;
height: 1px;
background: var(--liminal-fluorescent-glow);
}
.room-grid .room:hover {
background-color: var(--liminal-bg);
}
.room-grid .room-number {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
color: var(--liminal-text-faded);
letter-spacing: 0.2em;
text-transform: uppercase;
margin-bottom: 1.5rem;
}
.room-grid .room h3 {
font-size: 0.95rem;
letter-spacing: 0.08em;
margin-bottom: 0.75rem;
}
.room-grid .room p {
font-size: 0.85rem;
color: var(--liminal-text-muted);
line-height: 1.7;
}
| Aesthetic | Relationship |
|---|---|
| Dreamcore | Shares the surreal, nostalgic unease but amplifies it with more overt visual distortion, saturated color bleed, and explicitly dreamlike imagery; Dreamcore is the dream, Liminal Space is the room you wake up in |
| Weirdcore | A more aggressively distorted cousin that uses heavy image manipulation, text overlays, and glitch effects; where Liminal Space is subtly wrong, Weirdcore is overtly broken |
| Mallsoft | Focuses specifically on the abandoned commercial spaces (malls, food courts, retail) that are a subset of liminal imagery; Mallsoft adds muzak-era nostalgia and consumerist melancholy |
| Frutiger Aero | Represents the optimistic, glossy digital aesthetic of the same 2004-2013 era that Liminal Space renders as eerie and abandoned; they are the same spaces viewed with different emotional filters |
| Poolcore | Isolates the specific liminal quality of empty swimming pools, water parks, and aquatic facilities; a focused branch of the broader Liminal Space family |
| Vaporwave | Shares the nostalgic recontextualization of late-capitalist commercial spaces but aestheticizes them through color saturation and gloss rather than desaturation and decay |
| Dark Aero | A moody, desaturated relative that shares the sense of technological environments without human presence but leans more toward sleek digital interfaces than physical architecture |
| Brutalist Web Design | Both embrace discomfort and reject polished usability, but Brutalism is confrontational and structural while Liminal Space is atmospheric and psychological |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liminal Space Template</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400&family=Inter:wght@300;400;600&family=Roboto+Condensed:wght@300;400;700&display=swap" rel="stylesheet">
<style>
/* --- Custom Properties --- */
:root {
--liminal-backrooms-yellow: #c8c29d;
--liminal-cream: #e8e4d0;
--liminal-carpet-beige: #d4cdb6;
--liminal-fluorescent-green: #a8b5a2;
--liminal-corridor-blue: #7a8b8f;
--liminal-shadow-teal: #4d5a5e;
--liminal-void: #2c2e33;
--liminal-blown-white: #f5f0e1;
--liminal-stain-tan: #b8a88a;
--liminal-institutional-green: #6b7f5e;
--liminal-worn-laminate: #8e7c68;
--liminal-pool-blue: #5c6b8a;
--liminal-concrete: #9b9880;
--liminal-linoleum-gold: #d1c4a1;
--liminal-bg: var(--liminal-cream);
--liminal-text: var(--liminal-void);
--liminal-text-muted: var(--liminal-corridor-blue);
--liminal-text-faded: var(--liminal-concrete);
--liminal-border: var(--liminal-carpet-beige);
--liminal-border-strong: var(--liminal-stain-tan);
--liminal-surface: var(--liminal-blown-white);
--liminal-fluorescent-glow: rgba(200, 194, 157, 0.15);
--liminal-shadow-fade: rgba(44, 46, 51, 0.4);
}
/* --- Reset --- */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
/* --- Base --- */
body {
font-family: 'Inter', 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
font-size: 16px;
font-weight: 300;
line-height: 1.7;
color: var(--liminal-text);
background-color: var(--liminal-bg);
-webkit-font-smoothing: antialiased;
}
/* --- Fluorescent Overlay --- */
.fluorescent-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 1000;
background: linear-gradient(
180deg,
rgba(168, 181, 162, 0.04) 0%,
rgba(200, 194, 157, 0.06) 50%,
rgba(168, 181, 162, 0.03) 100%
);
animation: fluorescent-flicker 8s ease-in-out infinite;
}
@keyframes fluorescent-flicker {
0%, 100% { opacity: 1; }
47% { opacity: 1; }
48% { opacity: 0.92; }
49% { opacity: 1; }
72% { opacity: 1; }
72.5% { opacity: 0.95; }
73% { opacity: 1; }
}
/* --- Noise Overlay --- */
.noise-overlay {
position: fixed;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
pointer-events: none;
z-index: 999;
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
animation: noise-shift 0.5s steps(10) infinite;
}
@keyframes noise-shift {
0% { transform: translate(0, 0); }
20% { transform: translate(-5%, -5%); }
40% { transform: translate(5%, 5%); }
60% { transform: translate(-3%, 3%); }
80% { transform: translate(3%, -3%); }
100% { transform: translate(0, 0); }
}
/* --- Typography --- */
h1, h2, h3, h4, h5, h6 {
font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
line-height: 1.1;
}
a {
color: var(--liminal-pool-blue);
text-decoration: none;
border-bottom: 1px solid transparent;
transition: border-color 0.6s ease, color 0.6s ease;
}
a:hover {
color: var(--liminal-text);
border-bottom-color: var(--liminal-text-muted);
}
/* --- Navigation --- */
.nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.25rem 3rem;
border-bottom: 1px solid var(--liminal-border);
background-color: var(--liminal-surface);
position: relative;
}
.nav::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent 0%, var(--liminal-backrooms-yellow) 50%, transparent 100%);
opacity: 0.3;
}
.nav .brand {
font-family: 'Roboto Condensed', sans-serif;
font-weight: 700;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--liminal-text);
}
.nav ul {
list-style: none;
display: flex;
gap: 0;
}
.nav a {
display: block;
padding: 0.5rem 1.25rem;
font-size: 0.7rem;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--liminal-text-muted);
border-bottom: none;
transition: color 0.5s ease, background-color 0.5s ease;
}
.nav a:hover {
color: var(--liminal-text);
background-color: var(--liminal-fluorescent-glow);
}
/* --- Hero --- */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 3rem;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background:
repeating-linear-gradient(0deg, transparent, transparent 98px, rgba(180,170,140,0.07) 98px, rgba(180,170,140,0.07) 100px),
repeating-linear-gradient(90deg, transparent, transparent 98px, rgba(180,170,140,0.07) 98px, rgba(180,170,140,0.07) 100px);
pointer-events: none;
}
.hero::after {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: radial-gradient(ellipse at 50% 40%, rgba(200,194,157,0.1) 0%, transparent 70%);
pointer-events: none;
}
.hero h1 {
font-size: clamp(3rem, 8vw, 7rem);
letter-spacing: 0.15em;
position: relative;
z-index: 1;
}
.hero .subtitle {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.8rem;
font-weight: 300;
letter-spacing: 0.08em;
color: var(--liminal-text-muted);
margin-top: 2rem;
max-width: 55ch;
line-height: 1.9;
position: relative;
z-index: 1;
}
.hero .timestamp {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
color: var(--liminal-text-faded);
letter-spacing: 0.12em;
text-transform: uppercase;
margin-top: 3rem;
position: relative;
z-index: 1;
}
.hero .btn-row {
margin-top: 2.5rem;
display: flex;
flex-wrap: wrap;
gap: 1rem;
position: relative;
z-index: 1;
}
/* --- Buttons --- */
.btn {
display: inline-block;
font-family: 'Roboto Condensed', sans-serif;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 0.75rem 2rem;
border: 1px solid var(--liminal-text-muted);
background-color: transparent;
color: var(--liminal-text);
cursor: pointer;
text-decoration: none;
position: relative;
overflow: hidden;
transition: all 0.8s ease;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: var(--liminal-fluorescent-glow);
transition: left 0.8s ease;
}
.btn:hover {
border-color: var(--liminal-text);
border-bottom: 1px solid var(--liminal-text);
}
.btn:hover::before {
left: 0;
}
.btn--filled {
background-color: var(--liminal-shadow-teal);
color: var(--liminal-blown-white);
border-color: var(--liminal-shadow-teal);
}
.btn--filled:hover {
background-color: var(--liminal-void);
border-color: var(--liminal-void);
color: var(--liminal-backrooms-yellow);
}
/* --- Corridor Divider --- */
.corridor-divider {
width: 100%;
height: 40px;
position: relative;
background-color: var(--liminal-carpet-beige);
overflow: hidden;
}
.corridor-divider::before {
content: '';
position: absolute;
top: 50%;
left: 10%;
right: 10%;
height: 1px;
background: linear-gradient(90deg, transparent, var(--liminal-backrooms-yellow), var(--liminal-blown-white), var(--liminal-backrooms-yellow), transparent);
opacity: 0.5;
}
/* --- Content Section --- */
.content-section {
padding: 5rem 3rem;
max-width: 900px;
margin: 0 auto;
}
.content-section h2 {
font-size: clamp(1.5rem, 3.5vw, 2.5rem);
letter-spacing: 0.1em;
margin-bottom: 1rem;
}
.content-section .section-meta {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
color: var(--liminal-text-faded);
letter-spacing: 0.15em;
text-transform: uppercase;
margin-bottom: 2.5rem;
}
.content-section p {
margin-bottom: 1.5rem;
color: var(--liminal-text-muted);
max-width: 65ch;
}
/* --- Room Grid --- */
.room-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1px;
background-color: var(--liminal-border);
border: 1px solid var(--liminal-border);
margin: 3rem 0;
}
.room {
background-color: var(--liminal-surface);
padding: 2.5rem 2rem;
position: relative;
transition: background-color 1.2s ease;
}
.room::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60%;
height: 1px;
background: var(--liminal-fluorescent-glow);
}
.room:hover {
background-color: var(--liminal-bg);
}
.room .room-number {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
color: var(--liminal-text-faded);
letter-spacing: 0.2em;
text-transform: uppercase;
margin-bottom: 1.5rem;
}
.room h3 {
font-size: 0.95rem;
letter-spacing: 0.08em;
margin-bottom: 0.75rem;
}
.room p {
font-size: 0.85rem;
color: var(--liminal-text-muted);
line-height: 1.7;
}
/* --- Liminal Card --- */
.card {
background-color: var(--liminal-surface);
border: 1px solid var(--liminal-border);
padding: 2rem;
margin-bottom: 1.5rem;
position: relative;
transition: box-shadow 0.6s ease, border-color 0.6s ease;
}
.card::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 3px;
background: linear-gradient(90deg, var(--liminal-carpet-beige) 0%, var(--liminal-backrooms-yellow) 50%, var(--liminal-carpet-beige) 100%);
opacity: 0.6;
}
.card:hover {
border-color: var(--liminal-border-strong);
box-shadow: 0 0 30px var(--liminal-fluorescent-glow);
}
.card .card-label {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--liminal-text-faded);
margin-bottom: 1rem;
}
.card h3 {
font-size: 1.1rem;
margin-bottom: 0.75rem;
}
.card p {
color: var(--liminal-text-muted);
font-size: 0.9rem;
}
/* --- System Notice --- */
.system-notice {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.7rem;
color: var(--liminal-text-faded);
letter-spacing: 0.06em;
padding: 1.5rem 3rem;
border-top: 1px solid var(--liminal-border);
border-bottom: 1px solid var(--liminal-border);
background: repeating-linear-gradient(
90deg,
transparent 0px,
transparent 4px,
rgba(200, 194, 157, 0.03) 4px,
rgba(200, 194, 157, 0.03) 5px
);
text-align: center;
text-transform: uppercase;
}
/* --- Blockquote --- */
blockquote {
border-left: 2px solid var(--liminal-border-strong);
padding: 1rem 1.5rem;
color: var(--liminal-text-muted);
font-style: italic;
background: var(--liminal-fluorescent-glow);
margin: 2rem 0;
}
/* --- Footer --- */
.footer {
padding: 3rem;
text-align: center;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
color: var(--liminal-text-faded);
letter-spacing: 0.15em;
text-transform: uppercase;
border-top: 1px solid var(--liminal-border);
opacity: 0.6;
}
/* --- Responsive --- */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
padding: 1rem 1.5rem;
}
.nav ul {
flex-wrap: wrap;
justify-content: center;
}
.hero {
padding: 3rem 1.5rem;
min-height: 90vh;
}
.hero h1 {
letter-spacing: 0.08em;
}
.content-section {
padding: 3rem 1.5rem;
}
.room-grid {
grid-template-columns: 1fr;
}
.system-notice {
padding: 1rem 1.5rem;
font-size: 0.6rem;
}
}
</style>
</head>
<body>
<!-- Atmospheric overlays -->
<div class="fluorescent-overlay"></div>
<div class="noise-overlay"></div>
<!-- Navigation -->
<nav class="nav">
<div class="brand">Level 0</div>
<ul>
<li><a href="#threshold">Threshold</a></li>
<li><a href="#rooms">Rooms</a></li>
<li><a href="#corridors">Corridors</a></li>
<li><a href="#notices">Notices</a></li>
</ul>
</nav>
<!-- Hero -->
<section class="hero" id="threshold">
<h1>You have been<br>here before</h1>
<p class="subtitle">
A place between places. Not a destination but a passage --
the hallway you walk through without noticing, the room
you remember but cannot find on any floor plan.
Somewhere the lights are still on.
</p>
<p class="timestamp">Facility status: nominal — Sector 7-G — Last inspection: unknown</p>
<div class="btn-row">
<a href="#rooms" class="btn">Enter</a>
<a href="#corridors" class="btn btn--filled">Continue</a>
</div>
</section>
<!-- Corridor Divider -->
<div class="corridor-divider"></div>
<!-- Content Section -->
<section class="content-section" id="corridors">
<p class="section-meta">Section 02 // Corridor B-14 // Status: Unoccupied</p>
<h2>The Space Between</h2>
<p>
These are the rooms that exist in the margins of architecture. Designed for
passage, not permanence. You were never meant to stay here, yet the fluorescent
lights remain on. The carpet is the same in every direction.
</p>
<p>
The hum of the building systems is the only confirmation that time continues to
pass. Every door leads to another corridor. Every corridor leads to another room
identical to the last.
</p>
<blockquote>
You are in a place that was built for thousands and occupied by no one.
The architecture remembers a purpose you have forgotten.
</blockquote>
<!-- Cards -->
<div class="card">
<div class="card-label">Notice 2019-04-27 // Classification: Ambient</div>
<h3>Temporal Displacement Protocol</h3>
<p>
If you find yourself in a space you recognize but cannot place, do not
attempt to retrace your steps. Proceed forward. The exit is always ahead,
never behind.
</p>
</div>
<div class="card">
<div class="card-label">Notice 2003-11-15 // Classification: Environmental</div>
<h3>Fluorescent Maintenance Schedule</h3>
<p>
All overhead lighting units in Sectors 4 through 9 are scheduled for
replacement. Current estimated completion date has been deferred indefinitely.
Report any flickering to facilities management.
</p>
</div>
</section>
<!-- System Notice -->
<div class="system-notice">
Automated system — No personnel required — Monitoring active — Do not adjust environmental controls
</div>
<!-- Room Grid -->
<section style="padding: 3rem;" id="rooms">
<div class="room-grid">
<div class="room">
<div class="room-number">Room 001</div>
<h3>Reception Area</h3>
<p>A desk with no chair. A sign-in sheet with no names. The pen is attached to a chain that leads nowhere.</p>
</div>
<div class="room">
<div class="room-number">Room 002</div>
<h3>Waiting Room</h3>
<p>Magazines from a year that may not have happened. The clock on the wall has no hands. Your appointment was scheduled for always.</p>
</div>
<div class="room">
<div class="room-number">Room 003</div>
<h3>Pool Level</h3>
<p>The water is still. The diving board casts a shadow with no source. The lifeguard chair faces the wrong direction.</p>
</div>
<div class="room">
<div class="room-number">Room 004</div>
<h3>Food Court</h3>
<p>Every restaurant is open. Every menu is the same. The trays on the conveyor belt circle endlessly, carrying nothing.</p>
</div>
<div class="room">
<div class="room-number">Room 005</div>
<h3>Stairwell B</h3>
<p>The stairs go up. The stairs also go up. The floor numbers increment by values that are not quite one.</p>
</div>
<div class="room">
<div class="room-number">Room 006</div>
<h3>Corridor East</h3>
<p>This hallway is three hundred meters long and contains forty-two identical doors. None of them are locked. All of them open to this hallway.</p>
</div>
</div>
</section>
<!-- Another divider -->
<div class="corridor-divider"></div>
<!-- Final section -->
<section class="content-section" id="notices">
<p class="section-meta">Section 04 // Terminal Output // Last Modified: --/--/----</p>
<h2>Notices</h2>
<p>
This facility operates on a maintenance cycle of indeterminate length. All
systems are functioning within expected parameters. If you are reading this,
environmental conditions in your sector are stable.
</p>
<p>
There is no cause for concern. Proceed to the nearest exit. The exit is
located at the end of the corridor. The corridor continues.
</p>
<div style="margin-top: 2rem;">
<a href="#threshold" class="btn">Return to threshold</a>
</div>
</section>
<!-- Footer (deliberately minimal) -->
<footer class="footer">
Sector 7-G — Sublevel -- — Facility management system v0.0.1 — Status: operational
</footer>
</body>
</html>