website_designs

Constructivism

Soviet-era angular propaganda: diagonal compositions, bold red-and-black typography, photomontage. Constructivism emerged in post-revolutionary Russia (1913-1930s) as an art movement that rejected autonomous art in favor of design serving social and political purposes. Its visual language – dominated by dramatic diagonal compositions, wedge-shaped forms, bold sans-serif type, and a restricted red-black-white palette – was forged to communicate revolutionary ideals to the masses through posters, publications, and architecture. In digital design, it translates to high-energy, angular layouts with aggressive typography, stark color contrasts, and an unmistakable sense of dynamism and urgency.


Visual Characteristics

Core Design Traits

Design Principles


Color Palette

Constructivist Core Palette

The Constructivist palette is deliberately restricted to maximize impact: red for revolution, black for power, white for contrast.

Color Name Hex Role / Usage
Revolutionary Red #CC0000 Primary accent, headlines, key elements, action states
Deep Red #990000 Hover/active states, secondary red emphasis
Pure Black #000000 Text, backgrounds, structural elements, outlines
Off-Black #1A1A1A Dark backgrounds, card surfaces
Dark Charcoal #2D2D2D Secondary dark surfaces, footer backgrounds
Pure White #FFFFFF Text on dark, negative space, contrast areas
Off-White #F2F0EB Warm background, paper-like surfaces
Cream #E8E0D0 Aged paper effect, vintage poster feel
Steel Gray #6B6B6B Secondary text, muted elements
Rust Orange #C45522 Optional secondary warm accent, aged poster palette

CSS Custom Properties

:root {
  /* Primary palette */
  --con-red: #cc0000;
  --con-red-dark: #990000;
  --con-rust: #c45522;

  /* Neutrals */
  --con-black: #000000;
  --con-off-black: #1a1a1a;
  --con-charcoal: #2d2d2d;
  --con-steel: #6b6b6b;
  --con-white: #ffffff;
  --con-off-white: #f2f0eb;
  --con-cream: #e8e0d0;

  /* Functional */
  --con-bg-light: #f2f0eb;
  --con-bg-dark: #1a1a1a;
  --con-text-light: #ffffff;
  --con-text-dark: #000000;
  --con-text-muted: #6b6b6b;

  /* Angles */
  --con-skew: -5deg;
  --con-skew-strong: -12deg;
}

Color Usage Guidelines


Typography

Typeface Characteristics

Constructivist typography is:

Font Style Best For
Oswald Condensed gothic Primary display, headlines, navigation
Bebas Neue Ultra-condensed uppercase Maximum-impact display text, poster headings
Anton Impact-style condensed Oversized single-word statements
Archivo Black Bold grotesque Secondary headings, buttons
Russo One Geometric bold with Cyrillic feel Display text with Soviet character
Passion One Thick condensed display Hero text, extreme emphasis
Barlow Condensed Condensed geometric Body headings, navigation, labels
Roboto Condensed Condensed humanist Body text on dark backgrounds
Inter Screen-optimized sans Body text, readable secondary content
Source Sans Pro Clean UI sans Body text, data-heavy layouts

Font Pairing Suggestions

Heading Font Body Font Character
Bebas Neue (400) Roboto Condensed (400) Classic propaganda poster feel
Oswald (700) Inter (400) Bold, modern constructivism
Anton (400) Source Sans Pro (400) Maximum impact, readable body
Russo One (400) Roboto Condensed (400) Soviet-inspired, geometric
Passion One (700) Barlow Condensed (400) Ultra-bold, condensed throughout

Typography CSS Example

/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Roboto+Condensed:wght@400;700&display=swap');

/* Headings */
h1, h2, h3, h4, h5, h6 {
  font-family: 'Bebas Neue', 'Impact', sans-serif;
  font-weight: 400;
  color: var(--con-white);
  line-height: 0.9;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Display / Hero text */
.con-display {
  font-family: 'Bebas Neue', sans-serif;
  font-size: clamp(4rem, 12vw, 10rem);
  letter-spacing: 0.06em;
  line-height: 0.85;
  text-transform: uppercase;
  color: var(--con-red);
}

/* Body text */
body {
  font-family: 'Roboto Condensed', sans-serif;
  font-weight: 400;
  font-size: 1rem;
  line-height: 1.7;
  color: var(--con-text-dark);
}

/* Angled label */
.con-label {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--con-red);
  transform: rotate(var(--con-skew));
  display: inline-block;
}

