20 CSS Retro UI

16 Pure CSS4 Light JSPublished 8 new designs · Updated on

Reproducing a computing era means reproducing its constraints, not just its colours. These 20 hand-coded retro interfaces cover CRT scanlines and curvature, pixel-art scaling, ordered dithering, the four-shadow one-bit bevel, Windows 95 and Classic Mac chrome, MS-DOS and Teletext character grids, phosphor monitors and Y2K aqua. Every effect is built from first principles — no 98.css, no NES.css. Each demo is scoped under its own .rt-NN class, guards motion behind prefers-reduced-motion, and is framework-agnostic copy-paste code.

Related22 CSS Brutalism20 CSS Neon Effects20 CSS Grain and Noise Textures20 Tailwind Retro UI

Premium design systemPartner: Untitled UI

Affiliate link

Taking this style from one component to a whole product?

You just browsed 20 retro UI designs. Untitled UI is the Figma UI kit 380,000+ designers use, with 10,000+ components and variants in Pro, plus a matching React library on Tailwind CSS. Figma Pro is a one-time purchase from $129.

Get Untitled UI Pro

Untitled UI. We may earn a commission, at no extra cost to you.

01. CRT Scanlines and Screen Curvature (opens in a new tab)

Published

Pure CSSNEW
A CRT look is not one effect, it is four: scanlines, curvature, phosphor bloom and mains flicker. Each one is a separate layer here with its own switch, so you can stack them one at a time and see what each contributes. The reference build the rest of the collection borrows from, including the fix for 1px scanlines aliasing on fractional device pixel ratios.

02. Pixel Art Scaling with Image Rendering (opens in a new tab)

Published

Pure CSSNEW
The same 12×12 sprite rendered at 1×, 4× and 8× with default smoothing on the left and image-rendering: pixelated on the right, both sides labelled. It also shows the two things people get wrong: a non-integer scale factor reintroduces blur even with the property set, and the property does nothing at all to a shape drawn in CSS rather than sampled from a bitmap.

03. Dithering Patterns with CSS Gradients (opens in a new tab)

Published

Pure CSSNEW
Ordered dithering is how a limited palette fakes colours it does not have: alternate two available colours in a fixed pattern and the eye averages them. Built here from layered repeating-conic-gradient checkerboards over flat fills, with a smooth gradient beside Bayer ramps at 2, 4 and 8 colours — and an honest statement of where the CSS approximation stops.

04. One Bit Bevel Borders with Box Shadow (opens in a new tab)

Published

Pure CSSNEW
Every raised or sunken control of the 16-bit desktop era is the same object: four box-shadow insets in a fixed order — outer light, outer dark, inner light, inner dark — with the order reversed for the pressed state. One rule set produces raised, sunken, pressed and disabled here, with the shadow order printed next to an exploded diagram of the four edges.

05. Classic Mac System 7 Window Chrome (opens in a new tab)

Published

Pure CSSNEW
The other great desktop metaphor, and a deliberate contrast to the bevelled 16-bit look: horizontal pinstripe title bar, square close box on the left, grow box bottom-right, one-pixel black outline everywhere and no colour at all. It also answers the question a 1-bit interface forces — how do you show state when there is no second colour to reach for?

06. MS DOS Text Mode Interface Grid (opens in a new tab)

Published

Pure CSSNEW
A character-cell interface, reproduced as one: an 80×25 field where every cell is exactly one monospace advance, laid out with CSS Grid and ch units, framed with code page 437 box-drawing characters and restricted to the 16-colour CGA palette as tokens. The constraint is the subject — nothing can sit between two cells, so every alignment decision is an integer.
Newsletter

Enjoying these demos? Get new ones by email.

A short email when a new collection ships. Unsubscribe any time.

at

Almost there: check your inbox to confirm.Manage

07. Teletext and Ceefax Block Graphics (opens in a new tab)

Published

