<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>HtmlFlow Blog</title>
        <link>https://htmlflow.org/blog</link>
        <description>HtmlFlow Blog</description>
        <lastBuildDate>Wed, 01 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[BRHC - Backend-driven Reactive Hypermedia Controls with a Statically Typed Kotlin DSL]]></title>
            <link>https://htmlflow.org/blog/2026/07/01/brhc-backend-driven-reactive-hypermedia-controls-with-a-statically-typed-kotlin-dsl</link>
            <guid>https://htmlflow.org/blog/2026/07/01/brhc-backend-driven-reactive-hypermedia-controls-with-a-statically-typed-kotlin-dsl</guid>
            <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[HtmlFlow research publication on backend-driven reactive hypermedia controls with statically typed Kotlin DSL support.]]></description>
            <content:encoded><![CDATA[<p>New paper regarding HtmlFlow Kotlin DSL extension with statically typed support for reactive Datastar <a href="https://arxiv.org/abs/2607.29338" target="_blank" rel="noopener noreferrer" class="">BRHC: Backend-driven Reactive Hypermedia Controls with a Statically Typed Kotlin DSL</a>.</p>
<!-- -->
<p>This work extends the HtmlFlow Kotlin DSL with statically typed support for reactive Datastar attributes and signal-based bindings, aiming to reduce frontend/backend heterogeneity while nearly eliminating the need for JavaScript.</p>
<p>The paper was submitted to <em>Software: Practice and Experience (Wiley)</em> and is available on arXiv at <a href="https://doi.org/10.48550/arXiv.2607.29338" target="_blank" rel="noopener noreferrer" class="">arXiv:2607.29338</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="abstract">Abstract<a href="https://htmlflow.org/blog/2026/07/01/brhc-backend-driven-reactive-hypermedia-controls-with-a-statically-typed-kotlin-dsl#abstract" class="hash-link" aria-label="Direct link to Abstract" title="Direct link to Abstract" translate="no">​</a></h2>
<p>AI-assisted coding tools (e.g., Copilot, Cursor, Claude) are increasingly ubiquitous and enable rapid generation of web applications. However, this raises concerns regarding complexity, longevity and the long-term maintainability of generated systems. A key source of complexity is the heterogeneity between backend and frontend programming models, where multiple languages and paradigms are combined within a single application, often leading to duplicated logic and fragmented state management. To address this issue, recent approaches (e.g., HTMX, Turbo Hotwire, Datastar, etc.) follow the Hypermedia-Driven Application (HDA) model, positioning HTML as the primary communication medium between client and server. Unlike SPA-centric architectures, HDA systems shift the application state and interaction logic to the server, where backend-driven reactive signals synchronize with the client user interface. However, these approaches still introduce complexity through custom attributes and do not fully eliminate JavaScript, particularly in computed expressions. In this work, we propose a statically typed approach using a Kotlin-based HTML DSL (Domain-Specific Language) for backend-driven reactive web applications. We extend the HtmlFlow Kotlin DSL with typed custom HTML attributes (i.e., Datastar data-* attributes) and signal-based bindings using statically typed builders. We demonstrate the approach through a catalog of reactive interaction patterns and a Petclinic Spring MVC case study. The results indicate that the proposed approach can nearly eliminate the need for JavaScript while improving type safety and preserving a homogeneous programming model across frontend and backend, bridged through a backend-driven reactive, signal-centric architecture.</p>]]></content:encoded>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.4 - TBody and Tr as valid HtmlPage root elements.]]></title>
            <link>https://htmlflow.org/blog/2026/03/28/Release-5.0.4</link>
            <guid>https://htmlflow.org/blog/2026/03/28/Release-5.0.4</guid>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Add TBody and Tr as valid HtmlPage root elements for HTML fragments without full HTML structure.]]></description>
            <content:encoded><![CDATA[<p>This release introduces <code>TBody</code> and <code>Tr</code> as valid <code>HtmlPage</code> root elements and adds root builder extensions for <code>tbody</code> and <code>tr</code>, along with comprehensive tests.</p>
<!-- -->
<p>This feature enables the creation of HTML fragments that can be embedded in other HTML documents, such as tables, without requiring a complete HTML structure.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.3 - DataStar DSL, New HTML Builders, and Tooling Improvements.]]></title>
            <link>https://htmlflow.org/blog/2026/02/09/Release-5.0.3</link>
            <guid>https://htmlflow.org/blog/2026/02/09/Release-5.0.3</guid>
            <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade to Kotlin 2.3.10 and add Span as a valid HtmlPage root element with builder extensions.]]></description>
            <content:encoded><![CDATA[<p>Significant improvements to the Kotlin DSL, HTML builder capabilities, code
quality, and build infrastructure.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-datastar-kotlin-dsl">🚀 DataStar Kotlin DSL<a href="https://htmlflow.org/blog/2026/02/09/Release-5.0.3#-datastar-kotlin-dsl" class="hash-link" aria-label="Direct link to 🚀 DataStar Kotlin DSL" title="Direct link to 🚀 DataStar Kotlin DSL" translate="no">​</a></h3>
<p>A major milestone was reached with the introduction and evolution of an
idiomatic Kotlin DSL for DataStar integration:</p>
<ul>
<li class="">Introduced DataStar extension functions and the new <code>Signal</code> type.</li>
<li class="">Added support for <code>dataBind</code>, <code>dataInit</code>, <code>dataIndicator</code>, <code>dataAttr</code>, and
other DataStar attributes.</li>
<li class="">Expanded support with additional <code>data-*</code> attributes.</li>
<li class="">Added modifier support for DataStar attributes.</li>
<li class="">Refactored builders and organized DataStar tests into their own package.</li>
</ul>
<p>These improvements make it easier to build reactive HTML declaratively while
keeping the API clean and type-safe.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-html-builder-improvements">🏗️ HTML Builder Improvements<a href="https://htmlflow.org/blog/2026/02/09/Release-5.0.3#%EF%B8%8F-html-builder-improvements" class="hash-link" aria-label="Direct link to 🏗️ HTML Builder Improvements" title="Direct link to 🏗️ HTML Builder Improvements" translate="no">​</a></h2>
<p>The HTML DSL continues to become more flexible:</p>
<ul>
<li class="">Added <code>Span</code> as a valid <code>HtmlPage</code> root element.</li>
<li class="">Added <code>Tbody</code> as a valid <code>HtmlPage</code> root element.</li>
<li class="">Introduced new root builder extensions for <code>div</code>, <code>tr</code>, <code>span</code>, and <code>tbody</code>.</li>
<li class="">Expanded test coverage for all new builder capabilities.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-refactoring-and-quality">🧹 Refactoring and Quality<a href="https://htmlflow.org/blog/2026/02/09/Release-5.0.3#-refactoring-and-quality" class="hash-link" aria-label="Direct link to 🧹 Refactoring and Quality" title="Direct link to 🧹 Refactoring and Quality" translate="no">​</a></h2>
<p>Several improvements were made to enhance maintainability and reliability:</p>
<ul>
<li class="">Refactored HTML extension functions.</li>
<li class="">Applied Spotless formatting across the project.</li>
<li class="">Added missing unit tests.</li>
<li class="">Simplified imports and cleaned up obsolete tests.</li>
<li class="">Improved internal builder implementations.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-build--ci-improvements">⚙️ Build &amp; CI Improvements<a href="https://htmlflow.org/blog/2026/02/09/Release-5.0.3#%EF%B8%8F-build--ci-improvements" class="hash-link" aria-label="Direct link to ⚙️ Build &amp; CI Improvements" title="Direct link to ⚙️ Build &amp; CI Improvements" translate="no">​</a></h2>
<p>The development workflow has also been modernized:</p>
<ul>
<li class="">Upgraded the project to <strong>Kotlin 2.3.10</strong>.</li>
<li class="">Replaced <strong>JaCoCo</strong> with <strong>Kover</strong> for code coverage.</li>
<li class="">Added a GitHub Actions workflow to enforce <strong>Spotless</strong> formatting checks.</li>
<li class="">Merged multiple feature and CI pull requests.</li>
<li class="">Prepared the <strong>htmlflow-parent 5.0.3</strong> release.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-overall">📦 Overall<a href="https://htmlflow.org/blog/2026/02/09/Release-5.0.3#-overall" class="hash-link" aria-label="Direct link to 📦 Overall" title="Direct link to 📦 Overall" translate="no">​</a></h2>
<p>This development cycle focuses on three key goals:</p>
<ul>
<li class="">Expanding the HTML DSL with more expressive root builders.</li>
<li class="">Delivering first-class support for DataStar through an idiomatic Kotlin API.</li>
<li class="">Improving project quality with stronger testing, automated formatting, updated
tooling, and modernized CI.</li>
</ul>
<p>Together, these changes make HTMLFlow more expressive, easier to maintain, and
better prepared for future releases.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.2 - Changed boolean attributes behavior and remove kotlin dependency on Java HtmlFlow]]></title>
            <link>https://htmlflow.org/blog/2026/01/13/Release-5.0.2</link>
            <guid>https://htmlflow.org/blog/2026/01/13/Release-5.0.2</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade to xsd2poet 1.0.8 with distinct modules for Java and idiomatic Kotlin API. HtmlFlow now free of Kotlin dependencies.]]></description>
            <content:encoded><![CDATA[<p>This release upgrades <code>xsd2poet</code> to 1.0.8, introducing two distinct modules: one for Java and another for the idiomatic Kotlin API.</p>
<!-- -->
<p>HtmlFlow is now free of any Kotlin dependency, and only <code>htmlflow-kotlin</code> requires the Kotlin standard library.</p>
<p>In the new <code>xsd2poet-java</code>, the <code>ElementVisitor</code> no longer includes <code>visitSuspending</code>. The <code>visitSuspending</code> method is now exclusively part of the Kotlin version.</p>
<p>This release also resolves <a href="https://github.com/xmlet/HtmlFlow/issues/136" target="_blank" rel="noopener noreferrer" class="">Issue 136</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.1 - New multi-module architecture]]></title>
            <link>https://htmlflow.org/blog/2025/09/17/Release-5.0.1</link>
            <guid>https://htmlflow.org/blog/2025/09/17/Release-5.0.1</guid>
            <pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[HtmlFlow reorganized into four modules with separate Java and Kotlin APIs. New mfe() builder for dynamic HTML fragments supporting SSR and CSR.]]></description>
            <content:encoded><![CDATA[<p>Starting with version 5, the Java and Kotlin APIs are provided in separate modules.</p>
<p>As a result, the core Java HtmlFlow module no longer depends on the Kotlin coroutines library or <code>jsoup</code> (which is now only required by the reverse-engineering tool Flowifier, moved to its own module).</p>
<!-- -->
<p>HtmlFlow is now organized into four distinct modules:</p>
<ul>
<li class=""><strong>htmlflow-core:</strong> The main library (the <code>htmlflow</code> artifact) containing the Java API.</li>
<li class=""><strong>flowifier:</strong> A reverse-engineering tool for translating HTML documents into equivalent HtmlFlow view definitions.</li>
<li class=""><strong>htmlflow-kotlin:</strong> The idiomatic Kotlin API (which depends on <code>htmlflow-core</code>).</li>
<li class=""><strong>htmlflow-view-loader:</strong> A reflective inspector for HtmlFlow view definitions. It loads Kotlin functions of type <code>T -&gt; String</code> that return rendered HTML.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The <code>htmlflow-view-loader</code> module is particularly useful for integrating with web servers like <code>http4k</code>, which treat render engines as <code>T -&gt; String</code> functions.</p></div></div>
<p>Additionally, an <code>mfe()</code> builder has been added to dynamically load HTML fragments, supporting both SSR and CSR approaches within HtmlFlow view definitions.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Enabling Progressive Server-Side Rendering for Traditional Web Template Engines with Java Virtual Threads]]></title>
            <link>https://htmlflow.org/blog/2025/08/13/enabling-progressive-server-side-rendering-for-traditional-web-template-engines-with-java-virtual-threads</link>
            <guid>https://htmlflow.org/blog/2025/08/13/enabling-progressive-server-side-rendering-for-traditional-web-template-engines-with-java-virtual-threads</guid>
            <pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[HtmlFlow research publication on using Java virtual threads to enable progressive server-side rendering with traditional template engines.]]></description>
            <content:encoded><![CDATA[<p>We have published the paper <a href="https://doi.org/10.3390/software4030020" target="_blank" rel="noopener noreferrer" class="">Enabling Progressive Server-Side Rendering for Traditional Web Template Engines with Java Virtual Threads</a> in <em>Software</em>.</p>
<!-- -->
<p>This paper studies how Java virtual threads can simplify the implementation of progressive server-side rendering by enabling blocking template engines to operate effectively in non-blocking environments.</p>
<p>The article was published in <em>Software</em> 2025, 4(3), 20 on 13 August 2025.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="abstract">Abstract<a href="https://htmlflow.org/blog/2025/08/13/enabling-progressive-server-side-rendering-for-traditional-web-template-engines-with-java-virtual-threads#abstract" class="hash-link" aria-label="Direct link to Abstract" title="Direct link to Abstract" translate="no">​</a></h2>
<p>Modern web applications increasingly demand rendering techniques that optimize performance, responsiveness, and scalability. Progressive Server-Side Rendering (PSSR) bridges the gap between Server-Side Rendering and Client-Side Rendering by progressively streaming HTML content, improving perceived load times. Still, traditional HTML template engines often rely on blocking interfaces that hinder their use in asynchronous, non-blocking contexts required for PSSR. This paper analyzes how Java virtual threads, introduced in Java 21, enable non-blocking execution of blocking I/O operations, allowing the reuse of traditional template engines for PSSR without complex asynchronous programming models. We benchmark multiple engines across Spring WebFlux, Spring MVC, and Quarkus using reactive, suspendable, and virtual thread-based approaches. Results show that virtual threads allow blocking engines to scale comparably to those designed for non-blocking I/O, achieving high throughput and responsiveness under load. This demonstrates that virtual threads provide a compelling path to simplify the implementation of PSSR with familiar HTML templates, significantly lowering the barrier to entry while maintaining performance.</p>]]></content:encoded>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[Release 4.8]]></title>
            <link>https://htmlflow.org/blog/2025/07/12/Release-4.8</link>
            <guid>https://htmlflow.org/blog/2025/07/12/Release-4.8</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Removes Guava dependency and introduces ViewFactory.Builder. New Hot view type for http4k integration with hot-reload support.]]></description>
            <content:encoded><![CDATA[<p>This release removes the Guava dependency, previously used only for HTML text
escaping, and replaces it with the original HTML escaping source code.</p>
<!-- -->
<p>It also introduces ViewFactory.Builder, allowing configuration of <code>HtmlView</code>
parameters, such as isIndented, threadSafe and preEncoding.</p>
<p>Finally, it adds a new type of Hot view that recalculates all HTML—including
static HTML blocks— on each rendering, which is useful for http4k integration
with hot-reload support.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.7]]></title>
            <link>https://htmlflow.org/blog/2025/01/15/Release-4.7</link>
            <guid>https://htmlflow.org/blog/2025/01/15/Release-4.7</guid>
            <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Unified API generators replacing ASM-based bytecode generation with source code generation using JavaPoet and KotlinPoet.]]></description>
            <content:encoded><![CDATA[<p>This release addresses two major issues in the underlying infrastructure of
HtmlFlow:</p>
<ol>
<li class="">
<p><strong>Unified API Generators</strong>: Combines two previously separate API
generators—one for Java and another for idiomatic Kotlin builders using
function literals with receivers—into a single unified infrastructure.</p>
</li>
<li class="">
<p><strong>Simplified Manual Integration</strong>: Streamlines the process of merging
manually written builders (e.g., <code>of()</code>, <code>dynamic()</code>, <code>async()</code>,
<code>suspending()</code>, etc.) with automatically generated HTML builders.</p>
</li>
</ol>
<!-- -->
<p>Initially, when we introduced an alternative Kotlin API alongside the existing
Java API, the automatic Kotlin generation mechanism was not integrated into the
existing <code>HtmlApiFaster</code> infrastructure. Instead, as an experimental approach,
we integrated it directly within the HtmlFlow module using <a href="https://square.github.io/kotlinpoet/" target="_blank" rel="noopener noreferrer" class=""><strong>KotlinPoet</strong></a> to
generate Kotlin source code. This was a departure from the previous approach,
which relied on <a href="https://asm.ow2.io/" target="_blank" rel="noopener noreferrer" class=""><strong>ASM</strong></a> (a Java bytecode manipulation library) to generate the
element classes that make up the HtmlFlow Java API.</p>
<p>Additionally, extending the autogenerated <code>Element</code> base interface to include
new dynamic features was cumbersome. The legacy process required manually
merging custom additions after running the automatic generation.</p>
<p>With the introduction of the new <code>xsd2poet</code> dependency, which replaces the
legacy <code>XsdAsmFaster</code> and <code>HtmlApiFaster</code>, we now generate source code instead
of bytecode. Furthermore, we have refactored the backbone of the
<code>org.xmlet.htmlapifaster</code> API to be maintained as source code rather than
dynamically generated classes.</p>
<p>This new approach significantly simplifies the maintenance and enhancement of
HtmlFlow’s custom features.</p>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Progressive Server-Side Rendering with Suspendable Web Templates]]></title>
            <link>https://htmlflow.org/blog/2024/12/02/progressive-server-side-rendering-with-suspendable-web-templates</link>
            <guid>https://htmlflow.org/blog/2024/12/02/progressive-server-side-rendering-with-suspendable-web-templates</guid>
            <pubDate>Mon, 02 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[HtmlFlow research publication on progressive server-side rendering with suspendable web templates, published at WISE 2024.]]></description>
            <content:encoded><![CDATA[<p>We have published the paper <a href="https://doi.org/10.1007/978-981-96-0576-7_33" target="_blank" rel="noopener noreferrer" class="">Progressive Server-Side Rendering with Suspendable Web Templates</a> at WISE 2024.</p>
<!-- -->
<p>This work presents a proposal for server-side rendering web templates that support the async/await pattern while preserving well-formed HTML output and enabling progressive server-side rendering.</p>
<p>The paper appears in <a href="https://dl.acm.org/doi/proceedings/10.1007/978-981-96-0576-7" target="_blank" rel="noopener noreferrer" class="">Web Information Systems Engineering - WISE 2024: 25th International Conference, Doha, Qatar, December 2-5, 2024, Proceedings, Part V</a>, pages 458-473.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="abstract">Abstract<a href="https://htmlflow.org/blog/2024/12/02/progressive-server-side-rendering-with-suspendable-web-templates#abstract" class="hash-link" aria-label="Direct link to Abstract" title="Direct link to Abstract" translate="no">​</a></h2>
<p><em>Progressive server-side rendering</em> (PSSR) enhances the user experience by optimizing the first contentful paint and supporting incremental rendering as data becomes available. However, constructing web templates for asynchronous data models introduces complexity due to undesired interleaving between data access completion and template processing, potentially resulting in malformed HTML. Existing asynchronous programming idioms, such as async/await or suspending functions, enable developers to create code with a synchronous appearance while maintaining non-blocking progress. In this work, we introduce the first proposal for <em>server-side rendering</em> (SSR) web templates that seamlessly support the async/await pattern. Our proposal addresses the challenges associated with building SSR web templates for asynchronous data models, ensuring the production of well-formed HTML documents and preserving the capability of PSSR.</p>]]></content:encoded>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[Release 4.6 - Kotlin Extensions with Function Literals with Receiver]]></title>
            <link>https://htmlflow.org/blog/2024/05/21/Release-4.6</link>
            <guid>https://htmlflow.org/blog/2024/05/21/Release-4.6</guid>
            <pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[All HTML builders available through Kotlin Extensions with function literals with receiver, enabling nested method idiom.]]></description>
            <content:encoded><![CDATA[<p>All HTML builders are now available through Kotlin Extensions with function literals with receiver, enabling both <strong>nested method</strong> and <strong>method chaining</strong> idioms.</p>
<!-- -->
<p>You can write HTML structures in a natural, hierarchical way using nested lambdas, or use method chaining for concise simple sequences:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Nested Method</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Method Chaining</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Nested Method Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">body </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    div </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">        p </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"> </span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string-literal singleline string" style="color:#40813f">"Hello"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:#40813f">}</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">}</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:#40813f">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Method Chaining Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">body</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">div</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">p</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string-literal singleline string" style="color:#40813f">"Hello"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>l</code> builder emits the end tag, allowing fluent construction of HTML elements.</p></div></div></div></div></div>
<p>Both approaches are available depending on your preference - nested lambdas for readability with complex structures, or method chaining for concise simple sequences.</p>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.4 - Kotlin extensions with new raw() method. Async features]]></title>
            <link>https://htmlflow.org/blog/2024/01/26/Release-4.4</link>
            <guid>https://htmlflow.org/blog/2024/01/26/Release-4.4</guid>
            <pubDate>Fri, 26 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Kotlin Extensions with dyn lambda. New raw() to avoid HTML escaping. Factory methods view() and viewAsync() enhancements.]]></description>
            <content:encoded><![CDATA[<ul>
<li class="">
<p>Kotlin Extensions - new <code>dyn { }</code> lambda with parent Element as receiver to allow the use of implicit <code>this</code>. </p>
</li>
<li class="">
<p>New extensions on factory methods <code>view()</code> and <code>viewAsync()</code> to discard parameter <code>page</code> and allow start building on implicit this.</p>
</li>
<li class="">
<p>Upgrade to HtmlApiFaster 1.0.16 with new <code>raw()</code> to distinguish from <code>text()</code>. While the text visitor should escape HTML the raw should keep text as it is.</p>
</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.3 - Kotlin extensions and support for suspending continuations]]></title>
            <link>https://htmlflow.org/blog/2024/01/12/Release-4.3</link>
            <guid>https://htmlflow.org/blog/2024/01/12/Release-4.3</guid>
            <pubDate>Fri, 12 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Kotlin extensions with suspending() for suspendable continuations. Property .l to close tags. Solved Issue 105.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following new features and fixes:</p>
