<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.cmd-design.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.cmd-design.com/" rel="alternate" type="text/html" /><updated>2026-04-28T14:22:47+00:00</updated><id>https://www.cmd-design.com/feed.xml</id><title type="html">CMD-design</title><subtitle>The most recent portfolio for a new year!</subtitle><entry xml:lang="en"><title type="html">CSS-Driven Solar System</title><link href="https://www.cmd-design.com/posts/solar-system" rel="alternate" type="text/html" title="CSS-Driven Solar System" /><published>2025-11-12T15:00:06+00:00</published><updated>2025-11-12T15:00:06+00:00</updated><id>https://www.cmd-design.com/posts/solar-system</id><content type="html" xml:base="https://www.cmd-design.com/posts/solar-system"><![CDATA[<h4>A Little Universe Built with Pure Code</h4>

<p>This project started as “let me animate a planet real quick” and quietly escalated into a full solar system with moons, shadows, and a procedurally generated asteroid belt.
All of it built with HTML + SCSS, zero JavaScript, and a dangerous amount of enthusiasm.</p>

<p>This is exactly the kind of thing I love doing in my spare time: using code to build tiny worlds, experimenting with motion, and seeing how far you can push CSS before it starts sweating.</p>

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="bNpdGoL" data-pen-title="Solar System - Revised with Moons and Asteroids" data-user="cmd1209" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  
      <span>See the Pen <a href="https://codepen.io/cmd1209/pen/bNpdGoL">
  Solar System - Revised with Moons and Asteroids</a> by Chad Danford (<a href="https://codepen.io/cmd1209">@cmd1209</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
      
      <script async="" src="https://public.codepenassets.com/embed/index.js"></script>

Fort the project if you like and send me a link of what you were able to come up with.


  <h5>The simulation includes:</h5>
<ul class="list_standard">
  <li>Planets orbiting in their correct relative positions
</li>
<li>Moons (like the Moon and the four Galilean moons) following their planets
</li>
<li>Dynamic shadows based on which side faces the sun
</li>
<li>A fully generated asteroid belt that looks surprisingly “natural”
</li>
<li>All orbits, sizes, and speeds adjustable through variables
</li>
</ul>

Everything is parametric: change one value (like Earth’s orbital duration) and the whole system shifts in harmony. That’s the magic of SCSS loops, math, and a lot of trial and error.



  <h5>The Hardest / Most Fun Part: The Asteroid Belt</h5>

CSS doesn’t give you real randomness, so creating 100+ asteroids that feel chaotic — different distances, different speeds, different starting positions — meant getting creative with SCSS’s pseudo-random numbers.

The “aha!” moment was realizing that you can fake natural distribution by randomizing:
<ul class="list_standard">
  <li>orbital radius</li>
  <li>animation speed</li>
  <li>starting offset</li>
</ul>

The result? A belt that feels alive instead of looking like a dotted line someone forgot to align.


  
<figure class="highlight"><pre><code class="language-css" data-lang="css">  <span class="c">/* Primary Palette */</span>
<span class="o">//</span><span class="nt">asteroids</span> <span class="nt">variables</span>
<span class="err">$</span><span class="nt">asteroid-number</span><span class="o">:</span> <span class="err">100</span>
<span class="err">$</span><span class="nt">asteroid-start</span><span class="o">:</span> <span class="err">$</span><span class="nt">au</span> <span class="o">*</span> <span class="err">1</span><span class="o">.</span><span class="err">8</span>
<span class="err">$</span><span class="nt">asteroid-end</span><span class="o">:</span> <span class="err">$</span><span class="nt">au</span> <span class="o">*</span> <span class="err">2</span><span class="o">.</span><span class="err">9</span>

  <span class="k">@for</span> <span class="err">$</span><span class="n">i</span> <span class="n">from</span> <span class="m">1</span> <span class="n">through</span> <span class="err">$</span><span class="n">asteroid-number</span> 
  <span class="err">$</span><span class="n">randN</span><span class="p">:</span> <span class="p">(</span><span class="n">random</span><span class="p">(</span><span class="m">10000</span><span class="p">)</span> <span class="n">-</span> <span class="m">1</span><span class="p">)</span> <span class="p">/</span> <span class="m">1000</span>
  <span class="err">$</span><span class="n">asteroid-spread</span><span class="p">:</span> <span class="n">random</span><span class="p">(</span><span class="err">$</span><span class="n">asteroid-end</span> <span class="n">-</span> <span class="err">$</span><span class="n">asteroid-start</span><span class="p">)</span> <span class="err">+</span> <span class="err">$</span><span class="n">asteroid-start</span>
  <span class="p">.</span><span class="n">orbit--asteroids</span><span class="p">:</span><span class="n">nth-of-type</span><span class="p">(</span><span class="err">#</span><span class="p">{</span><span class="err">$</span><span class="nt">i</span><span class="p">}</span><span class="o">)</span>
    <span class="nt">position</span><span class="o">:</span> <span class="nt">absolute</span>
    <span class="nt">top</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">left</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">border-radius</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">transform-origin</span><span class="o">:</span> <span class="nt">center</span> <span class="nt">center</span>
    <span class="nt">width</span><span class="o">:</span> <span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span> <span class="err">*</span> <span class="err">2</span><span class="p">}</span>
    <span class="nt">height</span><span class="o">:</span> <span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span> <span class="err">*</span> <span class="err">2</span><span class="p">}</span>
    <span class="nt">margin-left</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span><span class="p">}</span>
    <span class="nt">margin-top</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span><span class="p">}</span>
    <span class="nt">animation</span><span class="o">:</span> <span class="nt">orbit</span> <span class="o">(</span><span class="err">#</span><span class="p">{</span><span class="err">$ceres-year</span> <span class="err">*</span> <span class="err">(0.9</span> <span class="err">+</span> <span class="err">random(20)/100)</span><span class="p">}</span><span class="o">)</span> <span class="nt">linear</span> <span class="nt">infinite</span>
    <span class="nt">animation-delay</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$randN</span> <span class="err">*</span> <span class="err">$earth-year</span><span class="p">}</span>

<span class="nc">.asteroid</span>
  <span class="nt">width</span><span class="o">:</span> <span class="err">2</span><span class="nt">px</span>
  <span class="nt">height</span><span class="o">:</span> <span class="err">2</span><span class="nt">px</span>
  <span class="nt">background-color</span><span class="o">:</span> <span class="nt">grey</span>
  </code></pre></figure>