Pure CSSNEW
The British broadcast text format, rebuilt cell by cell: 40×25 characters, seven saturated colours on black, double-height headline rows, and mosaic graphics assembled from 2×3 subcells inside single character cells. The palette is exactly seven colours plus black for a hardware reason, and the demo says which one.

08. Amber and Green Phosphor Monitor (opens in a new tab)

Published

Light JSNEW
Two monochrome tubes side by side with the phosphor named on each: P1 green and P3 amber. Persistence is a real trailing fade on newly written lines rather than a static glow, bloom scales with glyph brightness, and a slow retrace line crawls the field. It also states the accessibility limit that a one-hue display forces on you, and what it uses instead.

09. Windows 95 Desktop Interface (opens in a new tab)

PublishedUpdated

Pure CSS
A full desktop: icon field, taskbar with a working Start menu, a window with title bar and system buttons, and a modal-style dialog. Every raised and sunken edge is the four-inset bevel rather than an ad-hoc border, so the whole interface scales from one bevel unit and the pressed states are geometrically correct rather than approximated.

10. Retro Futuristic Terminal Interface (opens in a new tab)

PublishedUpdated

Pure CSS
A command console that boots: staggered POST lines, a typed command, and a live status column, all under the layered CRT treatment — scanlines, curvature, bloom. The boot reveal is pure CSS animation with the text present in the DOM from the start, which is the difference between a decorative sequence and one that traps an assistive-technology user in a stream of updates.

11. Eight Bit Pixel Art Buttons and HUD (opens in a new tab)

PublishedUpdated

Pure CSS
A game HUD and control set built entirely from stepped box-shadow blocks: segmented health, score with tabular figures, a lives row, and buttons whose notched corners are shadow offsets rather than a border image. The palette is a fixed 8-colour subset of the NES set and the demo enforces it, because palette discipline is what separates pixel art from a filter.

12. Neo Brutalist Component Board (opens in a new tab)

PublishedUpdated

Pure CSS
A single board of components in the hard-edged neo-brutalist style — 3px black borders, solid offset shadows, clashing flats, no gradients and no radius. It is deliberately one board rather than a component library, because the point here is the lineage: this is what the era's chunky, unapologetic chrome turned into once designers stopped apologising for it.

13. Skeuomorphic Cassette Player (opens in a new tab)

PublishedUpdated

Pure CSS
A portable tape deck with turning reels, a mechanical counter, and transport keys that travel when pressed. It is the counterpoint to the one-bit bevel: skeuomorphic depth models a light source and a material, so it needs graded shadows, inner reflections and a surface texture, where the bevel needs exactly four flat insets and nothing else.

14. Vaporwave Aesthetic Scene (opens in a new tab)

PublishedUpdated

Pure CSS
A perspective grid running to a banded sunset, with chrome lettering and a palm silhouette — the outrun scene built from a rotated grid plane, a repeating gradient and a stacked text fill, no images. It also names what it is: this aesthetic comes from 1980s marketing and album art, not from 1980s computers, which makes it the odd one out here on purpose.
Newsletter

Enjoying these demos? Get new ones by email.

A short email when a new collection ships. Unsubscribe any time.

at

Almost there: check your inbox to confirm.Manage

15. Retro Arcade Game Interface (opens in a new tab)

PublishedUpdated

Light JS
An arcade attract screen: illuminated marquee, high-score table with initials, and the insert-coin prompt cycling on the cabinet's own cadence. The blink is the interesting part — it is exactly the pattern the pause-and-stop success criterion exists for, so it runs on a period-correct rhythm, stays under three flashes a second, and stops dead under reduced motion.

16. ASCII Art Terminal Interface (opens in a new tab)

PublishedUpdated

Light JS
A character-cell console on paper white rather than the usual black: box-drawn panels, a block-letter banner, and a working command line that takes input without a form element. The banner is aria-hidden with a real text alternative, because ASCII art read aloud is several hundred punctuation marks and no information.

17. Nineties Web Guestbook Widget (opens in a new tab)