/* Caption */
.con-caption {
  font-family: 'Roboto Condensed', sans-serif;
  font-weight: 400;
  font-size: 0.85rem;
  color: var(--con-steel);
  line-height: 1.5;
}

Layout Principles

Grid and Structure

Section Organization

Responsive Approach


CSS / Design Techniques

Angular Section Divider

.con-section {
  position: relative;
  padding: 80px 40px;
}

.con-section--dark {
  background: var(--con-off-black);
  color: var(--con-white);
}

.con-section--light {
  background: var(--con-off-white);
  color: var(--con-black);
}

/* Angled top edge */
.con-section--angled::before {
  content: '';
  position: absolute;
  top: -40px;
  left: 0;
  right: 0;
  height: 80px;
  background: inherit;
  transform: skewY(-3deg);
  z-index: -1;
}

Constructivist Card Component

.con-card {
  background: var(--con-charcoal);
  color: var(--con-white);
  padding: 32px;
  position: relative;
  border-left: 6px solid var(--con-red);
  transform: rotate(-1deg);
  transition: transform 0.2s ease;
}

.con-card:hover {
  transform: rotate(0deg);
}

/* Red wedge accent */
.con-card::before {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  width: 0;
  height: 0;
  border-top: 40px solid var(--con-red);
  border-left: 40px solid transparent;
}

.con-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 28px;
  max-width: 1200px;
  margin: 0 auto;
}

Constructivist Button

.con-button {
  display: inline-block;
  background: var(--con-red);
  color: var(--con-white);
  border: none;
  border-radius: 0;
  padding: 14px 40px;
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1.2rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  cursor: pointer;
  text-decoration: none;
  transform: skewX(-5deg);
  transition: background 0.2s ease, transform 0.2s ease;
  position: relative;
}

.con-button:hover {
  background: var(--con-red-dark);
  transform: skewX(-5deg) translateY(-2px);
}

.con-button span {
  display: inline-block;
  transform: skewX(5deg);
}

/* Black variant */
.con-button--black {
  background: var(--con-black);
  border: 2px solid var(--con-white);
}

.con-button--black:hover {
  background: var(--con-red);
  border-color: var(--con-red);
}

/* Outline variant */
.con-button--outline {
  background: transparent;
  border: 3px solid var(--con-red);
  color: var(--con-red);
}

.con-button--outline:hover {
  background: var(--con-red);
  color: var(--con-white);
}
.con-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--con-black);
  padding: 0 40px;
  position: relative;
}

/* Red angular accent */
.con-nav::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  width: 200px;
  height: 4px;
  background: var(--con-red);
  transform: skewX(-20deg);
  transform-origin: bottom left;
}

.con-nav__logo {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1.8rem;
  color: var(--con-red);
  text-decoration: none;
  letter-spacing: 0.08em;
  padding: 20px 0;
}

