--- name: typography-first description: Web and App implementation guide for Typography First Design. Trigger when user wants text as the absolute main visual element, with minimal UI chroming. date_added: "2026-06-17" risk: safe source: self source_type: self --- # Typography First Design > "The words are the interface. No distractions, just beautiful text." ## 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 1. **Hyper-Sized Typography**: The main headline is so large it becomes an abstract graphic element. 2. **Minimal UI Chroming**: Buttons are just text. Navigation is just text. No boxes, no backgrounds. 3. **Kinetic Typography**: Text that moves, scrolls, or reacts to the user's cursor. ## Visual DNA - **Colors**: Extreme high contrast. Pure black and white, or a very dark background with a single neon accent color. **Midnight Luxury** works well. - **Typography**: Display fonts with extreme character. Try `Oswald`, `Anton`, or `Bebas Neue` for impact, or a massive serif. - **Layout**: Often centers the massive text perfectly in the viewport, cutting off at the edges. ## Web Implementation - Rely on `vw` and `vh` units for font sizing so the text perfectly fills the screen. - **CSS Example**: ```css body { background-color: #0A0A0A; color: #F5F5F0; overflow-x: hidden; margin: 0; } .hero-type { font-family: 'Anton', sans-serif; font-size: 25vw; /* Fills the width of the screen */ text-transform: uppercase; line-height: 0.8; white-space: nowrap; /* Outline effect */ color: transparent; -webkit-text-stroke: 2px #F5F5F0; transition: color 0.3s; } .hero-type:hover { color: var(--cta-highlight); -webkit-text-stroke: 0; } .nav-text-btn { background: none; border: none; color: #F5F5F0; font-size: 2rem; font-family: 'Helvetica Neue', sans-serif; text-decoration: underline; text-underline-offset: 8px; cursor: pointer; } ``` ## App Implementation ### SwiftUI ```swift struct TypographyFirstView: View { var body: some View { ZStack { Color(hex: "0A0A0A").ignoresSafeArea() VStack { // Massive Typography Bleeding Off Edge Text("THE WORDS ARE THE INTERFACE") .font(.custom("Anton", size: 200)) // Absurdly large .foregroundColor(Color(hex: "F5F5F0")) .lineLimit(1) .fixedSize(horizontal: true, vertical: false) // Force no wrapping .minimumScaleFactor(1.0) // Prevent auto-shrinking // Outlined variant Text("NO CHROMING") .font(.custom("Anton", size: 150)) .foregroundColor(.clear) .overlay( Text("NO CHROMING") .font(.custom("Anton", size: 150)) .foregroundColor(Color(hex: "0A0A0A")) // Hack for text stroke in SwiftUI .shadow(color: Color(hex: "F5F5F0"), radius: 1) ) .lineLimit(1) .fixedSize() } .frame(maxWidth: .infinity, alignment: .leading) .padding(.leading, -20) // Intentionally cut off } } } ``` - Use `.fixedSize(horizontal: true, vertical: false)` and `.lineLimit(1)` to force massive fonts to bleed off the edge of the screen rather than wrapping into a paragraph. - Native text-stroke is difficult in SwiftUI; overlapping a masked text or using thin shadows is the common workaround. ### Flutter ```dart class TypographyFirstScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFF0A0A0A), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Auto-scaling hero text FittedBox( fit: BoxFit.cover, child: Text( 'THE WORDS ARE', style: TextStyle(fontFamily: 'Anton', color: const Color(0xFFF5F5F0), height: 0.8), ), ), // Outlined text FittedBox( fit: BoxFit.cover, child: Stack( children: [ // Outline Text( 'THE INTERFACE', style: TextStyle( fontFamily: 'Anton', height: 0.8, foreground: Paint()..style = PaintingStyle.stroke..strokeWidth = 2..color = const Color(0xFFF5F5F0), ), ), // Solid fill (transparent) const Text('THE INTERFACE', style: TextStyle(fontFamily: 'Anton', height: 0.8, color: Colors.transparent)), ], ), ), ], ), ), ); } } ``` - `FittedBox` with `BoxFit.cover` is your best friend here. It ensures the text takes up the maximum possible width/height regardless of the device screen size. - Flutter makes text outlines easy by using `foreground: Paint()..style = PaintingStyle.stroke` in the `TextStyle`. ### React Native ```jsx const { width } = Dimensions.get('window'); const TypographyFirstScreen = () => { return ( {/* Massive Text */} WORDS ARE {/* Outlined Text (Not supported natively in standard React Native Text, requires SVG or shadows) */} INTERFACE {/* Typography Button */} Explore Now ); }; ``` - Rely on `Dimensions.get('window').width` to calculate extreme font sizes dynamically (e.g., `fontSize: width * 0.4`). - Use `numberOfLines={1}` and negative margins to allow the text to act as a graphic element bleeding off the screen. ### Jetpack Compose ```kotlin @Composable fun TypographyFirstScreen() { Column( modifier = Modifier.fillMaxSize().background(Color(0xFF0A0A0A)), verticalArrangement = Arrangement.Center ) { // Massive Text Text( text = "THE WORDS ARE", color = Color(0xFFF5F5F0), fontSize = 120.sp, // Absurd size fontFamily = FontFamily.SansSerif, // Replace with Anton lineHeight = 100.sp, softWrap = false, // Force bleed off edge modifier = Modifier.offset(x = (-20).dp) ) // Outlined Text Text( text = "THE INTERFACE", fontSize = 100.sp, fontFamily = FontFamily.SansSerif, lineHeight = 90.sp, softWrap = false, style = TextStyle( drawStyle = Stroke( miter = 10f, width = 2f, join = StrokeJoin.Round ) ), color = Color(0xFFF5F5F0) // The stroke color ) } } ``` - Set `softWrap = false` on `Text` to prevent it from wrapping and ruining the massive headline aesthetic. - Compose fully supports text outlines natively using `style = TextStyle(drawStyle = Stroke(...))`. ## Do's and Don'ts - **DO**: Mix filled text and outlined text (using `-webkit-text-stroke`) for visual interest. - **DON'T**: Wrap the text in cards or containers. Let it bleed into the background. ## 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.