<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>DevLab</title>
    <subtitle>A Zola theme for project pages, blogs, documentation and books.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://ripetitor.codeberg.page/devlab-theme/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-06T00:00:00+00:00</updated>
    <id>https://ripetitor.codeberg.page/devlab-theme/atom.xml</id>
    <entry xml:lang="en">
        <title>DevLab v0.9.0: layouts, collections and extension slots</title>
        <published>2026-10-02T00:00:00+00:00</published>
        <updated>2026-10-06T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-9-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-9-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-9-0/">&lt;p&gt;DevLab v0.9.0 lets a project combine a landing page, blog, several manuals and
a book in one Zola site. Layouts are selected in content front matter, reading
roots are registered in configuration, and template slots let a site replace
individual parts of the interface.&lt;/p&gt;
&lt;h2 id=&quot;layouts-follow-content-settings&quot;&gt;Layouts follow content settings&lt;a class=&quot;zola-anchor&quot; href=&quot;#layouts-follow-content-settings&quot; aria-label=&quot;Anchor link for: layouts-follow-content-settings&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The theme provides ordinary page and section layouts, dated articles,
documentation, Reader, landing pages and downloads. Zola&#39;s &lt;code&gt;template&lt;/code&gt; selects
a layout. A section&#39;s &lt;code&gt;page_template&lt;/code&gt; applies recursively to its descendants.
A closer section or a page can override it.&lt;/p&gt;
&lt;p&gt;A URL no longer implies a layout. A page under &lt;code&gt;content/manual/&lt;/code&gt; can use
&lt;code&gt;page.html&lt;/code&gt; without receiving a documentation shell. A post outside the blog
directory can use &lt;code&gt;blog-page.html&lt;/code&gt; and receive article metadata and a TOC.
Custom layouts declare their context in the &lt;code&gt;layout_context&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/architecture/&quot;&gt;Site architecture&lt;/a&gt; explains the content model,
layout selection and ownership of site files.&lt;/p&gt;
&lt;h2 id=&quot;landing-pages-use-ordered-blocks&quot;&gt;Landing pages use ordered blocks&lt;a class=&quot;zola-anchor&quot; href=&quot;#landing-pages-use-ordered-blocks&quot; aria-label=&quot;Anchor link for: landing-pages-use-ordered-blocks&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A landing page now reads an array of blocks. Authors choose their order and
can repeat feature or content sections. The built-in types are &lt;code&gt;hero&lt;/code&gt;,
&lt;code&gt;features&lt;/code&gt;, &lt;code&gt;learn&lt;/code&gt;, &lt;code&gt;workflow&lt;/code&gt;, &lt;code&gt;cta&lt;/code&gt; and &lt;code&gt;content&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For example, in &lt;code&gt;content/product.md&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Acme&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Tools for inspecting build logs.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;landing.html&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;home&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;blocks&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;hero&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; actions&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; label&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Read the manual&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/manual/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;features&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Tools&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; items&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Log search&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; description&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Find failed jobs and related output.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# Installation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;Add &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;the &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;package &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;and &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;configure &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;the &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;log &lt;/span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;directory.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The hero uses the page title and description. The &lt;code&gt;content&lt;/code&gt; block renders its
Markdown body. A hero must come first and can appear only once. Duplicate block
IDs and unknown block types stop the build. A site can add a block type through
&lt;code&gt;partials/landing-block.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/landing/&quot;&gt;Landing blocks&lt;/a&gt; for fields and inheritance.&lt;/p&gt;
&lt;h2 id=&quot;manuals-and-books-have-named-collections&quot;&gt;Manuals and books have named collections&lt;a class=&quot;zola-anchor&quot; href=&quot;#manuals-and-books-have-named-collections&quot; aria-label=&quot;Anchor link for: manuals-and-books-have-named-collections&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A collection identifies a reading root by its content source. For a site with
&lt;code&gt;content/manual/_index.md&lt;/code&gt; and &lt;code&gt;content/api/_index.md&lt;/code&gt;, configuration can contain:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;collections&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;manual&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;manual/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;collections&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;api&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;api/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_toc&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;navigation&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;links&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Home&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; collection&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;manual&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; collection&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;api&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The theme gets each root&#39;s URL and title from Zola. Sidebar, mobile tree,
breadcrumbs and reading links use the active collection. Source ancestry
keeps a page in that collection when the page sets a custom public &lt;code&gt;path&lt;/code&gt;.
The corresponding header link stays active and its sidebar branch stays open.&lt;/p&gt;
&lt;p&gt;Reading options inherit from site defaults, then the collection, ancestor
sections and current content. &lt;code&gt;page_actions&lt;/code&gt; merges individual fields, so a
local Copy link setting preserves the inherited Edit URL. Arrays replace the
previous array.&lt;/p&gt;
&lt;p&gt;Curated navigation selects distinct branches within the collection. Foreign,
duplicate and overlapping entries fail the build. Catalog pages show one
level of content in both automatic and curated modes: direct pages and links
to child sections.&lt;/p&gt;
&lt;p&gt;Navigation also accepts text dividers such as &lt;code&gt;{ label = &quot;Applications&quot; }&lt;/code&gt;.
An optional &lt;code&gt;translations&lt;/code&gt; map supplies labels for other languages. Dividers
appear in the desktop sidebar and mobile Docs menu, without links, toggles or
keyboard focus. They do not create pages or affect Previous/Next links. A group
with no sections in the active language is omitted.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/collections/&quot;&gt;Collections&lt;/a&gt; and
&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/navigation/&quot;&gt;Docs navigation&lt;/a&gt; describe the configuration.&lt;/p&gt;
&lt;h2 id=&quot;reading-navigation-and-page-widths&quot;&gt;Reading navigation and page widths&lt;a class=&quot;zola-anchor&quot; href=&quot;#reading-navigation-and-page-widths&quot; aria-label=&quot;Anchor link for: reading-navigation-and-page-widths&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Active entries in the Docs sidebar and page TOC use text highlighting. Blog
and author post lists use the same centered width as articles. Headings,
descriptions and separators align within that width.&lt;/p&gt;
&lt;p&gt;On the homepage, Blog and Downloads, the header separator appears after
scrolling. Docs and Reader show it immediately. Without JavaScript, the
separator remains visible on every page.&lt;/p&gt;
&lt;h2 id=&quot;reader-keeps-one-chapter-sequence&quot;&gt;Reader keeps one chapter sequence&lt;a class=&quot;zola-anchor&quot; href=&quot;#reader-keeps-one-chapter-sequence&quot; aria-label=&quot;Anchor link for: reader-keeps-one-chapter-sequence&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;reader.html&lt;/code&gt; renders chapter pages and section introductions. One sequence
controls the chapter list and Previous/Next links. By default, it contains the
root introduction, direct pages in Zola order, then subsection introductions
and descendants. Transparent sections contribute their content without adding
an introduction of their own.&lt;/p&gt;
&lt;p&gt;An explicit &lt;code&gt;reading_order&lt;/code&gt; can place introductions and chapters in another
order. Entries must be unique and belong to the book. Missing primary-language
files fail the build. Untranslated entries are omitted from that language&#39;s
sequence. Filenames containing &lt;code&gt;_index&lt;/code&gt; are treated as ordinary chapter files
unless the filename itself starts with &lt;code&gt;_index.&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Reader and Docs include a compact TOC on narrower screens. Edit links remain
available below the content when the desktop panel is hidden. The print
stylesheet removes navigation, announcements and controls, wraps code, and
includes every tab panel with its label. Printing covers
the current chapter. Whole-book PDF and EPUB export are outside this release.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/reader/&quot;&gt;Reader&lt;/a&gt; for a root section, first chapter and
explicit ordering example.&lt;/p&gt;
&lt;h2 id=&quot;small-template-changes-use-slots&quot;&gt;Small template changes use slots&lt;a class=&quot;zola-anchor&quot; href=&quot;#small-template-changes-use-slots&quot; aria-label=&quot;Anchor link for: small-template-changes-use-slots&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sites can replace header brand, navigation or tools separately. Shared page
slots cover headings, extra heading content, metadata and actions. Sidebar,
footer and icon slots cover the remaining common extension points.&lt;/p&gt;
&lt;p&gt;A custom icon added through &lt;code&gt;partials/icon.html&lt;/code&gt; works in content and footer
links. A missing footer icon falls back to the link name. Linked cards use a
heading link, allowing ordinary links in the Markdown body without nested
anchors.&lt;/p&gt;
&lt;p&gt;Base blocks also expose additions to the head, main landmark and body.
&lt;code&gt;layout_scripts&lt;/code&gt; belongs to a layout. &lt;code&gt;extra_scripts&lt;/code&gt; adds site script tags after
theme and layout tags. Use &lt;code&gt;defer&lt;/code&gt; on dependent classic scripts. Theme templates keep ordinary inheritance paths,
so site overrides continue to participate in Zola&#39;s lookup rules.&lt;/p&gt;
&lt;p&gt;CSS tokens control colors, fonts and widths. Overrides loaded after the theme
stylesheet apply in light, dark and system mode. Public slots and component
arguments are listed in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/extensions/&quot;&gt;Extension API&lt;/a&gt;.
&lt;code&gt;partials/devlab/&lt;/code&gt; and &lt;code&gt;components/internal/&lt;/code&gt; contain their implementation.&lt;/p&gt;
&lt;h2 id=&quot;community-cards&quot;&gt;Community cards&lt;a class=&quot;zola-anchor&quot; href=&quot;#community-cards&quot; aria-label=&quot;Anchor link for: community-cards&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;devlab.people&lt;/code&gt; renders a grid of centered profiles with avatars or initials,
names, optional nicknames and social links. Each profile can include a role,
biography and a support action below the card body. Cards use authored records
in the site&#39;s front matter or configuration and require no JavaScript.&lt;/p&gt;
&lt;p&gt;Profile, social and support destinations use the shared route resolver,
including the deployment prefix and active language for local links. A missing
name or incomplete support action stops the build with an explanatory error.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/community/&quot;&gt;Community cards guide&lt;/a&gt; includes a complete
page example. The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/components/people/&quot;&gt;People reference&lt;/a&gt;
lists its fields.&lt;/p&gt;
&lt;h2 id=&quot;bundled-svg-icons&quot;&gt;Bundled SVG icons&lt;a class=&quot;zola-anchor&quot; href=&quot;#bundled-svg-icons&quot; aria-label=&quot;Anchor link for: bundled-svg-icons&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Interface icons use Tabler Icons 3.48.0. Service logos use Simple Icons 16.34.0.
The default header mark and favicon use a terminal symbol. SVG files are
bundled with the theme and inherit the surrounding text color. Their licenses
and source mappings are included in the repository.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/components/icons/#icon-catalog&quot;&gt;icon catalog&lt;/a&gt; shows
every built-in icon. Sites can add their own icons through the existing
&lt;code&gt;partials/icon.html&lt;/code&gt; slot.&lt;/p&gt;
&lt;h2 id=&quot;translations-use-one-interface-catalog&quot;&gt;Translations use one interface catalog&lt;a class=&quot;zola-anchor&quot; href=&quot;#translations-use-one-interface-catalog&quot; aria-label=&quot;Anchor link for: translations-use-one-interface-catalog&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;English, German and Russian interface labels live in &lt;code&gt;theme.toml&lt;/code&gt;. Sites can
override individual keys or add another language. Controls and their accessible
names use the same resolved catalog. Downloads use its nested &lt;code&gt;downloads&lt;/code&gt;
table, with optional overrides from the selected data file.&lt;/p&gt;
&lt;p&gt;Content still needs its own translations. The switcher and &lt;code&gt;hreflang&lt;/code&gt; metadata
link to existing translated pages and sections. Missing translated collection
roots remove that language&#39;s collection link. Zola language configuration also
sets the translated site title, description, taxonomies and search index.&lt;/p&gt;
&lt;p&gt;Search loads the active language&#39;s generated index on first interaction.
German and Russian load the matching stemmer support and language modules
before the index. Other indexed languages can supply ordered plugin paths.
See &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/languages/&quot;&gt;Languages&lt;/a&gt; and
&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/configuration/search/&quot;&gt;Search configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;downloads-share-a-data-format&quot;&gt;Downloads share a data format&lt;a class=&quot;zola-anchor&quot; href=&quot;#downloads-share-a-data-format&quot; aria-label=&quot;Anchor link for: downloads-share-a-data-format&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Single downloads lists one product and its files by release channel. Catalog
lists several products with detail pages, search, support and vendor filters,
sorting and result counts. Both layouts read an explicit TOML data file.&lt;/p&gt;
&lt;p&gt;Product, channel and support IDs are validated during the build. A file becomes
downloadable when its URL is present. Its maturity status does not enable the
link. Preview and planned artifacts can therefore appear before files exist.
Checksum and signature links are optional and require an enabled download.
Each product can replace shared mirrors and override verification fields.
Catalog counts include only enabled files, and download labels distinguish
architecture and version.
The theme does not query release APIs or invent verification files.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/downloads/&quot;&gt;Single downloads&lt;/a&gt;,
&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/download-catalog/&quot;&gt;Catalog&lt;/a&gt; and the
&lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/downloads/&quot;&gt;data reference&lt;/a&gt; cover the two layouts.&lt;/p&gt;
&lt;h2 id=&quot;setup-starts-with-two-site-files&quot;&gt;Setup starts with two site files&lt;a class=&quot;zola-anchor&quot; href=&quot;#setup-starts-with-two-site-files&quot; aria-label=&quot;Anchor link for: setup-starts-with-two-site-files&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The installation guide links a local theme checkout or pins a published
revision. &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/quick-start/&quot;&gt;Quick start&lt;/a&gt; then creates
&lt;code&gt;zola.toml&lt;/code&gt; and &lt;code&gt;content/_index.md&lt;/code&gt;. Search, feeds and specialized layouts are
added when the site needs them. Standalone starter projects are removed.
Examples sit beside the settings or components they explain.&lt;/p&gt;
&lt;p&gt;The supported API is documented directly. Retired configuration keys stop the
build with an upgrade message. The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;v0.8 migration guide&lt;/a&gt;
maps the old homepage and reading settings to blocks and collections. Parallel
label tables and fixed homepage rendering are removed. Current configuration uses ordered landing blocks,
named collections, explicit navigation destinations and the interface catalog.&lt;/p&gt;
&lt;p&gt;A site build requires &lt;strong&gt;Zola 0.23.6 or newer&lt;/strong&gt;. There is no frontend build step.
Copy, tabs and diagrams load on pages that use them. Download layouts load
their shared controls. Static navigation and content remain readable without
JavaScript.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/publishing/&quot;&gt;publishing guide&lt;/a&gt; covers metadata, feeds,
cache settings and host policies.&lt;/p&gt;
&lt;h2 id=&quot;publication-and-release-checks&quot;&gt;Publication and release checks&lt;a class=&quot;zola-anchor&quot; href=&quot;#publication-and-release-checks&quot; aria-label=&quot;Anchor link for: publication-and-release-checks&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Blog lists and articles link to tag archives. Description text takes precedence
in lists, with a plain-text summary fallback. Dated articles link to their
adjacent posts. Author profiles require non-empty names and supply their display
name and role to page metadata.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/blog/&quot;&gt;Blog guide&lt;/a&gt; walks through the first post, authors,
tags and feeds. &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/deployment/&quot;&gt;Deployment&lt;/a&gt; covers uploading
&lt;code&gt;public/&lt;/code&gt; and checking live routes. The release tag is published separately.
Until it exists, the installation guide and Download page provide a repository
checkout. The demo build enables versioned archive URLs only after verifying
that the local and published tag point to the same commit and both archives
are available.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.8.0</title>
        <published>2026-09-19T00:00:00+00:00</published>
        <updated>2026-09-19T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-8-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-8-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-8-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.8.0&lt;/code&gt; is about composition. Authors can build landing sections and plans from reusable Markdown blocks, readers get a table of contents on long posts, and code examples can name the file they belong to. The release also settles the theme&#39;s own layout so sites stop patching it in Sass.&lt;/p&gt;