<ul>
<li class="">Added Kotlin extensions, such as the <code>.l</code> property, which can be used to close tags in Kotlin instead of <code>.__()</code>. </li>
<li class="">Introduced a new <code>.suspending()</code> builder to support the use of continuations in Kotlin, allowing suspending functions to use <code>await</code>.</li>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/105" target="_blank" rel="noopener noreferrer" class="">Issue 105</a> by integrating new attributes in <code>globalEventAttributes</code>, included with the release of <code>HtmlApiFaster</code> 1.0.15.</li>
<li class="">Added new unit tests verifying multi-threaded scenarios.</li>
<li class="">Updated the documentation to detail <code>setIndentation()</code> usage and the correct application of <code>threadSafe()</code>.</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.2 Fixes on disabling indentation and interleaving text with attributes]]></title>
            <link>https://htmlflow.org/blog/2023/12/27/Release-4.2</link>
            <guid>https://htmlflow.org/blog/2023/12/27/Release-4.2</guid>
            <pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Solved issues when text() is interleaved with attributes and newlines in script blocks. Improved documentation and made HtmlView strongly typed.]]></description>
            <content:encoded><![CDATA[<p>This release includes the following fixes and updates:</p>
<ul>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/103" target="_blank" rel="noopener noreferrer" class="">Issue 103</a>. Using <code>.text()</code> interleaved with attributes is no longer supported and will now throw an exception. </li>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/104" target="_blank" rel="noopener noreferrer" class="">Issue 104</a>. Disabling indentation incorrectly removed newlines inside text and script blocks. This has been corrected.</li>
<li class="">Enhanced the documentation with additional examples of data binding, conditionals (if/else), and loops.</li>
<li class=""><code>HtmlView</code> is now strongly typed with the type <code>M</code> corresponding to the model.</li>
</ul>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.1 Minor enhancements]]></title>
            <link>https://htmlflow.org/blog/2023/10/27/Release-4.1</link>
            <guid>https://htmlflow.org/blog/2023/10/27/Release-4.1</guid>
            <pubDate>Fri, 27 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Do not emit HTML boolean attributes with false values. Update Script tag with new types. HtmlViewAsync support for thread unsafe views.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following enhancements:</p>
