Changelog

Changelog

What’s new

Every release, with the new features, the changes and the fixes.

  1. v3.0.0 Latest

    • Added Design styles: switch the whole look with one data-spruce-style attribute.
    • Added Built-in dark mode that can follow the system preference.
    • Changed The form controls use block-size instead of height.
    • Fixed The select icon in right-to-left layouts.

    Release notes for v3.0.0

  2. v2.4.0

    • Added The layout-cluster() mixin.
    • Deprecated The $btn-font-family variable; use the $btn map.

    Release notes for v2.4.0

  3. v2.3.1

    • Fixed The focus ring of the outline buttons in Safari.
    • Security Updated the build dependencies.

    Release notes for v2.3.1

@use 'sprucecss/scss/spruce' as *;

.changelog-block {
  padding-block: spacer-clamp('xl', 'xxl');

  &__inner {
    align-items: start;
    display: grid;
    gap: spacer-clamp('l', 'xl');

    @include breakpoint('lg') {
      grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
    }
  }

  &__main {
    display: flex;
    flex-direction: column;
    gap: spacer('l');
  }

  &__aside {
    @include layout-stack('m');

    @include breakpoint('lg') {
      inset-block-start: spacer('l');
      position: sticky;
    }

    // The sidebar is narrow, so the newsletter stays one column.
    .newsletter {
      grid-template-columns: minmax(0, 1fr);
    }

    .newsletter__title {
      font-size: font-size('h4');
    }
  }

  &__links {
    list-style: none;
    padding: 0;
    @include layout-stack('xs');

    a {
      align-items: center;
      color: color('heading');
      display: inline-flex;
      font-weight: 600;
      gap: spacer('xs');
      text-decoration: none;

      &:hover {
        color: color('primary');
        text-decoration: underline;
      }
    }

    svg {
      block-size: 1.15rem;
      inline-size: 1.15rem;
    }
  }
}
<section class="changelog-block" aria-labelledby="changelog-block-title">
    <div class="container">
        <div class="changelog-block__inner">
            <div class="changelog-block__main">
                <header class="block-heading block-heading--start">
                    <p class="block-heading__eyebrow">Changelog</p>
                    <h2 class="block-heading__title" id="changelog-block-title">What’s new</h2>
                    <p class="block-heading__text">Every release, with the new features, the changes and the fixes.</p>
                </header>
                <ol class="l-changelog" reversed>
                    <li class="l-changelog__item" aria-labelledby="release-v3-0-0">
                        <time class="l-changelog__date" datetime="2026-10-01">Oct 1, 2026</time>
                        <div class="l-changelog__body">
                            <h2 class="l-changelog__title" id="release-v3-0-0">v3.0.0 <span class="l-changelog__latest">Latest</span></h2>
                            <ul class="l-changelog__list">
                                <li><span class="l-changelog__tag l-changelog__tag--added">Added</span> Design styles: switch the whole look with one <code>data-spruce-style</code> attribute.</li>
                                <li><span class="l-changelog__tag l-changelog__tag--added">Added</span> Built-in dark mode that can follow the system preference.</li>
                                <li><span class="l-changelog__tag l-changelog__tag--changed">Changed</span> The form controls use <code>block-size</code> instead of <code>height</code>.</li>
                                <li><span class="l-changelog__tag l-changelog__tag--fixed">Fixed</span> The select icon in right-to-left layouts.</li>
                            </ul>
                            <p class="l-changelog__more"><a class="l-changelog__link" href="#">Release notes for v3.0.0</a></p>
                        </div>
                    </li>
                    <li class="l-changelog__item" aria-labelledby="release-v2-4-0">
                        <time class="l-changelog__date" datetime="2026-03-12">Mar 12, 2026</time>
                        <div class="l-changelog__body">
                            <h2 class="l-changelog__title" id="release-v2-4-0">v2.4.0</h2>
                            <ul class="l-changelog__list">
                                <li><span class="l-changelog__tag l-changelog__tag--added">Added</span> The <code>layout-cluster()</code> mixin.</li>
                                <li><span class="l-changelog__tag l-changelog__tag--deprecated">Deprecated</span> The <code>$btn-font-family</code> variable; use the <code>$btn</code> map.</li>
                            </ul>
                            <p class="l-changelog__more"><a class="l-changelog__link" href="#">Release notes for v2.4.0</a></p>
                        </div>
                    </li>
                    <li class="l-changelog__item" aria-labelledby="release-v2-3-1">
                        <time class="l-changelog__date" datetime="2025-11-03">Nov 3, 2025</time>
                        <div class="l-changelog__body">
                            <h2 class="l-changelog__title" id="release-v2-3-1">v2.3.1</h2>
                            <ul class="l-changelog__list">
                                <li><span class="l-changelog__tag l-changelog__tag--fixed">Fixed</span> The focus ring of the outline buttons in Safari.</li>
                                <li><span class="l-changelog__tag l-changelog__tag--security">Security</span> Updated the build dependencies.</li>
                            </ul>
                            <p class="l-changelog__more"><a class="l-changelog__link" href="#">Release notes for v2.3.1</a></p>
                        </div>
                    </li>
                </ol>
            </div>
            <aside class="changelog-block__aside" aria-label="Follow the updates">
                <section class="newsletter" aria-labelledby="newsletter-title">
                    <div class="newsletter__content">
                        <h2 class="newsletter__title" id="newsletter-title">Stay in the loop</h2>
                        <p class="newsletter__text">Monthly notes about CSS, Sass and design systems. No spam, unsubscribe anytime.</p>
                    </div>
                    <form class="newsletter__form" onsubmit="return false;">
                        <label class="sr-only" for="newsletter-email">Email address</label>
                        <input class="form-control" id="newsletter-email" type="email" placeholder="you@example.com" autocomplete="email" required>
                        <button class="btn btn--primary" type="submit">Subscribe</button>
                        <label class="form-check newsletter__consent" for="newsletter-consent">
                            <input class="form-check__control" id="newsletter-consent" name="consent" type="checkbox" required>
                            <span class="form-label form-check__label">I agree to receive the newsletter and accept the <a href="#">privacy policy</a>. Unsubscribe anytime.</span>
                        </label>
                    </form>
                </section>
                <ul class="changelog-block__links" role="list">
                    <li><a href="/changelog/feed.xml">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>
                        RSS feed
                    </a></li>
                    <li><a href="#">
                        <svg class="changelog-block__brand" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
                        <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
                        </svg>
                        Releases on GitHub
                    </a></li>
                </ul>
            </aside>
        </div>
    </div>
</section>

Changelog

On this page

A changelog page block: the releases on the left, and the ways to follow the updates (newsletter, RSS, GitHub) in a sticky sidebar.

Technical Details

  • It combines the Block Heading, the Changelog list and the Newsletter form, plus the GitHub mark from the shared brand icons.
  • The sidebar is an aside labeled "Follow the updates", and it's sticky from the lg breakpoint, so the signup stays in view while scrolling through long release notes.
  • Link the RSS feed in the head too (<link rel="alternate" type="application/rss+xml">), so feed readers find it.
  • Override the heading and the feed URL with changelogBlock; the releases come from the Changelog component.

Documentation

Learn about Spruce CSS through our extensive documentation.

Components

Explore our UI library of accessible components built with Spruce CSS.

Blocks and Pages

Full-width page blocks and complete page templates, ready to copy.

Find us on GitHub

Did you find a bug? Have an idea or a question? Please open an issue to help us develop the project.