&lt;p&gt;This release raises the minimum Zola version to &lt;code&gt;0.23.6&lt;/code&gt; and explicitly escapes plain-text component fields when invoked from Markdown. Review overrides that put HTML in titles, labels or profile text: those fields now display it literally. Markdown bodies remain supported. Blog tables of contents are enabled by default. The theme still builds with Zola alone.&lt;/p&gt;
&lt;h2 id=&quot;card-grids&quot;&gt;Card grids&lt;a class=&quot;zola-anchor&quot; href=&quot;#card-grids&quot; aria-label=&quot;Anchor link for: card-grids&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;devlab.cards&lt;/code&gt; arranges &lt;code&gt;devlab.card&lt;/code&gt; children in a responsive grid. A card can link somewhere, carry an icon and a status tag, and hold Markdown:&lt;/p&gt;
&lt;div class=&quot;cards&quot;&gt;
&lt;div class=&quot;card card--link&quot;&gt;
&lt;div class=&quot;card-head&quot;&gt;&lt;span class=&quot;card-icon&quot;&gt;&lt;span class=&quot;content-icon content-icon-md&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M5 12l14 0&quot; /&gt;&lt;path d=&quot;M13 18l6 -6&quot; /&gt;&lt;path d=&quot;M13 6l6 6&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 class=&quot;card-title&quot;&gt;&lt;a class=&quot;card-link&quot; href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;&lt;span class=&quot;card-title-text&quot;&gt;Install&lt;/span&gt;&lt;span class=&quot;card-indicator&quot; aria-hidden=&quot;true&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;card-body&quot;&gt;&lt;p&gt;Pin a release tag and enable the theme in &lt;code&gt;zola.toml&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card card--link&quot;&gt;
&lt;div class=&quot;card-head&quot;&gt;&lt;span class=&quot;card-icon&quot;&gt;&lt;span class=&quot;content-icon content-icon-md&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M5 4h4l3 3h7a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 class=&quot;card-title&quot;&gt;&lt;a class=&quot;card-link&quot; href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/content-components/&quot;&gt;&lt;span class=&quot;card-title-text&quot;&gt;Content components&lt;/span&gt;&lt;span class=&quot;card-indicator&quot; aria-hidden=&quot;true&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;card-body&quot;&gt;&lt;p&gt;Recipes for card grids, timelines and overview icons.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card card--link card--external&quot;&gt;
&lt;div class=&quot;card-head&quot;&gt;&lt;span class=&quot;card-icon&quot;&gt;&lt;span class=&quot;content-icon content-icon-md&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M11.999.747A11.974 11.974 0 0 0 0 12.75c0 2.254.635 4.465 1.833 6.376L11.837 6.19c.072-.092.251-.092.323 0l4.178 5.402h-2.992l.065.239h3.113l.882 1.138h-3.674l.103.374h3.86l.777 1.003h-4.358l.135.483h4.593l.695.894h-5.038l.165.589h5.326l.609.785h-5.717l.182.65h6.038l.562.727h-6.397l.183.65h6.717A12.003 12.003 0 0 0 24 12.75 11.977 11.977 0 0 0 11.999.747zm3.654 19.104.182.65h5.326c.173-.204.353-.433.513-.65zm.385 1.377.18.65h3.563c.233-.198.485-.428.712-.65zm.383 1.377.182.648h1.203c.356-.204.685-.412 1.042-.648zz&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;content-badge content-badge-neutral&quot; dir=&quot;auto&quot;&gt;External&lt;/span&gt;&lt;/div&gt;
&lt;h3 class=&quot;card-title&quot;&gt;&lt;a class=&quot;card-link&quot; href=&quot;https://codeberg.org/RiPetitor/devlab-theme&quot;&gt;&lt;span class=&quot;card-title-text&quot;&gt;Codeberg&lt;/span&gt;&lt;span class=&quot;card-indicator&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6&quot; /&gt;&lt;path d=&quot;M11 13l9 -9&quot; /&gt;&lt;path d=&quot;M15 4h5v5&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;card-body&quot;&gt;&lt;p&gt;Source code, issues and release tags.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A linked card adds a trailing arrow, an absolute HTTP(S) destination switches it to the external-link marker, and a static card omits the arrow entirely. Docs overview cards gained the same icon slot through an optional &lt;code&gt;[extra] icon&lt;/code&gt; in section or page front matter, so a documentation landing page no longer needs hand-written markup.&lt;/p&gt;
&lt;h2 id=&quot;status-timelines&quot;&gt;Status timelines&lt;a class=&quot;zola-anchor&quot; href=&quot;#status-timelines&quot; aria-label=&quot;Anchor link for: status-timelines&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;devlab.timeline&lt;/code&gt; presents a plan as ordered stages. Each stage declares a &lt;code&gt;status&lt;/code&gt; and can add a date and a custom label:&lt;/p&gt;
&lt;ol class=&quot;timeline&quot;&gt;
&lt;li class=&quot;timeline-item timeline-item--done&quot;&gt;&lt;span class=&quot;timeline-marker&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;div class=&quot;timeline-content&quot;&gt;&lt;p class=&quot;timeline-meta&quot;&gt;&lt;span class=&quot;content-badge content-badge-success&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;timeline-date&quot; dir=&quot;ltr&quot;&gt;2026-08&lt;/span&gt;&lt;/p&gt;&lt;h3 class=&quot;timeline-title&quot;&gt;Bring-up&lt;/h3&gt;&lt;div class=&quot;timeline-body&quot;&gt;&lt;p&gt;UART, bootloader, kernel, Device Tree and internal storage.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;timeline-item timeline-item--active&quot;&gt;&lt;span class=&quot;timeline-marker&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;div class=&quot;timeline-content&quot;&gt;&lt;p class=&quot;timeline-meta&quot;&gt;&lt;span class=&quot;content-badge content-badge-info&quot;&gt;In progress&lt;/span&gt;&lt;span class=&quot;timeline-date&quot; dir=&quot;ltr&quot;&gt;2026-09&lt;/span&gt;&lt;/p&gt;&lt;h3 class=&quot;timeline-title&quot;&gt;Hardware validation&lt;/h3&gt;&lt;div class=&quot;timeline-body&quot;&gt;&lt;p&gt;Network, USB, wireless, display, audio and sensors.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;timeline-item timeline-item--planned&quot;&gt;&lt;span class=&quot;timeline-marker&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;div class=&quot;timeline-content&quot;&gt;&lt;p class=&quot;timeline-meta&quot;&gt;&lt;span class=&quot;content-badge content-badge-neutral&quot;&gt;Planned&lt;/span&gt;&lt;span class=&quot;timeline-date&quot; dir=&quot;ltr&quot;&gt;Q4 2026&lt;/span&gt;&lt;/p&gt;&lt;h3 class=&quot;timeline-title&quot;&gt;Preview&lt;/h3&gt;&lt;div class=&quot;timeline-body&quot;&gt;&lt;p&gt;Test image with known limitations and pinned component versions.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;timeline-item timeline-item--planned&quot;&gt;&lt;span class=&quot;timeline-marker&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;div class=&quot;timeline-content&quot;&gt;&lt;p class=&quot;timeline-meta&quot;&gt;&lt;span class=&quot;content-badge content-badge-neutral&quot;&gt;Release&lt;/span&gt;&lt;/p&gt;&lt;h3 class=&quot;timeline-title&quot;&gt;Supported&lt;/h3&gt;&lt;div class=&quot;timeline-body&quot;&gt;&lt;p&gt;Regression matrix on a release candidate before the stable release.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Supported statuses are &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;planned&lt;/code&gt; and &lt;code&gt;blocked&lt;/code&gt;. An unknown value falls back to &lt;code&gt;planned&lt;/code&gt;. The state is carried by the badge text as well as the marker colour, so a plan still reads without colour.&lt;/p&gt;
&lt;h2 id=&quot;blog-tables-of-contents&quot;&gt;Blog tables of contents&lt;a class=&quot;zola-anchor&quot; href=&quot;#blog-tables-of-contents&quot; aria-label=&quot;Anchor link for: blog-tables-of-contents&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Long posts now render a table of contents. On wide screens the article stays centered and the scrollable table of contents sits at the viewport edge. Below that width it collapses into a disclosure above the body. Both versions highlight the current section as the reader scrolls.&lt;/p&gt;
&lt;p&gt;The Blog also uses a wider canvas than before, which puts that space to work without stretching the reading measure. Set &lt;code&gt;devlab.blog.show_toc = false&lt;/code&gt; to publish posts without a table of contents. Posts with fewer than two headings stay unchanged.&lt;/p&gt;
&lt;h2 id=&quot;code-blocks-that-name-their-file&quot;&gt;Code blocks that name their file&lt;a class=&quot;zola-anchor&quot; href=&quot;#code-blocks-that-name-their-file&quot; aria-label=&quot;Anchor link for: code-blocks-that-name-their-file&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Zola already carries the &lt;code&gt;name&lt;/code&gt; annotation of a fenced block into the rendered HTML. DevLab now shows it as the block title and demotes the language to a supporting chip:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot; data-name=&quot;build.sh&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: light-dark(#1B1F234D, #444D56);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;make&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;nproc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The toolbar reads the caption from Zola&#39;s &lt;code&gt;data-name&lt;/code&gt; attribute and keeps it outside the copied source. The toolbar also prints readable language labels, which turns Zola&#39;s internal syntax names into &lt;code&gt;Shell&lt;/code&gt;, &lt;code&gt;Text&lt;/code&gt; and similar.&lt;/p&gt;
&lt;p&gt;Syntax colors now follow the code block&#39;s own &lt;code&gt;--color-pre-scheme&lt;/code&gt; token. A site can use dark code blocks on a light page without getting light-theme syntax colors on the dark background. Set this token alongside &lt;code&gt;--color-pre-bg&lt;/code&gt; and &lt;code&gt;--color-pre-fg&lt;/code&gt; in custom palettes.&lt;/p&gt;
&lt;h2 id=&quot;navigation-and-feed-fixes&quot;&gt;Navigation and feed fixes&lt;a class=&quot;zola-anchor&quot; href=&quot;#navigation-and-feed-fixes&quot; aria-label=&quot;Anchor link for: navigation-and-feed-fixes&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Nested Docs navigation, breadcrumbs and previous/next links now preserve the current language. Blog author links use Zola&#39;s taxonomy URLs, including author names with spaces. Feed discovery follows &lt;code&gt;feed_filenames&lt;/code&gt;, and author feed links use the first configured file with an accessible, configurable label.&lt;/p&gt;
&lt;h2 id=&quot;footer-links-with-names&quot;&gt;Footer links with names&lt;a class=&quot;zola-anchor&quot; href=&quot;#footer-links-with-names&quot; aria-label=&quot;Anchor link for: footer-links-with-names&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Footer links used to collapse to an icon whenever one was configured. &lt;code&gt;devlab.footer.show_link_names = true&lt;/code&gt; renders every link as its icon plus the visible name and shows the configured group label as a heading. The compact footer in the Docs sidebar and mobile panel follows the same setting, and icon-only links remain the default.&lt;/p&gt;
&lt;h2 id=&quot;content-media-and-narrow-tables&quot;&gt;Content media and narrow tables&lt;a class=&quot;zola-anchor&quot; href=&quot;#content-media-and-narrow-tables&quot; aria-label=&quot;Anchor link for: content-media-and-narrow-tables&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Content images had no theme rules at all: an oversized image could leave the column. Images are now constrained to the content width, figure images and captions are styled, and table cells tighten on narrow screens next to the existing horizontal scroll. The theme also ships a &lt;code&gt;visually-hidden&lt;/code&gt; utility.&lt;/p&gt;
&lt;h2 id=&quot;a-quieter-default&quot;&gt;A quieter default&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-quieter-default&quot; aria-label=&quot;Anchor link for: a-quieter-default&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The release also removes rough edges that consumer sites were working around in their own Sass:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A callout keeps the author&#39;s title casing instead of capitalizing every word, and an unknown &lt;code&gt;type&lt;/code&gt; falls back to &lt;code&gt;info&lt;/code&gt; with a readable label.&lt;/li&gt;
&lt;li&gt;Docs pages without headings no longer reserve an empty table of contents column.&lt;/li&gt;
&lt;li&gt;Docs overview cards use the full content column instead of stopping at a fixed width, and step lists keep their spacing against the following block.&lt;/li&gt;
&lt;li&gt;Blog article titles no longer break at a narrow character limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your site patched any of these, the override can go.&lt;/p&gt;
&lt;h2 id=&quot;previously-on-the-development-branch&quot;&gt;Previously on the development branch&lt;a class=&quot;zola-anchor&quot; href=&quot;#previously-on-the-development-branch&quot; aria-label=&quot;Anchor link for: previously-on-the-development-branch&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Three features that were available only on &lt;code&gt;main&lt;/code&gt; now ship in a tagged release: the dismissible &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/announcements/&quot;&gt;announcement banner&lt;/a&gt;, reusable &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/community/&quot;&gt;community cards&lt;/a&gt; and &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/blog-authors/&quot;&gt;Blog author profiles&lt;/a&gt;. Sites that waited for a tag can adopt them without tracking the development branch.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-7-0&quot;&gt;Upgrading from v0.7.0&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-7-0&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-7-0&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update the pinned theme tag to &lt;code&gt;v0.8.0&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt; after the tag is published.&lt;/li&gt;
&lt;li&gt;Upgrade Zola to &lt;code&gt;0.23.6&lt;/code&gt; or newer. Review component overrides: titles, labels and profile text are plain text, while component bodies can still contain Markdown.&lt;/li&gt;
&lt;li&gt;Posts with at least two headings now render a table of contents. Set &lt;code&gt;devlab.blog.show_toc = false&lt;/code&gt; to opt out.&lt;/li&gt;
&lt;li&gt;Review footer links. Icon-only links are unchanged. Enable &lt;code&gt;show_link_names&lt;/code&gt; only when the labels should be visible.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;name=&lt;/code&gt; to fenced blocks whose file or path matters at a glance. Existing blocks render as before.&lt;/li&gt;
&lt;li&gt;Remove site-owned Sass that duplicates content images, figure captions, narrow tables, callout casing, the Docs table of contents or Blog title width.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;, then inspect the new components at a narrow viewport and with a keyboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The complete component contracts live in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/components/&quot;&gt;Tera components&lt;/a&gt;, the new recipes in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/content-components/&quot;&gt;Content components&lt;/a&gt;, and every setting in the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/configuration/&quot;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.8.0&lt;/code&gt; requires Zola &lt;code&gt;0.23.6&lt;/code&gt; or newer. Theme consumers still build with Zola alone: Node.js and npm are not runtime or site-build requirements, and the bundled diagram renderer does not depend on a remote service.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.7.0</title>
        <published>2026-09-01T00:00:00+00:00</published>
        <updated>2026-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-7-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-7-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-7-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.7.0&lt;/code&gt; focuses on the daily work around technical content. Maintainers can connect a Docs page to its source, writers gain reusable structures for commands and architecture, and readers get clearer code examples without adding a frontend build step to the site.&lt;/p&gt;