.con-nav__links {
  display: flex;
  gap: 32px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.con-nav__links a {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1.05rem;
  color: var(--con-white);
  text-decoration: none;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 20px 0;
  transition: color 0.2s ease;
  position: relative;
}

.con-nav__links a:hover {
  color: var(--con-red);
}

.con-nav__links a::after {
  content: '';
  position: absolute;
  bottom: 16px;
  left: 0;
  width: 0;
  height: 2px;
  background: var(--con-red);
  transition: width 0.3s ease;
}

.con-nav__links a:hover::after {
  width: 100%;
}

Hero Section

.con-hero {
  background: var(--con-off-black);
  color: var(--con-white);
  padding: 100px 40px 120px;
  position: relative;
  overflow: hidden;
}

/* Diagonal red wedge */
.con-hero::before {
  content: '';
  position: absolute;
  top: 0;
  right: -100px;
  width: 500px;
  height: 100%;
  background: var(--con-red);
  transform: skewX(-12deg);
  opacity: 0.15;
}

.con-hero__content {
  max-width: 1200px;
  margin: 0 auto;
  position: relative;
  z-index: 1;
}

.con-hero__content h1 {
  font-size: clamp(4rem, 10vw, 8rem);
  color: var(--con-white);
  line-height: 0.85;
  margin-bottom: 1.5rem;
  transform: rotate(-3deg);
  transform-origin: left center;
}

.con-hero__content h1 .red {
  color: var(--con-red);
}

.con-hero__content p {
  font-size: 1.15rem;
  color: var(--con-steel);
  max-width: 500px;
  margin-bottom: 2.5rem;
  line-height: 1.7;
}

@media (max-width: 768px) {
  .con-hero {
    padding: 60px 24px 80px;
  }
}

Feature Grid

.con-features {
  background: var(--con-off-white);
  padding: 80px 40px;
  position: relative;
}

.con-features__header {
  max-width: 1200px;
  margin: 0 auto 60px;
}

.con-features__header h2 {
  font-size: 3rem;
  color: var(--con-black);
  position: relative;
  display: inline-block;
}

/* Red underline accent */
.con-features__header h2::after {
  content: '';
  position: absolute;
  bottom: -8px;
  left: 0;
  width: 60px;
  height: 6px;
  background: var(--con-red);
  transform: skewX(-15deg);
}

.con-features__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 28px;
  max-width: 1200px;
  margin: 0 auto;
}

.con-feature {
  background: var(--con-white);
  padding: 32px;
  border-left: 5px solid var(--con-red);
  position: relative;
}

.con-feature__number {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 3.5rem;
  color: var(--con-cream);
  line-height: 1;
  margin-bottom: 0.5rem;
}

.con-feature h3 {
  font-size: 1.3rem;
  color: var(--con-black);
  margin-bottom: 0.75rem;
}

.con-feature p {
  font-size: 0.95rem;
  color: var(--con-steel);
  line-height: 1.6;
}

Diagonal Stripe Accent

.con-stripe {
  height: 60px;
  background: repeating-linear-gradient(
    -45deg,
    var(--con-red),
    var(--con-red) 20px,
    var(--con-black) 20px,
    var(--con-black) 40px
  );
}

Manifesto Block

.con-manifesto {
  background: var(--con-red);
  color: var(--con-white);
  padding: 80px 40px;
  text-align: center;
  position: relative;
  clip-path: polygon(0 8%, 100% 0, 100% 92%, 0 100%);
}

.con-manifesto h2 {
  font-size: clamp(2.5rem, 6vw, 4.5rem);
  margin-bottom: 1.5rem;
  transform: rotate(-2deg);
}

.con-manifesto p {
  font-size: 1.15rem;
  max-width: 550px;
  margin: 0 auto 2rem;
  opacity: 0.9;
}

Design Do’s and Don’ts

Do

Don’t


Aesthetic Relationship to Constructivism
Bauhaus Contemporary sibling; shared the integration of art and industrial production but with German academic formality
De Stijl Parallel reductionist movement; shared geometric abstraction but restricted to horizontals and verticals
Heroic Realism Soviet successor; transitioned from abstract Constructivism to figurative propaganda while retaining bold compositional energy
Suprematism Russian predecessor; Malevich’s pure geometric abstraction laid the groundwork for Constructivist visual language
International Typographic Style Descendant; formalized Constructivist typography and grid principles into a systematic design methodology
Plakatstil Poster-art relative; shared bold, flat graphics and impactful typography for mass communication
Neubrutalism Contemporary echo; shares the raw, bold graphic presence and rejection of polish
Flat Design Distant descendant; shares flat color and absence of depth but lacks Constructivism’s angular dynamism
DIY Punk Spiritual heir; shares the collage aesthetic, anti-establishment energy, and raw, unpolished visual aggression
New Wave Postmodern descendant; deconstructed Constructivist grid principles with layering and typographic experimentation

