<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://csswitch.github.io/jekyll-pixel-theme/feed.xml" rel="self" type="application/atom+xml" /><link href="https://csswitch.github.io/jekyll-pixel-theme/" rel="alternate" type="text/html" /><updated>2026-05-12T20:27:32+00:00</updated><id>https://csswitch.github.io/jekyll-pixel-theme/feed.xml</id><title type="html">Pixel Blog</title><subtitle>Your 8-bit adventures in code</subtitle><author><name>Player One</name><email>player@example.com</email></author><entry><title type="html">CSS Pixel Art Techniques — No Images Required</title><link href="https://csswitch.github.io/jekyll-pixel-theme/2024/01/22/css-pixel-art-techniques/" rel="alternate" type="text/html" title="CSS Pixel Art Techniques — No Images Required" /><published>2024-01-22T00:00:00+00:00</published><updated>2024-01-22T00:00:00+00:00</updated><id>https://csswitch.github.io/jekyll-pixel-theme/2024/01/22/css-pixel-art-techniques</id><content type="html" xml:base="https://csswitch.github.io/jekyll-pixel-theme/2024/01/22/css-pixel-art-techniques/"><![CDATA[<p>Real pixel art — in CSS, without a single image file. Here’s how Pixel Theme achieves the look.</p>

<h2 id="the-core-trick-image-rendering-pixelated">The Core Trick: <code class="language-plaintext highlighter-rouge">image-rendering: pixelated</code></h2>

<p>This CSS property tells the browser to scale images (and the element) without anti-aliasing:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">img</span> <span class="p">{</span>
  <span class="nl">image-rendering</span><span class="p">:</span> <span class="n">pixelated</span><span class="p">;</span>
  <span class="nl">image-rendering</span><span class="p">:</span> <span class="n">crisp-edges</span><span class="p">;</span> <span class="c">/* Firefox */</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Pair this with small SVGs or emoji and you get crisp scaled sprites.</p>

<h2 id="tiled-background-grid">Tiled Background Grid</h2>