PublishedUpdated

Pure CSS
A personal-homepage guestbook: odometer hit counter, webring navigation, signed entries and a "best viewed in" badge, on the grey ground and ridged borders of the era. The point it makes is the one that matters most about this period — reproduce the look, never the markup, because everything that made these pages work is now the reason they fail.

18. Y2K Aqua Gloss Interface Kit (opens in a new tab)

PublishedUpdated

Pure CSS
The early-2000s gel look, built correctly: glossy pill buttons, translucent panels over a pinstriped ground, and a candy-stripe progress bar that flows. The gloss is the interesting part — it is a stack of four separate highlights, not one gradient, which is why most attempts at this style look like a coloured button with a shine on it.

19. Vintage Storefront Layout (opens in a new tab)

PublishedUpdated

Pure CSS
A mail-order catalogue page: ruled columns, small caps, halftone product plates and a printed price block with the order code set in monospace. The typographic decisions are the demo — catalogue type was small, tightly leaded and set in serif with heavy tracking on the labels, and only one of those choices survives contact with an accessibility audit unchanged.

20. Retro Desktop Portfolio Template (opens in a new tab)

PublishedUpdated

Light JS
A portfolio laid out as a desktop: menu bar, icon field and two windows you can move. The drag is the point — a pointer-only implementation fails keyboard operability outright, so every title bar here is focusable, responds to the arrow keys, and reports its position, with the pointer path as an enhancement rather than the only way in.
FAQ

Frequently asked questions

How do you build a CRT screen effect in CSS?
It is four separate effects composed, not one. Scanlines are a repeating-linear-gradient overlay with alternating transparent and dark bands. Curvature comes from a generous border-radius plus a radial vignette that darkens the corners, which reads as barrel distortion without any actual warping. Phosphor bloom is a duplicated text layer blurred behind the sharp one, so bright glyphs appear to spill light. Flicker is a slow, low-amplitude opacity animation. Keeping them separate is what makes the effect tunable — you can dial the scanlines back for legibility while keeping the bloom, which is exactly what you want on a screen people actually have to read.
Why does my pixel art go blurry when I scale it up?
Because the browser smooths by default. Every image is resampled with bilinear filtering when scaled, which is right for photographs and wrong for a 16x16 sprite. Setting image-rendering to pixelated turns that off and gives you nearest-neighbour scaling, so each source pixel becomes a hard square block. Two traps follow. Non-integer scale factors reintroduce softness even with the property set, because a source pixel no longer maps to a whole number of screen pixels — scale by 2x, 3x or 4x, never 2.5x. And the property only affects sampled images; a shape you drew with border-radius or box-shadow is already vector and is unaffected.
How is a Windows 95 button border actually made?
Four box-shadow insets in a fixed order, not a border property. The outer pair does the main lighting — white on the top and left, dark grey on the bottom and right — and the inner pair adds the second tone that gives the edge its depth. Reverse the order and the control reads as pressed rather than raised, which is the whole mechanism behind the era's click feedback. It matters that this is box-shadow rather than border-style outset: outset renders inconsistently across engines and cannot express the two-tone inner edge that makes the bevel look like the real thing.
Do these use 98.css, NES.css or any retro framework?
No. Every effect here is built from first principles — gradients, box-shadow, transforms, grid — with nothing loaded from outside the demo. That is deliberate. A retro CSS framework gives you a set of finished components and no understanding of how they work, so the moment you need something the library does not ship, you are stuck. Learning that a bevel is four shadows in a fixed order or that a character-cell interface is a grid measured in ch units means you can build the piece nobody wrote for you.
How do you keep retro interfaces accessible?
By treating period accuracy and accessibility as separate problems and solving both. Several eras conflict with modern requirements directly. A one-bit Macintosh interface has no second colour for state, so state is carried by pattern and position instead. A monochrome phosphor monitor has one hue, so the same applies. Blinking cursors and arcade prompts are exactly what SC 2.2.2 is about, so everything blinking here stops under prefers-reduced-motion and nothing flashes more than three times a second. Period close boxes were tiny, so the chrome is scaled up to keep targets at 44px. Draggable windows are operable with arrow keys, because pointer-only dragging fails keyboard access outright. The look survives all of it.
What is a character-cell interface and why does it need ch units?
MS-DOS text mode and Teletext were not laid out in pixels — the screen was a fixed grid of character cells, 80 by 25 for DOS and 40 by 25 for Teletext, and nothing could sit between two cells. Reproducing that in CSS means a grid whose column width is exactly one monospace character, which is what the ch unit gives you. Every alignment is then integer by construction, box-drawing characters join up cleanly, and the layout cannot drift the way a pixel-measured one does. The constraint is also the reason those interfaces look the way they do, so honouring it matters more than approximating the colours.
When is a retro aesthetic the wrong choice?
More often than it is the right one. These are strong commitments that carry connotations a product may not want: a CRT terminal reads as hacker-adjacent, Y2K gloss reads as unserious, a Windows 95 desktop reads as ironic. For most working software that is a cost rather than a feature, and it competes with the interface's actual job. Retro earns its place where the reference is the point — a game, a music or hardware product, a portfolio, a launch campaign, a deliberately nostalgic brand — and works badly anywhere the user simply needs to get something done.