&lt;p&gt;The new features are additive. Existing &lt;code&gt;v0.6.0&lt;/code&gt; content continues to render, page provenance remains opt-in and pages that do not use diagrams do not download the diagram renderer.&lt;/p&gt;
&lt;h2 id=&quot;documentation-connected-to-its-source&quot;&gt;Documentation connected to its source&lt;a class=&quot;zola-anchor&quot; href=&quot;#documentation-connected-to-its-source&quot; aria-label=&quot;Anchor link for: documentation-connected-to-its-source&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Docs pages can now show an authored update date, copy their current URL and link directly to contribution or issue workflows:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;page_actions&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_last_updated&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_copy_link&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;edit_url&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;https://codeberg.org/acme/project/_edit/main/content/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;report_url&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;https://codeberg.org/acme/project/issues/new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date_format&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;%Y-%m-%d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The update date is rendered only when a page defines Zola&#39;s native &lt;code&gt;updated&lt;/code&gt; field. DevLab does not substitute a build timestamp or publication date. The edit link appends the real source-relative path, while the icon-only Copy link control preserves an active heading fragment when the Clipboard API is available. Editing lives beside the table of contents on wide screens, and the feedback destination closes the article as a dedicated discussion card.&lt;/p&gt;
&lt;p&gt;Every action can be enabled independently. Omitting the complete table keeps the previous page footer unchanged.&lt;/p&gt;
&lt;h2 id=&quot;commands-that-keep-their-context&quot;&gt;Commands that keep their context&lt;a class=&quot;zola-anchor&quot; href=&quot;#commands-that-keep-their-context&quot; aria-label=&quot;Anchor link for: commands-that-keep-their-context&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Tabs now support an optional synchronization key. Groups sharing the key remember the selected value and update together, which is useful when one guide repeats operating-system, package-manager or deployment choices.&lt;/p&gt;
&lt;div
  class=&quot;content-tabs&quot;
  data-content-tabs
  data-tabs-label=&quot;Preview command&quot;
  data-tabs-sync=&quot;release-shell&quot;
&gt;
&lt;section
  class=&quot;content-tab-panel&quot;
  data-content-tab
  data-tab-name=&quot;Unix&quot;
  data-tab-value=&quot;unix&quot;
  data-tab-selected=&quot;true&quot;
&gt;
  &lt;p class=&quot;content-tab-fallback-label&quot; data-tab-fallback-label&gt;Unix&lt;/p&gt;
  &lt;div class=&quot;content-tab-body&quot;&gt;
    &lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;zola&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;section
  class=&quot;content-tab-panel&quot;
  data-content-tab
  data-tab-name=&quot;Windows&quot;
  data-tab-value=&quot;windows&quot;
  data-tab-selected=&quot;false&quot;
&gt;
  &lt;p class=&quot;content-tab-fallback-label&quot; data-tab-fallback-label&gt;Windows&lt;/p&gt;
  &lt;div class=&quot;content-tab-body&quot;&gt;
    &lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;zola.exe&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;p&gt;Without JavaScript, every panel remains readable. With enhancement enabled, the control follows the horizontal tabs keyboard pattern, mirrors arrow behavior in RTL layouts and stores only the selected value.&lt;/p&gt;