<p>The pixel grid background is a pure CSS double repeating-gradient:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.pixel-bg</span> <span class="p">{</span>
  <span class="nl">background-image</span><span class="p">:</span>
    <span class="nf">repeating-linear-gradient</span><span class="p">(</span>
      <span class="m">0deg</span><span class="p">,</span>
      <span class="nb">transparent</span><span class="p">,</span>
      <span class="nb">transparent</span> <span class="m">7px</span><span class="p">,</span>
      <span class="nf">rgba</span><span class="p">(</span><span class="m">48</span><span class="p">,</span><span class="m">98</span><span class="p">,</span><span class="m">48</span><span class="p">,</span> <span class="m">0.3</span><span class="p">)</span> <span class="m">7px</span><span class="p">,</span>
      <span class="nf">rgba</span><span class="p">(</span><span class="m">48</span><span class="p">,</span><span class="m">98</span><span class="p">,</span><span class="m">48</span><span class="p">,</span> <span class="m">0.3</span><span class="p">)</span> <span class="m">8px</span>
    <span class="p">),</span>
    <span class="nf">repeating-linear-gradient</span><span class="p">(</span>
      <span class="m">90deg</span><span class="p">,</span>
      <span class="nb">transparent</span><span class="p">,</span>
      <span class="nb">transparent</span> <span class="m">7px</span><span class="p">,</span>
      <span class="nf">rgba</span><span class="p">(</span><span class="m">48</span><span class="p">,</span><span class="m">98</span><span class="p">,</span><span class="m">48</span><span class="p">,</span> <span class="m">0.3</span><span class="p">)</span> <span class="m">7px</span><span class="p">,</span>
      <span class="nf">rgba</span><span class="p">(</span><span class="m">48</span><span class="p">,</span><span class="m">98</span><span class="p">,</span><span class="m">48</span><span class="p">,</span> <span class="m">0.3</span><span class="p">)</span> <span class="m">8px</span>
    <span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Two perpendicular <code class="language-plaintext highlighter-rouge">repeating-linear-gradient</code> layers create a 8×8 grid. The grid line is 1px wide, the cell is 7px wide.</p>

<h2 id="pixel-button-with-depth">Pixel Button with Depth</h2>

<p>The “inset pixel shadow” effect:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.btn-pixel</span> <span class="p">{</span>
  <span class="nl">box-shadow</span><span class="p">:</span> <span class="m">4px</span> <span class="m">4px</span> <span class="m">0</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.8</span><span class="p">);</span>
  <span class="nl">transition</span><span class="p">:</span> <span class="n">box-shadow</span> <span class="m">0.08s</span><span class="p">,</span> <span class="n">transform</span> <span class="m">0.08s</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.btn-pixel</span><span class="nd">:hover</span> <span class="p">{</span>
  <span class="nl">box-shadow</span><span class="p">:</span> <span class="m">2px</span> <span class="m">2px</span> <span class="m">0</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.8</span><span class="p">);</span>
  <span class="nl">transform</span><span class="p">:</span> <span class="nf">translate</span><span class="p">(</span><span class="m">2px</span><span class="p">,</span> <span class="m">2px</span><span class="p">);</span>
<span class="p">}</span>

<span class="nc">.btn-pixel</span><span class="nd">:active</span> <span class="p">{</span>
  <span class="nl">box-shadow</span><span class="p">:</span> <span class="m">0</span> <span class="m">0</span> <span class="m">0</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.8</span><span class="p">);</span>
  <span class="nl">transform</span><span class="p">:</span> <span class="nf">translate</span><span class="p">(</span><span class="m">4px</span><span class="p">,</span> <span class="m">4px</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The button <em>moves</em> toward the shadow as you click — it feels physically pressed.</p>

<h2 id="crt-scanlines">CRT Scanlines</h2>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.scanlines</span> <span class="p">{</span>
  <span class="nl">position</span><span class="p">:</span> <span class="nb">fixed</span><span class="p">;</span>
  <span class="nl">inset</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
  <span class="nl">pointer-events</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span> <span class="c">/* critical — don't block clicks */</span>
  <span class="nl">background</span><span class="p">:</span> <span class="nf">repeating-linear-gradient</span><span class="p">(</span>
    <span class="m">0deg</span><span class="p">,</span>
    <span class="nb">transparent</span><span class="p">,</span>
    <span class="nb">transparent</span> <span class="m">3px</span><span class="p">,</span>
    <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.08</span><span class="p">)</span> <span class="m">3px</span><span class="p">,</span>
    <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.08</span><span class="p">)</span> <span class="m">4px</span>
  <span class="p">);</span>
  <span class="nl">animation</span><span class="p">:</span> <span class="n">flicker</span> <span class="m">8s</span> <span class="nb">infinite</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">@keyframes</span> <span class="n">flicker</span> <span class="p">{</span>
  <span class="m">0%</span><span class="o">,</span> <span class="m">95%</span><span class="o">,</span> <span class="m">100%</span> <span class="p">{</span> <span class="nl">opacity</span><span class="p">:</span> <span class="m">1</span><span class="p">;</span> <span class="p">}</span>
  <span class="m">96%</span><span class="o">,</span> <span class="m">98%</span>      <span class="p">{</span> <span class="nl">opacity</span><span class="p">:</span> <span class="m">0.97</span><span class="p">;</span> <span class="p">}</span>
  <span class="m">97%</span>           <span class="p">{</span> <span class="nl">opacity</span><span class="p">:</span> <span class="m">0.92</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">flicker</code> keyframe is subtle — a barely-perceptible opacity dip every 8 seconds. Your eye catches it peripherally, adding analog authenticity without being distracting.</p>

<h2 id="pixel-card-inset-shadow">Pixel Card Inset Shadow</h2>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.post-card</span> <span class="p">{</span>
  <span class="nl">box-shadow</span><span class="p">:</span>
    <span class="nb">inset</span> <span class="m">-2px</span> <span class="m">-2px</span> <span class="m">0</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0.5</span><span class="p">),</span>   <span class="c">/* bottom-right darkens */</span>
    <span class="nb">inset</span>  <span class="m">2px</span>  <span class="m">2px</span> <span class="m">0</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">255</span><span class="p">,</span><span class="m">255</span><span class="p">,</span><span class="m">255</span><span class="p">,</span><span class="m">0.1</span><span class="p">);</span> <span class="c">/* top-left highlights */</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Two inset shadows on opposite corners simulate a beveled 3D edge without any border-image tricks.</p>

<h2 id="floating-sprite-animation">Floating Sprite Animation</h2>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@keyframes</span> <span class="n">float</span> <span class="p">{</span>
  <span class="m">0%</span><span class="o">,</span> <span class="m">100%</span> <span class="p">{</span> <span class="nl">transform</span><span class="p">:</span> <span class="nf">translateY</span><span class="p">(</span><span class="m">0</span><span class="p">);</span> <span class="p">}</span>
  <span class="m">50%</span>      <span class="p">{</span> <span class="nl">transform</span><span class="p">:</span> <span class="nf">translateY</span><span class="p">(</span><span class="m">-8px</span><span class="p">);</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The key is using exactly <code class="language-plaintext highlighter-rouge">8px</code> — matching the pixel grid. Floating on a non-pixel boundary feels wrong; 8px feels intentional.</p>]]></content><author><name>Player One</name><email>player@example.com</email></author><category term="css" /><category term="tutorial" /><category term="pixel-art" /><category term="design" /><summary type="html"><![CDATA[How to build pixel art UI components using only CSS box-shadows, repeating gradients, and image-rendering: pixelated.]]></summary></entry><entry><title type="html">Welcome to Pixel Theme — 8-Bit Jekyll</title><link href="https://csswitch.github.io/jekyll-pixel-theme/2024/01/15/welcome-to-pixel-theme/" rel="alternate" type="text/html" title="Welcome to Pixel Theme — 8-Bit Jekyll" /><published>2024-01-15T00:00:00+00:00</published><updated>2024-01-15T00:00:00+00:00</updated><id>https://csswitch.github.io/jekyll-pixel-theme/2024/01/15/welcome-to-pixel-theme</id><content type="html" xml:base="https://csswitch.github.io/jekyll-pixel-theme/2024/01/15/welcome-to-pixel-theme/"><![CDATA[<p>Welcome to <strong>Pixel Theme</strong> — a Jekyll blog that looks like it was compiled in 1993.</p>

<h2 id="what-youre-looking-at">What You’re Looking At</h2>

<ul>
  <li>The font is <a href="https://fonts.google.com/specimen/Press+Start+2P">Press Start 2P</a> — a pixel-perfect bitmap-style Google Font</li>
  <li>Those horizontal lines across the page are CSS scanlines (a <code class="language-plaintext highlighter-rouge">repeating-linear-gradient</code> overlay)</li>
  <li>The boot sequence you saw on first load? Pure CSS <code class="language-plaintext highlighter-rouge">@keyframes</code> — no JavaScript until the sequence ends</li>
  <li>The ❤️ in the top bar tracks your reading progress</li>
</ul>

<h2 id="the-palette-system">The Palette System</h2>

<p>Change your entire color scheme with one config value:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">pixel</span><span class="pi">:</span>
  <span class="na">palette</span><span class="pi">:</span> <span class="s2">"</span><span class="s">gameboy"</span>   <span class="c1"># try: nes | cga | amber | synthwave</span>
</code></pre></div></div>

<p><strong>gameboy</strong> → classic green-on-black Game Boy LCD<br />
<strong>nes</strong> → warm cream/blue NES palette<br />
<strong>cga</strong> → hardcore cyan/magenta CGA monitor<br />
<strong>amber</strong> → orange amber CRT terminal<br />
<strong>synthwave</strong> → purple/pink retrowave</p>

<h2 id="writing-posts">Writing Posts</h2>

<p>Create files in <code class="language-plaintext highlighter-rouge">_posts/</code> with the format <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-title.md</code>:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">My</span><span class="nv"> </span><span class="s">Pixel</span><span class="nv"> </span><span class="s">Post"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2024-01-15</span>
<span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">javascript</span><span class="pi">,</span> <span class="nv">tutorial</span><span class="pi">]</span>
<span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Short</span><span class="nv"> </span><span class="s">excerpt</span><span class="nv"> </span><span class="s">shown</span><span class="nv"> </span><span class="s">on</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">post</span><span class="nv"> </span><span class="s">card."</span>
<span class="nn">---</span>

Content here...
</code></pre></div></div>

<h2 id="easter-egg-️">Easter Egg 🕹️</h2>

<p>There’s a hidden easter egg in the theme. Try typing <code class="language-plaintext highlighter-rouge">A</code>, <code class="language-plaintext highlighter-rouge">B</code>, <code class="language-plaintext highlighter-rouge">↑</code>, <code class="language-plaintext highlighter-rouge">↑</code>, <code class="language-plaintext highlighter-rouge">↓</code>, <code class="language-plaintext highlighter-rouge">A</code>, <code class="language-plaintext highlighter-rouge">B</code> using your keyboard…</p>

<p><em>(hint: it’s related to the color of everything)</em></p>]]></content><author><name>Player One</name><email>player@example.com</email></author><category term="design" /><category term="retro" /><category term="getting-started" /><summary type="html"><![CDATA[An 8-bit pixel art Jekyll theme with CRT scanlines, boot sequence, HP progress bar, and Press Start 2P font.]]></summary></entry></feed>