<ul>
<li class="">HTML boolean attributes are no longer emitted when assigned a <code>false</code> value. </li>
<li class="">Added new types for the <code>Script</code> tag, including <code>module</code> and <code>importmap</code>.</li>
<li class=""><code>HtmlViewAsync</code> now supports thread-unsafe views, allowing sequential execution even if asynchronous relative to the data model.</li>
</ul>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.0 Support for Asynchronous Models]]></title>
            <link>https://htmlflow.org/blog/2023/01/31/Release-4.0</link>
            <guid>https://htmlflow.org/blog/2023/01/31/Release-4.0</guid>
            <pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[New HtmlViewAsync with renderAsync() and writeAsync() returning CompletableFuture. New builder await() and strongly typed dynamic views.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following changes when migrating from HtmlFlow 3.x to 4.x:</p>
<ul>
<li class=""><code>DynamicHtml</code> and <code>StaticHtml</code> are replaced by <code>HtmlView</code> and <code>HtmlDoc</code>, respectively. Both inherit from the new <code>HtmlPage</code> type.</li>
<li class="">The factory methods <code>DynamicHtml.view()</code> and <code>StaticHtml.view()</code> have been moved to the <code>HtmlFlow</code> class, becoming <code>HtmlFlow.view()</code> and <code>HtmlFlow.doc()</code>. </li>
<li class="">The <code>HtmlWriter</code> interface, which previously defined standard methods (<code>write</code> and <code>render</code>) for all HTML pages, has been removed. With the dynamic nature of <code>HtmlView</code> (formerly <code>DynamicHtml</code>), <code>render(model)</code> and <code>write(model)</code> now require a model argument. These methods are not applicable to <code>HtmlDoc</code> (formerly <code>StaticHtml</code>), leading to the removal of <code>HtmlWriter</code>. The base class <code>HtmlPage</code> no longer defines write or render methods.</li>
<li class=""><code>HtmlPage</code>, <code>HtmlView</code>, and <code>HtmlDoc</code> are no longer parameterized with the model type. The model is now parameterized only when using the builder <code>&lt;M&gt; dynamic(BiConsumer&lt;E, M&gt; consumer)</code>, where <code>E</code> is the parent HTML element and <code>M</code> is the model type.</li>
<li class="">The model object is now passed directly as a parameter to the consumer of a dynamic block (e.g., calling <code>.dynamic((elem, model) -&gt; ...)</code>), eliminating the need for closures to capture the model object.</li>
</ul>
<p>For example, the dynamic blocks approach has been simplified:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">HtmlFlow 3.x API</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">HtmlFlow 4.x API</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Previous 3.x approach</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:#3a6ddc">template</span><span class="token punctuation" style="color:#40813f">(</span><span class="token class-name" style="color:#a86201">DynamicHtml</span><span class="token generics punctuation" style="color:#40813f">&lt;</span><span class="token generics class-name" style="color:#a86201">Pet</span><span class="token generics punctuation" style="color:#40813f">&gt;</span><span class="token plain"> view</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token class-name" style="color:#a86201">Pet</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    view</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">h2</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">dynamic</span><span class="token punctuation" style="color:#40813f">(</span><span class="token plain">h2 </span><span class="token operator" style="color:#3a6ddc">-&gt;</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">getName</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">New 4.x approach</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:#3a6ddc">template</span><span class="token punctuation" style="color:#40813f">(</span><span class="token class-name" style="color:#a86201">HtmlPage</span><span class="token plain"> view</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    view</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">h2</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token generics punctuation" style="color:#40813f">&lt;</span><span class="token generics class-name" style="color:#a86201">Pet</span><span class="token generics punctuation" style="color:#40813f">&gt;</span><span class="token function" style="color:#3a6ddc">dynamic</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">(</span><span class="token plain">h2</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token operator" style="color:#3a6ddc">-&gt;</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">getName</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><br></span></code></pre></div></div></div></div></div>
<ul>
<li class="">Partials are now the only place where closures can capture a model object of a different type than the enclosing template. When doing so, you must use a <code>dynamic()</code> block to prevent the partial from being stored as static HTML and ensure it renders whenever called with a model. If the partial uses the same model as its container, avoid the closure and instead use the model provided to the <code>dynamic(cons)</code> builder.</li>
<li class="">The <code>addPartial()</code> builder has been removed. A partial is now simply a consumer function of an HTML element (<code>Consumer&lt;E extends Element&gt;</code>). You can combine partials using higher-order function composition. The element serves as the parent HTML where HtmlFlow continues to emit code. Additional arguments corresponding to context models can also be passed to partial views.</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 3.9 Support for Custom Elements]]></title>
            <link>https://htmlflow.org/blog/2022/01/30/Release-3.9</link>
            <guid>https://htmlflow.org/blog/2022/01/30/Release-3.9</guid>
            <pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[New custom element feature that allows defining HtmlFlow views. Invoking .custom('alert-info') returns an instance of the new CustomElement class that inherits from the existing Div class.]]></description>
            <content:encoded><![CDATA[<p>A new custom element feature allows defining HtmlFlow views, as shown in the listing at the end of this post. This feature applies to both static and dynamic views.</p>
<p>You can find this sample in the unit tests at <a href="https://github.com/xmlet/HtmlFlow/blob/master/src/test/java/htmlflow/test/views/HtmlCustomElements.java" target="_blank" rel="noopener noreferrer" class="">htmlflow.test.views.HtmlCustomElements</a>.</p>
<p>Invoking <code>.custom("alert-info")</code> returns an instance of the new <code>CustomElement</code> class, which inherits from the existing <code>Div</code> class. As a result, the returned instance has most HTML features available.</p>
<!-- -->
<p>Example usage:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">CustomElement Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token class-name" style="color:#a86201">StaticHtml</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">view</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">html</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">head</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">script</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrSrc</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"alert.js"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrDefer</span><span class="token punctuation" style="color:#40813f">(</span><span class="token boolean" style="color:#a86201">true</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">body</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrClass</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"container"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">p</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"Testing custom elements!"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">custom</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"alert-info"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"title"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"Information"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"message"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"This is a message for a custom element"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"kind"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"success"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">ul</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">li</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"For any reason we could even include other elements."</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">;</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 3.7]]></title>
            <link>https://htmlflow.org/blog/2021/04/07/Release-3.7</link>
            <guid>https://htmlflow.org/blog/2021/04/07/Release-3.7</guid>
            <pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Implicit PrintStream usage in addPartial() when parent template is initialized with a PrintStream.]]></description>
            <content:encoded><![CDATA[<p>When a parent template is initialized with a <code>PrintStream</code>, any internal use of <code>addPartial()</code> will now implicitly use that <code>PrintStream</code>, regardless of the output approach defined during the partial view's instantiation.</p>
<!-- -->
<p>This feature introduces a couple of new internal methods, including <code>newby()</code> in <code>HtmlVisitor</code>, which creates a new instance of the same type while preserving indentation.</p>
<p>Resolves <a href="https://github.com/xmlet/HtmlFlow/pull/75" target="_blank" rel="noopener noreferrer" class="">Pull Request 75</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 3.6]]></title>
            <link>https://htmlflow.org/blog/2020/11/10/Release-3.6</link>
            <guid>https://htmlflow.org/blog/2020/11/10/Release-3.6</guid>
            <pubDate>Tue, 10 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Fixed code smells related to Generics and updated JUnit to address a reported vulnerability.]]></description>
            <content:encoded><![CDATA[<p>Fixed code smells related to Generics and other use cases.</p>
<!-- -->
<p>Updated the JUnit release to address a reported vulnerability. For details, see <a href="https://github.com/xmlet/HtmlFlow/pull/68" target="_blank" rel="noopener noreferrer" class="">Pull Request 68</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Spring-based pet clinic app with HtmlFlow views]]></title>
            <link>https://htmlflow.org/blog/2020/01/23/spring-petclinic-with-htmlflow</link>
            <guid>https://htmlflow.org/blog/2020/01/23/spring-petclinic-with-htmlflow</guid>
            <pubDate>Thu, 23 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[spring-petclinic implementation of the sample Spring-based pet clinic web application integrated with HtmlFlow views, replacing Thymeleaf template engine.]]></description>
            <content:encoded><![CDATA[<p>We have provided a standard implementation of the sample Spring-based pet clinic web application integrated with HtmlFlow views at <a href="https://github.com/xmlet/spring-petclinic" target="_blank" rel="noopener noreferrer" class="">github.com/xmlet/spring-petclinic</a>.</p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>In this implementation, the Thymeleaf template engine has been replaced with HtmlFlow.</p></div></div>
<p>The project defines templates as first-class functions, leveraging Java language features while removing auxiliary Spring infrastructure components like <code>ModelAndView</code> and <code>ViewResolver</code>. Consequently, validations regarding these mechanics have been removed from the unit tests.</p>]]></content:encoded>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[Release 3.5]]></title>
            <link>https://htmlflow.org/blog/2020/01/13/Release-3.5</link>
            <guid>https://htmlflow.org/blog/2020/01/13/Release-3.5</guid>
            <pubDate>Mon, 13 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Downgraded to target Java runtime 1.8 for compatibility with more applications.]]></description>
            <content:encoded><![CDATA[<p>The target Java runtime has been downgraded to 1.8.</p>
<!-- -->
<p>This change improves compatibility with applications such as <a href="https://github.com/jreijn/spring-comparing-template-engines" target="_blank" rel="noopener noreferrer" class="">spring-comparing-template-engines</a> that do not support higher Java versions.</p>]]></content:encoded>
            <category>Release</category>
        </item>
    </channel>
</rss>