&lt;h2 id=&quot;project-structure-without-hand-drawn-connectors&quot;&gt;Project structure without hand-drawn connectors&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-structure-without-hand-drawn-connectors&quot; aria-label=&quot;Anchor link for: project-structure-without-hand-drawn-connectors&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The new file-tree components replace fragile ASCII layouts with semantic folders and files. Folders use the browser&#39;s native disclosure control and remain collapsible without JavaScript.&lt;/p&gt;
&lt;figure class=&quot;content-file-tree&quot;&gt;&lt;figcaption class=&quot;file-tree-label&quot; dir=&quot;auto&quot;&gt;Release workspace&lt;/figcaption&gt;&lt;ul class=&quot;file-tree-list&quot;&gt;
&lt;li class=&quot;file-tree-item file-tree-folder&quot;&gt;&lt;details class=&quot;file-tree-folder-details&quot; open&gt;&lt;summary class=&quot;file-tree-row file-tree-folder-row&quot;&gt;&lt;span class=&quot;file-tree-indicator&quot; aria-hidden=&quot;true&quot;&gt;&amp;rsaquo;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M5 4h4l3 3h7a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;devlab-theme&lt;/span&gt;&lt;/summary&gt;&lt;ul class=&quot;file-tree-list file-tree-children&quot;&gt;
&lt;li class=&quot;file-tree-item file-tree-file&quot;&gt;&lt;div class=&quot;file-tree-row file-tree-file-row&quot;&gt;&lt;span class=&quot;file-tree-indicator-spacer&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M14 3v4a1 1 0 0 0 1 1h4&quot; /&gt;&lt;path d=&quot;M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2&quot; /&gt;&lt;path d=&quot;M9 17h6&quot; /&gt;&lt;path d=&quot;M9 13h6&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;theme.toml&lt;/span&gt;&lt;span class=&quot;file-tree-note&quot; dir=&quot;auto&quot;&gt;Release metadata&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;file-tree-item file-tree-folder&quot;&gt;&lt;details class=&quot;file-tree-folder-details&quot; open&gt;&lt;summary class=&quot;file-tree-row file-tree-folder-row&quot;&gt;&lt;span class=&quot;file-tree-indicator&quot; aria-hidden=&quot;true&quot;&gt;&amp;rsaquo;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M5 4h4l3 3h7a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-11a2 2 0 0 1 2 -2&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;content&lt;/span&gt;&lt;/summary&gt;&lt;ul class=&quot;file-tree-list file-tree-children&quot;&gt;
&lt;li class=&quot;file-tree-item file-tree-file&quot;&gt;&lt;div class=&quot;file-tree-row file-tree-file-row&quot;&gt;&lt;span class=&quot;file-tree-indicator-spacer&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M14 3v4a1 1 0 0 0 1 1h4&quot; /&gt;&lt;path d=&quot;M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2&quot; /&gt;&lt;path d=&quot;M9 17h6&quot; /&gt;&lt;path d=&quot;M9 13h6&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;docs&lt;/span&gt;&lt;span class=&quot;file-tree-note&quot; dir=&quot;auto&quot;&gt;Product documentation&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;file-tree-item file-tree-file&quot;&gt;&lt;div class=&quot;file-tree-row file-tree-file-row&quot;&gt;&lt;span class=&quot;file-tree-indicator-spacer&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M14 3v4a1 1 0 0 0 1 1h4&quot; /&gt;&lt;path d=&quot;M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2&quot; /&gt;&lt;path d=&quot;M9 17h6&quot; /&gt;&lt;path d=&quot;M9 13h6&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;blog&lt;/span&gt;&lt;span class=&quot;file-tree-note&quot; dir=&quot;auto&quot;&gt;Release notes&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;
&lt;li class=&quot;file-tree-item file-tree-file&quot;&gt;&lt;div class=&quot;file-tree-row file-tree-file-row&quot;&gt;&lt;span class=&quot;file-tree-indicator-spacer&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M14 3v4a1 1 0 0 0 1 1h4&quot; /&gt;&lt;path d=&quot;M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2&quot; /&gt;&lt;path d=&quot;M9 17h6&quot; /&gt;&lt;path d=&quot;M9 13h6&quot; /&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;span class=&quot;file-tree-name&quot; dir=&quot;auto&quot;&gt;THIRD_PARTY_NOTICES.md&lt;/span&gt;&lt;span class=&quot;file-tree-note&quot; dir=&quot;auto&quot;&gt;Vendored dependency notices&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/figure&gt;
&lt;p&gt;Compact badges complement the tree when a status belongs inside a sentence: Release &lt;span class=&quot;content-badge content-badge-success&quot; dir=&quot;auto&quot;&gt;Stable&lt;/span&gt; API &lt;span class=&quot;content-badge content-badge-info&quot; dir=&quot;auto&quot;&gt;Beta&lt;/span&gt; Migration &lt;span class=&quot;content-badge content-badge-neutral&quot; dir=&quot;auto&quot;&gt;Not required&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Badge text carries the meaning independently of color, and folder or file names use automatic text direction for mixed-language documentation.&lt;/p&gt;
&lt;h2 id=&quot;architecture-as-authored-content&quot;&gt;Architecture as authored content&lt;a class=&quot;zola-anchor&quot; href=&quot;#architecture-as-authored-content&quot; aria-label=&quot;Anchor link for: architecture-as-authored-content&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;devlab.diagram&lt;/code&gt; turns a compact Mermaid-compatible source into a responsive SVG that follows the active DevLab palette:&lt;/p&gt;
&lt;figure class=&quot;content-diagram&quot; data-devlab-diagram data-diagram-state=&quot;loading&quot; data-diagram-source=&quot;CmZsb3djaGFydCBMUgogIHNvdXJjZVsiQXV0aG9yZWQgY29udGVudCJdCiAgY2hlY2tbIlpvbGEgY2hlY2siXQogIGRvY3NbIkRvY3VtZW50YXRpb24iXQogIHJlbGVhc2VbIlRhZ2dlZCByZWxlYXNlIl0KCiAgc291cmNlIC0tPiBjaGVjawogIGNoZWNrIC0tPiBkb2NzCiAgZG9jcyAtLT4gcmVsZWFzZQo=&quot; data-diagram-error=&quot;Diagram could not be rendered.&quot;&gt;&lt;figcaption class=&quot;diagram-caption&quot;&gt;&lt;strong class=&quot;diagram-label&quot; id=&quot;release-authoring-flow-label&quot; dir=&quot;auto&quot;&gt;Release authoring flow&lt;/strong&gt;&lt;span class=&quot;diagram-description&quot; id=&quot;release-authoring-flow-description&quot; dir=&quot;auto&quot;&gt;Source content becomes checked documentation and then a tagged release.&lt;/span&gt;&lt;/figcaption&gt;&lt;div class=&quot;diagram-stage&quot; data-devlab-diagram-stage role=&quot;img&quot; aria-labelledby=&quot;release-authoring-flow-label&quot; aria-describedby=&quot;release-authoring-flow-description&quot; aria-busy=&quot;true&quot;&gt;&lt;/div&gt;&lt;noscript&gt;&lt;style&gt;.content-diagram[data-diagram-state=&quot;loading&quot;] .diagram-stage{display:none}&lt;/style&gt;&lt;p class=&quot;diagram-noscript&quot;&gt;Diagram could not be rendered.&lt;/p&gt;&lt;/noscript&gt;&lt;/figure&gt;
&lt;p&gt;The self-contained renderer is bundled with the theme and makes no font or CDN request. Its cost is isolated to pages that contain a diagram: approximately 1.6 MB minified or 495 KB gzip. The component provides a visible caption, an accessible description and a source fallback when rendering is unavailable.&lt;/p&gt;
&lt;p&gt;Flowcharts, state, sequence, class, ER and XY diagrams are supported. Diagram input should remain trusted, repository-authored content rather than visitor input.&lt;/p&gt;
&lt;h2 id=&quot;code-blocks-with-a-deliberate-hierarchy&quot;&gt;Code blocks with a deliberate hierarchy&lt;a class=&quot;zola-anchor&quot; href=&quot;#code-blocks-with-a-deliberate-hierarchy&quot; aria-label=&quot;Anchor link for: code-blocks-with-a-deliberate-hierarchy&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Fenced code now renders as a composed panel with a language toolbar, an icon-only Copy control, clearer line numbers and a visible highlighted-line treatment. Copy feedback changes the icon while retaining localized accessible labels and a polite live announcement.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: light-dark(#1B1F234D, #444D56);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; release&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: light-dark(#1B1F234D, #444D56);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    check_site&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: light-dark(#F6F8FA, #2B3036);&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: light-dark(#1B1F234D, #444D56);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    publish_tag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: light-dark(#1B1F234D, #444D56);&quot;&gt;4&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Long lines scroll inside the panel instead of widening the page. Only blocks that actually overflow enter the keyboard tab order, and copied text continues to exclude visual line numbers.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-6-0&quot;&gt;Upgrading from v0.6.0&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-6-0&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-6-0&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update the pinned theme tag to &lt;code&gt;v0.7.0&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt; after the tag is published.&lt;/li&gt;
&lt;li&gt;Keep Zola &lt;code&gt;0.23.4&lt;/code&gt;. This release does not change the current Zola target.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;devlab.docs.page_actions&lt;/code&gt; only when the site has real source and feedback destinations.&lt;/li&gt;
&lt;li&gt;Replace hand-written command switches, file trees or architecture drawings gradually. Existing Markdown does not require conversion.&lt;/li&gt;
&lt;li&gt;Review site-owned Sass overrides that target code blocks, Docs page footers or component internals.&lt;/li&gt;
&lt;li&gt;Account for the diagram payload before adding diagrams to frequently visited pages.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;, then inspect interactive components with a keyboard and at a narrow viewport.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The complete syntax and parameter contracts live in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/components/&quot;&gt;Tera components&lt;/a&gt;, while page actions are documented in the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/configuration/reading/#page-provenance-actions&quot;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.7.0&lt;/code&gt; targets Zola &lt;code&gt;0.23.4&lt;/code&gt;. Theme consumers still build with Zola alone: Node.js and npm are not runtime or site-build requirements, and the checked-in diagram renderer does not depend on a remote service.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.6.0</title>
        <published>2026-08-31T00:00:00+00:00</published>
        <updated>2026-10-06T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-6-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-6-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-6-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.6.0&lt;/code&gt; gives the homepage, Docs, Blog and Downloads shared CSS