Quick-Start: Minimal Constructivism Page Template

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Constructivism Page</title>
  <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Roboto+Condensed:wght@400;700&display=swap" rel="stylesheet">
  <style>
    :root {
      --con-red: #cc0000;
      --con-red-dark: #990000;
      --con-black: #000000;
      --con-off-black: #1a1a1a;
      --con-charcoal: #2d2d2d;
      --con-white: #ffffff;
      --con-off-white: #f2f0eb;
      --con-cream: #e8e0d0;
      --con-steel: #6b6b6b;
    }

    * { margin: 0; padding: 0; box-sizing: border-box; }

    body {
      background: var(--con-off-black);
      color: var(--con-white);
      font-family: 'Roboto Condensed', sans-serif;
      font-weight: 400;
      line-height: 1.7;
    }

    h1, h2, h3 {
      font-family: 'Bebas Neue', sans-serif;
      font-weight: 400;
      text-transform: uppercase;
      letter-spacing: 0.04em;
      line-height: 0.9;
    }

    /* Navigation */
    nav {
      display: flex;
      align-items: center;
      justify-content: space-between;
      background: var(--con-black);
      padding: 0 40px;
      position: relative;
    }

    nav::after {
      content: '';
      position: absolute;
      bottom: 0;
      left: 0;
      width: 180px;
      height: 4px;
      background: var(--con-red);
      transform: skewX(-20deg);
      transform-origin: bottom left;
    }

    nav a.logo {
      font-family: 'Bebas Neue', sans-serif;
      font-size: 1.8rem;
      color: var(--con-red);
      text-decoration: none;
      letter-spacing: 0.1em;
      padding: 20px 0;
    }

    nav ul {
      display: flex;
      gap: 28px;
      list-style: none;
    }

    nav ul a {
      font-family: 'Bebas Neue', sans-serif;
      font-size: 1rem;
      color: var(--con-white);
      text-decoration: none;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      padding: 20px 0;
      transition: color 0.2s;
    }

    nav ul a:hover { color: var(--con-red); }

    /* Hero */
    .hero {
      padding: 100px 40px 120px;
      position: relative;
      overflow: hidden;
    }

    .hero::before {
      content: '';
      position: absolute;
      top: 0;
      right: -80px;
      width: 450px;
      height: 100%;
      background: var(--con-red);
      transform: skewX(-12deg);
      opacity: 0.12;
    }

    .hero-inner {
      max-width: 1200px;
      margin: 0 auto;
      position: relative;
      z-index: 1;
    }

    .hero h1 {
      font-size: clamp(4rem, 10vw, 8rem);
      line-height: 0.85;
      margin-bottom: 1.5rem;
      transform: rotate(-3deg);
      transform-origin: left center;
    }

    .hero h1 .red { color: var(--con-red); }

    .hero p {
      font-size: 1.1rem;
      color: var(--con-steel);
      max-width: 480px;
      margin-bottom: 2.5rem;
    }

    .btn {
      display: inline-block;
      background: var(--con-red);
      color: var(--con-white);
      padding: 14px 40px;
      font-family: 'Bebas Neue', sans-serif;
      font-size: 1.2rem;
      letter-spacing: 0.1em;
      text-transform: uppercase;
      text-decoration: none;
      transform: skewX(-5deg);
      transition: background 0.2s, transform 0.2s;
    }

    .btn span {
      display: inline-block;
      transform: skewX(5deg);
    }

    .btn:hover {
      background: var(--con-red-dark);
      transform: skewX(-5deg) translateY(-2px);
    }

    /* Diagonal stripe divider */
    .stripe {
      height: 50px;
      background: repeating-linear-gradient(
        -45deg,
        var(--con-red),
        var(--con-red) 15px,
        var(--con-black) 15px,
        var(--con-black) 30px
      );
    }

    /* Features */
    .features {
      background: var(--con-off-white);
      color: var(--con-black);
      padding: 80px 40px;
    }

    .features h2 {
      font-size: 3rem;
      color: var(--con-black);
      max-width: 1200px;
      margin: 0 auto 60px;
      position: relative;
      display: inline-block;
    }

    .features h2::after {
      content: '';
      position: absolute;
      bottom: -8px;
      left: 0;
      width: 50px;
      height: 5px;
      background: var(--con-red);
      transform: skewX(-15deg);
    }

    .features-header {
      max-width: 1200px;
      margin: 0 auto;
    }

    .features-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
      gap: 24px;
      max-width: 1200px;
      margin: 0 auto;
    }

    .feature {
      background: var(--con-white);
      padding: 32px;
      border-left: 5px solid var(--con-red);
    }

    .feature-num {
      font-family: 'Bebas Neue', sans-serif;
      font-size: 3rem;
      color: var(--con-cream);
      line-height: 1;
      margin-bottom: 0.5rem;
    }

    .feature h3 {
      font-size: 1.3rem;
      color: var(--con-black);
      margin-bottom: 0.75rem;
    }

    .feature p {
      color: var(--con-steel);
      font-size: 0.95rem;
    }

    /* Manifesto / CTA */
    .manifesto {
      background: var(--con-red);
      color: var(--con-white);
      padding: 100px 40px;
      text-align: center;
      clip-path: polygon(0 6%, 100% 0, 100% 94%, 0 100%);
    }

    .manifesto h2 {
      font-size: clamp(2.5rem, 6vw, 4.5rem);
      margin-bottom: 1.5rem;
      transform: rotate(-2deg);
    }

    .manifesto p {
      font-size: 1.15rem;
      max-width: 520px;
      margin: 0 auto 2rem;
      opacity: 0.9;
    }

    .manifesto .btn {
      background: var(--con-white);
      color: var(--con-red);
    }

    .manifesto .btn:hover {
      background: var(--con-black);
      color: var(--con-white);
    }

    /* Footer */
    footer {
      background: var(--con-black);
      color: var(--con-steel);
      text-align: center;
      padding: 40px;
      font-size: 0.85rem;
      position: relative;
    }

    footer::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 4px;
      background: var(--con-red);
    }

    @media (max-width: 768px) {
      .hero { padding: 60px 24px 80px; }
      nav { padding: 0 20px; }
      nav ul { gap: 16px; }
      .features { padding: 60px 24px; }
      .manifesto { padding: 80px 24px; clip-path: polygon(0 3%, 100% 0, 100% 97%, 0 100%); }
    }
  </style>
