Cyberpunk UI
"High tech, low life. Neon signs cutting through the smog of a dystopian megacity."
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
- Neon on Black: The foundation is absolute black (
#000000) or deep charcoal, cut by searingly bright neon accents. - Angled Geometries: Clipped corners (chamfers) rather than rounded corners. UI elements often look like they were cut from metal plates.
- Glitch and Data: Random streams of hexadecimal data, barcode accents, and intentional visual tearing.
Visual DNA
- Colors: Acid Yellow (
#FCE205), Cyan (#00FFFF), Hot Pink (#FF003C), against Black. - Typography: Industrial, squared-off sans-serifs (like
Rajdhani,Blender Pro, orTeko), mixed with small monospace fonts for data. - Styling: Diagonal stripes, warning tape patterns, and heavy outer glows.
Web Implementation
- Rely on
clip-pathfor the angled cuts. - CSS Example:
body {
background-color: #050505;
color: #00FFFF;
font-family: 'Rajdhani', sans-serif;
background-image: repeating-linear-gradient(
45deg,
#050505,
#050505 10px,
#0a0a0a 10px,
#0a0a0a 20px
);
}
.cyberpunk-button {
background-color: #FF003C; /* Cyberpunk Red/Pink */
color: #FFF;
font-size: 1.5rem;
font-weight: bold;
text-transform: uppercase;
border: none;
padding: 16px 32px;
/* The signature clipped corner */
clip-path: polygon(
0 0,
calc(100% - 15px) 0,
100% 15px,
100% 100%,
15px 100%,
0 calc(100% - 15px)
);
position: relative;
transition: all 0.2s ease;
}
/* The glitch/shadow effect */
.cyberpunk-button:hover {
background-color: #FCE205; /* Acid Yellow */
color: #000;
box-shadow:
-4px 0 0 #00FFFF,
4px 0 0 #FF003C;
}
.data-stream {
font-family: monospace;
font-size: 0.8rem;
color: rgba(0, 255, 255, 0.5);
}
App Implementation
SwiftUI
struct CyberpunkShape: Shape {
let cutSize: CGFloat = 15
func path(in rect: CGRect) -> Path {
var path = Path()
// Top left
path.move(to: CGPoint(x: 0, y: 0))
// Top right (cut)
path.addLine(to: CGPoint(x: rect.maxX - cutSize, y: 0))
path.addLine(to: CGPoint(x: rect.maxX, y: cutSize))
// Bottom right
path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
// Bottom left (cut)
path.addLine(to: CGPoint(x: cutSize, y: rect.maxY))
path.addLine(to: CGPoint(x: 0, y: rect.maxY - cutSize))
path.closeSubpath()
return path
}
}
struct CyberButton: View {
var body: some View {
Button(action: {}) {
Text("SYS.OVERRIDE")
.font(.custom("Rajdhani", size: 24))
.fontWeight(.bold)
.foregroundColor(.white)
.padding(.horizontal, 32)
.padding(.vertical, 16)
}
.background(Color(red: 1.0, green: 0.0, blue: 0.24)) // Cyberpunk Red
.clipShape(CyberpunkShape())
.overlay(
CyberpunkShape()
.stroke(Color(red: 0.0, green: 1.0, blue: 1.0), lineWidth: 2) // Cyan border
)
}
}
- Define a custom
Shapethat physically cuts off the corners, bypassing standardcornerRadius. - Use
.clipShape()for the background, and.overlay()with.stroke()for high-tech borders.
Flutter
class CyberpunkClipper extends CustomClipper<Path> {
final double cutSize = 15.0;
@override
Path getClip(Size size) {
Path path = Path();
path.lineTo(size.width - cutSize, 0); // Top right cut start
path.lineTo(size.width, cutSize); // Top right cut end
path.lineTo(size.width, size.height);
path.lineTo(cutSize, size.height); // Bottom left cut start
path.lineTo(0, size.height - cutSize);// Bottom left cut end
path.close();
return path;
}
@override
bool shouldReclip(CustomClipper<Path> oldClipper) => false;
}
class CyberButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ClipPath(
clipper: CyberpunkClipper(),
child: Container(
color: const Color(0xFFFF003C), // Cyberpunk Red
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16),
child: const Text(
'SYS.OVERRIDE',
style: TextStyle(
color: Colors.white,
fontSize: 24,
fontWeight: FontWeight.bold,
fontFamily: 'Rajdhani',
),
),
),
);
}
}
- Extend
CustomClipper<Path>to calculate the precise angular cuts. - Wrap your containers in
ClipPath. - For borders, you must use a
CustomPaintwith aCustomPainterthat traces the exact same path.
React Native
import Svg, { Polygon } from 'react-native-svg';
const CyberButton = () => {
return (
<View style={{ alignItems: 'center', justifyContent: 'center', width: 200, height: 60 }}>
{/* Background SVG to achieve the clipped corner look */}
<View style={{ position: 'absolute', top: 0, bottom: 0, left: 0, right: 0 }}>
<Svg height="100%" width="100%" viewBox="0 0 200 60" preserveAspectRatio="none">
<Polygon
points="0,0 185,0 200,15 200,60 15,60 0,45"
fill="#FF003C"
stroke="#00FFFF"
strokeWidth="2"
/>
</Svg>
</View>
<Text style={{
color: '#FFF',
fontSize: 20,
fontWeight: 'bold',
fontFamily: 'Rajdhani-Bold'
}}>
SYS.OVERRIDE
</Text>
</View>
);
};
- React Native does not natively support clipping paths on views easily.
- Solution: Use
react-native-svgto draw a<Polygon>that acts as the absolute-positioned background behind transparent text.
Jetpack Compose
class CyberpunkShape(private val cutSize: Dp) : Shape {
override fun createOutline(
size: Size,
layoutDirection: LayoutDirection,
density: Density
): Outline {
val cutPx = with(density) { cutSize.toPx() }
val path = Path().apply {
moveTo(0f, 0f)
lineTo(size.width - cutPx, 0f)
lineTo(size.width, cutPx)
lineTo(size.width, size.height)
lineTo(cutPx, size.height)
lineTo(0f, size.height - cutPx)
close()
}
return Outline.Generic(path)
}
}
@Composable
fun CyberButton() {
Box(
modifier = Modifier
.clip(CyberpunkShape(15.dp))
.background(Color(0xFFFF003C))
.border(2.dp, Color(0xFF00FFFF), CyberpunkShape(15.dp))
.clickable { }
.padding(horizontal = 32.dp, vertical = 16.dp)
) {
Text(
text = "SYS.OVERRIDE",
color = Color.White,
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
// Assuming custom font is loaded
)
}
}
- Create a custom
Shapeby overridingcreateOutlineand tracing thePath. - Pass this shape directly into
Modifier.clip()andModifier.background(). - You can elegantly apply a border stroke directly to the custom shape using
Modifier.border().
Do's and Don'ts
- DO: Include tiny, meaningless technical details (crosshairs, serial numbers, "SYS.OVERRIDE" text).
- DON'T: Use soft, organic curves or gradients. It must be sharp and aggressive.
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.