PC-98 is an aesthetic originating from the NEC PC-9800 series of personal computers, dominant in Japan from the early 1980s to the late 1990s. The visual style is most closely associated with visual novels and eroge of the era, characterized by high-resolution pixel art (640x400), severely limited color palettes (16-256 colors from a 4096-color bank), and meticulous dithering techniques that create the illusion of depth and gradient with minimal colors. Artists placed pixels individually, exploiting dithering patterns to simulate smooth shading, soft skin tones, and atmospheric lighting within extreme technical constraints. The result is a uniquely warm, intimate, and melancholic visual language distinct from both Western pixel art and later anime CG.
The PC-98 palette is defined by careful selection from a limited bank, with dithering used to extend perceived range:
Based on characteristic PC-98 visual novel color selections:
| Role | Color | Hex |
|---|---|---|
| Background Dark | Deep Navy | #1A1028 |
| Background Mid | Dusty Indigo | #2D2240 |
| Surface | Warm Charcoal | #3A2E4A |
| Surface Light | Muted Mauve | #584870 |
| Primary Text | Cream | #E8D8C8 |
| Secondary Text | Soft Lavender | #C0A8D0 |
| Accent Warm | Rose Pink | #D87890 |
| Accent Soft | Peach | #E8A888 |
| Accent Cool | Slate Teal | #689098 |
| Highlight | Pale Gold | #F0D890 |
| Border Ornate | Antique Bronze | #987858 |
| Border Light | Dusty Rose | #B89088 |
| Shadow | Deep Purple | #180820 |
| Sky Gradient Top | Faded Violet | #6848A0 |
| Sky Gradient Low | Sunset Peach | #E8A070 |
| Foliage | Muted Olive | #608050 |
For simulating the PC-98 dithering effect in CSS, these pairs work well when alternated:
| Gradient Effect | Color A | Color B |
|---|---|---|
| Skin tone | #E8B890 |
#D09078 |
| Hair highlight | #F0D0E0 |
#B07898 |
| Evening sky | #6848A0 |
#D88868 |
| Shadow on fabric | #584870 |
#3A2E4A |
| Water/pool | #4878A0 |
#68A8B8 |
:root {
/* Backgrounds */
--pc98-bg-dark: #1A1028;
--pc98-bg-mid: #2D2240;
--pc98-bg-surface: #3A2E4A;
--pc98-bg-surface-light: #584870;
/* Text */
--pc98-text-primary: #E8D8C8;
--pc98-text-secondary: #C0A8D0;
--pc98-text-muted: #887898;
/* Accents */
--pc98-accent-rose: #D87890;
--pc98-accent-peach: #E8A888;
--pc98-accent-teal: #689098;
--pc98-accent-gold: #F0D890;
--pc98-accent-lavender: #A080C0;
/* Borders and ornamental */
--pc98-border-bronze: #987858;
--pc98-border-rose: #B89088;
--pc98-border-dark: #483858;
/* Shadows */
--pc98-shadow: #180820;
--pc98-shadow-soft: rgba(24, 8, 32, 0.6);
/* Atmospheric */
--pc98-sky-violet: #6848A0;
--pc98-sky-peach: #E8A070;
--pc98-foliage: #608050;
/* Functional mappings */
--pc98-bg-primary: var(--pc98-bg-dark);
--pc98-bg-secondary: var(--pc98-bg-mid);
--pc98-bg-card: var(--pc98-bg-surface);
--pc98-text-heading: var(--pc98-accent-gold);
--pc98-text-body: var(--pc98-text-primary);
--pc98-accent-primary: var(--pc98-accent-rose);
--pc98-accent-secondary: var(--pc98-accent-teal);
--pc98-border: var(--pc98-border-bronze);
}
PC-98 typography reflects the constraints of rendering complex Japanese characters on a 640x400 pixel grid:
| Font | Style | Usage |
|---|---|---|
| M PLUS 1 Code | Japanese-supporting monospace | Primary text, dialog boxes – authentic CJK pixel feel at small sizes |
| Noto Sans JP | Clean Japanese sans-serif | Body text, dialog, readable Japanese |
| DotGothic16 | Japanese pixel/dot-matrix style | Authentic retro Japanese text feel (Google Fonts) |
| Press Start 2P | Pixel Latin font | English headings, UI labels |
| Silkscreen | Clean pixel font | Small UI text, status labels |
| VT323 | Monospace terminal pixel font | Terminal-style text, data displays |
| Kosugi Maru | Rounded Japanese pixel font | Softer UI text, friendly labels |
@import url('https://fonts.googleapis.com/css2?family=DotGothic16&family=M+PLUS+1+Code:wght@400;700&family=Press+Start+2P&family=VT323&display=swap');
/* Primary body text -- clean, readable, retro feel */
body {
font-family: 'M PLUS 1 Code', 'DotGothic16', monospace;
font-size: 16px;
line-height: 1.8;
letter-spacing: 0.02em;
color: var(--pc98-text-primary);
image-rendering: pixelated;
}
/* Headings -- pixel font, warm gold */
h1, h2, h3 {
font-family: 'Press Start 2P', 'DotGothic16', monospace;
color: var(--pc98-accent-gold);
text-shadow: 2px 2px 0px var(--pc98-shadow);
letter-spacing: 0.05em;
line-height: 1.6;
}
h1 {
font-size: clamp(1.2rem, 3vw, 2rem);
}
h2 {
font-size: clamp(0.9rem, 2vw, 1.4rem);
color: var(--pc98-accent-rose);
}
/* Dialog box text -- the core visual novel element */
.pc98-dialog {
font-family: 'M PLUS 1 Code', 'DotGothic16', monospace;
font-size: 15px;
line-height: 2;
color: var(--pc98-text-primary);
text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5);
}
/* Character name label */
.pc98-name {
font-family: 'Press Start 2P', monospace;
font-size: 0.7rem;
color: var(--pc98-accent-gold);
letter-spacing: 0.1em;
text-transform: uppercase;
}
/* Small UI labels (date, time, status) */
.pc98-label {
font-family: 'VT323', 'Press Start 2P', monospace;
font-size: 0.85rem;
color: var(--pc98-accent-peach);
letter-spacing: 0.05em;
}
/* Monospace data display */
.pc98-mono {
font-family: 'VT323', monospace;
font-size: 1rem;
color: var(--pc98-accent-teal);
}
The defining UI element of PC-98 games – elaborate frames surrounding the main viewport:
The visual signature of the PC-98 aesthetic – used everywhere to simulate gradients:
/* Checkerboard dither pattern -- the signature PC-98 texture */
.pc98-dither {
background-image:
linear-gradient(45deg,
var(--pc98-bg-surface) 25%, transparent 25%,
transparent 75%, var(--pc98-bg-surface) 75%
),
linear-gradient(45deg,
var(--pc98-bg-surface) 25%, transparent 25%,
transparent 75%, var(--pc98-bg-surface) 75%
);
background-size: 4px 4px;
background-position: 0 0, 2px 2px;
background-color: var(--pc98-bg-mid);
}
/* Finer dither for subtle transitions */
.pc98-dither--fine {
background-size: 2px 2px;
background-position: 0 0, 1px 1px;
}
/* Horizontal line dither */
.pc98-dither--lines {
background-image: repeating-linear-gradient(
to bottom,
var(--pc98-bg-surface) 0px,
var(--pc98-bg-surface) 1px,
var(--pc98-bg-mid) 1px,
var(--pc98-bg-mid) 2px
);
}
/* Main viewport frame mimicking PC-98 decorative borders */
.pc98-frame {
border: 3px solid var(--pc98-border-bronze);
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
inset 0 0 0 4px var(--pc98-bg-surface),
inset 0 0 0 5px var(--pc98-border-rose),
0 0 0 1px var(--pc98-border-dark),
0 0 0 4px var(--pc98-bg-surface-light),
0 0 0 5px var(--pc98-border-bronze);
background: var(--pc98-bg-dark);
}
/* Simpler inner frame for content sections */
.pc98-frame--inner {
border: 2px solid var(--pc98-border-bronze);
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
inset 0 0 0 3px var(--pc98-bg-surface);
padding: 1.5rem;
}
/* Decorative corner accents */
.pc98-frame--corners {
position: relative;
border: 2px solid var(--pc98-border-bronze);
padding: 2rem;
}
.pc98-frame--corners::before,
.pc98-frame--corners::after {
content: '';
position: absolute;
width: 12px;
height: 12px;
border-color: var(--pc98-accent-gold);
border-style: solid;
}
.pc98-frame--corners::before {
top: 4px;
left: 4px;
border-width: 2px 0 0 2px;
}
.pc98-frame--corners::after {
bottom: 4px;
right: 4px;
border-width: 0 2px 2px 0;
}
/* Classic PC-98 visual novel dialog box */
.pc98-dialog-box {
background: rgba(0, 0, 0, 0.92);
border: 2px solid var(--pc98-border-bronze);
padding: 1.2rem 1.5rem;
position: relative;
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
0 -2px 8px var(--pc98-shadow-soft);
}
/* Character name plate */
.pc98-dialog-box .name-plate {
position: absolute;
top: -14px;
left: 16px;
background: var(--pc98-bg-dark);
border: 1px solid var(--pc98-border-bronze);
padding: 2px 12px;
font-family: 'Press Start 2P', monospace;
font-size: 0.65rem;
color: var(--pc98-accent-gold);
letter-spacing: 0.08em;
}
/* Typewriter text reveal animation */
@keyframes pc98-typewriter {
from { width: 0; }
to { width: 100%; }
}
.pc98-dialog-box .text-reveal {
overflow: hidden;
white-space: nowrap;
animation: pc98-typewriter 2s steps(40) forwards;
}
/* Simulate the CRT softening that made dithering look like smooth gradients */
.pc98-crt {
position: relative;
}
/* Subtle scanline overlay */
.pc98-crt::after {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 2px,
rgba(0, 0, 0, 0.08) 2px,
rgba(0, 0, 0, 0.08) 4px
);
pointer-events: none;
z-index: 100;
}
/* CRT screen curvature and vignette */
.pc98-monitor {
border-radius: 8px;
box-shadow:
inset 0 0 80px rgba(24, 8, 32, 0.4),
inset 0 0 20px rgba(24, 8, 32, 0.2),
0 0 30px rgba(104, 72, 160, 0.08);
}
/* Slight warm color cast (PC-98 monitors had warm tint) */
.pc98-warm-cast {
filter: sepia(0.05) saturate(1.1) brightness(0.98);
}
/* Prevent browser smoothing on scaled pixel art */
img, canvas {
image-rendering: pixelated;
image-rendering: crisp-edges;
}
/* Snap to pixel grid */
.pc98-pixel-snap {
transform: translateZ(0);
will-change: transform;
}
/* Simulated PC-98 sunset sky with stepped dither-like gradient */
.pc98-sky {
background: linear-gradient(
to bottom,
var(--pc98-sky-violet) 0%,
var(--pc98-sky-violet) 15%,
#8860B0 25%,
#B07898 40%,
#D08878 55%,
var(--pc98-sky-peach) 70%,
#E8C080 85%,
var(--pc98-accent-gold) 100%
);
}
/* Stepped gradient (discrete color bands instead of smooth) */
.pc98-sky--stepped {
background: linear-gradient(
to bottom,
var(--pc98-sky-violet) 0%, var(--pc98-sky-violet) 16.6%,
#8860B0 16.6%, #8860B0 33.3%,
#B07898 33.3%, #B07898 50%,
#D08878 50%, #D08878 66.6%,
var(--pc98-sky-peach) 66.6%, var(--pc98-sky-peach) 83.3%,
var(--pc98-accent-gold) 83.3%, var(--pc98-accent-gold) 100%
);
}
/* Date/time display panel */
.pc98-status-panel {
display: inline-flex;
align-items: center;
gap: 0.5rem;
background: var(--pc98-bg-dark);
border: 1px solid var(--pc98-border-bronze);
padding: 4px 10px;
font-family: 'VT323', monospace;
font-size: 1rem;
color: var(--pc98-accent-peach);
}
/* Segmented display numbers (money, stats) */
.pc98-segment-display {
font-family: 'Press Start 2P', monospace;
font-size: 0.75rem;
color: var(--pc98-accent-teal);
background: #0A0818;
border: 1px solid var(--pc98-border-dark);
padding: 4px 8px;
letter-spacing: 0.15em;
text-shadow: 0 0 4px rgba(104, 144, 152, 0.4);
}
/* Ornamental sidebar column -- simplified version of PC-98 decorative borders */
.pc98-sidebar-ornament {
width: 60px;
background:
repeating-linear-gradient(
to bottom,
var(--pc98-border-bronze) 0px,
var(--pc98-border-bronze) 2px,
var(--pc98-bg-surface) 2px,
var(--pc98-bg-surface) 18px,
var(--pc98-border-bronze) 18px,
var(--pc98-border-bronze) 20px,
var(--pc98-bg-surface-light) 20px,
var(--pc98-bg-surface-light) 40px
);
border-left: 3px solid var(--pc98-border-bronze);
border-right: 3px solid var(--pc98-border-bronze);
box-shadow:
inset 2px 0 0 var(--pc98-border-dark),
inset -2px 0 0 var(--pc98-border-dark);
}
/* Diamond/rosette repeating motif for border decoration */
.pc98-border-pattern {
background-image:
radial-gradient(circle at 50% 50%,
var(--pc98-accent-rose) 2px,
transparent 2px
),
radial-gradient(circle at 0% 50%,
var(--pc98-border-bronze) 1px,
transparent 1px
),
radial-gradient(circle at 100% 50%,
var(--pc98-border-bronze) 1px,
transparent 1px
);
background-size: 20px 20px;
background-color: var(--pc98-bg-surface);
}
/* PC-98 styled content card */
.pc98-card {
background: var(--pc98-bg-surface);
border: 2px solid var(--pc98-border-bronze);
padding: 2rem;
position: relative;
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
inset 0 0 20px rgba(24, 8, 32, 0.3),
4px 4px 0px var(--pc98-shadow);
}
/* Hover: warm glow */
.pc98-card:hover {
border-color: var(--pc98-accent-rose);
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
inset 0 0 20px rgba(24, 8, 32, 0.3),
0 0 12px rgba(216, 120, 144, 0.15),
4px 4px 0px var(--pc98-shadow);
transition: all 0.3s ease;
}
/* PC-98 styled button */
.pc98-button {
display: inline-block;
padding: 0.5rem 1.8rem;
background: var(--pc98-bg-surface);
border: 2px solid var(--pc98-border-bronze);
color: var(--pc98-accent-gold);
font-family: 'Press Start 2P', 'DotGothic16', monospace;
font-size: 0.7rem;
letter-spacing: 0.08em;
text-decoration: none;
cursor: pointer;
box-shadow:
2px 2px 0px var(--pc98-shadow),
inset 0 0 0 1px var(--pc98-border-dark);
transition: all 0.15s steps(2);
}
.pc98-button:hover {
background: var(--pc98-bg-surface-light);
border-color: var(--pc98-accent-gold);
color: var(--pc98-text-primary);
box-shadow:
1px 1px 0px var(--pc98-shadow),
inset 0 0 0 1px var(--pc98-border-dark);
transform: translate(1px, 1px);
}
.pc98-button:active {
box-shadow:
0 0 0 var(--pc98-shadow),
inset 0 0 0 1px var(--pc98-border-dark);
transform: translate(2px, 2px);
}
| Physical / Game Reference | Web Equivalent |
|---|---|
| Dithered pixel gradients | CSS checkerboard background-image patterns with two alternating colors at 2-4px scale |
| Ornate Art Nouveau border columns | Multi-layered box-shadow frames, repeating background-image patterns, CSS border-image |
| Stained-glass border panels | radial-gradient and linear-gradient patterns in border sidebars with warm jewel tones |
| CRT monitor softening | Subtle scanline overlay via repeating-linear-gradient, slight filter: blur(0.3px) |
| Pixel art character portraits | Scaled pixel art images with image-rendering: pixelated, or SVG pixel art |
| Dark dialog box overlay | Semi-transparent black (rgba(0,0,0,0.92)) panels with thin colored borders |
| Segmented number displays | Monospace pixel fonts with subtle text-shadow glow |
| Bronze/gold metallic UI trim | Warm brown/gold border colors with subtle box-shadow for depth |
| Atmospheric sunset skies | Multi-stop linear-gradient with stepped (non-smooth) color bands |
When creating or sourcing imagery for a PC-98 styled site:
image-rendering: pixelated| Aesthetic | Relationship to PC-98 |
|---|---|
| 8-Bit | Earlier generation; PC-98 is far more detailed with higher resolution and more colors, but shares pixel art foundation |
| Animecore | Overlapping visual language; PC-98 is the pixel-art-era predecessor of digital anime aesthetics |
| Cassette Futurism | Shares retro-tech nostalgia and 1980s-90s Japanese computing culture |
| Cyberpunk | Some PC-98 games (Policenauts, Night Slave) share cyberpunk themes and neon-accented visuals |
| Future Funk | Borrows PC-98 and city pop era imagery for nostalgic Japanese retro-futurism |
| Heisei Retro | PC-98 is a core artifact of Heisei-era (1989-2019) Japanese media culture |
| Lo-fi | Shares melancholic, low-fidelity, nostalgic mood; PC-98 screenshots are common lo-fi visual elements |
| Pixel UI | Western parallel development of pixel-based interface design during the same era |
| Retrofuturism | PC-98 represents a Japanese branch of retro computing culture |
| Vaporwave | Heavily draws from PC-98 limited palettes and nostalgic Japanese computing imagery |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PC-98 Page</title>
<link href="https://fonts.googleapis.com/css2?family=DotGothic16&family=M+PLUS+1+Code:wght@400;700&family=Press+Start+2P&family=VT323&display=swap" rel="stylesheet">
<style>
:root {
--pc98-bg-dark: #1A1028;
--pc98-bg-mid: #2D2240;
--pc98-bg-surface: #3A2E4A;
--pc98-bg-surface-light: #584870;
--pc98-text-primary: #E8D8C8;
--pc98-text-secondary: #C0A8D0;
--pc98-accent-rose: #D87890;
--pc98-accent-peach: #E8A888;
--pc98-accent-teal: #689098;
--pc98-accent-gold: #F0D890;
--pc98-border-bronze: #987858;
--pc98-border-dark: #483858;
--pc98-shadow: #180820;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--pc98-bg-dark);
color: var(--pc98-text-primary);
font-family: 'M PLUS 1 Code', 'DotGothic16', monospace;
font-size: 16px;
line-height: 1.8;
min-height: 100vh;
overflow-x: hidden;
image-rendering: pixelated;
}
/* Page frame with ornate borders */
.pc98-page {
max-width: 960px;
margin: 2rem auto;
display: grid;
grid-template-columns: 50px 1fr 50px;
grid-template-rows: auto 1fr auto;
min-height: 90vh;
}
/* Decorative side borders */
.pc98-border-left,
.pc98-border-right {
background:
repeating-linear-gradient(
to bottom,
var(--pc98-border-bronze) 0px, var(--pc98-border-bronze) 2px,
var(--pc98-bg-surface) 2px, var(--pc98-bg-surface) 18px,
var(--pc98-border-bronze) 18px, var(--pc98-border-bronze) 20px,
var(--pc98-bg-surface-light) 20px, var(--pc98-bg-surface-light) 40px
);
border: 2px solid var(--pc98-border-bronze);
}
.pc98-border-left {
grid-column: 1;
grid-row: 1 / -1;
border-right: 3px solid var(--pc98-border-bronze);
}
.pc98-border-right {
grid-column: 3;
grid-row: 1 / -1;
border-left: 3px solid var(--pc98-border-bronze);
}
/* Main content viewport */
.pc98-viewport {
grid-column: 2;
grid-row: 1 / 3;
background: var(--pc98-bg-mid);
padding: 3rem 2.5rem;
position: relative;
border-top: 2px solid var(--pc98-border-bronze);
}
/* Dithered background texture */
.pc98-viewport::before {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(45deg,
var(--pc98-bg-surface) 25%, transparent 25%,
transparent 75%, var(--pc98-bg-surface) 75%
),
linear-gradient(45deg,
var(--pc98-bg-surface) 25%, transparent 25%,
transparent 75%, var(--pc98-bg-surface) 75%
);
background-size: 4px 4px;
background-position: 0 0, 2px 2px;
opacity: 0.15;
pointer-events: none;
}
.pc98-viewport > * {
position: relative;
z-index: 1;
}
/* Hero heading */
.pc98-viewport h1 {
font-family: 'Press Start 2P', monospace;
font-size: clamp(1rem, 2.5vw, 1.6rem);
color: var(--pc98-accent-gold);
text-shadow: 2px 2px 0px var(--pc98-shadow);
margin-bottom: 1.5rem;
letter-spacing: 0.05em;
line-height: 1.8;
}
.pc98-viewport h2 {
font-family: 'Press Start 2P', monospace;
font-size: clamp(0.7rem, 1.8vw, 1rem);
color: var(--pc98-accent-rose);
text-shadow: 1px 1px 0px var(--pc98-shadow);
margin: 2rem 0 1rem;
letter-spacing: 0.04em;
line-height: 1.8;
}
p {
margin-bottom: 1rem;
color: var(--pc98-text-secondary);
}
/* Dialog box at bottom */
.pc98-dialog-box {
grid-column: 2;
grid-row: 3;
background: rgba(0, 0, 0, 0.92);
border: 2px solid var(--pc98-border-bronze);
padding: 1.2rem 1.5rem;
position: relative;
}
.pc98-dialog-box .name-plate {
position: absolute;
top: -12px;
left: 16px;
background: var(--pc98-bg-dark);
border: 1px solid var(--pc98-border-bronze);
padding: 2px 12px;
font-family: 'Press Start 2P', monospace;
font-size: 0.6rem;
color: var(--pc98-accent-gold);
letter-spacing: 0.08em;
}
.pc98-dialog-box p {
color: var(--pc98-text-primary);
font-size: 14px;
line-height: 2;
margin: 0;
}
/* Status bar */
.pc98-status {
display: flex;
justify-content: space-between;
margin-top: 0.8rem;
}
.pc98-status span {
font-family: 'VT323', monospace;
font-size: 0.9rem;
color: var(--pc98-accent-teal);
}
/* Scanline overlay */
.pc98-scanlines {
position: fixed;
inset: 0;
background: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 2px,
rgba(0, 0, 0, 0.06) 2px,
rgba(0, 0, 0, 0.06) 4px
);
pointer-events: none;
z-index: 9999;
}
/* Card styling */
.pc98-card {
background: var(--pc98-bg-surface);
border: 2px solid var(--pc98-border-bronze);
padding: 1.5rem;
margin: 1.5rem 0;
box-shadow:
inset 0 0 0 1px var(--pc98-border-dark),
3px 3px 0px var(--pc98-shadow);
}
.mono {
font-family: 'VT323', monospace;
color: var(--pc98-accent-teal);
font-size: 0.95rem;
}
</style>
</head>
<body>
<div class="pc98-scanlines"></div>
<div class="pc98-page">
<div class="pc98-border-left"></div>
<div class="pc98-viewport">
<h1>Title Here</h1>
<div class="pc98-card">
<h2>Section Heading</h2>
<p>Content styled with the PC-98 aesthetic -- warm pastels, dithered textures, ornate borders, and the intimate atmosphere of 1990s Japanese visual novels.</p>
<p class="mono">STATUS: OPERATIONAL // COLORS: 16</p>
</div>
</div>
<div class="pc98-border-right"></div>
<div class="pc98-dialog-box">
<span class="name-plate">NARRATOR</span>
<p>The screen glows softly in the dim room. Each pixel placed with care, each color chosen from a palette of just sixteen...</p>
<div class="pc98-status">
<span>AUG.12 Tue</span>
<span>PM 3:15</span>
</div>
</div>
</div>
</body>
</html>