Generate retro-styled UI components and design systems
Design-style skill for Retro Design: warm analog palettes, film-grain texture, and classic typography with vintage stamp badges.
Maintainer of this project? Claim this page to edit the listing.
13.6.1Add to Favorites
Why it matters
Create vintage-inspired user interfaces with period-accurate design patterns, typography, and visual elements that evoke specific eras while maintaining modern usability and accessibility standards.
Outcomes
What it gets done
Generate CSS and markup for retro design aesthetics (80s neon, 90s web, brutalism)
Apply vintage color palettes, typography, and texture treatments to modern components
Create pixel-perfect recreations of classic UI patterns with contemporary code
Balance nostalgic visual language with WCAG accessibility and responsive behavior
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/ag-retro-design | bash Overview
Retro Design
A design-style skill for Retro Design - warm analog color palettes, film-grain texture, and classic typography with vintage stamp/badge accents - with matching Web CSS and SwiftUI implementations. Use it for vintage-branded products, throwback marketing, or nostalgic content pages that want to evoke old print or film media rather than clean modern digital polish - the small imperfections (grain, misregistered shadow, tilted sticker) are what sell the illusion, not a single big design decision.
What it does
Retro Design is a design-style child skill ('a warm, analog feeling - nostalgia through muted tones, grain, and classic typography'), part of the design-it family and not meant to be triggered directly. Three core principles: Warm Analog Color Palettes (colors that look faded by the sun or printed on aged paper), Texture and Noise (a slight grain overlay simulating film or old print media), and Classic Typography Pairings (heavy, groovy display fonts paired with typewriter or classic serif body copy).
When to use - and when NOT to
Use it when the user's request matches this warm, nostalgic, analog-media aesthetic - vintage-branded products, throwback marketing campaigns, or anything wanting to evoke old print or film media rather than crisp digital cleanliness. As a design sub-style, it's selected by the parent design-it skill's routing rather than invoked on its own.
Inputs and outputs
Visual DNA uses Monochromatic Brown or warm faded tones - mustard yellow, burnt orange, sage green, off-white - paired with display fonts like Cooper Black, Garamond, or Courier, and styling accents like badges, stamps, wavy borders, and halftone patterns. The web implementation layers a noise-texture background image with background-blend-mode: multiply over an aged-paper base color to fake film grain, sets bold display headlines with a solid, non-blurred colored text-shadow offset (mustard yellow behind burnt orange text, mimicking a slightly misregistered vintage print), gives cards a chunky vintage offset shadow in a brown tone rather than a soft blur, and renders a circular "badge" element rotated a few degrees off-axis to look like a hand-applied sticker or stamp.
.retro-header {
color: #D35400;
text-shadow: 2px 2px 0px #F1C40F;
}
.retro-badge {
border-radius: 50%;
transform: rotate(-10deg);
}
Integrations
SwiftUI reproduces the same paper-and-ink color pairing, layers an optional film-grain image with .blendMode(.multiply) at reduced opacity over the background, and applies the identical solid offset shadow technique to display text (.shadow(color:, radius: 0, x: 2, y: 2) with zero blur radius, matching the web's hard-edged vintage print-shadow look) using the Cooper Black display font and Georgia serif body copy - the small imperfections (grain, hard-edged misregistered shadow, tilted sticker) are what sell the analog illusion, more than any single big color decision.
Who it's for
Designers and developers building vintage-branded products, throwback marketing campaigns, or nostalgic content pages that want to evoke old print or film media through warm, faded color and analog texture rather than crisp modern digital polish.
Source README
Retro Design
"A warm, analog feeling. Nostalgia through muted tones, grain, and classic typography."
When to Use
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the design-it skill and is not meant to be triggered directly.
Core Principles
- Warm, Analog Color Palettes: Colors look faded by the sun or printed on aged paper.
- Texture and Noise: A slight grain overlay to simulate film or old print media.
- Classic Typography Pairings: Heavy, groovy display fonts paired with typewriter or classic serif body copy.
Visual DNA
- Colors: Monochromatic Brown or warm, faded palettes (mustard yellow, burnt orange, sage green, off-white).
- Typography: Display fonts like
Cooper Black,Garamond, orCourier. - Styling: Badges, stamps, wavy borders, and halftone patterns.
Web Implementation
- Use CSS filters and background noise images to create texture.
- CSS Example:
body {
background-color: #F4E8D1; /* Aged paper */
color: #3E2723; /* Deep brown ink */
font-family: 'Georgia', serif;
/* Apply a subtle noise overlay using a pseudo-element or background image */
background-image: url('noise-texture.png');
background-blend-mode: multiply;
}
.retro-header {
font-family: 'Cooper Black', serif;
font-size: 4rem;
color: #D35400; /* Burnt orange */
text-shadow: 2px 2px 0px #F1C40F; /* Mustard yellow drop shadow */
letter-spacing: -1px;
}
.retro-card {
background-color: #FFF3E0;
border: 2px solid #3E2723;
border-radius: 12px;
padding: 24px;
/* Vintage offset shadow */
box-shadow: 8px 8px 0px #795548;
}
.retro-badge {
display: inline-block;
background-color: #E74C3C;
color: #F4E8D1;
font-family: monospace;
font-weight: bold;
padding: 8px 16px;
border-radius: 50%; /* Make it look like a sticker */
transform: rotate(-10deg);
}
App Implementation
SwiftUI
struct RetroCard: View {
let paperColor = Color(red: 0.96, green: 0.91, blue: 0.82) // #F4E8D1
let inkColor = Color(red: 0.24, green: 0.15, blue: 0.14) // #3E2723
var body: some View {
ZStack {
paperColor.ignoresSafeArea()
// Optional: Noise texture
Image("film_grain")
.resizable()
.blendMode(.multiply)
.opacity(0.3)
.ignoresSafeArea()
VStack(alignment: .leading, spacing: 24) {
Text("RETRO DESIGN")
.font(.custom("Cooper Black", size: 36))
.foregroundColor(Color(red: 0.83, green: 0.33, blue: 0.0)) // #D35400
.shadow(color: Color(red: 0.95, green: 0.77, blue: 0.06), radius: 0, x: 2, y: 2)
Text("Analog warmth and classic typography.")
.font(.custom("Georgia", size: 18))
.foregroundColor(inkColor)
}
.padding(32)
.background(Color(red: 1.0, green: 0.95, blue: 0.88))
.cornerRadius(12)
.overlay(
RoundedRectangle(cornerRadius: 12)
.stroke(inkColor, lineWidth: 2)
)
// Vintage solid offset shadow
.shadow(color: Color(red: 0.47, green: 0.33, blue: 0.28), radius: 0, x: 8, y: 8)
}
}
}
- A grain texture image can be overlaid using
.blendMode(.multiply). Be aware of memory usage with full-screen textures. - Use
.shadow(radius: 0)to create the hard offset shadows typical of 70s print media. - Custom fonts like Cooper Black are absolutely required.
Flutter
class RetroCard extends StatelessWidget {
final Color paperColor = const Color(0xFFF4E8D1);
final Color inkColor = const Color(0xFF3E2723);
@override
Widget build(BuildContext context) {
return Container(
color: paperColor,
child: Stack(
fit: StackFit.expand,
children: [
// Noise texture
Opacity(
opacity: 0.3,
child: Image.asset('assets/film_grain.png',
fit: BoxFit.cover,
colorBlendMode: BlendMode.multiply),
),
Center(
child: Container(
padding: const EdgeInsets.all(32),
decoration: BoxDecoration(
color: const Color(0xFFFFF3E0),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: inkColor, width: 2),
boxShadow: const [
BoxShadow(
color: Color(0xFF795548),
blurRadius: 0, // Hard offset shadow
offset: Offset(8, 8),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('RETRO DESIGN',
style: TextStyle(
fontFamily: 'Cooper',
fontSize: 36,
color: Color(0xFFD35400),
shadows: [Shadow(color: Color(0xFFF1C40F), offset: Offset(2, 2))],
)),
const SizedBox(height: 24),
Text('Analog warmth and classic typography.',
style: TextStyle(fontFamily: 'Georgia', fontSize: 18, color: inkColor)),
],
),
),
),
],
),
);
}
}
- Wrap backgrounds in a
Stackto place a semi-transparent film grain asset over the solid color. - Drop shadows for text and containers must have
blurRadius: 0to emulate offset misregistered ink prints.
React Native
const RetroCard = () => {
return (
<ImageBackground
source={require('./film_grain.png')}
style={{ flex: 1, backgroundColor: '#F4E8D1', padding: 24, justifyContent: 'center' }}
imageStyle={{ opacity: 0.3, tintColor: '#3E2723' }}
>
<View style={{
backgroundColor: '#FFF3E0',
padding: 32,
borderRadius: 12,
borderWidth: 2,
borderColor: '#3E2723',
// Hard drop shadow
shadowColor: '#795548',
shadowOffset: { width: 8, height: 8 },
shadowOpacity: 1,
shadowRadius: 0,
elevation: 8, // Fallback for Android, though it blurs
}}>
<Text style={{
fontFamily: 'CooperBlack',
fontSize: 36,
color: '#D35400',
textShadowColor: '#F1C40F',
textShadowOffset: { width: 2, height: 2 },
textShadowRadius: 0,
marginBottom: 24
}}>
RETRO DESIGN
</Text>
<Text style={{ fontFamily: 'Georgia', fontSize: 18, color: '#3E2723' }}>
Analog warmth and classic typography.
</Text>
</View>
</ImageBackground>
);
};
- Use
ImageBackgroundon the root view for the grain. - Android's
elevationcannot do unblurred offset shadows natively. Usereact-native-drop-shadowfor perfect retro shadows on Android.
Jetpack Compose
@Composable
fun RetroCard() {
val inkColor = Color(0xFF3E2723)
Box(modifier = Modifier.fillMaxSize().background(Color(0xFFF4E8D1))) {
// Noise Texture Overlay
Image(
painter = painterResource(id = R.drawable.film_grain),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.matchParentSize().alpha(0.3f),
colorFilter = ColorFilter.tint(Color.Black, BlendMode.Multiply)
)
Box(
modifier = Modifier
.align(Alignment.Center)
.padding(24.dp)
// Fake hard shadow in compose by drawing behind
.drawBehind {
drawRoundRect(
color = Color(0xFF795548),
topLeft = Offset(8.dp.toPx(), 8.dp.toPx()),
size = size,
cornerRadius = CornerRadius(12.dp.toPx())
)
}
.background(Color(0xFFFFF3E0), RoundedCornerShape(12.dp))
.border(2.dp, inkColor, RoundedCornerShape(12.dp))
.padding(32.dp)
) {
Column {
Text("RETRO DESIGN",
fontFamily = FontFamily(Font(R.font.cooper_black)),
fontSize = 36.sp,
color = Color(0xFFD35400),
style = TextStyle(shadow = Shadow(Color(0xFFF1C40F), Offset(4f, 4f), 0f))
)
Spacer(Modifier.height(24.dp))
Text("Analog warmth and classic typography.",
fontFamily = FontFamily.Serif,
fontSize = 18.sp,
color = inkColor)
}
}
}
}
- Native
Modifier.shadowcreates soft blurs. UseModifier.drawBehindto draw an offsetdrawRoundRectfor the hard retro shadow block. - Text shadows support hard offsets perfectly via
Shadow(color, offset, blurRadius = 0f).
Do's and Don'ts
- DO: Use slightly off-white backgrounds (cream, beige) instead of pure
#FFFFFFto simulate aged paper. - DON'T: Use sleek, modern geometric sans-serifs or tech-focused neon colors.
Limitations
- This is a styling reference and does not replace environment-specific validation, accessibility testing, or expert review.
- Ensure appropriate contrast ratios and responsive behaviors are verified separately.
FAQ
Common questions
Discussion
Questions & comments ยท 0
Sign In Sign in to leave a comment.