Skill

Editorial Design

Design-style skill for Editorial Design: serif/sans-serif pairing, drop caps, pull quotes, and columnar magazine-style layouts.

Maintainer of this project? Claim this page to edit the listing.


79
Spark score
out of 100
Updated 28 days ago
Version 13.5.0

Add to Favorites

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/ag-editorial-design | bash

Overview

Editorial Design

A design-style skill for Editorial Design - serif/sans-serif typography pairing, drop caps, pull quotes, and columnar magazine layouts - with matching Web CSS and SwiftUI implementations. Use it for long-form articles, blogs, or content-heavy pages that want a sophisticated, print-magazine reading experience.

What it does

Editorial Design is a design-style child skill ('the digital magazine - sophisticated typography pairings and deliberate, elegant pacing'), part of the design-it family and not meant to be triggered directly. Three core principles: Serif & Sans-Serif Pairing (the hallmark of the style - a beautiful, high-contrast serif for headings paired with a clean sans-serif for body copy), Large Drop Caps & Pull Quotes (typographic flourishes that guide the eye and break up long text blocks), and Columnar Layouts (content flows in distinct columns, often separated by fine hairline rules).

When to use - and when NOT to

Use it when the user's request matches a sophisticated, magazine-like reading aesthetic - long-form articles, blogs, or content-heavy pages that want an elegant, print-inspired feel rather than a generic web-app layout. 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 Modern Editorial or Yacht Club palettes - warm, paper-like backgrounds with deep, ink-like blacks or navy blues - with headline fonts drawn from Playfair Display, Merriweather, or Bodoni, body fonts from Lato, Open Sans, or Source Sans Pro, and thin elegant hairline rules separating sections. The web implementation pairs a large, bold, italic serif headline with a bottom border rule, body copy set in two magazine-style CSS columns (column-count: 2; column-gap: 40px) at generous 1.8 line-height, an oversized floated first-letter drop cap styled in the headline serif and colored with the CTA accent, and a centered pull-quote framed by top and bottom rule lines.

.editorial-body {
  column-count: 2;
  column-gap: 40px;
}
.editorial-body::first-letter {
  font-size: 4rem;
  float: left;
  color: var(--cta-highlight);
}

Integrations

SwiftUI reproduces the same typographic hierarchy manually since it has no native ::first-letter selector: an HStack splits the drop-cap character out as its own oversized, colored Text view with negative top padding to pull the body text tighter against it, alongside a custom Playfair Display headline and Lato body copy with generous line spacing - achieving the same serif/sans-serif pairing and drop-cap effect through manual composition rather than a CSS pseudo-element.

Who it's for

Designers and developers building long-form content pages - articles, blogs, editorial features - who want a sophisticated, print-magazine reading experience with deliberate typography pacing instead of a flat, generic web-app text layout - the same discipline that makes a printed magazine feel considered rather than dumped onto the page.

Source README

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:
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

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

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

const EditorialScreen = () => {
  return (
    <ScrollView style={{ flex: 1, backgroundColor: '#F9F9F8', padding: 24 }}>
      <Text style={{ 
        fontFamily: 'PlayfairDisplay-BoldItalic', 
        fontSize: 48, 
        color: '#121212', 
        lineHeight: 52,
        marginTop: 40,
        marginBottom: 24 
      }}>
        The Digital{'\n'}Magazine
      </Text>
      
      <View style={{ height: 1, backgroundColor: '#121212', marginBottom: 24 }} />
      
      <View style={{ flexDirection: 'row' }}>
        <Text style={{ 
          fontFamily: 'PlayfairDisplay-Bold', 
          fontSize: 72, 
          color: '#8B0000',
          lineHeight: 80,
          marginTop: -10, // Adjust alignment
          marginRight: 8
        }}>
          I
        </Text>
        <Text style={{ 
          flex: 1, 
          fontFamily: 'Lato-Regular', 
          fontSize: 16, 
          lineHeight: 26, 
          color: '#333' 
        }}>
          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.
        </Text>
      </View>
      
      {/* Pull Quote */}
      <View style={{ 
        borderTopWidth: 2, borderBottomWidth: 2, borderColor: '#121212', 
        marginTop: 48, paddingVertical: 32 
      }}>
        <Text style={{ 
          fontFamily: 'PlayfairDisplay-Italic', 
          fontSize: 28, 
          textAlign: 'center', 
          color: '#121212' 
        }}>
          “Sophistication is in the spacing.”
        </Text>
      </View>
    </ScrollView>
  );
};
  • 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

@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.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.