tokens for typography, spacing and colors. It adds an optional homepage image
and revises the layouts at desktop and mobile widths.&lt;/p&gt;
&lt;p&gt;The release keeps DevLab Zola-native and dependency-free. It does not change the &lt;code&gt;devlab.*&lt;/code&gt; content component syntax or require a content migration from &lt;code&gt;v0.5.0&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;one-visual-foundation&quot;&gt;One visual foundation&lt;a class=&quot;zola-anchor&quot; href=&quot;#one-visual-foundation&quot; aria-label=&quot;Anchor link for: one-visual-foundation&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Typography, spacing, radii, shadows, motion and surface roles now share a compact set of CSS custom properties. Components use the same scale for hierarchy, focus states and interaction feedback in light and dark modes.&lt;/p&gt;
&lt;p&gt;Borders and shadows distinguish raised surfaces. Accent colors identify actions,
current navigation and status.&lt;/p&gt;
&lt;p&gt;For update-safe customization, continue to use the public CSS tokens documented in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/customization/branding/&quot;&gt;Brand and colors&lt;/a&gt; before overriding individual component selectors.&lt;/p&gt;
&lt;h2 id=&quot;optional-homepage-image&quot;&gt;Optional homepage image&lt;a class=&quot;zola-anchor&quot; href=&quot;#optional-homepage-image&quot; aria-label=&quot;Anchor link for: optional-homepage-image&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The wide homepage now has a composed hero, stronger responsive spacing and an optional product preview. Configure the preview in homepage front matter:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;home_layout&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;wide&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;home_hero_image&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/images/project-docs-preview.png&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;home_hero_image_alt&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Project documentation with sidebar navigation and an on-page table of contents.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the image is omitted, the hero returns to a centered text composition. Feature summaries, the learn-more section, workflow and final call to action use the same layout rhythm while remaining independently optional.&lt;/p&gt;
&lt;p&gt;Homepage configuration still works globally or in &lt;code&gt;content/_index.md&lt;/code&gt;. Local values take priority, and an explicitly empty feature array can hide its corresponding card or point collection. See the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/landing/&quot;&gt;homepage configuration reference&lt;/a&gt; for the complete inheritance rules.&lt;/p&gt;
&lt;h2 id=&quot;documentation-built-around-reading&quot;&gt;Documentation built around reading&lt;a class=&quot;zola-anchor&quot; href=&quot;#documentation-built-around-reading&quot; aria-label=&quot;Anchor link for: documentation-built-around-reading&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The Docs overview, sidebar, article hierarchy, table of contents and previous or next navigation now have clearer separation without turning every region into a card. Section identity stays visible, long-form content keeps a comfortable measure and navigation remains useful on smaller screens.&lt;/p&gt;
&lt;p&gt;Breadcrumbs and adjacent-page links continue to follow the same language-aware documentation tree introduced in &lt;code&gt;v0.5.0&lt;/code&gt;. This release changes their presentation, not their routing contract.&lt;/p&gt;
&lt;h2 id=&quot;blog-layout-and-pagination&quot;&gt;Blog layout and pagination&lt;a class=&quot;zola-anchor&quot; href=&quot;#blog-layout-and-pagination&quot; aria-label=&quot;Anchor link for: blog-layout-and-pagination&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The Blog index places metadata in a separate column on larger screens. Titles,
summaries, release badges and article headers use the shared spacing and type
tokens.&lt;/p&gt;
&lt;p&gt;The starter Blog configuration now displays five posts per page:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Blog&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sort_by&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;paginate_by&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;blog.html&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;page_template&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;blog-page.html&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a documented default for new sites, not a forced theme setting. Existing sites keep their own &lt;code&gt;paginate_by&lt;/code&gt; value, and omitting it still renders all posts on one page.&lt;/p&gt;
&lt;h2 id=&quot;downloads-with-a-visible-release-path&quot;&gt;Downloads with a visible release path&lt;a class=&quot;zola-anchor&quot; href=&quot;#downloads-with-a-visible-release-path&quot; aria-label=&quot;Anchor link for: downloads-with-a-visible-release-path&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The Downloads page separates its introduction, status, channels and verification
guidance into successive sections. Each channel retains its own download action.&lt;/p&gt;
&lt;p&gt;Status and verification blocks share the new surface and type scales, and the layout adapts from a broad release overview to a single-column mobile flow. The underlying Downloads configuration remains unchanged.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-5-0&quot;&gt;Upgrading from v0.5.0&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-5-0&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-5-0&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update the pinned theme tag to &lt;code&gt;v0.6.0&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Keep Zola &lt;code&gt;0.23.4&lt;/code&gt;. This release does not change the current Zola target.&lt;/li&gt;
&lt;li&gt;Optionally add &lt;code&gt;home_hero_image&lt;/code&gt; and a meaningful &lt;code&gt;home_hero_image_alt&lt;/code&gt; to a wide homepage.&lt;/li&gt;
&lt;li&gt;Review site-owned Sass and template overrides, especially rules that target homepage, Docs, Blog or Downloads internals.&lt;/li&gt;
&lt;li&gt;Choose the Blog page size explicitly if the new-site example of five posts does not fit the publication.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;, then inspect the four primary surfaces in light, dark and narrow layouts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No authored component syntax migration is required.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.6.0&lt;/code&gt; targets Zola &lt;code&gt;0.23.4&lt;/code&gt;. It has no Node.js, npm or external frontend runtime dependency.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.5.0</title>
        <published>2026-08-21T00:00:00+00:00</published>
        <updated>2026-08-21T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-5-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-5-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-5-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.5.0&lt;/code&gt; brings the documentation interface onto one language-aware routing model and targets Zola &lt;code&gt;0.23.4&lt;/code&gt;. Docs navigation, local links, search and layout direction now follow explicit contracts instead of relying on assumptions that only hold for a single-language site.&lt;/p&gt;
&lt;p&gt;This release does not provide a translation catalog for authored content or every theme-owned string. It supplies the routing, partial-translation and RTL foundations that a multilingual site needs while keeping interface labels configurable through the existing settings.&lt;/p&gt;
&lt;h2 id=&quot;one-language-aware-route-model&quot;&gt;One language-aware route model&lt;a class=&quot;zola-anchor&quot; href=&quot;#one-language-aware-route-model&quot; aria-label=&quot;Anchor link for: one-language-aware-route-model&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Local header, mobile-menu, homepage, CTA, footer, feed and Docs links now resolve for the active Zola language. External URLs, protocol-relative URLs, email and telephone links, fragments and query-only references remain unchanged.&lt;/p&gt;
&lt;p&gt;Docs also handle partial translations deliberately. A missing translated Docs root hides that language&#39;s Docs destinations. When the translated root exists, untranslated curated sectors are skipped, and a Docs destination without any renderable navigation items stays a direct link instead of opening an empty mobile panel. The default-language configuration remains strict, so a missing configured Docs section still stops the build.&lt;/p&gt;
&lt;p&gt;Content components cannot infer a page&#39;s language by themselves. Pass the active language when a card contains a local link that should follow translated routes:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;{%&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;card&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Fast setup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; href&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@/docs/getting-started/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; content_lang&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Open the translated guide.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;{%&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;/&lt;/span&gt;&lt;span&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;card&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;explicit-right-to-left-languages&quot;&gt;Explicit right-to-left languages&lt;a class=&quot;zola-anchor&quot; href=&quot;#explicit-right-to-left-languages&quot; aria-label=&quot;Anchor link for: explicit-right-to-left-languages&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sites can list the active language codes that should render right-to-left:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;i18n&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rtl_languages&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;he&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DevLab sets the document direction from this list. The drawer, header, Docs sidebar, table of contents, overview cards, pagination and content components use logical layout properties and mirror their directional indicators in RTL. Inline and fenced code remain isolated as left-to-right content so technical punctuation keeps its intended order.&lt;/p&gt;
&lt;p&gt;Unlisted languages continue to use &lt;code&gt;ltr&lt;/code&gt;. Codes may name the default language as well as languages configured under Zola&#39;s &lt;code&gt;[languages]&lt;/code&gt; table.&lt;/p&gt;
&lt;h2 id=&quot;docs-navigation-follows-one-scope&quot;&gt;Docs navigation follows one scope&lt;a class=&quot;zola-anchor&quot; href=&quot;#docs-navigation-follows-one-scope&quot; aria-label=&quot;Anchor link for: docs-navigation-follows-one-scope&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;When &lt;code&gt;extra.devlab.docs.navigation&lt;/code&gt; curates the top-level documentation sectors, previous and next links now use that same scope and order. Pages below omitted sectors remain published but no longer reappear through pagination.&lt;/p&gt;
&lt;p&gt;Within each selected sector, navigation follows the content tree depth first: direct pages come before subsection pages. Duplicate page paths are removed in first-occurrence order, preventing repeated or overlapping manifest entries from creating pagination loops. Keep manifest entries unique and non-overlapping anyway, because the sidebar and root catalog render each configured top-level sector. Breadcrumbs continue to represent the real content hierarchy independently of the curated top level.&lt;/p&gt;
&lt;p&gt;Translated Docs roots, nested sections, breadcrumbs, catalogs and pagination now resolve Zola&#39;s language-specific source paths without appending a language suffix twice.&lt;/p&gt;
&lt;h2 id=&quot;an-explicit-search-index-contract&quot;&gt;An explicit search index contract&lt;a class=&quot;zola-anchor&quot; href=&quot;#an-explicit-search-index-contract&quot; aria-label=&quot;Anchor link for: an-explicit-search-index-contract&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab&#39;s bundled search adapter consumes Zola&#39;s JavaScript Elasticlunr index. New and upgraded sites should state that format explicitly:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;build_search_index&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;search&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index_format&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;elasticlunr_javascript&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include_title&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include_description&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include_content&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An explicitly configured incompatible format now hides the search control, omits its scripts and removes search-specific guidance from the 404 page. If the field is absent, search continues to work only while Zola&#39;s active default produces the supported format.&lt;/p&gt;
&lt;h2 id=&quot;current-zola-target&quot;&gt;Current Zola target&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-zola-target&quot; aria-label=&quot;Anchor link for: current-zola-target&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab &lt;code&gt;v0.5.0&lt;/code&gt; targets Zola &lt;code&gt;0.23.4&lt;/code&gt;. The CI build downloads the official GNU archive, verifies its SHA-256 checksum and checks the reported version before building the site. The theme follows the current Zola release rather than promising a compatibility range across older or newer versions.&lt;/p&gt;
&lt;p&gt;No authored component syntax migration is required from &lt;code&gt;v0.4.0&lt;/code&gt;, but the Zola update is required.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-4-0&quot;&gt;Upgrading from v0.4.0&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-4-0&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-4-0&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install Zola &lt;code&gt;0.23.4&lt;/code&gt; and confirm it with &lt;code&gt;zola --version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;search.index_format = &quot;elasticlunr_javascript&quot;&lt;/code&gt; when search is enabled.&lt;/li&gt;
&lt;li&gt;List every active RTL language under &lt;code&gt;extra.devlab.i18n.rtl_languages&lt;/code&gt;. Leave the array empty for an LTR-only site.&lt;/li&gt;
&lt;li&gt;Pass &lt;code&gt;content_lang={lang}&lt;/code&gt; to cards whose local links should follow translated content routes.&lt;/li&gt;
&lt;li&gt;Review curated previous and next links, and keep Docs manifest entries unique and non-overlapping.&lt;/li&gt;
&lt;li&gt;Review site-owned template and Sass overrides that assume physical left or right positioning.&lt;/li&gt;
&lt;li&gt;Update the pinned theme tag to &lt;code&gt;v0.5.0&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;, then inspect Docs navigation, search and local links in every configured language.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sites that remain single-language and left-to-right need no new i18n configuration.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.5.0&lt;/code&gt; targets Zola &lt;code&gt;0.23.4&lt;/code&gt;. It has no Node.js, npm or external frontend runtime dependency.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.4.0</title>
        <published>2026-08-06T00:00:00+00:00</published>
        <updated>2026-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-4-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-4-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-4-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.4.0&lt;/code&gt; moves completely to Zola &lt;code&gt;0.23.1&lt;/code&gt; and Tera 2. It deliberately drops compatibility with earlier Zola versions: the template engine was rewritten, macros disappeared, shortcodes were removed from Zola, and Markdown bodies are now Tera templates before they are rendered as Markdown.&lt;/p&gt;
