Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Typography First Design. Trigger when user wants text as the absolute main visual element, with minimal UI chroming.
.claude/skills/lingxling-typography-first/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 173% | 0% |
> "The words are the interface. No distractions, just beautiful text."
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.
Oswald, Anton, or Bebas Neue for impact, or a massive serif.vw and vh units for font sizing so the text perfectly fills the screen.cssbody { 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; }
swiftstruct 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 } } }
.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.dartclass 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.foreground: Paint()..style = PaintingStyle.stroke in the TextStyle.jsxconst { width } = Dimensions.get('window'); const TypographyFirstScreen = () => { return ( <View style={{ flex: 1, backgroundColor: '#0A0A0A', justifyContent: 'center' }}> {/* Massive Text */} <Text numberOfLines={1} style={{ fontFamily: 'Anton-Regular', fontSize: width * 0.4, color: '#F5F5F0', lineHeight: width * 0.35, marginLeft: -20 }} > WORDS ARE </Text> {/* Outlined Text (Not supported natively in standard React Native Text, requires SVG or shadows) */} <Text numberOfLines={1} style={{ fontFamily: 'Anton-Regular', fontSize: width * 0.35, color: '#0A0A0A', lineHeight: width * 0.3, textShadowColor: '#F5F5F0', textShadowOffset: {width: -1, height: 1}, textShadowRadius: 1 }} > INTERFACE </Text> {/* Typography Button */} <TouchableOpacity style={{ marginTop: 40, alignSelf: 'center' }}> <Text style={{ color: '#F5F5F0', fontSize: 24, textDecorationLine: 'underline' }}> Explore Now </Text> </TouchableOpacity> </View> ); };
Dimensions.get('window').width to calculate extreme font sizes dynamically (e.g., fontSize: width * 0.4).numberOfLines={1} and negative margins to allow the text to act as a graphic element bleeding off the screen.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 ) } }
softWrap = false on Text to prevent it from wrapping and ruining the massive headline aesthetic.style = TextStyle(drawStyle = Stroke(...)).-webkit-text-stroke) for visual interest.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 45,825 | 22,527 | -51% | 1 | 1 | 0% | 4,640 | 6,309 | +36% | 0 | 0 | — |
case-02 | fail→fail | 19,302 | 11,575 | -40% | 1 | 1 | 0% | 3,047 | 4,493 | +47% | 0 | 0 | — |
case-03 | pass→pass | 6,354 | 6,527 | +3% | 1 | 1 | 0% | 1,134 | 3,092 | +173% | 0 | 0 | — |
case-12 | pass→pass | 13,615 | 7,193 | -47% | 1 | 1 | 0% | 1,727 | 3,291 | +91% | 0 | 0 | — |
case-04 | pass→pass | 11,391 | 10,124 | -11% | 1 | 1 | 0% | 1,702 | 3,670 | +116% | 0 | 0 | — |
case-05 | pass→pass | 12,274 | 11,488 | -6% | 1 | 1 | 0% | 2,125 | 3,976 | +87% | 0 | 0 | — |
case-06 | fail→fail | 19,181 | 13,232 | -31% | 1 | 1 | 0% | 3,153 | 4,625 | +47% | 0 | 0 | — |
case-07 | pass→pass | 14,700 | 12,631 | -14% | 1 | 1 | 0% | 2,470 | 4,396 | +78% | 0 | 0 | — |
case-08 | pass→pass | 7,993 | 4,467 | -44% | 1 | 1 | 0% | 1,065 | 2,919 | +174% | 0 | 0 | — |
case-09 | pass→pass | 14,894 | 6,561 | -56% | 1 | 1 | 0% | 2,148 | 3,257 | +52% | 0 | 0 | — |
case-10 | fail→pass | 14,779 | 6,928 | -53% | 1 | 1 | 0% | 2,344 | 3,284 | +40% | 0 | 0 | — |
case-11 | pass→pass | 20,721 | 7,661 | -63% | 1 | 1 | 0% | 2,083 | 3,652 | +75% | 0 | 0 | — |
case-13 | fail→pass | 26,604 | 18,058 | -32% | 1 | 1 | 0% | 4,132 | 5,050 | +22% | 0 | 0 | — |
case-14 | fail→fail | 10,837 | 8,997 | -17% | 1 | 1 | 0% | 1,948 | 3,867 | +99% | 0 | 0 | — |
case-15 | fail→fail | 16,286 | 14,695 | -10% | 1 | 1 | 0% | 2,974 | 4,795 | +61% | 0 | 0 | — |
case-16 | pass→pass | 19,154 | 16,103 | -16% | 1 | 1 | 0% | 3,004 | 5,263 | +75% | 0 | 0 | — |
case-17 | pass→pass | 16,984 | 12,107 | -29% | 1 | 1 | 0% | 2,578 | 3,968 | +54% | 0 | 0 | — |
case-18 | pass→pass | 17,838 | 17,381 | -3% | 1 | 1 | 0% | 3,110 | 5,047 | +62% | 0 | 0 | — |
case-19 | fail→pass | 15,531 | 11,204 | -28% | 1 | 1 | 0% | 2,658 | 3,792 | +43% | 0 | 0 | — |
case-20 | pass→pass | 19,514 | 17,865 | -8% | 1 | 1 | 0% | 3,256 | 4,755 | +46% | 0 | 0 | — |
case-21 | pass→pass | 17,628 | 27,582 | +56% | 1 | 1 | 0% | 3,561 | 6,193 | +74% | 0 | 0 | — |
case-22 | fail→fail | 20,475 | 23,163 | +13% | 1 | 1 | 0% | 4,139 | 5,849 | +41% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.