</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="web" /><summary type="html"><![CDATA[A Little Universe Built with Pure Code This project started as “let me animate a planet real quick” and quietly escalated into a full solar system with moons, shadows, and a procedurally generated asteroid belt. All of it built with HTML + SCSS, zero JavaScript, and a dangerous amount of enthusiasm. This is exactly the kind of thing I love doing in my spare time: using code to build tiny worlds, experimenting with motion, and seeing how far you can push CSS before it starts sweating. See the Pen Solar System - Revised with Moons and Asteroids by Chad Danford (@cmd1209) on CodePen. Fort the project if you like and send me a link of what you were able to come up with. The simulation includes: Planets orbiting in their correct relative positions Moons (like the Moon and the four Galilean moons) following their planets Dynamic shadows based on which side faces the sun A fully generated asteroid belt that looks surprisingly “natural” All orbits, sizes, and speeds adjustable through variables Everything is parametric: change one value (like Earth’s orbital duration) and the whole system shifts in harmony. That’s the magic of SCSS loops, math, and a lot of trial and error. The Hardest / Most Fun Part: The Asteroid Belt CSS doesn’t give you real randomness, so creating 100+ asteroids that feel chaotic — different distances, different speeds, different starting positions — meant getting creative with SCSS’s pseudo-random numbers. The “aha!” moment was realizing that you can fake natural distribution by randomizing: orbital radius animation speed starting offset The result? A belt that feels alive instead of looking like a dotted line someone forgot to align. /* Primary Palette */ //asteroids variables $asteroid-number: 100 $asteroid-start: $au * 1.8 $asteroid-end: $au * 2.9 @for $i from 1 through $asteroid-number $randN: (random(10000) - 1) / 1000 $asteroid-spread: random($asteroid-end - $asteroid-start) + $asteroid-start .orbit--asteroids:nth-of-type(#{$i}) position: absolute top: 50% left: 50% border-radius: 50% transform-origin: center center width: #{$asteroid-spread * 2} height: #{$asteroid-spread * 2} margin-left: -#{$asteroid-spread} margin-top: -#{$asteroid-spread} animation: orbit (#{$ceres-year * (0.9 + random(20)/100)}) linear infinite animation-delay: -#{$randN * $earth-year} .asteroid width: 2px height: 2px background-color: grey]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/solarsystem/%22,%20%22thumbnail%22=%3E%22solarsystem_thumb.jpg%22,%20%22feature%22=%3E%22solarsystem_thumb.jpg%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/solarsystem/%22,%20%22thumbnail%22=%3E%22solarsystem_thumb.jpg%22,%20%22feature%22=%3E%22solarsystem_thumb.jpg%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">CSS-Driven Solar System</title><link href="https://www.cmd-design.com/de/posts/solar-system" rel="alternate" type="text/html" title="CSS-Driven Solar System" /><published>2025-11-12T15:00:06+00:00</published><updated>2025-11-12T15:00:06+00:00</updated><id>https://www.cmd-design.com/de/posts/solar-system</id><content type="html" xml:base="https://www.cmd-design.com/de/posts/solar-system"><![CDATA[<h4>Ein kleines Universum, gebaut nur mit Code</h4>

<p>Dieses Projekt begann mit dem Gedanken: „Ich animiere kurz mal einen Planeten“ und entwickelte sich still und leise zu einem kompletten Sonnensystem mit Monden, Schatten und einem prozedural erzeugten Asteroidengürtel.
Gebaut nur mit HTML und SCSS, ganz ohne JavaScript, aber mit einer ziemlich großen Portion Enthusiasmus.</p>

<p>Genau solche Dinge mache ich gern in meiner Freizeit: mit Code kleine Welten bauen, mit Bewegung experimentieren und ausprobieren, wie weit man CSS treiben kann, bevor es ins Schwitzen kommt.</p>

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="bNpdGoL" data-pen-title="Solar System - Revised with Moons and Asteroids" data-user="cmd1209" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  
      <span>See the Pen <a href="https://codepen.io/cmd1209/pen/bNpdGoL">
  Solar System - Revised with Moons and Asteroids</a> by Chad Danford (<a href="https://codepen.io/cmd1209">@cmd1209</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
      
      <script async="" src="https://public.codepenassets.com/embed/index.js"></script>

Fork das Projekt gern und schick mir einen Link, wenn du etwas Eigenes daraus gemacht hast.


  <h5>Die Simulation enthält:</h5>
<ul class="list_standard">
  <li>Planeten, die in ihren jeweiligen relativen Positionen kreisen
</li>
<li>Monde wie unser Mond oder die vier galileischen Monde, die ihren Planeten folgen
</li>
<li>Dynamische Schatten, je nachdem welche Seite zur Sonne zeigt
</li>
<li>Einen vollständig generierten Asteroidengürtel, der überraschend natürlich wirkt
</li>
<li>Orbits, Größen und Geschwindigkeiten, die komplett über Variablen steuerbar sind
</li>
</ul>

Alles ist parametrisch aufgebaut: Ändert man einen einzigen Wert, etwa die Umlaufdauer der Erde, verschiebt sich das gesamte System stimmig mit. Genau darin liegt der Reiz von SCSS-Loops, etwas Mathematik und ziemlich viel Ausprobieren.



  <h5>Der schwierigste und zugleich schönste Teil: der Asteroidengürtel</h5>

CSS kennt keine echte Zufälligkeit. Um mehr als 100 Asteroiden glaubwürdig chaotisch wirken zu lassen, also mit unterschiedlichen Abständen, Geschwindigkeiten und Startpositionen, musste ich die pseudozufälligen Möglichkeiten von SCSS ziemlich kreativ nutzen.

Der entscheidende Moment war die Erkenntnis, dass sich eine natürliche Verteilung überzeugend vortäuschen lässt, wenn man diese Werte variiert:
<ul class="list_standard">
  <li>Orbitalradius</li>
  <li>Animationsgeschwindigkeit</li>
  <li>Startversatz</li>
</ul>

Das Ergebnis: ein Gürtel, der lebendig wirkt, statt wie eine gepunktete Linie, die einfach nicht sauber ausgerichtet wurde.


  
<figure class="highlight"><pre><code class="language-css" data-lang="css">  <span class="c">/* Primary Palette */</span>
<span class="o">//</span><span class="nt">asteroids</span> <span class="nt">variables</span>
<span class="err">$</span><span class="nt">asteroid-number</span><span class="o">:</span> <span class="err">100</span>
<span class="err">$</span><span class="nt">asteroid-start</span><span class="o">:</span> <span class="err">$</span><span class="nt">au</span> <span class="o">*</span> <span class="err">1</span><span class="o">.</span><span class="err">8</span>
<span class="err">$</span><span class="nt">asteroid-end</span><span class="o">:</span> <span class="err">$</span><span class="nt">au</span> <span class="o">*</span> <span class="err">2</span><span class="o">.</span><span class="err">9</span>

  <span class="k">@for</span> <span class="err">$</span><span class="n">i</span> <span class="n">from</span> <span class="m">1</span> <span class="n">through</span> <span class="err">$</span><span class="n">asteroid-number</span> 
  <span class="err">$</span><span class="n">randN</span><span class="p">:</span> <span class="p">(</span><span class="n">random</span><span class="p">(</span><span class="m">10000</span><span class="p">)</span> <span class="n">-</span> <span class="m">1</span><span class="p">)</span> <span class="p">/</span> <span class="m">1000</span>
  <span class="err">$</span><span class="n">asteroid-spread</span><span class="p">:</span> <span class="n">random</span><span class="p">(</span><span class="err">$</span><span class="n">asteroid-end</span> <span class="n">-</span> <span class="err">$</span><span class="n">asteroid-start</span><span class="p">)</span> <span class="err">+</span> <span class="err">$</span><span class="n">asteroid-start</span>
  <span class="p">.</span><span class="n">orbit--asteroids</span><span class="p">:</span><span class="n">nth-of-type</span><span class="p">(</span><span class="err">#</span><span class="p">{</span><span class="err">$</span><span class="nt">i</span><span class="p">}</span><span class="o">)</span>
    <span class="nt">position</span><span class="o">:</span> <span class="nt">absolute</span>
    <span class="nt">top</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">left</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">border-radius</span><span class="o">:</span> <span class="err">50</span><span class="o">%</span>
    <span class="nt">transform-origin</span><span class="o">:</span> <span class="nt">center</span> <span class="nt">center</span>
    <span class="nt">width</span><span class="o">:</span> <span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span> <span class="err">*</span> <span class="err">2</span><span class="p">}</span>
    <span class="nt">height</span><span class="o">:</span> <span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span> <span class="err">*</span> <span class="err">2</span><span class="p">}</span>
    <span class="nt">margin-left</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span><span class="p">}</span>
    <span class="nt">margin-top</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$asteroid-spread</span><span class="p">}</span>
    <span class="nt">animation</span><span class="o">:</span> <span class="nt">orbit</span> <span class="o">(</span><span class="err">#</span><span class="p">{</span><span class="err">$ceres-year</span> <span class="err">*</span> <span class="err">(0.9</span> <span class="err">+</span> <span class="err">random(20)/100)</span><span class="p">}</span><span class="o">)</span> <span class="nt">linear</span> <span class="nt">infinite</span>
    <span class="nt">animation-delay</span><span class="o">:</span> <span class="nt">-</span><span class="err">#</span><span class="p">{</span><span class="err">$randN</span> <span class="err">*</span> <span class="err">$earth-year</span><span class="p">}</span>

<span class="nc">.asteroid</span>
  <span class="nt">width</span><span class="o">:</span> <span class="err">2</span><span class="nt">px</span>
  <span class="nt">height</span><span class="o">:</span> <span class="err">2</span><span class="nt">px</span>
  <span class="nt">background-color</span><span class="o">:</span> <span class="nt">grey</span>
  </code></pre></figure>



</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="de" /><category term="web" /><summary type="html"><![CDATA[Ein kleines Universum, gebaut nur mit Code Dieses Projekt begann mit dem Gedanken: „Ich animiere kurz mal einen Planeten“ und entwickelte sich still und leise zu einem kompletten Sonnensystem mit Monden, Schatten und einem prozedural erzeugten Asteroidengürtel. Gebaut nur mit HTML und SCSS, ganz ohne JavaScript, aber mit einer ziemlich großen Portion Enthusiasmus. Genau solche Dinge mache ich gern in meiner Freizeit: mit Code kleine Welten bauen, mit Bewegung experimentieren und ausprobieren, wie weit man CSS treiben kann, bevor es ins Schwitzen kommt. See the Pen Solar System - Revised with Moons and Asteroids by Chad Danford (@cmd1209) on CodePen. Fork das Projekt gern und schick mir einen Link, wenn du etwas Eigenes daraus gemacht hast. Die Simulation enthält: Planeten, die in ihren jeweiligen relativen Positionen kreisen Monde wie unser Mond oder die vier galileischen Monde, die ihren Planeten folgen Dynamische Schatten, je nachdem welche Seite zur Sonne zeigt Einen vollständig generierten Asteroidengürtel, der überraschend natürlich wirkt Orbits, Größen und Geschwindigkeiten, die komplett über Variablen steuerbar sind Alles ist parametrisch aufgebaut: Ändert man einen einzigen Wert, etwa die Umlaufdauer der Erde, verschiebt sich das gesamte System stimmig mit. Genau darin liegt der Reiz von SCSS-Loops, etwas Mathematik und ziemlich viel Ausprobieren. Der schwierigste und zugleich schönste Teil: der Asteroidengürtel CSS kennt keine echte Zufälligkeit. Um mehr als 100 Asteroiden glaubwürdig chaotisch wirken zu lassen, also mit unterschiedlichen Abständen, Geschwindigkeiten und Startpositionen, musste ich die pseudozufälligen Möglichkeiten von SCSS ziemlich kreativ nutzen. Der entscheidende Moment war die Erkenntnis, dass sich eine natürliche Verteilung überzeugend vortäuschen lässt, wenn man diese Werte variiert: Orbitalradius Animationsgeschwindigkeit Startversatz Das Ergebnis: ein Gürtel, der lebendig wirkt, statt wie eine gepunktete Linie, die einfach nicht sauber ausgerichtet wurde. /* Primary Palette */ //asteroids variables $asteroid-number: 100 $asteroid-start: $au * 1.8 $asteroid-end: $au * 2.9 @for $i from 1 through $asteroid-number $randN: (random(10000) - 1) / 1000 $asteroid-spread: random($asteroid-end - $asteroid-start) + $asteroid-start .orbit--asteroids:nth-of-type(#{$i}) position: absolute top: 50% left: 50% border-radius: 50% transform-origin: center center width: #{$asteroid-spread * 2} height: #{$asteroid-spread * 2} margin-left: -#{$asteroid-spread} margin-top: -#{$asteroid-spread} animation: orbit (#{$ceres-year * (0.9 + random(20)/100)}) linear infinite animation-delay: -#{$randN * $earth-year} .asteroid width: 2px height: 2px background-color: grey]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/solarsystem/%22,%20%22thumbnail%22=%3E%22solarsystem_thumb.jpg%22,%20%22feature%22=%3E%22solarsystem_thumb.jpg%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/solarsystem/%22,%20%22thumbnail%22=%3E%22solarsystem_thumb.jpg%22,%20%22feature%22=%3E%22solarsystem_thumb.jpg%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">2 Days in Miami</title><link href="https://www.cmd-design.com/posts/miami" rel="alternate" type="text/html" title="2 Days in Miami" /><published>2025-07-13T15:00:06+00:00</published><updated>2025-07-13T15:00:06+00:00</updated><id>https://www.cmd-design.com/posts/miami</id><content type="html" xml:base="https://www.cmd-design.com/posts/miami"><![CDATA[<p>For some reason I imagined setting down in Miami, after our flight from Frankfurt, and being immediatly blown away by the blue skies and water. But no, we arrived in the middle of some crazy summer storm, and the arrivals and uber pick up was being flooded at the time.</p>

<div class="post-grid mt-lg mb-lg">
  <div class="grid post__grid gap-sm ">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_1.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_1.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_2.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_2.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_3.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_3.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_4.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_4.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_5.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_5.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
  </div>
</div>

<p>The following day, the weather had cleared and Miami was just as I had imagined—blue skies and bright sunlight. With only one full day to explore, we wandered through the vibrant streets of Little Havana, where the air was filled with the sounds of salsa music and the aroma of Cuban coffee. Colorful murals and lively domino games in Máximo Gómez Park made the neighborhood feel welcoming and full of energy. Even with limited time, we managed to sample some authentic Cuban food and soak in the unique atmosphere that makes Miami so memorable. I also took some shots of the historic Tower Theater, a striking landmark that stands as a testament to the neighborhood’s rich cultural heritage.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="photography" /><summary type="html"><![CDATA[For some reason I imagined setting down in Miami, after our flight from Frankfurt, and being immediatly blown away by the blue skies and water. But no, we arrived in the middle of some crazy summer storm, and the arrivals and uber pick up was being flooded at the time. The following day, the weather had cleared and Miami was just as I had imagined—blue skies and bright sunlight. With only one full day to explore, we wandered through the vibrant streets of Little Havana, where the air was filled with the sounds of salsa music and the aroma of Cuban coffee. Colorful murals and lively domino games in Máximo Gómez Park made the neighborhood feel welcoming and full of energy. Even with limited time, we managed to sample some authentic Cuban food and soak in the unique atmosphere that makes Miami so memorable. I also took some shots of the historic Tower Theater, a striking landmark that stands as a testament to the neighborhood’s rich cultural heritage.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/miami_2025/%22,%20%22feature%22=%3E%22miami_2025_1.webp%22,%20%22thumbnail%22=%3E%22miami_2025_1.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/miami_2025/%22,%20%22feature%22=%3E%22miami_2025_1.webp%22,%20%22thumbnail%22=%3E%22miami_2025_1.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">2 Days in Miami</title><link href="https://www.cmd-design.com/de/posts/miami" rel="alternate" type="text/html" title="2 Days in Miami" /><published>2025-07-13T15:00:06+00:00</published><updated>2025-07-13T15:00:06+00:00</updated><id>https://www.cmd-design.com/de/posts/miami</id><content type="html" xml:base="https://www.cmd-design.com/de/posts/miami"><![CDATA[<p>Aus irgendeinem Grund hatte ich mir vorgestellt, nach dem Flug aus Frankfurt in Miami anzukommen und sofort von blauem Himmel und Wasser empfangen zu werden. Stattdessen landeten wir mitten in einem wilden Sommersturm, und sowohl der Ankunftsbereich als auch der Uber-Pick-up standen teilweise unter Wasser.</p>

<div class="post-grid mt-lg mb-lg">
  <div class="grid post__grid gap-sm ">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_1.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_1.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_2.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_2.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_3.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_3.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_4.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_4.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
            
                <a href="/assets/images/miami_2025/miami_2025_5.webp" class="post__image">
                  <img src="/assets/images/miami_2025/miami_2025_5.webp" class="img-responsive" alt="Grid Image" />
                </a>
            
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
  </div>
</div>

<p>Am nächsten Tag hatte sich das Wetter beruhigt und Miami zeigte sich genauso, wie ich es mir vorgestellt hatte: blauer Himmel und grelles Sonnenlicht. Mit nur einem vollen Tag zum Erkunden liefen wir durch die lebendigen Straßen von Little Havana, wo Salsa aus offenen Türen klang und der Duft von kubanischem Kaffee in der Luft lag. Bunte Murals und die Domino-Runden im Máximo Gómez Park gaben dem Viertel eine offene, energiegeladene Stimmung. Trotz der kurzen Zeit schafften wir kubanisches Essen, viel Atmosphäre und ein paar Aufnahmen des historischen Tower Theater mitzunehmen, das bis heute ein starkes Zeichen für die kulturelle Geschichte des Viertels ist.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="de" /><category term="photography" /><summary type="html"><![CDATA[Aus irgendeinem Grund hatte ich mir vorgestellt, nach dem Flug aus Frankfurt in Miami anzukommen und sofort von blauem Himmel und Wasser empfangen zu werden. Stattdessen landeten wir mitten in einem wilden Sommersturm, und sowohl der Ankunftsbereich als auch der Uber-Pick-up standen teilweise unter Wasser. Am nächsten Tag hatte sich das Wetter beruhigt und Miami zeigte sich genauso, wie ich es mir vorgestellt hatte: blauer Himmel und grelles Sonnenlicht. Mit nur einem vollen Tag zum Erkunden liefen wir durch die lebendigen Straßen von Little Havana, wo Salsa aus offenen Türen klang und der Duft von kubanischem Kaffee in der Luft lag. Bunte Murals und die Domino-Runden im Máximo Gómez Park gaben dem Viertel eine offene, energiegeladene Stimmung. Trotz der kurzen Zeit schafften wir kubanisches Essen, viel Atmosphäre und ein paar Aufnahmen des historischen Tower Theater mitzunehmen, das bis heute ein starkes Zeichen für die kulturelle Geschichte des Viertels ist.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/miami_2025/%22,%20%22feature%22=%3E%22miami_2025_1.webp%22,%20%22thumbnail%22=%3E%22miami_2025_1.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/miami_2025/%22,%20%22feature%22=%3E%22miami_2025_1.webp%22,%20%22thumbnail%22=%3E%22miami_2025_1.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">OKLCH Color Scheme</title><link href="https://www.cmd-design.com/posts/CMD-colors" rel="alternate" type="text/html" title="OKLCH Color Scheme" /><published>2025-04-16T15:00:06+00:00</published><updated>2025-04-16T15:00:06+00:00</updated><id>https://www.cmd-design.com/posts/CMD-colors</id><content type="html" xml:base="https://www.cmd-design.com/posts/CMD-colors"><![CDATA[<p>When I set out to define the color system for this project, I wanted something that would be both flexible and future-proof. Traditional hex or RGB values work fine for static palettes, but they become limiting when you need to adjust lightness, contrast, or accessibility on the fly. That’s why I chose to build the palette using the OKLCH color model. Unlike HSL or HEX, OKLCH is perceptually uniform — meaning that changes in lightness or chroma behave more consistently with how our eyes actually see color. This makes it much easier to fine-tune shades, generate accessible contrasts, and maintain harmony across the palette.</p>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Primary Palette */</span>
<span class="nt">--primary-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">40</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">15</span> <span class="err">272</span><span class="o">);</span>
<span class="nt">--color-primary-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">90</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">80</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">70</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">60</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">50</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">);</span>
<span class="nt">--color-primary-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">30</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">10</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">5</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">0</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<p>The foundation of the palette is the primary color range, which I created by varying the lightness value from 0 to 100 while keeping chroma and hue constant. This gave me a smooth spectrum of tints and shades derived from one anchor hue. From there, I added a secondary color, an alert color for states and notifications, and a more playful accent color (teal). Each range follows the same principle — start with a base and build out a scale by adjusting lightness in OKLCH.</p>

<p>To make the palette practical for development, I translated every step into CSS custom properties. Each color in the scale gets a variable name (e.g. –color-primary-30, –color-accent-70) that corresponds to its lightness step. On top of that, I created utility classes (e.g. .bg-primary-30, .text-accent-70) to apply the colors directly in markup. This approach keeps design tokens consistent, makes it easy to swap or extend colors later, and reduces guesswork when working with the palette in real-world layouts.</p>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Secondary Palette */</span>
<span class="nt">--secondary-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">30</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">13</span> <span class="err">10</span><span class="o">.</span><span class="err">92</span><span class="o">);</span>
<span class="nt">--color-secondary-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">95</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">85</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">73</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">55</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">40</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">);</span>
<span class="nt">--color-secondary-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">25</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">17</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">12</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">8</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Teal Palette */</span>
<span class="nt">--teal-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">65</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">1099</span> <span class="err">198</span><span class="o">);</span>
<span class="nt">--color-teal-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">99</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">90</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">85</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">75</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">70</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">);</span>
<span class="nt">--color-teal-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">58</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">45</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">32</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">24</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">18</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* alert Palette */</span>
<span class="nt">--alert-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">80</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">1659</span> <span class="err">119</span><span class="o">.</span><span class="err">42</span><span class="o">);</span>
<span class="nt">--color-alert-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">99</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">93</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">91</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">87</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">83</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">);</span>
<span class="nt">--color-alert-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">76</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">60</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">50</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">40</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>]]></content><author><name>Chad Matthew Danford</name></author><category term="web" /><summary type="html"><![CDATA[When I set out to define the color system for this project, I wanted something that would be both flexible and future-proof. Traditional hex or RGB values work fine for static palettes, but they become limiting when you need to adjust lightness, contrast, or accessibility on the fly. That’s why I chose to build the palette using the OKLCH color model. Unlike HSL or HEX, OKLCH is perceptually uniform — meaning that changes in lightness or chroma behave more consistently with how our eyes actually see color. This makes it much easier to fine-tune shades, generate accessible contrasts, and maintain harmony across the palette. /* Primary Palette */ --primary-color: oklch(40% 0.15 272); --color-primary-0: oklch(from var(--primary-color) 90% c h); --color-primary-10: oklch(from var(--primary-color) 80% c h); --color-primary-20: oklch(from var(--primary-color) 70% c h); --color-primary-30: oklch(from var(--primary-color) 60% c h); --color-primary-40: oklch(from var(--primary-color) 50% c h); --color-primary-50: var(--primary-color); --color-primary-60: oklch(from var(--primary-color) 30% c h); --color-primary-70: oklch(from var(--primary-color) 20% c h); --color-primary-80: oklch(from var(--primary-color) 10% c h); --color-primary-90: oklch(from var(--primary-color) 5% c h); --color-primary-100: oklch(from var(--primary-color) 0% c h); The foundation of the palette is the primary color range, which I created by varying the lightness value from 0 to 100 while keeping chroma and hue constant. This gave me a smooth spectrum of tints and shades derived from one anchor hue. From there, I added a secondary color, an alert color for states and notifications, and a more playful accent color (teal). Each range follows the same principle — start with a base and build out a scale by adjusting lightness in OKLCH. To make the palette practical for development, I translated every step into CSS custom properties. Each color in the scale gets a variable name (e.g. –color-primary-30, –color-accent-70) that corresponds to its lightness step. On top of that, I created utility classes (e.g. .bg-primary-30, .text-accent-70) to apply the colors directly in markup. This approach keeps design tokens consistent, makes it easy to swap or extend colors later, and reduces guesswork when working with the palette in real-world layouts. /* Secondary Palette */ --secondary-color: oklch(30% 0.13 10.92); --color-secondary-0: oklch(from var(--secondary-color) 95% c h); --color-secondary-10: oklch(from var(--secondary-color) 85% c h); --color-secondary-20: oklch(from var(--secondary-color) 73% c h); --color-secondary-30: oklch(from var(--secondary-color) 55% c h); --color-secondary-40: oklch(from var(--secondary-color) 40% c h); --color-secondary-50: var(--secondary-color); --color-secondary-60: oklch(from var(--secondary-color) 25% c h); --color-secondary-70: oklch(from var(--secondary-color) 20% c h); --color-secondary-80: oklch(from var(--secondary-color) 17% c h); --color-secondary-90: oklch(from var(--secondary-color) 12% c h); --color-secondary-100: oklch(from var(--secondary-color) 8% c h); /* Teal Palette */ --teal-color: oklch(65% 0.1099 198); --color-teal-0: oklch(from var(--teal-color) 99% c h); --color-teal-10: oklch(from var(--teal-color) 90% c h); --color-teal-20: oklch(from var(--teal-color) 85% c h); --color-teal-30: oklch(from var(--teal-color) 75% c h); --color-teal-40: oklch(from var(--teal-color) 70% c h); --color-teal-50: var(--teal-color); --color-teal-60: oklch(from var(--teal-color) 58% c h); --color-teal-70: oklch(from var(--teal-color) 45% c h); --color-teal-80: oklch(from var(--teal-color) 32% c h); --color-teal-90: oklch(from var(--teal-color) 24% c h); --color-teal-100: oklch(from var(--teal-color) 18% c h); /* alert Palette */ --alert-color: oklch(80% 0.1659 119.42); --color-alert-0: oklch(from var(--alert-color) 99% c h); --color-alert-10: oklch(from var(--alert-color) 93% c h); --color-alert-20: oklch(from var(--alert-color) 91% c h); --color-alert-30: oklch(from var(--alert-color) 87% c h); --color-alert-40: oklch(from var(--alert-color) 83% c h); --color-alert-50: var(--alert-color); --color-alert-60: oklch(from var(--alert-color) 76% c h); --color-alert-70: oklch(from var(--alert-color) 60% c h); --color-alert-80: oklch(from var(--alert-color) 50% c h); --color-alert-90: oklch(from var(--alert-color) 40% c h); --color-alert-100: oklch(from var(--alert-color) 20% c h);]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/oklch/%22,%20%22thumbnail%22=%3E%22oklch_colors_thumbnail.png%22,%20%22feature%22=%3E%22oklch_colors_thumbnail.png%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/oklch/%22,%20%22thumbnail%22=%3E%22oklch_colors_thumbnail.png%22,%20%22feature%22=%3E%22oklch_colors_thumbnail.png%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">OKLCH Color Scheme</title><link href="https://www.cmd-design.com/de/posts/CMD-colors" rel="alternate" type="text/html" title="OKLCH Color Scheme" /><published>2025-04-16T15:00:06+00:00</published><updated>2025-04-16T15:00:06+00:00</updated><id>https://www.cmd-design.com/de/posts/CMD-colors</id><content type="html" xml:base="https://www.cmd-design.com/de/posts/CMD-colors"><![CDATA[<p>Als ich das Farbsystem für dieses Projekt definiert habe, wollte ich etwas entwickeln, das flexibel und zugleich zukunftssicher ist. Klassische Hex- oder RGB-Werte funktionieren für statische Paletten gut, stoßen aber schnell an Grenzen, wenn Helligkeit, Kontrast oder Barrierefreiheit fein abgestimmt werden sollen. Deshalb habe ich die Palette auf Basis des OKLCH-Farbmodells aufgebaut. Im Unterschied zu HSL oder HEX ist OKLCH wahrnehmungsorientiert, Veränderungen bei Helligkeit und Chroma verhalten sich also deutlich näher an dem, wie wir Farbe tatsächlich sehen. Dadurch lassen sich Abstufungen, Kontraste und Harmonien wesentlich präziser steuern.</p>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Primary Palette */</span>
<span class="nt">--primary-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">40</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">15</span> <span class="err">272</span><span class="o">);</span>
<span class="nt">--color-primary-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">90</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">80</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">70</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">60</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">50</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">);</span>
<span class="nt">--color-primary-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">30</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">10</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">5</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-primary-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--primary-color</span><span class="o">)</span> <span class="err">0</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<p>Die Grundlage der Palette bildet eine Primärfarbskala, bei der ich den Helligkeitswert von 0 bis 100 variiert habe, während Chroma und Hue konstant bleiben. So entstand aus einem Ausgangston ein gleichmäßiges Spektrum aus Tints und Shades. Darauf aufbauend kamen eine Sekundärfarbe, eine Alert-Farbe für Zustände und Hinweise sowie ein spielerischerer Akzentton in Teal hinzu. Alle Skalen folgen demselben Prinzip: von einer Basisfarbe ausgehend Abstufungen über die Helligkeit in OKLCH aufbauen.</p>