Related collections

20 CSS 3D Effects preview

20 CSS 3D Effects

20 hand-coded CSS 3D patterns covering the transform pipeline reference build, the perspective property versus the perspective function, perspective-origin as the camera position, why transform function order changes the result, backface-visibility on two sided elements, what silently flattens preserve-3d, building a cube from six faces, transform-origin in three dimensions, translateZ versus scale for depth, z-fighting on coplanar surfaces, rotate3d and the transform matrix, plus ring layouts, stacked z-planes, pointer tilt with parallax, a hinged page-turn flipbook, a drag-rotate cube navigator, an extruded synth panel, perspective floor geometry, nested 3D contexts, and helix distribution. 14 demos are pure CSS; 6 use vanilla JavaScript.

22 CSS Brutalism preview

22 CSS Brutalism

22 hand-coded brutalist and neubrutalist CSS designs covering the full spectrum of the aesthetic — from the anti-design brutalism of 2014-2018 (raw system fonts, zero border radius, monochrome density, visible structure) through to the neubrutalism of 2021-present (bright pastel fills, thick black borders, hard offset shadows with zero blur, rounded blocks). The neubrutalist half ships SaaS pricing cards with sticker badges, a pastel admin dashboard, signup forms, rotated feature cards, an offset-shadow navbar, a playful button set, a native dialog modal, a testimonial wall, blog cards, chunky toggles, a landing hero, an image gallery, stats panels and a rounded footer. The brutalist half covers product grids, raw form controls, a monochrome data dashboard, a portfolio index, indie SaaS pricing, Windows 95 desktop chrome, editorial long-read and a streetwear catalog. Every design is scoped under a .brt-NN prefix for no-collision pasting, guards prefers-reduced-motion, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

20 CSS Claymorphism preview

20 CSS Claymorphism

20 hand-coded CSS claymorphism designs covering the three-layer shadow recipe that defines the style, inner highlight and inner shadow layering, the border radius scale that makes shapes read as puffy rather than merely rounded, claymorphism compared side by side with neumorphism, a clay and glassmorphism hybrid, single light-source discipline across a layout, depth tiers for visual hierarchy, a Tailwind implementation with both arbitrary values and theme tokens, squishy button press states, toggles and checkboxes, inset input wells and search bars, badge and pill systems, cards, popover-based modals, pricing tables, mobile tab bars, app icon grids, toast and alert bubbles, dark mode shadow recalibration, and the paint cost of animating shadows. 19 demos are pure CSS; 1 uses vanilla JavaScript.

Search CodeFronts

Loading…