&lt;p&gt;This is a real breaking release rather than a compatibility shim. In return, the theme now has one component system for layouts and authored content, clearer build failures and less theme-specific syntax.&lt;/p&gt;
&lt;h2 id=&quot;one-global-component-api&quot;&gt;One global component API&lt;a class=&quot;zola-anchor&quot; href=&quot;#one-global-component-api&quot; aria-label=&quot;Anchor link for: one-global-component-api&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;All reusable content now lives in &lt;code&gt;templates/components.html&lt;/code&gt; and uses a namespaced Tera 2 API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devlab.card&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devlab.callout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devlab.details&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devlab.steps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devlab.icon&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Components are registered globally and need no import. Block components accept Markdown bodies:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;{%&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;callout&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;tip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Tera 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;The component body supports **Markdown**.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;{%&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;/&lt;/span&gt;&lt;span&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;callout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inline components use a self-closing tag:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;{{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;devlab&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;.&lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;github&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;GitHub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The complete API and live examples are in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/reference/components/&quot;&gt;Tera components&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;required-content-migration&quot;&gt;Required content migration&lt;a class=&quot;zola-anchor&quot; href=&quot;#required-content-migration&quot; aria-label=&quot;Anchor link for: required-content-migration&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Old shortcode calls do not build on Zola 0.23. Replace them before upgrading:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Before&lt;/th&gt;&lt;th&gt;Now&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;card(...)&lt;/code&gt; / &lt;code&gt;end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.card&lt;/code&gt; block component&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;callout(...)&lt;/code&gt; / &lt;code&gt;end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.callout&lt;/code&gt; block component&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;details(...)&lt;/code&gt; / &lt;code&gt;end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.details&lt;/code&gt; block component&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;steps()&lt;/code&gt; / &lt;code&gt;end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.steps&lt;/code&gt; block component&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;icon(...)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-closing &lt;code&gt;devlab.icon&lt;/code&gt; component&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Zola 0.23 also evaluates Tera inside fenced code blocks. Wrap literal template examples in matching Tera raw/endraw blocks. Files that must never execute Tera can instead be listed under &lt;code&gt;skip_content_templating&lt;/code&gt;, but pages using DevLab components must remain templated.&lt;/p&gt;
&lt;h2 id=&quot;required-template-migration&quot;&gt;Required template migration&lt;a class=&quot;zola-anchor&quot; href=&quot;#required-template-migration&quot; aria-label=&quot;Anchor link for: required-template-migration&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Site-owned overrides must follow the Tera 2 migration rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;replace macro declarations, template imports, and &lt;code&gt;namespace::call()&lt;/code&gt; invocations with components.&lt;/li&gt;
&lt;li&gt;pass named test arguments, such as &lt;code&gt;value is starting_with(pat=&quot;/docs/&quot;)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;replace recursive includes with recursive components.&lt;/li&gt;
&lt;li&gt;use square brackets for array indexes.&lt;/li&gt;
&lt;li&gt;review stricter undefined-value access and renamed or removed filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DevLab&#39;s own recursive Docs navigation, section catalogs, table of contents, pagination helpers, cards, links and icons are all Tera 2 components now. No compatibility macros remain in the theme.&lt;/p&gt;
&lt;h2 id=&quot;language-aware-internals&quot;&gt;Language-aware internals&lt;a class=&quot;zola-anchor&quot; href=&quot;#language-aware-internals&quot; aria-label=&quot;Anchor link for: language-aware-internals&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Content lookups now pass the active &lt;code&gt;lang&lt;/code&gt; to &lt;code&gt;get_page&lt;/code&gt; and &lt;code&gt;get_section&lt;/code&gt;, using the canonical content paths required by Zola 0.23. Search loads &lt;code&gt;search_index.&amp;lt;lang&amp;gt;.js&lt;/code&gt; automatically unless &lt;code&gt;extra.devlab.search.index&lt;/code&gt; explicitly overrides the filename.&lt;/p&gt;
&lt;p&gt;The active Zola language also supplies the document&#39;s &lt;code&gt;lang&lt;/code&gt; attribute. Interface strings remain configurable through the existing label fields. This release does not claim complete translation coverage.&lt;/p&gt;
&lt;h2 id=&quot;cleaner-component-assets&quot;&gt;Cleaner component assets&lt;a class=&quot;zola-anchor&quot; href=&quot;#cleaner-component-assets&quot; aria-label=&quot;Anchor link for: cleaner-component-assets&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;SVG fragments now live under &lt;code&gt;templates/components/icons/&lt;/code&gt;, and every fragment is explicitly excluded from keyboard focus. The public icon component keeps decorative icons hidden from assistive technology and adds an accessible name only when &lt;code&gt;label&lt;/code&gt; is present.&lt;/p&gt;
&lt;p&gt;The CI build downloads the official Zola &lt;code&gt;0.23.1&lt;/code&gt; musl archive and verifies its SHA-256 digest before extraction. Both the theme metadata and documentation now require 0.23.1.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-3-1&quot;&gt;Upgrading from v0.3.1&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-3-1&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-3-1&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install Zola &lt;code&gt;0.23.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Convert every DevLab shortcode call to the matching &lt;code&gt;devlab.*&lt;/code&gt; component.&lt;/li&gt;
&lt;li&gt;Protect literal Tera examples in Markdown with raw blocks.&lt;/li&gt;
&lt;li&gt;Migrate any site-owned template overrides from macros and Tera 1 syntax.&lt;/li&gt;
&lt;li&gt;Update the pinned theme tag to &lt;code&gt;v0.4.0&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and a production &lt;code&gt;zola build&lt;/code&gt; with the site&#39;s real base URL.&lt;/li&gt;
&lt;li&gt;Review Docs navigation, component output, search, feeds and custom overrides.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The upstream breaking changes are documented in the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/getzola/zola/blob/v0.23.1/CHANGELOG.md&quot;&gt;Zola 0.23 changelog&lt;/a&gt; and the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/Keats/tera/blob/master/MIGRATION.md&quot;&gt;Tera 2 migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.4.0&lt;/code&gt; requires Zola &lt;code&gt;0.23.1&lt;/code&gt; or newer. It has no Node.js, npm or external frontend runtime dependency.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.3.1</title>
        <published>2026-07-23T00:00:00+00:00</published>
        <updated>2026-07-23T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-1/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-1/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-1/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.3.1&lt;/code&gt; is a focused follow-up to &lt;code&gt;v0.3.0&lt;/code&gt;. Most of the work happened inside Docs: section landings are easier to scan, navigation controls have one clear purpose and a project can choose which documentation sectors belong in the primary interface.&lt;/p&gt;
&lt;p&gt;The release also tightens the surrounding layout and makes the footer a real customization surface without changing the Zola-native build.&lt;/p&gt;
&lt;h2 id=&quot;documentation-without-synthetic-waypoints&quot;&gt;Documentation without synthetic waypoints&lt;a class=&quot;zola-anchor&quot; href=&quot;#documentation-without-synthetic-waypoints&quot; aria-label=&quot;Anchor link for: documentation-without-synthetic-waypoints&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The global Docs link already opens the documentation landing page, and each section title already has an authored landing of its own. DevLab no longer inserts synthetic links named &lt;code&gt;Overview&lt;/code&gt; between those destinations.&lt;/p&gt;
&lt;p&gt;Section titles are now ordinary landing links. A separate chevron button expands or collapses descendants when they exist. The split keeps navigation concise and gives each control one job: the title navigates, while the chevron discloses.&lt;/p&gt;
&lt;p&gt;Without JavaScript, every descendant remains visible and every landing remains reachable. After initialization, inactive branches collapse, saved open branches keep their state and the branch containing the current page opens so its active link stays in view.&lt;/p&gt;
&lt;h2 id=&quot;curate-the-sectors-derive-the-tree&quot;&gt;Curate the sectors, derive the tree&lt;a class=&quot;zola-anchor&quot; href=&quot;#curate-the-sectors-derive-the-tree&quot; aria-label=&quot;Anchor link for: curate-the-sectors-derive-the-tree&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;extra.devlab.docs.navigation&lt;/code&gt; is a new optional manifest for selecting and ordering the top-level sectors shared by the desktop sidebar, mobile Docs panel and root catalog:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docs&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;docs/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/docs/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;navigation&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;docs/getting-started/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;docs/guides/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; section&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;docs/reference/_index.md&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The manifest names only the top level. Titles, descriptions, links, pages and child sections still come from Zola content, so authors do not maintain a second copy of the complete tree. Omitting the manifest or leaving it empty preserves automatic top-level discovery.&lt;/p&gt;
&lt;p&gt;Landing pages now reveal the hierarchy one level at a time. The Docs root presents the selected sectors, while a sector presents its direct pages and direct child sections as compact cards. Deeper entries stay on their own parent landing instead of flooding every higher-level page. The root introduction remains before its catalog, and authored text after a card group now has enough space to read as a new block.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/navigation/&quot;&gt;Docs navigation&lt;/a&gt; for the complete content and configuration contract.&lt;/p&gt;
&lt;h2 id=&quot;a-stricter-visual-frame&quot;&gt;A stricter visual frame&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-stricter-visual-frame&quot; aria-label=&quot;Anchor link for: a-stricter-visual-frame&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The header, Docs sidebar and table of contents now use one quiet border color to define their areas consistently. The header separator is inset, so the line does not change sticky offsets or add a hidden pixel to the layout.&lt;/p&gt;
&lt;p&gt;Overview entries use smaller responsive cards without decorative arrows. This keeps attention on titles and descriptions and brings dense section pages closer to the restrained visual language used by Hextra without copying its Hugo-specific structure.&lt;/p&gt;
&lt;p&gt;The footer follows the same system. Its copyright stays geometrically centered, while an optional note and project links can occupy the side regions. Narrow screens and compact Docs contexts stack the same content into a centered column.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;footer&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Documentation for the Acme platform.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;links&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Codeberg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;https://codeberg.org/acme/docs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;codeberg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Atom feed&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;/atom.xml&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; icon&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;rss&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For markup beyond the structured fields, a site can replace only &lt;code&gt;partials/footer-content.html&lt;/code&gt;. The theme keeps ownership of the separator, responsive layout and compact mode. The available fields and icon names are documented in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/customization/branding/&quot;&gt;Brand and colors&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;smaller-reliability-improvements&quot;&gt;Smaller reliability improvements&lt;a class=&quot;zola-anchor&quot; href=&quot;#smaller-reliability-improvements&quot; aria-label=&quot;Anchor link for: smaller-reliability-improvements&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Search reports an unavailable state when its library or generated index cannot load, instead of leaving an unhandled failure.&lt;/li&gt;
&lt;li&gt;Generic taxonomy list and term routes now use complete theme layouts.&lt;/li&gt;
&lt;li&gt;Blog dates accept &lt;code&gt;extra.devlab.blog.date_format&lt;/code&gt;, with the existing day-first display retained as the default.&lt;/li&gt;
&lt;li&gt;Docs and navigation scripts load only when their rendered interfaces need them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;upgrading-from-v0-3-0&quot;&gt;Upgrading from v0.3.0&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-3-0&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-3-0&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Most sites can update without moving content or changing their existing &lt;code&gt;extra.devlab.*&lt;/code&gt; configuration. The new Docs manifest, footer fields and Blog date format are opt-in.&lt;/p&gt;
&lt;p&gt;One interface contract changed deliberately: &lt;code&gt;docs_overview_label&lt;/code&gt; is no longer read because generated &lt;code&gt;Overview&lt;/code&gt; links no longer exist. An older configuration can leave the field in place without breaking the build, but it has no effect. Create a real page or section titled &lt;code&gt;Overview&lt;/code&gt; when that destination belongs in the information architecture.&lt;/p&gt;
&lt;p&gt;Review site-owned CSS, copied templates or JavaScript that targets the previous Docs navigation or overview markup. A full &lt;code&gt;partials/footer.html&lt;/code&gt; override still works and must continue to handle &lt;code&gt;footer_compact&lt;/code&gt;. New customizations should prefer the smaller &lt;code&gt;partials/footer-content.html&lt;/code&gt; boundary.&lt;/p&gt;
&lt;p&gt;Before updating a pinned installation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read the changes above and review site-owned Docs or footer overrides.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;v0.3.1&lt;/code&gt; using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check the Docs root, one section landing and one deep page at desktop and mobile widths.&lt;/li&gt;
&lt;li&gt;Verify search, the mobile menu, the footer and both color modes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.3.1&lt;/code&gt; requires Zola &lt;code&gt;0.22.1&lt;/code&gt; or newer. It remains Zola-native and does not require Node.js, npm or an external frontend runtime.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.3.0</title>
        <published>2026-07-18T00:00:00+00:00</published>
        <updated>2026-10-06T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-3-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.3.0&lt;/code&gt; replaces the demo&#39;s flat documentation list with nested