<p>Damit die Palette auch in der Entwicklung praktisch nutzbar ist, habe ich jede Stufe in CSS Custom Properties übersetzt. Jede Farbe erhält einen Variablennamen wie <code class="language-plaintext highlighter-rouge">--color-primary-30</code> oder <code class="language-plaintext highlighter-rouge">--color-accent-70</code>, der direkt ihrer Helligkeitsstufe entspricht. Ergänzend dazu habe ich Utility-Klassen wie <code class="language-plaintext highlighter-rouge">.bg-primary-30</code> oder <code class="language-plaintext highlighter-rouge">.text-accent-70</code> angelegt, damit sich die Farben direkt im Markup verwenden lassen. So bleiben die Design-Tokens konsistent, Farben lassen sich später leichter austauschen oder erweitern und die Arbeit mit der Palette in realen Layouts wird deutlich klarer.</p>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Secondary Palette */</span>
<span class="nt">--secondary-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">30</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">13</span> <span class="err">10</span><span class="o">.</span><span class="err">92</span><span class="o">);</span>
<span class="nt">--color-secondary-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">95</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">85</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">73</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">55</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">40</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">);</span>
<span class="nt">--color-secondary-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">25</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">17</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">12</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-secondary-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--secondary-color</span><span class="o">)</span> <span class="err">8</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* Teal Palette */</span>
<span class="nt">--teal-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">65</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">1099</span> <span class="err">198</span><span class="o">);</span>
<span class="nt">--color-teal-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">99</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">90</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">85</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">75</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">70</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">);</span>
<span class="nt">--color-teal-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">58</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">45</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">32</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">24</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-teal-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--teal-color</span><span class="o">)</span> <span class="err">18</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="c">/* alert Palette */</span>
<span class="nt">--alert-color</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="err">80</span><span class="o">%</span> <span class="err">0</span><span class="o">.</span><span class="err">1659</span> <span class="err">119</span><span class="o">.</span><span class="err">42</span><span class="o">);</span>
<span class="nt">--color-alert-0</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">99</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-10</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">93</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-20</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">91</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-30</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">87</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-40</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">83</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-50</span><span class="o">:</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">);</span>
<span class="nt">--color-alert-60</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">76</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-70</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">60</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-80</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">50</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-90</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">40</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span>
<span class="nt">--color-alert-100</span><span class="o">:</span> <span class="nt">oklch</span><span class="o">(</span><span class="nt">from</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--alert-color</span><span class="o">)</span> <span class="err">20</span><span class="o">%</span> <span class="nt">c</span> <span class="nt">h</span><span class="o">);</span></code></pre></figure>]]></content><author><name>Chad Matthew Danford</name></author><category term="de" /><category term="web" /><summary type="html"><![CDATA[Als ich das Farbsystem für dieses Projekt definiert habe, wollte ich etwas entwickeln, das flexibel und zugleich zukunftssicher ist. Klassische Hex- oder RGB-Werte funktionieren für statische Paletten gut, stoßen aber schnell an Grenzen, wenn Helligkeit, Kontrast oder Barrierefreiheit fein abgestimmt werden sollen. Deshalb habe ich die Palette auf Basis des OKLCH-Farbmodells aufgebaut. Im Unterschied zu HSL oder HEX ist OKLCH wahrnehmungsorientiert, Veränderungen bei Helligkeit und Chroma verhalten sich also deutlich näher an dem, wie wir Farbe tatsächlich sehen. Dadurch lassen sich Abstufungen, Kontraste und Harmonien wesentlich präziser steuern. /* Primary Palette */ --primary-color: oklch(40% 0.15 272); --color-primary-0: oklch(from var(--primary-color) 90% c h); --color-primary-10: oklch(from var(--primary-color) 80% c h); --color-primary-20: oklch(from var(--primary-color) 70% c h); --color-primary-30: oklch(from var(--primary-color) 60% c h); --color-primary-40: oklch(from var(--primary-color) 50% c h); --color-primary-50: var(--primary-color); --color-primary-60: oklch(from var(--primary-color) 30% c h); --color-primary-70: oklch(from var(--primary-color) 20% c h); --color-primary-80: oklch(from var(--primary-color) 10% c h); --color-primary-90: oklch(from var(--primary-color) 5% c h); --color-primary-100: oklch(from var(--primary-color) 0% c h); Die Grundlage der Palette bildet eine Primärfarbskala, bei der ich den Helligkeitswert von 0 bis 100 variiert habe, während Chroma und Hue konstant bleiben. So entstand aus einem Ausgangston ein gleichmäßiges Spektrum aus Tints und Shades. Darauf aufbauend kamen eine Sekundärfarbe, eine Alert-Farbe für Zustände und Hinweise sowie ein spielerischerer Akzentton in Teal hinzu. Alle Skalen folgen demselben Prinzip: von einer Basisfarbe ausgehend Abstufungen über die Helligkeit in OKLCH aufbauen. Damit die Palette auch in der Entwicklung praktisch nutzbar ist, habe ich jede Stufe in CSS Custom Properties übersetzt. Jede Farbe erhält einen Variablennamen wie --color-primary-30 oder --color-accent-70, der direkt ihrer Helligkeitsstufe entspricht. Ergänzend dazu habe ich Utility-Klassen wie .bg-primary-30 oder .text-accent-70 angelegt, damit sich die Farben direkt im Markup verwenden lassen. So bleiben die Design-Tokens konsistent, Farben lassen sich später leichter austauschen oder erweitern und die Arbeit mit der Palette in realen Layouts wird deutlich klarer. /* Secondary Palette */ --secondary-color: oklch(30% 0.13 10.92); --color-secondary-0: oklch(from var(--secondary-color) 95% c h); --color-secondary-10: oklch(from var(--secondary-color) 85% c h); --color-secondary-20: oklch(from var(--secondary-color) 73% c h); --color-secondary-30: oklch(from var(--secondary-color) 55% c h); --color-secondary-40: oklch(from var(--secondary-color) 40% c h); --color-secondary-50: var(--secondary-color); --color-secondary-60: oklch(from var(--secondary-color) 25% c h); --color-secondary-70: oklch(from var(--secondary-color) 20% c h); --color-secondary-80: oklch(from var(--secondary-color) 17% c h); --color-secondary-90: oklch(from var(--secondary-color) 12% c h); --color-secondary-100: oklch(from var(--secondary-color) 8% c h); /* Teal Palette */ --teal-color: oklch(65% 0.1099 198); --color-teal-0: oklch(from var(--teal-color) 99% c h); --color-teal-10: oklch(from var(--teal-color) 90% c h); --color-teal-20: oklch(from var(--teal-color) 85% c h); --color-teal-30: oklch(from var(--teal-color) 75% c h); --color-teal-40: oklch(from var(--teal-color) 70% c h); --color-teal-50: var(--teal-color); --color-teal-60: oklch(from var(--teal-color) 58% c h); --color-teal-70: oklch(from var(--teal-color) 45% c h); --color-teal-80: oklch(from var(--teal-color) 32% c h); --color-teal-90: oklch(from var(--teal-color) 24% c h); --color-teal-100: oklch(from var(--teal-color) 18% c h); /* alert Palette */ --alert-color: oklch(80% 0.1659 119.42); --color-alert-0: oklch(from var(--alert-color) 99% c h); --color-alert-10: oklch(from var(--alert-color) 93% c h); --color-alert-20: oklch(from var(--alert-color) 91% c h); --color-alert-30: oklch(from var(--alert-color) 87% c h); --color-alert-40: oklch(from var(--alert-color) 83% c h); --color-alert-50: var(--alert-color); --color-alert-60: oklch(from var(--alert-color) 76% c h); --color-alert-70: oklch(from var(--alert-color) 60% c h); --color-alert-80: oklch(from var(--alert-color) 50% c h); --color-alert-90: oklch(from var(--alert-color) 40% c h); --color-alert-100: oklch(from var(--alert-color) 20% c h);]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/oklch/%22,%20%22thumbnail%22=%3E%22oklch_colors_thumbnail.png%22,%20%22feature%22=%3E%22oklch_colors_thumbnail.png%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/oklch/%22,%20%22thumbnail%22=%3E%22oklch_colors_thumbnail.png%22,%20%22feature%22=%3E%22oklch_colors_thumbnail.png%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Calumet HQ</title><link href="https://www.cmd-design.com/posts/calumet_hq" rel="alternate" type="text/html" title="Calumet HQ" /><published>2024-10-01T15:00:06+00:00</published><updated>2024-10-01T15:00:06+00:00</updated><id>https://www.cmd-design.com/posts/calumet_hq</id><content type="html" xml:base="https://www.cmd-design.com/posts/calumet_hq"><![CDATA[<p>Almost a year before Calumet’s Hamburg headquarters move-in date (Fall 2024), I was asked to collaborate directly with management on shaping the new space. My role was to design the look and feel of the HQ — making sure the physical environment reflected the company’s identity and supported how teams actually work day to day.</p>

<div id="gallerysplider" class="splide mt-xxl mb-xxl" aria-labelledby="gallery-splider">
  <div class="splide__track">
    <ul class="splide__list">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_01.webp"><img src="/assets/images/calumet_hq/calumet_hq_01.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_02.webp"><img src="/assets/images/calumet_hq/calumet_hq_02.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_03.webp"><img src="/assets/images/calumet_hq/calumet_hq_03.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
          
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
    </ul>
  </div>
</div>

<p>I also introduced large-format inspirational photography to cover non-glass walls, giving the office a strong visual character and connecting the environment to the creative spirit of the company. Beyond graphics, I supported management in choosing furniture and decorations, ensuring consistency with the design direction. To cap it off, I organized a company-wide photography call: employees contributed images that were framed and displayed in the “Meet and Mingle” room — a space dedicated to community and collaboration.</p>

<p>The project began with concept development: I created proposals that balanced functionality with brand expression. These early ideas set the tone for everything that followed, from material choices and colors to how common areas and workspaces could express Calumet’s values.</p>

<p>One of the most important results was a room-naming concept. Using results from a company-wide survey, I created names for every meeting space and designed a visual system that combined the Calumet logo with each name. Since most rooms had glass walls, these designs were produced as large vinyl stickers — a simple but effective way to bring identity and clarity into the space.</p>

<p>The result was a headquarters that doesn’t just function as an office, but embodies Calumet’s culture: professional, creative, and inclusive, with employees directly contributing to the look and feel of the space.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="design" /><summary type="html"><![CDATA[Almost a year before Calumet’s Hamburg headquarters move-in date (Fall 2024), I was asked to collaborate directly with management on shaping the new space. My role was to design the look and feel of the HQ — making sure the physical environment reflected the company’s identity and supported how teams actually work day to day. I also introduced large-format inspirational photography to cover non-glass walls, giving the office a strong visual character and connecting the environment to the creative spirit of the company. Beyond graphics, I supported management in choosing furniture and decorations, ensuring consistency with the design direction. To cap it off, I organized a company-wide photography call: employees contributed images that were framed and displayed in the “Meet and Mingle” room — a space dedicated to community and collaboration. The project began with concept development: I created proposals that balanced functionality with brand expression. These early ideas set the tone for everything that followed, from material choices and colors to how common areas and workspaces could express Calumet’s values. One of the most important results was a room-naming concept. Using results from a company-wide survey, I created names for every meeting space and designed a visual system that combined the Calumet logo with each name. Since most rooms had glass walls, these designs were produced as large vinyl stickers — a simple but effective way to bring identity and clarity into the space. The result was a headquarters that doesn’t just function as an office, but embodies Calumet’s culture: professional, creative, and inclusive, with employees directly contributing to the look and feel of the space.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_hq/%22,%20%22thumbnail%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22hq01%22=%3E%22calumet_hq01.webp%22,%20%22hq02%22=%3E%22calumet_hq02.webp%22,%20%22hq03%22=%3E%22calumet_hq03.webp%22,%20%22hq04%22=%3E%22calumet_hq04.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_hq/%22,%20%22thumbnail%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22hq01%22=%3E%22calumet_hq01.webp%22,%20%22hq02%22=%3E%22calumet_hq02.webp%22,%20%22hq03%22=%3E%22calumet_hq03.webp%22,%20%22hq04%22=%3E%22calumet_hq04.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">Calumet HQ</title><link href="https://www.cmd-design.com/de/posts/calumet_hq" rel="alternate" type="text/html" title="Calumet HQ" /><published>2024-10-01T15:00:06+00:00</published><updated>2024-10-01T15:00:06+00:00</updated><id>https://www.cmd-design.com/de/posts/calumet_hq</id><content type="html" xml:base="https://www.cmd-design.com/de/posts/calumet_hq"><![CDATA[<p>Fast ein Jahr vor dem Einzug in Calumets neues Hamburger Headquarter im Herbst 2024 wurde ich gebeten, direkt mit dem Management an der Gestaltung der neuen Räume zu arbeiten. Meine Aufgabe war es, Look and Feel des HQ zu entwickeln und dafür zu sorgen, dass die physische Umgebung die Identität des Unternehmens widerspiegelt und den Arbeitsalltag der Teams sinnvoll unterstützt.</p>

<div id="gallerysplider" class="splide mt-xxl mb-xxl" aria-labelledby="gallery-splider">
  <div class="splide__track">
    <ul class="splide__list">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_01.webp"><img src="/assets/images/calumet_hq/calumet_hq_01.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_02.webp"><img src="/assets/images/calumet_hq/calumet_hq_02.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_hq/calumet_hq_03.webp"><img src="/assets/images/calumet_hq/calumet_hq_03.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
          
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
    </ul>
  </div>
</div>

<p>Zusätzlich brachte ich großformatige inspirierende Fotografie an geschlossene Wände, um dem Büro eine starke visuelle Identität zu geben und die Räume mit dem kreativen Geist des Unternehmens zu verbinden. Über die Grafik hinaus unterstützte ich das Management bei der Auswahl von Möbeln und Dekoration, damit alles gestalterisch zusammenpasst. Zum Abschluss organisierte ich einen internen Fotografie-Call: Mitarbeiter reichten Bilder ein, die gerahmt im „Meet and Mingle“-Raum ausgestellt wurden, einem Ort für Begegnung und Zusammenarbeit.</p>

<p>Das Projekt begann mit der Konzeptentwicklung. Ich erarbeitete Vorschläge, die Funktionalität und Markenausdruck miteinander ausbalancierten. Diese frühen Ideen gaben den Ton für alles Weitere vor, von Materialentscheidungen und Farben bis zur Frage, wie Gemeinschaftsbereiche und Arbeitsplätze Calumets Werte sichtbar machen können.</p>

<p>Eines der wichtigsten Ergebnisse war ein Raumbenennungs-Konzept. Auf Basis einer unternehmensweiten Umfrage entwickelte ich Namen für alle Besprechungsräume und ein visuelles System, das den Calumet-Schriftzug mit den jeweiligen Namen verband. Da viele Räume Glaswände haben, wurden diese Entwürfe als große Vinyl-Folien umgesetzt, eine einfache, aber wirkungsvolle Lösung, um Identität und Orientierung in die Räume zu bringen.</p>

<p>Das Ergebnis war ein Headquarter, das nicht nur als Büro funktioniert, sondern Calumets Kultur verkörpert: professionell, kreativ und offen, mit einem Look and Feel, zu dem die Mitarbeiter selbst beigetragen haben.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="de" /><category term="design" /><summary type="html"><![CDATA[Fast ein Jahr vor dem Einzug in Calumets neues Hamburger Headquarter im Herbst 2024 wurde ich gebeten, direkt mit dem Management an der Gestaltung der neuen Räume zu arbeiten. Meine Aufgabe war es, Look and Feel des HQ zu entwickeln und dafür zu sorgen, dass die physische Umgebung die Identität des Unternehmens widerspiegelt und den Arbeitsalltag der Teams sinnvoll unterstützt. Zusätzlich brachte ich großformatige inspirierende Fotografie an geschlossene Wände, um dem Büro eine starke visuelle Identität zu geben und die Räume mit dem kreativen Geist des Unternehmens zu verbinden. Über die Grafik hinaus unterstützte ich das Management bei der Auswahl von Möbeln und Dekoration, damit alles gestalterisch zusammenpasst. Zum Abschluss organisierte ich einen internen Fotografie-Call: Mitarbeiter reichten Bilder ein, die gerahmt im „Meet and Mingle“-Raum ausgestellt wurden, einem Ort für Begegnung und Zusammenarbeit. Das Projekt begann mit der Konzeptentwicklung. Ich erarbeitete Vorschläge, die Funktionalität und Markenausdruck miteinander ausbalancierten. Diese frühen Ideen gaben den Ton für alles Weitere vor, von Materialentscheidungen und Farben bis zur Frage, wie Gemeinschaftsbereiche und Arbeitsplätze Calumets Werte sichtbar machen können. Eines der wichtigsten Ergebnisse war ein Raumbenennungs-Konzept. Auf Basis einer unternehmensweiten Umfrage entwickelte ich Namen für alle Besprechungsräume und ein visuelles System, das den Calumet-Schriftzug mit den jeweiligen Namen verband. Da viele Räume Glaswände haben, wurden diese Entwürfe als große Vinyl-Folien umgesetzt, eine einfache, aber wirkungsvolle Lösung, um Identität und Orientierung in die Räume zu bringen. Das Ergebnis war ein Headquarter, das nicht nur als Büro funktioniert, sondern Calumets Kultur verkörpert: professionell, kreativ und offen, mit einem Look and Feel, zu dem die Mitarbeiter selbst beigetragen haben.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_hq/%22,%20%22thumbnail%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22hq01%22=%3E%22calumet_hq01.webp%22,%20%22hq02%22=%3E%22calumet_hq02.webp%22,%20%22hq03%22=%3E%22calumet_hq03.webp%22,%20%22hq04%22=%3E%22calumet_hq04.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_hq/%22,%20%22thumbnail%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_hq_thumbnail.webp%22,%20%22hq01%22=%3E%22calumet_hq01.webp%22,%20%22hq02%22=%3E%22calumet_hq02.webp%22,%20%22hq03%22=%3E%22calumet_hq03.webp%22,%20%22hq04%22=%3E%22calumet_hq04.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Calumet Email Newsletter</title><link href="https://www.cmd-design.com/posts/calumet_nl" rel="alternate" type="text/html" title="Calumet Email Newsletter" /><published>2024-03-15T15:00:06+00:00</published><updated>2024-03-15T15:00:06+00:00</updated><id>https://www.cmd-design.com/posts/calumet_nl</id><content type="html" xml:base="https://www.cmd-design.com/posts/calumet_nl"><![CDATA[<p>The story of the newsletter started back when I was still a senior developer/designer on the web team. I’d periodically give the content team design advice — little things that could make layouts cleaner, create easy wins, and elevate the overall look. These small interventions built trust and opened the door to a closer collaboration with the head of content.</p>

<div class="post-media post-media--one">
  <img src="/assets/images/calumet_nl/calumet_nl01.webp" alt="" />
</div>
<p>When I became Head of Art Direction, I felt a responsibility to keep pushing my design philosophy into every channel. The newsletter was one of the first areas I championed. I made a point of mentioning it regularly to stakeholders, showing small improvements whenever I could, and keeping the idea alive until the right moment to focus on it came.</p>

<div id="gallerysplider" class="splide mt-xxl mb-xxl" aria-labelledby="gallery-splider">
  <div class="splide__track">
    <ul class="splide__list">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl01.webp"><img src="/assets/images/calumet_nl/calumet_nl01.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl02.webp"><img src="/assets/images/calumet_nl/calumet_nl02.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl03.webp"><img src="/assets/images/calumet_nl/calumet_nl03.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl04.webp"><img src="/assets/images/calumet_nl/calumet_nl04.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
          
        
      
        
          
            
          
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
    </ul>
  </div>
</div>

<p>That persistence paid off. Soon, I was sitting in on direct talks with the content lead and the developers at Emarsys, who were building the newsletter modules. With design, content, and development working in sync, we moved from ad hoc tweaks to building reusable modules that looked good, worked reliably, and represented the brand consistently.</p>

<p>The result was a newsletter system that felt cohesive and professional — less like a series of one-off sends, more like a branded experience. Production became smoother for the content team, developers had clearer design direction, and stakeholders saw a tangible step forward in how design could add value.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="design" /><summary type="html"><![CDATA[The story of the newsletter started back when I was still a senior developer/designer on the web team. I’d periodically give the content team design advice — little things that could make layouts cleaner, create easy wins, and elevate the overall look. These small interventions built trust and opened the door to a closer collaboration with the head of content. When I became Head of Art Direction, I felt a responsibility to keep pushing my design philosophy into every channel. The newsletter was one of the first areas I championed. I made a point of mentioning it regularly to stakeholders, showing small improvements whenever I could, and keeping the idea alive until the right moment to focus on it came. That persistence paid off. Soon, I was sitting in on direct talks with the content lead and the developers at Emarsys, who were building the newsletter modules. With design, content, and development working in sync, we moved from ad hoc tweaks to building reusable modules that looked good, worked reliably, and represented the brand consistently. The result was a newsletter system that felt cohesive and professional — less like a series of one-off sends, more like a branded experience. Production became smoother for the content team, developers had clearer design direction, and stakeholders saw a tangible step forward in how design could add value.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_nl/%22,%20%22thumbnail%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22cutoutold%22=%3E%22calumet_nl_old_thumb.webp%22,%20%22cutout01%22=%3E%22calumet_nl01.webp%22,%20%22cutout02%22=%3E%22calumet_nl02.webp%22,%20%22cutout03%22=%3E%22calumet_nl03.webp%22,%20%22cutout04%22=%3E%22calumet_nl04.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_nl/%22,%20%22thumbnail%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22cutoutold%22=%3E%22calumet_nl_old_thumb.webp%22,%20%22cutout01%22=%3E%22calumet_nl01.webp%22,%20%22cutout02%22=%3E%22calumet_nl02.webp%22,%20%22cutout03%22=%3E%22calumet_nl03.webp%22,%20%22cutout04%22=%3E%22calumet_nl04.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">Calumet Email Newsletter</title><link href="https://www.cmd-design.com/de/posts/calumet_nl" rel="alternate" type="text/html" title="Calumet Email Newsletter" /><published>2024-03-15T15:00:06+00:00</published><updated>2024-03-15T15:00:06+00:00</updated><id>https://www.cmd-design.com/de/posts/calumet_nl</id><content type="html" xml:base="https://www.cmd-design.com/de/posts/calumet_nl"><![CDATA[<p>Die Geschichte des Newsletters begann, als ich noch als Senior Developer/Designer im Webteam arbeitete. Ich gab dem Content-Team immer wieder kleine Designhinweise, Anpassungen, die Layouts klarer machten, schnelle Verbesserungen brachten und den gesamten Auftritt aufwerteten. Diese kleinen Eingriffe schufen Vertrauen und führten zu einer engeren Zusammenarbeit mit der Content-Leitung.</p>

<div class="post-media post-media--one">
  <img src="/assets/images/calumet_nl/calumet_nl01.webp" alt="" />
</div>
<p>Als ich Head of Art Direction wurde, war für mich klar, dass sich mein Designverständnis in allen Kanälen wiederfinden sollte. Der Newsletter war einer der ersten Bereiche, die ich gezielt vorantrieb. Ich brachte das Thema immer wieder bei Stakeholdern ein, zeigte kleine Verbesserungen, sobald sich die Gelegenheit bot, und hielt die Idee so lange präsent, bis der richtige Moment für einen echten Fokus gekommen war.</p>

<div id="gallerysplider" class="splide mt-xxl mb-xxl" aria-labelledby="gallery-splider">
  <div class="splide__track">
    <ul class="splide__list">
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl01.webp"><img src="/assets/images/calumet_nl/calumet_nl01.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl02.webp"><img src="/assets/images/calumet_nl/calumet_nl02.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl03.webp"><img src="/assets/images/calumet_nl/calumet_nl03.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
              <li class="splide__slide">
                <div class="splide__slide__container">
                  <a href="/assets/images/calumet_nl/calumet_nl04.webp"><img src="/assets/images/calumet_nl/calumet_nl04.webp" alt="Gallery Image" /></a>
                </div>
              </li>
            
          
        
      
        
          
            
          
        
      
        
          
            
          
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
        
      
    </ul>
  </div>
</div>

<p>Diese Beharrlichkeit zahlte sich aus. Bald saß ich direkt mit der Content-Leitung und den Entwicklern bei Emarsys am Tisch, die die Newsletter-Module umsetzten. Weil Design, Content und Entwicklung abgestimmt zusammenarbeiteten, wurden aus einzelnen Ad-hoc-Verbesserungen wiederverwendbare Module, die gut aussahen, zuverlässig funktionierten und die Marke konsistent transportierten.</p>

<p>Das Ergebnis war ein Newsletter-System, das sich geschlossen und professionell anfühlte, weniger wie einzelne Aussendungen, mehr wie ein durchgängiges Markenerlebnis. Die Produktion wurde für das Content-Team deutlich einfacher, die Entwickler hatten klarere gestalterische Leitplanken und Stakeholder sahen konkret, welchen Mehrwert Design liefern kann.</p>]]></content><author><name>Chad Matthew Danford</name></author><category term="de" /><category term="design" /><summary type="html"><![CDATA[Die Geschichte des Newsletters begann, als ich noch als Senior Developer/Designer im Webteam arbeitete. Ich gab dem Content-Team immer wieder kleine Designhinweise, Anpassungen, die Layouts klarer machten, schnelle Verbesserungen brachten und den gesamten Auftritt aufwerteten. Diese kleinen Eingriffe schufen Vertrauen und führten zu einer engeren Zusammenarbeit mit der Content-Leitung. Als ich Head of Art Direction wurde, war für mich klar, dass sich mein Designverständnis in allen Kanälen wiederfinden sollte. Der Newsletter war einer der ersten Bereiche, die ich gezielt vorantrieb. Ich brachte das Thema immer wieder bei Stakeholdern ein, zeigte kleine Verbesserungen, sobald sich die Gelegenheit bot, und hielt die Idee so lange präsent, bis der richtige Moment für einen echten Fokus gekommen war. Diese Beharrlichkeit zahlte sich aus. Bald saß ich direkt mit der Content-Leitung und den Entwicklern bei Emarsys am Tisch, die die Newsletter-Module umsetzten. Weil Design, Content und Entwicklung abgestimmt zusammenarbeiteten, wurden aus einzelnen Ad-hoc-Verbesserungen wiederverwendbare Module, die gut aussahen, zuverlässig funktionierten und die Marke konsistent transportierten. Das Ergebnis war ein Newsletter-System, das sich geschlossen und professionell anfühlte, weniger wie einzelne Aussendungen, mehr wie ein durchgängiges Markenerlebnis. Die Produktion wurde für das Content-Team deutlich einfacher, die Entwickler hatten klarere gestalterische Leitplanken und Stakeholder sahen konkret, welchen Mehrwert Design liefern kann.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_nl/%22,%20%22thumbnail%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22cutoutold%22=%3E%22calumet_nl_old_thumb.webp%22,%20%22cutout01%22=%3E%22calumet_nl01.webp%22,%20%22cutout02%22=%3E%22calumet_nl02.webp%22,%20%22cutout03%22=%3E%22calumet_nl03.webp%22,%20%22cutout04%22=%3E%22calumet_nl04.webp%22%7D" /><media:content medium="image" url="https://www.cmd-design.com/%7B%22gallery%22=%3E%22/assets/images/calumet_nl/%22,%20%22thumbnail%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22feature%22=%3E%22calumet_nl_thumbnail.webp%22,%20%22cutoutold%22=%3E%22calumet_nl_old_thumb.webp%22,%20%22cutout01%22=%3E%22calumet_nl01.webp%22,%20%22cutout02%22=%3E%22calumet_nl02.webp%22,%20%22cutout03%22=%3E%22calumet_nl03.webp%22,%20%22cutout04%22=%3E%22calumet_nl04.webp%22%7D" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>