--- name: editorial-design description: Web and App implementation guide for Editorial Design. Trigger when user wants a magazine-inspired layout, large headlines, and elegant typography pairing. date_added: "2026-06-17" risk: safe source: self source_type: self --- # Editorial Design > "The digital magazine. Sophisticated typography pairings and deliberate, elegant pacing." ## 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. **Serif & Sans-Serif Pairing**: The hallmark of editorial design. A beautiful, high-contrast serif for headings, paired with a clean sans-serif for body copy. 2. **Large Drop Caps & Pull Quotes**: Typographic flourishes that guide the eye and break up long blocks of text. 3. **Columnar Layouts**: Content flows in distinct columns, often with fine lines (rules) separating them. ## Visual DNA - **Colors**: **Modern Editorial** or **Yacht Club**. Warm, paper-like backgrounds with deep, ink-like blacks or navy blues. - **Typography**: - Headlines: `Playfair Display`, `Merriweather`, `Bodoni`. - Body: `Lato`, `Open Sans`, `Source Sans Pro`. - **Borders**: Thin, elegant horizontal lines (hairlines) used to separate sections. ## Web Implementation - **CSS Example**: ```css body { background-color: #F9F9F9; /* Paper white */ color: #121212; /* Ink black */ } /* Typography Pairing */ .editorial-headline { font-family: 'Playfair Display', serif; font-size: 4rem; font-weight: 700; font-style: italic; margin-bottom: 24px; border-bottom: 1px solid #121212; padding-bottom: 24px; } .editorial-body { font-family: 'Lato', sans-serif; font-size: 1.1rem; line-height: 1.8; column-count: 2; /* Magazine columns */ column-gap: 40px; } /* Drop Cap */ .editorial-body::first-letter { font-family: 'Playfair Display', serif; font-size: 4rem; float: left; line-height: 0.8; padding-right: 12px; color: var(--cta-highlight); } .pull-quote { font-family: 'Playfair Display', serif; font-size: 2rem; text-align: center; margin: 48px 0; padding: 24px 0; border-top: 2px solid #121212; border-bottom: 2px solid #121212; } ``` ## App Implementation ### SwiftUI ```swift struct EditorialView: View { var body: some View { ScrollView { VStack(alignment: .leading, spacing: 24) { // Editorial Headline Text("The Digital\nMagazine") .font(.custom("Playfair Display", size: 48)) .fontWeight(.bold) .italic() .foregroundColor(Color(white: 0.05)) .padding(.bottom, 16) Divider().background(Color.black) // Drop Cap and Body HStack(alignment: .top, spacing: 8) { Text("I") .font(.custom("Playfair Display", size: 64)) .foregroundColor(Color(red: 0.7, green: 0.2, blue: 0.2)) // Negative padding to pull the body text tighter to the drop cap .padding(.top, -10) Text("n an era of sterile, flat interfaces, the return to elegant typography feels like a breath of fresh air. The interplay of serif and sans-serif...") .font(.custom("Lato", size: 16)) .lineSpacing(6) .foregroundColor(Color(white: 0.1)) } // Pull Quote VStack { Divider().background(Color.black) Text("“Sophistication is in the spacing.”") .font(.custom("Playfair Display", size: 28)) .italic() .multilineTextAlignment(.center) .padding(.vertical, 24) Divider().background(Color.black) } .padding(.vertical, 24) } .padding(24) } .background(Color(red: 0.98, green: 0.98, blue: 0.96)) // Warm paper white } } ``` - Extensive use of `.font(.custom())` is mandatory. System fonts look too app-like. - Use `Divider()` to create the hairlines that are so common in print design. - A fake "drop cap" can be achieved with an `HStack` aligning top. ### Flutter ```dart class EditorialScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFFF9F9F8), // Paper background body: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 40), const Text( 'The Digital\nMagazine', style: TextStyle(fontFamily: 'PlayfairDisplay', fontSize: 48, fontWeight: FontWeight.bold, fontStyle: FontStyle.italic, height: 1.1), ), const SizedBox(height: 24), const Divider(color: Colors.black, thickness: 1), const SizedBox(height: 24), // Body with Drop Cap simulation using RichText is complex, // a simpler Row approach works well enough for mobile. Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'I', style: TextStyle(fontFamily: 'PlayfairDisplay', fontSize: 72, height: 1.0, color: Color(0xFF8B0000)), ), const SizedBox(width: 8), Expanded( child: const Text( 'n an era of sterile, flat interfaces, the return to elegant typography feels like a breath of fresh air. The interplay of serif and sans-serif brings humanity back to the screen.', style: TextStyle(fontFamily: 'Lato', fontSize: 16, height: 1.6, color: Colors.black87), ), ), ], ), const SizedBox(height: 48), // Pull Quote const Divider(color: Colors.black, thickness: 2), const Padding( padding: EdgeInsets.symmetric(vertical: 32.0), child: Center( child: Text( '“Sophistication is in the spacing.”', textAlign: TextAlign.center, style: TextStyle(fontFamily: 'PlayfairDisplay', fontSize: 28, fontStyle: FontStyle.italic), ), ), ), const Divider(color: Colors.black, thickness: 2), ], ), ), ); } } ``` - Set `height` parameters in `TextStyle` (line-height). `1.6` is a good editorial body height. - Use `Divider` with `thickness: 2` for the heavy rules around pull quotes. ### React Native ```jsx const EditorialScreen = () => { return ( The Digital{'\n'}Magazine I n an era of sterile, flat interfaces, the return to elegant typography feels like a breath of fresh air. The interplay of serif and sans-serif brings humanity. {/* Pull Quote */} “Sophistication is in the spacing.” ); }; ``` - Line heights and fonts are everything. You must have custom fonts linked in your React Native project for this style to work. - Use `borderTopWidth` and `borderBottomWidth` on a container `View` to create the pull quote styling. ### Jetpack Compose ```kotlin @Composable fun EditorialScreen() { // Assuming Playfair and Lato are defined in FontFamily val playfair = FontFamily.Serif val lato = FontFamily.SansSerif Column( modifier = Modifier .fillMaxSize() .background(Color(0xFFF9F9F8)) .verticalScroll(rememberScrollState()) .padding(24.dp) ) { Spacer(Modifier.height(40.dp)) Text( text = "The Digital\nMagazine", fontFamily = playfair, fontSize = 48.sp, fontWeight = FontWeight.Bold, fontStyle = FontStyle.Italic, lineHeight = 52.sp, color = Color(0xFF121212) ) Spacer(Modifier.height(24.dp)) Divider(color = Color(0xFF121212), thickness = 1.dp) Spacer(Modifier.height(24.dp)) Row(verticalAlignment = Alignment.Top) { Text( text = "I", fontFamily = playfair, fontSize = 72.sp, color = Color(0xFF8B0000), modifier = Modifier.offset(y = (-10).dp).padding(end = 8.dp) ) Text( text = "n an era of sterile, flat interfaces, the return to elegant typography feels like a breath of fresh air. The interplay of serif and sans-serif.", fontFamily = lato, fontSize = 16.sp, lineHeight = 26.sp, color = Color(0xFF333333) ) } Spacer(Modifier.height(48.dp)) // Pull Quote Divider(color = Color(0xFF121212), thickness = 2.dp) Text( text = "“Sophistication is in the spacing.”", fontFamily = playfair, fontSize = 28.sp, fontStyle = FontStyle.Italic, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth().padding(vertical = 32.dp) ) Divider(color = Color(0xFF121212), thickness = 2.dp) } } ``` - Compose handles custom fonts and line heights (`26.sp`) very elegantly. - Use `Divider()` for the hairlines. Adjust thickness as needed for headers vs pull quotes. ## Do's and Don'ts - **DO**: Treat the interface like a printed page. Margins should be generous. - **DON'T**: Clutter the UI with typical app components like floating action buttons or heavy navigation bars. Keep it clean. ## 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.