section navigation. It also adds regular page and section layouts, makes
download cards reusable, and documents how site overrides survive theme updates.&lt;/p&gt;
&lt;h2 id=&quot;documentation-that-keeps-its-shape&quot;&gt;Documentation that keeps its shape&lt;a class=&quot;zola-anchor&quot; href=&quot;#documentation-that-keeps-its-shape&quot; aria-label=&quot;Anchor link for: documentation-that-keeps-its-shape&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The Demo documentation now uses the recursive Zola section tree already supported by DevLab instead of presenting its guides as one flat list. Nested groups start closed for a first-time visitor, remember the reader&#39;s choices locally and share that state between the desktop sidebar and mobile Docs panel. The current page keeps its active state without forcing a reader&#39;s closed group back open.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;On this page&lt;/code&gt; follows the same idea. Third-level headings sit below their second-level parent, and scrolling opens the branch that contains the active heading without turning the parent into a non-clickable control.&lt;/p&gt;
&lt;p&gt;The compact footer now belongs at the bottom of Docs navigation, where it remains available without interrupting the article. Breadcrumbs and previous/next links are still rendered by Zola, so essential reading paths do not depend on JavaScript. The complete behavior is described in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/navigation/&quot;&gt;Docs navigation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;room-for-the-rest-of-the-project&quot;&gt;Room for the rest of the project&lt;a class=&quot;zola-anchor&quot; href=&quot;#room-for-the-rest-of-the-project&quot; aria-label=&quot;Anchor link for: room-for-the-rest-of-the-project&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Not every page is documentation or a release post. DevLab now includes regular &lt;code&gt;page.html&lt;/code&gt; and &lt;code&gt;section.html&lt;/code&gt; layouts for project pages, directories and small collections. Generic sections can show their Markdown introduction, child sections, direct pages and pagination without borrowing a Docs or Blog template. See &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/content-layouts/&quot;&gt;Content layouts&lt;/a&gt; for the content model.&lt;/p&gt;
&lt;p&gt;Downloads has also grown from a Demo-specific page into a reusable distribution layout. A project can publish any number of release channels, leave planned artifacts unavailable, add a release summary and link existing checksums or signatures. The front matter contract remains documented in &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/download-cards/&quot;&gt;Download cards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The header mark is now owned by the site. A new installation starts with a text-only brand, while projects that want a mark can use the built-in triangle or provide their own image.&lt;/p&gt;
&lt;h2 id=&quot;fewer-hidden-rules&quot;&gt;Fewer hidden rules&lt;a class=&quot;zola-anchor&quot; href=&quot;#fewer-hidden-rules&quot; aria-label=&quot;Anchor link for: fewer-hidden-rules&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The documentation is now grouped into Getting started, Guides, Customization and Reference. It explains pinned installation and updates, every supported configuration field, CSS tokens, template extension hooks and the maintenance cost of replacing a partial. The goal is to keep project-owned files outside &lt;code&gt;themes/devlab-theme/&lt;/code&gt;, where an update cannot silently overwrite them. Start with the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/customization/&quot;&gt;Customization overview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;README and the project screenshot now show the same interface that the documentation describes, rather than an earlier flat-navigation Demo.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-from-v0-2-1&quot;&gt;Upgrading from v0.2.1&lt;a class=&quot;zola-anchor&quot; href=&quot;#upgrading-from-v0-2-1&quot; aria-label=&quot;Anchor link for: upgrading-from-v0-2-1&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The structured global configuration under &lt;code&gt;extra.devlab.*&lt;/code&gt; remains valid. Most sites can keep their navigation, Docs, Blog, search, appearance, SEO and homepage settings unchanged.&lt;/p&gt;
&lt;p&gt;There are three deliberate changes worth checking before switching the pinned tag.&lt;/p&gt;
&lt;h3 id=&quot;move-downloads-front-matter&quot;&gt;Move Downloads front matter&lt;a class=&quot;zola-anchor&quot; href=&quot;#move-downloads-front-matter&quot; aria-label=&quot;Anchor link for: move-downloads-front-matter&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The earlier flat Downloads fields are no longer read. Release data now belongs to the section-scoped &lt;code&gt;extra.downloads&lt;/code&gt; tables:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;code&gt;v0.2.1&lt;/code&gt; section field&lt;/th&gt;&lt;th&gt;&lt;code&gt;v0.3.0&lt;/code&gt; section field&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.status_label&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.eyebrow&lt;/code&gt; and &lt;code&gt;extra.downloads.status.label&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.channels_label&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.channels_label&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.download_unavailable_label&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.unavailable_label&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.iso_channels&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.channels&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.status_title&lt;/code&gt;, &lt;code&gt;extra.status_description&lt;/code&gt;, &lt;code&gt;extra.status_items&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.status.title&lt;/code&gt;, &lt;code&gt;extra.downloads.status.description&lt;/code&gt;, &lt;code&gt;extra.downloads.status.items&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extra.checksum_label&lt;/code&gt;, &lt;code&gt;extra.checksum_title&lt;/code&gt;, &lt;code&gt;extra.checksum_description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.downloads.verification.label&lt;/code&gt;, &lt;code&gt;extra.downloads.verification.title&lt;/code&gt;, &lt;code&gt;extra.downloads.verification.description&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Channel fields such as &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;button_label&lt;/code&gt; keep their meaning. Verification links are new in &lt;code&gt;v0.3.0&lt;/code&gt;. Status and verification blocks render only when they have a non-empty title, so incomplete data no longer leaves an empty placeholder.&lt;/p&gt;
&lt;p&gt;No compatibility aliases are retained for the old Downloads fields. Move the values before updating the theme.&lt;/p&gt;
&lt;h3 id=&quot;choose-the-header-mark-explicitly&quot;&gt;Choose the header mark explicitly&lt;a class=&quot;zola-anchor&quot; href=&quot;#choose-the-header-mark-explicitly&quot; aria-label=&quot;Anchor link for: choose-the-header-mark-explicitly&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The built-in triangle is no longer shown by default. Add this if the site should keep the previous DevLab mark:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;devlab&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;brand&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_logo_mark&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;logo_mark_path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set &lt;code&gt;logo_mark_path&lt;/code&gt; to a site-owned image for a custom mark, or leave &lt;code&gt;show_logo_mark = false&lt;/code&gt; for the new text-only default.&lt;/p&gt;
&lt;h3 id=&quot;review-site-owned-overrides&quot;&gt;Review site-owned overrides&lt;a class=&quot;zola-anchor&quot; href=&quot;#review-site-owned-overrides&quot; aria-label=&quot;Anchor link for: review-site-owned-overrides&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;On Docs routes, &lt;code&gt;partials/footer.html&lt;/code&gt; is now rendered inside the desktop sidebar and mobile Docs panel with &lt;code&gt;footer_compact = true&lt;/code&gt;, rather than below the article. A site-level footer replacement should support that compact context.&lt;/p&gt;
&lt;p&gt;Also review copied layouts, partials, CSS or JavaScript that depend on the previous Downloads markup, Blog pagination classes, Docs navigation or TOC structure. These implementation details changed even though their public behavior remains familiar.&lt;/p&gt;
&lt;p&gt;The Demo documentation itself moved from a flat list into nested sections without redirects. Saved links to Quick start, Guides or Reference pages may need updating. Consumer sites keep their own content routes and are not required to copy the Demo hierarchy.&lt;/p&gt;
&lt;h2 id=&quot;before-publishing-the-update&quot;&gt;Before publishing the update&lt;a class=&quot;zola-anchor&quot; href=&quot;#before-publishing-the-update&quot; aria-label=&quot;Anchor link for: before-publishing-the-update&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Read the changes above and keep project customizations outside the theme directory.&lt;/li&gt;
&lt;li&gt;Update the pinned theme tag using &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/getting-started/installation/&quot;&gt;Install and update&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;zola check&lt;/code&gt; and &lt;code&gt;zola build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check the routes the site actually enables: Home, Docs, Blog and Downloads.&lt;/li&gt;
&lt;li&gt;On Docs, verify nested groups, remembered state, &lt;code&gt;On this page&lt;/code&gt;, the mobile panel and the compact footer.&lt;/li&gt;
&lt;li&gt;Check search, published and unavailable download actions, and both color modes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sites upgrading from a version older than &lt;code&gt;v0.2.1&lt;/code&gt; should first follow the structured configuration migration in the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-1/&quot;&gt;v0.2.1 release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.3.0&lt;/code&gt; requires Zola &lt;code&gt;0.22.1&lt;/code&gt; or newer. Building a site requires no
Node.js pipeline or external content service.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.2.1</title>
        <published>2026-07-13T18:47:02+05:00</published>
        <updated>2026-07-13T18:47:02+05:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-1/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-1/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-1/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.2.1&lt;/code&gt; tightens the &lt;code&gt;v0.2&lt;/code&gt; foundation with more predictable optional features, safer links and fewer compatibility branches.&lt;/p&gt;
&lt;h2 id=&quot;breaking-configuration-change&quot;&gt;Breaking configuration change&lt;a class=&quot;zola-anchor&quot; href=&quot;#breaking-configuration-change&quot; aria-label=&quot;Anchor link for: breaking-configuration-change&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.2.1&lt;/code&gt; removes the flat configuration aliases retained from &lt;code&gt;0.1.x&lt;/code&gt;. Sites already using &lt;code&gt;extra.devlab.*&lt;/code&gt; require no changes. Sites still using flat fields under &lt;code&gt;[extra]&lt;/code&gt; must update them before upgrading. Otherwise those values are ignored and the affected features use their defaults.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Previous field&lt;/th&gt;&lt;th&gt;Structured field&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;logo_text&lt;/code&gt;, &lt;code&gt;footer_text&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.brand.logo_text&lt;/code&gt;, &lt;code&gt;devlab.brand.footer_text&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nav_links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.navigation.links&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs_section&lt;/code&gt;, &lt;code&gt;docs_path&lt;/code&gt;, &lt;code&gt;get_started_path&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.docs.section&lt;/code&gt;, &lt;code&gt;devlab.docs.path&lt;/code&gt;, &lt;code&gt;devlab.docs.get_started_path&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;blog_path&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.blog.path&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme_default&lt;/code&gt;, &lt;code&gt;theme_toggle&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.appearance.default_mode&lt;/code&gt;, &lt;code&gt;devlab.appearance.show_toggle&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;search_index&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.search.index&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og_image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;devlab.seo.og_image&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Existing &lt;code&gt;home_*&lt;/code&gt; homepage fields, &lt;code&gt;extra.labels&lt;/code&gt; and interface labels remain unchanged.&lt;/p&gt;
&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;a class=&quot;zola-anchor&quot; href=&quot;#highlights&quot; aria-label=&quot;Anchor link for: highlights&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Navigation can be empty or contain only the sections a site actually uses. Search and the color-mode toggle remain independent.&lt;/li&gt;
&lt;li&gt;Docs navigation, overview trees and previous or next links now pass through transparent sections without exposing structural placeholders.&lt;/li&gt;
&lt;li&gt;Mobile anchor targets stay visible below the sticky header, and drawer transitions no longer interfere with focus restoration.&lt;/li&gt;
&lt;li&gt;Internal paths still respect Zola&#39;s base URL, while absolute, protocol-relative, fragment, query, email and telephone links keep their original form.&lt;/li&gt;
&lt;li&gt;Code blocks preserve their layout without JavaScript, including long lines and copy-button spacing.&lt;/li&gt;
&lt;li&gt;Page and section title overrides once again flow into the final document title without duplicating SEO logic.&lt;/li&gt;
&lt;li&gt;Tagged installation examples are pinned to the release, and CI verifies that a release tag matches &lt;code&gt;theme.toml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.2.1&lt;/code&gt; requires Zola &lt;code&gt;0.22.1&lt;/code&gt; or newer and remains fully Zola-native: no Node.js, npm or external frontend runtime is required.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.2.0</title>
        <published>2026-07-13T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-2-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.2.0&lt;/code&gt; establishes the foundation for a maintainable Zola-native documentation theme without adding a frontend toolchain.&lt;/p&gt;