</head>
<body>
  <nav>
    <a href="#" class="logo">Construct</a>
    <ul>
      <li><a href="#">Manifesto</a></li>
      <li><a href="#">Works</a></li>
      <li><a href="#">Archive</a></li>
      <li><a href="#">Join</a></li>
    </ul>
  </nav>

  <section class="hero">
    <div class="hero-inner">
      <h1><span class="red">Build</span> The<br>New World</h1>
      <p>Art in the service of revolution. Design as construction. Every angle, every line, every word forged with purpose and directed toward the future.</p>
      <a href="#" class="btn"><span>Forward</span></a>
    </div>
  </section>

  <div class="stripe"></div>

  <section class="features">
    <div class="features-header">
      <h2>Principles</h2>
    </div>
    <div class="features-grid">
      <div class="feature">
        <div class="feature-num">01</div>
        <h3>Purpose</h3>
        <p>Art is not decoration. It is a tool for communication, for construction, for transforming society through visual force.</p>
      </div>
      <div class="feature">
        <div class="feature-num">02</div>
        <h3>Dynamism</h3>
        <p>Diagonal energy drives every composition forward. Nothing is static. Every element carries momentum and direction.</p>
      </div>
      <div class="feature">
        <div class="feature-num">03</div>
        <h3>Collective</h3>
        <p>Design serves the many, not the few. Visual clarity ensures the message reaches every eye, every mind.</p>
      </div>
    </div>
  </section>

  <section class="manifesto">
    <h2>Art Into Life</h2>
    <p>The artist is a constructor. The canvas is the street. The medium is the message. Build forward.</p>
    <a href="#" class="btn"><span>Read Manifesto</span></a>
  </section>

  <footer>
    <p>Built on Constructivist principles. Moscow 1921.</p>
  </footer>
</body>
</html>