12 CSS Retro UI Designs05 / 12
Retro Cassette Player UI Web Component
A skeuomorphic tape deck modelled in pure CSS gradients — moulded plastic body with inset highlights, a recessed window with two spinning reels, an LCD with an animated VU meter, real pressable transport keys with travel, and three rotary knobs with pointer ticks. Major Mono Display + Oswald, warm 80s-hi-fi tones.
Published
The code
<div class="ret-05">
<div class="ret-05__deck">
<div class="ret-05__brand">
<b>cassettone</b>
<span>Stereo · Auto-Reverse · Dolby</span>
</div>
<div class="ret-05__window">
<div class="ret-05__label">◦ SIDE A · MIXTAPE '88 ◦</div>
<div class="ret-05__tape">
<div class="ret-05__reel"></div>
<div class="ret-05__reel" style="animation-duration:3.4s"></div>
</div>
</div>
<div class="ret-05__lcd">
<span class="t">▶ 02:14 / 04:51</span>
<div class="ret-05__meter"><i></i><i></i><i></i><i></i><i></i><i></i></div>
</div>
<div class="ret-05__transport">
<button class="ret-05__key">⏮</button>
<button class="ret-05__key ret-05__key--play">▶</button>
<button class="ret-05__key">⏸</button>
<button class="ret-05__key">⏭</button>
<button class="ret-05__key">⏹</button>
</div>
<div class="ret-05__knobs">
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--1"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Volume</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--2"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Bass</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--3"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Treble</small>
</div>
</div>
</div>
</div><div class="ret-05">
<div class="ret-05__deck">
<div class="ret-05__brand">
<b>cassettone</b>
<span>Stereo · Auto-Reverse · Dolby</span>
</div>
<div class="ret-05__window">
<div class="ret-05__label">◦ SIDE A · MIXTAPE '88 ◦</div>
<div class="ret-05__tape">
<div class="ret-05__reel"></div>
<div class="ret-05__reel" style="animation-duration:3.4s"></div>
</div>
</div>
<div class="ret-05__lcd">
<span class="t">▶ 02:14 / 04:51</span>
<div class="ret-05__meter"><i></i><i></i><i></i><i></i><i></i><i></i></div>
</div>
<div class="ret-05__transport">
<button class="ret-05__key">⏮</button>
<button class="ret-05__key ret-05__key--play">▶</button>
<button class="ret-05__key">⏸</button>
<button class="ret-05__key">⏭</button>
<button class="ret-05__key">⏹</button>
</div>
<div class="ret-05__knobs">
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--1"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Volume</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--2"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Bass</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--3"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Treble</small>
</div>
</div>
</div>
</div>@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Oswald:wght@300;500;700&display=swap');
.ret-05,
.ret-05 *,
.ret-05 *::before,
.ret-05 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ret-05 ::selection {
background: #e8743b;
color: #1c140e;
}
.ret-05 {
--case: #d8c5a8;
--case-d: #b39d7c;
--metal: #c9ccd1;
--dark: #2a2420;
--orange: #e8743b;
--cream: #f3e9d6;
--led: #7dff4f;
font-family: 'Oswald',sans-serif;
background: radial-gradient(120% 100% at 50% 0%,#5a4632,#2b211a 70%);
min-height: 100vh;
display: grid;
place-items: center;
padding: clamp(16px,4vw,48px);
color: var(--dark);
}
/* the plastic body: stacked gradients + inset highlights + drop shadow */
.ret-05__deck {
width: min(560px,100%);
background: linear-gradient(160deg,#e8d7b8,#c3ad88 55%,#a98f6b);
border-radius: 22px;
padding: 26px;
box-shadow: inset 0 2px 2px rgba(255,255,255,.7), inset 0 -4px 8px rgba(0,0,0,.28), 0 30px 60px rgba(0,0,0,.55), 0 2px 0 rgba(0,0,0,.4);
position: relative;
}
.ret-05__deck::before {
content: '';
position: absolute;
inset: 11px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,.25);
pointer-events: none;
}
.ret-05__brand {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 18px;
}
.ret-05__brand b {
font-family: 'Major Mono Display';
font-size: 1.5rem;
letter-spacing: .06em;
color: #3a2f25;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__brand span {
font-size: .7rem;
letter-spacing: .3em;
text-transform: uppercase;
color: #6b5a44;
font-weight: 500;
}
/* cassette window: dark recess with spinning reels */
.ret-05__window {
background: linear-gradient(180deg,#1b1612,#322820);
border-radius: 12px;
padding: 22px;
margin-bottom: 22px;
box-shadow: inset 0 4px 10px rgba(0,0,0,.85),inset 0 -1px 0 rgba(255,255,255,.08),0 1px 0 rgba(255,255,255,.4);
position: relative;
overflow: hidden;
}
.ret-05__tape {
display: flex;
align-items: center;
justify-content: center;
gap: 64px;
position: relative;
}
.ret-05__tape::before {
content: '';
position: absolute;
top: 50%;
left: 18%;
right: 18%;
height: 10px;
transform: translateY(-50%);
background: linear-gradient(180deg,#1a120b,#0d0805);
border-radius: 2px;
box-shadow: inset 0 1px 1px rgba(0,0,0,.8);
}
.ret-05__reel {
width: 74px;
height: 74px;
border-radius: 50%;
position: relative;
z-index: 2;
background: radial-gradient(circle at 35% 30%,#5a5048,#221c16 70%);
box-shadow: inset 0 0 0 6px #15110d,inset 0 0 14px rgba(0,0,0,.9),0 0 0 2px #3a3128;
animation: ret-05-spin 3s linear infinite;
}
.ret-05__reel::before {
content: '';
position: absolute;
inset: 24px;
border-radius: 50%;
background: repeating-conic-gradient(#d8cdbe 0 12deg,#8a7d6c 12deg 24deg);
box-shadow: 0 0 0 3px #15110d;
}
.ret-05__reel::after {
content: '';
position: absolute;
inset: 32px;
border-radius: 50%;
background: radial-gradient(circle,#2a221a,#0d0805);
}
@keyframes ret-05-spin {
to {
transform: rotate(360deg);
}
}
.ret-05__label {
position: absolute;
top: 8px;
left: 50%;
transform: translateX(-50%);
font-family: 'Major Mono Display';
font-size: .62rem;
letter-spacing: .2em;
color: var(--orange);
z-index: 3;
white-space: nowrap;
}
/* LCD + level meter */
.ret-05__lcd {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
background: #2f3a2c;
border-radius: 8px;
padding: 10px 16px;
margin-bottom: 22px;
box-shadow: inset 0 2px 6px rgba(0,0,0,.7);
font-family: 'Major Mono Display';
color: var(--led);
text-shadow: 0 0 6px rgba(125,255,79,.6);
}
.ret-05__lcd .t {
font-size: 1.1rem;
letter-spacing: .05em;
}
.ret-05__meter {
display: flex;
gap: 3px;
align-items: flex-end;
height: 22px;
}
.ret-05__meter i {
width: 5px;
background: var(--led);
border-radius: 1px;
animation: ret-05-eq 1.1s ease-in-out infinite;
}
.ret-05__meter i:nth-child(1) {
height: 30%;
animation-delay: 0s;
}
.ret-05__meter i:nth-child(2) {
height: 60%;
animation-delay: .15s;
}
.ret-05__meter i:nth-child(3) {
height: 95%;
animation-delay: .3s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(4) {
height: 50%;
animation-delay: .45s;
}
.ret-05__meter i:nth-child(5) {
height: 75%;
animation-delay: .6s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(6) {
height: 40%;
animation-delay: .75s;
}
@keyframes ret-05-eq {
50% {
height: 20%;
}
}
/* transport buttons: real pressable plastic */
.ret-05__transport {
display: flex;
gap: 12px;
margin-bottom: 24px;
}
.ret-05__key {
flex: 1;
height: 48px;
border-radius: 7px;
border: none;
cursor: pointer;
font-size: 1rem;
color: #2a2018;
background: linear-gradient(180deg,#efe2cb,#c7b18c);
box-shadow: 0 4px 0 #9a805e,inset 0 1px 0 rgba(255,255,255,.8);
transition: transform .06s,box-shadow .06s;
display: grid;
place-items: center;
}
.ret-05__key:hover {
filter: brightness(1.04);
}
.ret-05__key:active {
transform: translateY(4px);
box-shadow: 0 0 0 #9a805e,inset 0 1px 3px rgba(0,0,0,.3);
}
.ret-05__key--play {
background: linear-gradient(180deg,#f29a5c,#d8612a);
color: #fff;
box-shadow: 0 4px 0 #a8451a,inset 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__key--play:active {
box-shadow: 0 0 0 #a8451a,inset 0 1px 3px rgba(0,0,0,.4);
}
/* knobs */
.ret-05__knobs {
display: flex;
justify-content: space-around;
align-items: flex-start;
}
.ret-05__knobwrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 9px;
}
.ret-05__knob {
width: 62px;
height: 62px;
border-radius: 50%;
cursor: grab;
position: relative;
background: conic-gradient(from -135deg,#3a322a,#6a5e4f 50%,#2a241e);
box-shadow: 0 5px 10px rgba(0,0,0,.5),inset 0 2px 3px rgba(255,255,255,.25),inset 0 -3px 6px rgba(0,0,0,.6);
}
.ret-05__knob::before {
content: '';
position: absolute;
top: 6px;
left: 50%;
width: 4px;
height: 18px;
background: var(--orange);
border-radius: 2px;
transform: translateX(-50%);
box-shadow: 0 0 5px rgba(232,116,59,.7);
}
.ret-05__knob--2 {
transform: rotate(80deg);
}
.ret-05__knob--3 {
transform: rotate(-70deg);
}
.ret-05__knobwrap small {
font-size: .66rem;
letter-spacing: .18em;
text-transform: uppercase;
color: #5a4a36;
font-weight: 600;
}
.ret-05__dots {
position: relative;
width: 62px;
height: 14px;
margin-top: -4px;
}
.ret-05__dots i {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
background: #5a4a36;
top: 0;
}
.ret-05__dots i:nth-child(1) {
left: 0;
}
.ret-05__dots i:nth-child(2) {
left: 30%;
top: -3px;
}
.ret-05__dots i:nth-child(3) {
left: 50%;
top: -5px;
}
.ret-05__dots i:nth-child(4) {
left: 70%;
top: -3px;
}
.ret-05__dots i:nth-child(5) {
right: 0;
}
@media (max-width: 480px) {
.ret-05__tape {
gap: 30px;
}
.ret-05__knob {
width: 50px;
height: 50px;
}
}
@media (prefers-reduced-motion: reduce) {
.ret-05__reel,
.ret-05__meter i {
animation: none !important;
}
}@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Oswald:wght@300;500;700&display=swap');
.ret-05,
.ret-05 *,
.ret-05 *::before,
.ret-05 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ret-05 ::selection {
background: #e8743b;
color: #1c140e;
}
.ret-05 {
--case: #d8c5a8;
--case-d: #b39d7c;
--metal: #c9ccd1;
--dark: #2a2420;
--orange: #e8743b;
--cream: #f3e9d6;
--led: #7dff4f;
font-family: 'Oswald',sans-serif;
background: radial-gradient(120% 100% at 50% 0%,#5a4632,#2b211a 70%);
min-height: 100vh;
display: grid;
place-items: center;
padding: clamp(16px,4vw,48px);
color: var(--dark);
}
/* the plastic body: stacked gradients + inset highlights + drop shadow */
.ret-05__deck {
width: min(560px,100%);
background: linear-gradient(160deg,#e8d7b8,#c3ad88 55%,#a98f6b);
border-radius: 22px;
padding: 26px;
box-shadow: inset 0 2px 2px rgba(255,255,255,.7), inset 0 -4px 8px rgba(0,0,0,.28), 0 30px 60px rgba(0,0,0,.55), 0 2px 0 rgba(0,0,0,.4);
position: relative;
}
.ret-05__deck::before {
content: '';
position: absolute;
inset: 11px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,.25);
pointer-events: none;
}
.ret-05__brand {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 18px;
}
.ret-05__brand b {
font-family: 'Major Mono Display';
font-size: 1.5rem;
letter-spacing: .06em;
color: #3a2f25;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__brand span {
font-size: .7rem;
letter-spacing: .3em;
text-transform: uppercase;
color: #6b5a44;
font-weight: 500;
}
/* cassette window: dark recess with spinning reels */
.ret-05__window {
background: linear-gradient(180deg,#1b1612,#322820);
border-radius: 12px;
padding: 22px;
margin-bottom: 22px;
box-shadow: inset 0 4px 10px rgba(0,0,0,.85),inset 0 -1px 0 rgba(255,255,255,.08),0 1px 0 rgba(255,255,255,.4);
position: relative;
overflow: hidden;
}
.ret-05__tape {
display: flex;
align-items: center;
justify-content: center;
gap: 64px;
position: relative;
}
.ret-05__tape::before {
content: '';
position: absolute;
top: 50%;
left: 18%;
right: 18%;
height: 10px;
transform: translateY(-50%);
background: linear-gradient(180deg,#1a120b,#0d0805);
border-radius: 2px;
box-shadow: inset 0 1px 1px rgba(0,0,0,.8);
}
.ret-05__reel {
width: 74px;
height: 74px;
border-radius: 50%;
position: relative;
z-index: 2;
background: radial-gradient(circle at 35% 30%,#5a5048,#221c16 70%);
box-shadow: inset 0 0 0 6px #15110d,inset 0 0 14px rgba(0,0,0,.9),0 0 0 2px #3a3128;
animation: ret-05-spin 3s linear infinite;
}
.ret-05__reel::before {
content: '';
position: absolute;
inset: 24px;
border-radius: 50%;
background: repeating-conic-gradient(#d8cdbe 0 12deg,#8a7d6c 12deg 24deg);
box-shadow: 0 0 0 3px #15110d;
}
.ret-05__reel::after {
content: '';
position: absolute;
inset: 32px;
border-radius: 50%;
background: radial-gradient(circle,#2a221a,#0d0805);
}
@keyframes ret-05-spin {
to {
transform: rotate(360deg);
}
}
.ret-05__label {
position: absolute;
top: 8px;
left: 50%;
transform: translateX(-50%);
font-family: 'Major Mono Display';
font-size: .62rem;
letter-spacing: .2em;
color: var(--orange);
z-index: 3;
white-space: nowrap;
}
/* LCD + level meter */
.ret-05__lcd {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
background: #2f3a2c;
border-radius: 8px;
padding: 10px 16px;
margin-bottom: 22px;
box-shadow: inset 0 2px 6px rgba(0,0,0,.7);
font-family: 'Major Mono Display';
color: var(--led);
text-shadow: 0 0 6px rgba(125,255,79,.6);
}
.ret-05__lcd .t {
font-size: 1.1rem;
letter-spacing: .05em;
}
.ret-05__meter {
display: flex;
gap: 3px;
align-items: flex-end;
height: 22px;
}
.ret-05__meter i {
width: 5px;
background: var(--led);
border-radius: 1px;
animation: ret-05-eq 1.1s ease-in-out infinite;
}
.ret-05__meter i:nth-child(1) {
height: 30%;
animation-delay: 0s;
}
.ret-05__meter i:nth-child(2) {
height: 60%;
animation-delay: .15s;
}
.ret-05__meter i:nth-child(3) {
height: 95%;
animation-delay: .3s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(4) {
height: 50%;
animation-delay: .45s;
}
.ret-05__meter i:nth-child(5) {
height: 75%;
animation-delay: .6s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(6) {
height: 40%;
animation-delay: .75s;
}
@keyframes ret-05-eq {
50% {
height: 20%;
}
}
/* transport buttons: real pressable plastic */
.ret-05__transport {
display: flex;
gap: 12px;
margin-bottom: 24px;
}
.ret-05__key {
flex: 1;
height: 48px;
border-radius: 7px;
border: none;
cursor: pointer;
font-size: 1rem;
color: #2a2018;
background: linear-gradient(180deg,#efe2cb,#c7b18c);
box-shadow: 0 4px 0 #9a805e,inset 0 1px 0 rgba(255,255,255,.8);
transition: transform .06s,box-shadow .06s;
display: grid;
place-items: center;
}
.ret-05__key:hover {
filter: brightness(1.04);
}
.ret-05__key:active {
transform: translateY(4px);
box-shadow: 0 0 0 #9a805e,inset 0 1px 3px rgba(0,0,0,.3);
}
.ret-05__key--play {
background: linear-gradient(180deg,#f29a5c,#d8612a);
color: #fff;
box-shadow: 0 4px 0 #a8451a,inset 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__key--play:active {
box-shadow: 0 0 0 #a8451a,inset 0 1px 3px rgba(0,0,0,.4);
}
/* knobs */
.ret-05__knobs {
display: flex;
justify-content: space-around;
align-items: flex-start;
}
.ret-05__knobwrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 9px;
}
.ret-05__knob {
width: 62px;
height: 62px;
border-radius: 50%;
cursor: grab;
position: relative;
background: conic-gradient(from -135deg,#3a322a,#6a5e4f 50%,#2a241e);
box-shadow: 0 5px 10px rgba(0,0,0,.5),inset 0 2px 3px rgba(255,255,255,.25),inset 0 -3px 6px rgba(0,0,0,.6);
}
.ret-05__knob::before {
content: '';
position: absolute;
top: 6px;
left: 50%;
width: 4px;
height: 18px;
background: var(--orange);
border-radius: 2px;
transform: translateX(-50%);
box-shadow: 0 0 5px rgba(232,116,59,.7);
}
.ret-05__knob--2 {
transform: rotate(80deg);
}
.ret-05__knob--3 {
transform: rotate(-70deg);
}
.ret-05__knobwrap small {
font-size: .66rem;
letter-spacing: .18em;
text-transform: uppercase;
color: #5a4a36;
font-weight: 600;
}
.ret-05__dots {
position: relative;
width: 62px;
height: 14px;
margin-top: -4px;
}
.ret-05__dots i {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
background: #5a4a36;
top: 0;
}
.ret-05__dots i:nth-child(1) {
left: 0;
}
.ret-05__dots i:nth-child(2) {
left: 30%;
top: -3px;
}
.ret-05__dots i:nth-child(3) {
left: 50%;
top: -5px;
}
.ret-05__dots i:nth-child(4) {
left: 70%;
top: -3px;
}
.ret-05__dots i:nth-child(5) {
right: 0;
}
@media (max-width: 480px) {
.ret-05__tape {
gap: 30px;
}
.ret-05__knob {
width: 50px;
height: 50px;
}
}
@media (prefers-reduced-motion: reduce) {
.ret-05__reel,
.ret-05__meter i {
animation: none !important;
}
}Here's a working CSS Retro UI Design from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Retro Cassette Player UI Web Component
Source: https://codefronts.com/design-styles/css-retro-designs/retro-cassette-player-ui-web-component/
A skeuomorphic tape deck modelled in pure CSS gradients — moulded plastic body with inset highlights, a recessed window with two spinning reels, an LCD with an animated VU meter, real pressable transport keys with travel, and three rotary knobs with pointer ticks. Major Mono Display + Oswald, warm 80s-hi-fi tones.
## HTML
```html
<div class="ret-05">
<div class="ret-05__deck">
<div class="ret-05__brand">
<b>cassettone</b>
<span>Stereo · Auto-Reverse · Dolby</span>
</div>
<div class="ret-05__window">
<div class="ret-05__label">◦ SIDE A · MIXTAPE '88 ◦</div>
<div class="ret-05__tape">
<div class="ret-05__reel"></div>
<div class="ret-05__reel" style="animation-duration:3.4s"></div>
</div>
</div>
<div class="ret-05__lcd">
<span class="t">▶ 02:14 / 04:51</span>
<div class="ret-05__meter"><i></i><i></i><i></i><i></i><i></i><i></i></div>
</div>
<div class="ret-05__transport">
<button class="ret-05__key">⏮</button>
<button class="ret-05__key ret-05__key--play">▶</button>
<button class="ret-05__key">⏸</button>
<button class="ret-05__key">⏭</button>
<button class="ret-05__key">⏹</button>
</div>
<div class="ret-05__knobs">
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--1"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Volume</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--2"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Bass</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--3"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Treble</small>
</div>
</div>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Oswald:wght@300;500;700&display=swap');
.ret-05,
.ret-05 *,
.ret-05 *::before,
.ret-05 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ret-05 ::selection {
background: #e8743b;
color: #1c140e;
}
.ret-05 {
--case: #d8c5a8;
--case-d: #b39d7c;
--metal: #c9ccd1;
--dark: #2a2420;
--orange: #e8743b;
--cream: #f3e9d6;
--led: #7dff4f;
font-family: 'Oswald',sans-serif;
background: radial-gradient(120% 100% at 50% 0%,#5a4632,#2b211a 70%);
min-height: 100vh;
display: grid;
place-items: center;
padding: clamp(16px,4vw,48px);
color: var(--dark);
}
/* the plastic body: stacked gradients + inset highlights + drop shadow */
.ret-05__deck {
width: min(560px,100%);
background: linear-gradient(160deg,#e8d7b8,#c3ad88 55%,#a98f6b);
border-radius: 22px;
padding: 26px;
box-shadow: inset 0 2px 2px rgba(255,255,255,.7), inset 0 -4px 8px rgba(0,0,0,.28), 0 30px 60px rgba(0,0,0,.55), 0 2px 0 rgba(0,0,0,.4);
position: relative;
}
.ret-05__deck::before {
content: '';
position: absolute;
inset: 11px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,.25);
pointer-events: none;
}
.ret-05__brand {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 18px;
}
.ret-05__brand b {
font-family: 'Major Mono Display';
font-size: 1.5rem;
letter-spacing: .06em;
color: #3a2f25;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__brand span {
font-size: .7rem;
letter-spacing: .3em;
text-transform: uppercase;
color: #6b5a44;
font-weight: 500;
}
/* cassette window: dark recess with spinning reels */
.ret-05__window {
background: linear-gradient(180deg,#1b1612,#322820);
border-radius: 12px;
padding: 22px;
margin-bottom: 22px;
box-shadow: inset 0 4px 10px rgba(0,0,0,.85),inset 0 -1px 0 rgba(255,255,255,.08),0 1px 0 rgba(255,255,255,.4);
position: relative;
overflow: hidden;
}
.ret-05__tape {
display: flex;
align-items: center;
justify-content: center;
gap: 64px;
position: relative;
}
.ret-05__tape::before {
content: '';
position: absolute;
top: 50%;
left: 18%;
right: 18%;
height: 10px;
transform: translateY(-50%);
background: linear-gradient(180deg,#1a120b,#0d0805);
border-radius: 2px;
box-shadow: inset 0 1px 1px rgba(0,0,0,.8);
}
.ret-05__reel {
width: 74px;
height: 74px;
border-radius: 50%;
position: relative;
z-index: 2;
background: radial-gradient(circle at 35% 30%,#5a5048,#221c16 70%);
box-shadow: inset 0 0 0 6px #15110d,inset 0 0 14px rgba(0,0,0,.9),0 0 0 2px #3a3128;
animation: ret-05-spin 3s linear infinite;
}
.ret-05__reel::before {
content: '';
position: absolute;
inset: 24px;
border-radius: 50%;
background: repeating-conic-gradient(#d8cdbe 0 12deg,#8a7d6c 12deg 24deg);
box-shadow: 0 0 0 3px #15110d;
}
.ret-05__reel::after {
content: '';
position: absolute;
inset: 32px;
border-radius: 50%;
background: radial-gradient(circle,#2a221a,#0d0805);
}
@keyframes ret-05-spin {
to {
transform: rotate(360deg);
}
}
.ret-05__label {
position: absolute;
top: 8px;
left: 50%;
transform: translateX(-50%);
font-family: 'Major Mono Display';
font-size: .62rem;
letter-spacing: .2em;
color: var(--orange);
z-index: 3;
white-space: nowrap;
}
/* LCD + level meter */
.ret-05__lcd {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
background: #2f3a2c;
border-radius: 8px;
padding: 10px 16px;
margin-bottom: 22px;
box-shadow: inset 0 2px 6px rgba(0,0,0,.7);
font-family: 'Major Mono Display';
color: var(--led);
text-shadow: 0 0 6px rgba(125,255,79,.6);
}
.ret-05__lcd .t {
font-size: 1.1rem;
letter-spacing: .05em;
}
.ret-05__meter {
display: flex;
gap: 3px;
align-items: flex-end;
height: 22px;
}
.ret-05__meter i {
width: 5px;
background: var(--led);
border-radius: 1px;
animation: ret-05-eq 1.1s ease-in-out infinite;
}
.ret-05__meter i:nth-child(1) {
height: 30%;
animation-delay: 0s;
}
.ret-05__meter i:nth-child(2) {
height: 60%;
animation-delay: .15s;
}
.ret-05__meter i:nth-child(3) {
height: 95%;
animation-delay: .3s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(4) {
height: 50%;
animation-delay: .45s;
}
.ret-05__meter i:nth-child(5) {
height: 75%;
animation-delay: .6s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(6) {
height: 40%;
animation-delay: .75s;
}
@keyframes ret-05-eq {
50% {
height: 20%;
}
}
/* transport buttons: real pressable plastic */
.ret-05__transport {
display: flex;
gap: 12px;
margin-bottom: 24px;
}
.ret-05__key {
flex: 1;
height: 48px;
border-radius: 7px;
border: none;
cursor: pointer;
font-size: 1rem;
color: #2a2018;
background: linear-gradient(180deg,#efe2cb,#c7b18c);
box-shadow: 0 4px 0 #9a805e,inset 0 1px 0 rgba(255,255,255,.8);
transition: transform .06s,box-shadow .06s;
display: grid;
place-items: center;
}
.ret-05__key:hover {
filter: brightness(1.04);
}
.ret-05__key:active {
transform: translateY(4px);
box-shadow: 0 0 0 #9a805e,inset 0 1px 3px rgba(0,0,0,.3);
}
.ret-05__key--play {
background: linear-gradient(180deg,#f29a5c,#d8612a);
color: #fff;
box-shadow: 0 4px 0 #a8451a,inset 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__key--play:active {
box-shadow: 0 0 0 #a8451a,inset 0 1px 3px rgba(0,0,0,.4);
}
/* knobs */
.ret-05__knobs {
display: flex;
justify-content: space-around;
align-items: flex-start;
}
.ret-05__knobwrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 9px;
}
.ret-05__knob {
width: 62px;
height: 62px;
border-radius: 50%;
cursor: grab;
position: relative;
background: conic-gradient(from -135deg,#3a322a,#6a5e4f 50%,#2a241e);
box-shadow: 0 5px 10px rgba(0,0,0,.5),inset 0 2px 3px rgba(255,255,255,.25),inset 0 -3px 6px rgba(0,0,0,.6);
}
.ret-05__knob::before {
content: '';
position: absolute;
top: 6px;
left: 50%;
width: 4px;
height: 18px;
background: var(--orange);
border-radius: 2px;
transform: translateX(-50%);
box-shadow: 0 0 5px rgba(232,116,59,.7);
}
.ret-05__knob--2 {
transform: rotate(80deg);
}
.ret-05__knob--3 {
transform: rotate(-70deg);
}
.ret-05__knobwrap small {
font-size: .66rem;
letter-spacing: .18em;
text-transform: uppercase;
color: #5a4a36;
font-weight: 600;
}
.ret-05__dots {
position: relative;
width: 62px;
height: 14px;
margin-top: -4px;
}
.ret-05__dots i {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
background: #5a4a36;
top: 0;
}
.ret-05__dots i:nth-child(1) {
left: 0;
}
.ret-05__dots i:nth-child(2) {
left: 30%;
top: -3px;
}
.ret-05__dots i:nth-child(3) {
left: 50%;
top: -5px;
}
.ret-05__dots i:nth-child(4) {
left: 70%;
top: -3px;
}
.ret-05__dots i:nth-child(5) {
right: 0;
}
@media (max-width: 480px) {
.ret-05__tape {
gap: 30px;
}
.ret-05__knob {
width: 50px;
height: 50px;
}
}
@media (prefers-reduced-motion: reduce) {
.ret-05__reel,
.ret-05__meter i {
animation: none !important;
}
}
```Paste this into ChatGPT, Claude, Cursor, or any coding assistant. The block below is pre-framed with everything the AI needs to integrate this demo into your project — markup, styles, scoping notes, and the source URL. Hit Copy and paste straight into your chat.
Here's a working CSS Retro UI Design from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Retro Cassette Player UI Web Component
Source: https://codefronts.com/design-styles/css-retro-designs/retro-cassette-player-ui-web-component/
A skeuomorphic tape deck modelled in pure CSS gradients — moulded plastic body with inset highlights, a recessed window with two spinning reels, an LCD with an animated VU meter, real pressable transport keys with travel, and three rotary knobs with pointer ticks. Major Mono Display + Oswald, warm 80s-hi-fi tones.
## HTML
```html
<div class="ret-05">
<div class="ret-05__deck">
<div class="ret-05__brand">
<b>cassettone</b>
<span>Stereo · Auto-Reverse · Dolby</span>
</div>
<div class="ret-05__window">
<div class="ret-05__label">◦ SIDE A · MIXTAPE '88 ◦</div>
<div class="ret-05__tape">
<div class="ret-05__reel"></div>
<div class="ret-05__reel" style="animation-duration:3.4s"></div>
</div>
</div>
<div class="ret-05__lcd">
<span class="t">▶ 02:14 / 04:51</span>
<div class="ret-05__meter"><i></i><i></i><i></i><i></i><i></i><i></i></div>
</div>
<div class="ret-05__transport">
<button class="ret-05__key">⏮</button>
<button class="ret-05__key ret-05__key--play">▶</button>
<button class="ret-05__key">⏸</button>
<button class="ret-05__key">⏭</button>
<button class="ret-05__key">⏹</button>
</div>
<div class="ret-05__knobs">
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--1"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Volume</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--2"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Bass</small>
</div>
<div class="ret-05__knobwrap">
<div class="ret-05__knob ret-05__knob--3"></div>
<div class="ret-05__dots"><i></i><i></i><i></i><i></i><i></i></div>
<small>Treble</small>
</div>
</div>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display&family=Oswald:wght@300;500;700&display=swap');
.ret-05,
.ret-05 *,
.ret-05 *::before,
.ret-05 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.ret-05 ::selection {
background: #e8743b;
color: #1c140e;
}
.ret-05 {
--case: #d8c5a8;
--case-d: #b39d7c;
--metal: #c9ccd1;
--dark: #2a2420;
--orange: #e8743b;
--cream: #f3e9d6;
--led: #7dff4f;
font-family: 'Oswald',sans-serif;
background: radial-gradient(120% 100% at 50% 0%,#5a4632,#2b211a 70%);
min-height: 100vh;
display: grid;
place-items: center;
padding: clamp(16px,4vw,48px);
color: var(--dark);
}
/* the plastic body: stacked gradients + inset highlights + drop shadow */
.ret-05__deck {
width: min(560px,100%);
background: linear-gradient(160deg,#e8d7b8,#c3ad88 55%,#a98f6b);
border-radius: 22px;
padding: 26px;
box-shadow: inset 0 2px 2px rgba(255,255,255,.7), inset 0 -4px 8px rgba(0,0,0,.28), 0 30px 60px rgba(0,0,0,.55), 0 2px 0 rgba(0,0,0,.4);
position: relative;
}
.ret-05__deck::before {
content: '';
position: absolute;
inset: 11px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,.25);
pointer-events: none;
}
.ret-05__brand {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 18px;
}
.ret-05__brand b {
font-family: 'Major Mono Display';
font-size: 1.5rem;
letter-spacing: .06em;
color: #3a2f25;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__brand span {
font-size: .7rem;
letter-spacing: .3em;
text-transform: uppercase;
color: #6b5a44;
font-weight: 500;
}
/* cassette window: dark recess with spinning reels */
.ret-05__window {
background: linear-gradient(180deg,#1b1612,#322820);
border-radius: 12px;
padding: 22px;
margin-bottom: 22px;
box-shadow: inset 0 4px 10px rgba(0,0,0,.85),inset 0 -1px 0 rgba(255,255,255,.08),0 1px 0 rgba(255,255,255,.4);
position: relative;
overflow: hidden;
}
.ret-05__tape {
display: flex;
align-items: center;
justify-content: center;
gap: 64px;
position: relative;
}
.ret-05__tape::before {
content: '';
position: absolute;
top: 50%;
left: 18%;
right: 18%;
height: 10px;
transform: translateY(-50%);
background: linear-gradient(180deg,#1a120b,#0d0805);
border-radius: 2px;
box-shadow: inset 0 1px 1px rgba(0,0,0,.8);
}
.ret-05__reel {
width: 74px;
height: 74px;
border-radius: 50%;
position: relative;
z-index: 2;
background: radial-gradient(circle at 35% 30%,#5a5048,#221c16 70%);
box-shadow: inset 0 0 0 6px #15110d,inset 0 0 14px rgba(0,0,0,.9),0 0 0 2px #3a3128;
animation: ret-05-spin 3s linear infinite;
}
.ret-05__reel::before {
content: '';
position: absolute;
inset: 24px;
border-radius: 50%;
background: repeating-conic-gradient(#d8cdbe 0 12deg,#8a7d6c 12deg 24deg);
box-shadow: 0 0 0 3px #15110d;
}
.ret-05__reel::after {
content: '';
position: absolute;
inset: 32px;
border-radius: 50%;
background: radial-gradient(circle,#2a221a,#0d0805);
}
@keyframes ret-05-spin {
to {
transform: rotate(360deg);
}
}
.ret-05__label {
position: absolute;
top: 8px;
left: 50%;
transform: translateX(-50%);
font-family: 'Major Mono Display';
font-size: .62rem;
letter-spacing: .2em;
color: var(--orange);
z-index: 3;
white-space: nowrap;
}
/* LCD + level meter */
.ret-05__lcd {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
background: #2f3a2c;
border-radius: 8px;
padding: 10px 16px;
margin-bottom: 22px;
box-shadow: inset 0 2px 6px rgba(0,0,0,.7);
font-family: 'Major Mono Display';
color: var(--led);
text-shadow: 0 0 6px rgba(125,255,79,.6);
}
.ret-05__lcd .t {
font-size: 1.1rem;
letter-spacing: .05em;
}
.ret-05__meter {
display: flex;
gap: 3px;
align-items: flex-end;
height: 22px;
}
.ret-05__meter i {
width: 5px;
background: var(--led);
border-radius: 1px;
animation: ret-05-eq 1.1s ease-in-out infinite;
}
.ret-05__meter i:nth-child(1) {
height: 30%;
animation-delay: 0s;
}
.ret-05__meter i:nth-child(2) {
height: 60%;
animation-delay: .15s;
}
.ret-05__meter i:nth-child(3) {
height: 95%;
animation-delay: .3s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(4) {
height: 50%;
animation-delay: .45s;
}
.ret-05__meter i:nth-child(5) {
height: 75%;
animation-delay: .6s;
background: #ffd23f;
}
.ret-05__meter i:nth-child(6) {
height: 40%;
animation-delay: .75s;
}
@keyframes ret-05-eq {
50% {
height: 20%;
}
}
/* transport buttons: real pressable plastic */
.ret-05__transport {
display: flex;
gap: 12px;
margin-bottom: 24px;
}
.ret-05__key {
flex: 1;
height: 48px;
border-radius: 7px;
border: none;
cursor: pointer;
font-size: 1rem;
color: #2a2018;
background: linear-gradient(180deg,#efe2cb,#c7b18c);
box-shadow: 0 4px 0 #9a805e,inset 0 1px 0 rgba(255,255,255,.8);
transition: transform .06s,box-shadow .06s;
display: grid;
place-items: center;
}
.ret-05__key:hover {
filter: brightness(1.04);
}
.ret-05__key:active {
transform: translateY(4px);
box-shadow: 0 0 0 #9a805e,inset 0 1px 3px rgba(0,0,0,.3);
}
.ret-05__key--play {
background: linear-gradient(180deg,#f29a5c,#d8612a);
color: #fff;
box-shadow: 0 4px 0 #a8451a,inset 0 1px 0 rgba(255,255,255,.5);
}
.ret-05__key--play:active {
box-shadow: 0 0 0 #a8451a,inset 0 1px 3px rgba(0,0,0,.4);
}
/* knobs */
.ret-05__knobs {
display: flex;
justify-content: space-around;
align-items: flex-start;
}
.ret-05__knobwrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 9px;
}
.ret-05__knob {
width: 62px;
height: 62px;
border-radius: 50%;
cursor: grab;
position: relative;
background: conic-gradient(from -135deg,#3a322a,#6a5e4f 50%,#2a241e);
box-shadow: 0 5px 10px rgba(0,0,0,.5),inset 0 2px 3px rgba(255,255,255,.25),inset 0 -3px 6px rgba(0,0,0,.6);
}
.ret-05__knob::before {
content: '';
position: absolute;
top: 6px;
left: 50%;
width: 4px;
height: 18px;
background: var(--orange);
border-radius: 2px;
transform: translateX(-50%);
box-shadow: 0 0 5px rgba(232,116,59,.7);
}
.ret-05__knob--2 {
transform: rotate(80deg);
}
.ret-05__knob--3 {
transform: rotate(-70deg);
}
.ret-05__knobwrap small {
font-size: .66rem;
letter-spacing: .18em;
text-transform: uppercase;
color: #5a4a36;
font-weight: 600;
}
.ret-05__dots {
position: relative;
width: 62px;
height: 14px;
margin-top: -4px;
}
.ret-05__dots i {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
background: #5a4a36;
top: 0;
}
.ret-05__dots i:nth-child(1) {
left: 0;
}
.ret-05__dots i:nth-child(2) {
left: 30%;
top: -3px;
}
.ret-05__dots i:nth-child(3) {
left: 50%;
top: -5px;
}
.ret-05__dots i:nth-child(4) {
left: 70%;
top: -3px;
}
.ret-05__dots i:nth-child(5) {
right: 0;
}
@media (max-width: 480px) {
.ret-05__tape {
gap: 30px;
}
.ret-05__knob {
width: 50px;
height: 50px;
}
}
@media (prefers-reduced-motion: reduce) {
.ret-05__reel,
.ret-05__meter i {
animation: none !important;
}
}
```