&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;a class=&quot;zola-anchor&quot; href=&quot;#highlights&quot; aria-label=&quot;Anchor link for: highlights&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A calm surface system replaces the experimental liquid-glass treatment.&lt;/li&gt;
&lt;li&gt;The documentation workspace now uses a full-height sidebar, readable article column and compact table of contents.&lt;/li&gt;
&lt;li&gt;Previous and next documentation links are rendered by Zola and work without JavaScript, including across nested sections.&lt;/li&gt;
&lt;li&gt;Mobile navigation manages focus, keeps keyboard navigation inside the drawer and restores focus after closing.&lt;/li&gt;
&lt;li&gt;Search exposes an accessible combobox and listbox contract with live result feedback.&lt;/li&gt;
&lt;li&gt;Template extension hooks allow custom metadata, CSS, scripts and body integrations without copying &lt;code&gt;base.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Structured &lt;code&gt;extra.devlab&lt;/code&gt; settings become the primary configuration contract while &lt;code&gt;0.1.x&lt;/code&gt; flat fields remain supported.&lt;/li&gt;
&lt;li&gt;Blog pagination, release badges and published or updated metadata turn Blog into a practical Updates channel.&lt;/li&gt;
&lt;li&gt;Copy feedback is announced to assistive technology and interface transitions respect reduced-motion preferences.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;a class=&quot;zola-anchor&quot; href=&quot;#compatibility&quot; aria-label=&quot;Anchor link for: compatibility&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Existing &lt;code&gt;0.1.x&lt;/code&gt; configuration continues to work. New sites should use the structured groups documented under &lt;code&gt;extra.devlab&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The DevLab &lt;code&gt;v0.2.0&lt;/code&gt; templates can build with Zola &lt;code&gt;0.22.0&lt;/code&gt; when a site uses &lt;code&gt;config.toml&lt;/code&gt; or passes &lt;code&gt;--config zola.toml&lt;/code&gt; explicitly. This repository and its documentation use &lt;code&gt;zola.toml&lt;/code&gt;, whose automatic discovery starts with Zola &lt;code&gt;0.22.1&lt;/code&gt;. The supported native workflow is therefore Zola &lt;code&gt;0.22.1&lt;/code&gt; or newer: &lt;code&gt;zola check&lt;/code&gt; followed by &lt;code&gt;zola build&lt;/code&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.1.2</title>
        <published>2026-07-04T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-2/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-2/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-2/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.1.2&lt;/code&gt; is a small polish release for page navigation.&lt;/p&gt;
&lt;h2 id=&quot;before&quot;&gt;Before&lt;a class=&quot;zola-anchor&quot; href=&quot;#before&quot; aria-label=&quot;Anchor link for: before&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Blog posts did not show where they belonged, while documentation pages already had breadcrumbs. On mobile, documentation previous/next links also took too much space and stacked into large blocks.&lt;/p&gt;
&lt;h2 id=&quot;after&quot;&gt;After&lt;a class=&quot;zola-anchor&quot; href=&quot;#after&quot; aria-label=&quot;Anchor link for: after&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Breadcrumbs now use one shared template and work for both documentation pages and blog posts.&lt;/p&gt;
&lt;p&gt;Documentation previous/next links are more compact on mobile. They stay readable, but no longer take over the bottom of the page.&lt;/p&gt;
&lt;p&gt;Sites without a blog or without documentation still build normally.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.1.1</title>
        <published>2026-07-03T00:00:00+00:00</published>
        <updated>2026-07-03T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-1/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-1/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-1/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.1.1&lt;/code&gt; is a small hotfix for documentation navigation.&lt;/p&gt;
&lt;h2 id=&quot;before&quot;&gt;Before&lt;a class=&quot;zola-anchor&quot; href=&quot;#before&quot; aria-label=&quot;Anchor link for: before&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Documentation groups had to be listed by hand in section frontmatter. Nested folders could exist in &lt;code&gt;content/docs/&lt;/code&gt;, but the sidebar, breadcrumbs and previous/next links did not understand them as one navigation tree.&lt;/p&gt;
&lt;h2 id=&quot;after&quot;&gt;After&lt;a class=&quot;zola-anchor&quot; href=&quot;#after&quot; aria-label=&quot;Anchor link for: after&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The docs navigation now follows the Zola section structure automatically.&lt;/p&gt;
&lt;p&gt;Create a folder with &lt;code&gt;_index.md&lt;/code&gt;, add pages inside it, and the theme will render it as an expandable group. Nested sections work the same way, and breadcrumbs plus previous/next links follow the same tree.&lt;/p&gt;
&lt;p&gt;No manual page list is needed for regular documentation navigation.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme v0.1.0</title>
        <published>2026-06-30T00:00:00+00:00</published>
        <updated>2026-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-0/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-0/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/devlab-theme-v0-1-0/">&lt;p&gt;This article describes its original release. Configuration examples may use
retired settings. For v0.9, follow the &lt;a href=&quot;https://ripetitor.codeberg.page/devlab-theme/docs/guides/upgrading-v0-8/&quot;&gt;upgrade guide&lt;/a&gt;
and the current reference.&lt;/p&gt;
&lt;p&gt;DevLab Theme &lt;code&gt;v0.1.0&lt;/code&gt; is the first public preview release of a developer-focused Zola theme for documentation sites, technical blogs and project pages.&lt;/p&gt;
&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;a class=&quot;zola-anchor&quot; href=&quot;#highlights&quot; aria-label=&quot;Anchor link for: highlights&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Documentation layout with sidebar, table of contents, breadcrumbs and previous/next navigation&lt;/li&gt;
&lt;li&gt;Blog layout&lt;/li&gt;
&lt;li&gt;Client-side search&lt;/li&gt;
&lt;li&gt;Light, dark and system color modes&lt;/li&gt;
&lt;li&gt;SEO metadata&lt;/li&gt;
&lt;li&gt;Atom feed autodiscovery&lt;/li&gt;
&lt;li&gt;SVG favicon&lt;/li&gt;
&lt;li&gt;Custom 404 page&lt;/li&gt;
&lt;li&gt;Configurable homepage&lt;/li&gt;
&lt;li&gt;Callout and card shortcodes&lt;/li&gt;
&lt;li&gt;Code block headers with copy buttons&lt;/li&gt;
&lt;li&gt;Mobile navigation&lt;/li&gt;
&lt;li&gt;Optional docs and blog sections for clean external Zola sites&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;a class=&quot;zola-anchor&quot; href=&quot;#requirements&quot; aria-label=&quot;Anchor link for: requirements&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zola &lt;code&gt;0.22.0&lt;/code&gt; or newer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Install the theme as a Git submodule:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; submodule&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https://codeberg.org/RiPetitor/devlab-theme&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; themes/devlab-theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; submodule&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-init&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-recursive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable it in your Zola config:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;theme&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;devlab-theme&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;a class=&quot;zola-anchor&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This is an early public release. The theme is suitable for testing, personal documentation sites and small technical projects.&lt;/p&gt;
&lt;p&gt;Planned future work includes additional shortcodes, tags and taxonomies, Mermaid, KaTeX, multilingual support and CI checks.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DevLab Theme 0.0.1 release candidate</title>
        <published>2026-06-06T00:00:00+00:00</published>
        <updated>2026-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>RiPetitor</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ripetitor.codeberg.page/devlab-theme/blog/introducing-devlab-theme/"/>
        <id>https://ripetitor.codeberg.page/devlab-theme/blog/introducing-devlab-theme/</id>
        
        <content type="html" xml:base="https://ripetitor.codeberg.page/devlab-theme/blog/introducing-devlab-theme/">&lt;p&gt;DevLab Theme is a modern Zola theme for developers, documentation sites and technical blogs.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;0.0.1&lt;/code&gt; release candidate turns the project from a local demo into a small theme package that can be installed in a separate Zola site.&lt;/p&gt;
&lt;div class=&quot;callout callout--info&quot;&gt;
  &lt;p class=&quot;callout-title&quot;&gt;Release candidate&lt;/p&gt;
  &lt;p&gt;This version is ready for final validation. Before tagging &lt;code&gt;v0.0.1&lt;/code&gt;, the theme should be checked in this repository and installed once in a clean external Zola site.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-is-included&quot;&gt;What is included&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-included&quot; aria-label=&quot;Anchor link for: what-is-included&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The release candidate focuses on the workflows a documentation theme needs on day one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation layout with desktop sidebar and table of contents&lt;/li&gt;
&lt;li&gt;single mobile menu with a documentation panel&lt;/li&gt;
&lt;li&gt;grouped and collapsible docs navigation&lt;/li&gt;
&lt;li&gt;docs breadcrumbs and previous/next links&lt;/li&gt;
&lt;li&gt;client-side search&lt;/li&gt;
&lt;li&gt;light and dark color modes&lt;/li&gt;
&lt;li&gt;callout and card shortcodes&lt;/li&gt;
&lt;li&gt;code block headers with language labels and copy buttons&lt;/li&gt;
&lt;li&gt;theme metadata, MIT license and fallback &lt;code&gt;[extra]&lt;/code&gt; defaults&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;install-preview&quot;&gt;Install preview&lt;a class=&quot;zola-anchor&quot; href=&quot;#install-preview&quot; aria-label=&quot;Anchor link for: install-preview&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Install the theme under a Zola site&#39;s &lt;code&gt;themes/&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https://codeberg.org/RiPetitor/devlab-theme&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; themes/devlab-theme&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable the theme and the optional search index:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;theme&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;devlab-theme&lt;/span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;compile_sass&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;build_search_index&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The theme is designed to work without a frontend framework or build tool beyond Zola&#39;s built-in Sass and search index support.&lt;/p&gt;
&lt;h2 id=&quot;validation-before-tagging&quot;&gt;Validation before tagging&lt;a class=&quot;zola-anchor&quot; href=&quot;#validation-before-tagging&quot; aria-label=&quot;Anchor link for: validation-before-tagging&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The final &lt;code&gt;0.0.1&lt;/code&gt; tag should be cut after these checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;run &lt;code&gt;zola check&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;zola build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;review light and dark modes&lt;/li&gt;
&lt;li&gt;review desktop and mobile documentation navigation&lt;/li&gt;
&lt;li&gt;review mobile menu open, close, backdrop click, Escape and link-click states&lt;/li&gt;
&lt;li&gt;review search results and empty search state&lt;/li&gt;
&lt;li&gt;review code block language labels and Copy button states&lt;/li&gt;
&lt;li&gt;install the repository as &lt;code&gt;themes/devlab-theme&lt;/code&gt; in a clean external Zola site&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;next-direction&quot;&gt;Next direction&lt;a class=&quot;zola-anchor&quot; href=&quot;#next-direction&quot; aria-label=&quot;Anchor link for: next-direction&quot;&gt;
  &lt;span class=&quot;content-icon content-icon-sm&quot; aria-hidden=&quot;true&quot;&gt;
    
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; focusable=&quot;false&quot; aria-hidden=&quot;true&quot; class=&quot;social-icon&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 15l6 -6&quot; /&gt;&lt;path d=&quot;M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464&quot; /&gt;&lt;path d=&quot;M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463&quot; /&gt;&lt;/svg&gt;

  &lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;After &lt;code&gt;0.0.1&lt;/code&gt;, the theme can move toward more polished documentation ergonomics: richer code block metadata, more content components, better search presentation and a small set of real-world example pages.&lt;/p&gt;
</content>
        
    </entry>
</feed>
