<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://frus.dev/blog</id>
    <title>frus Blog</title>
    <updated>2026-11-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://frus.dev/blog"/>
    <subtitle>frus Blog</subtitle>
    <icon>https://frus.dev/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[A home for frus]]></title>
        <id>https://frus.dev/blog/hello</id>
        <link href="https://frus.dev/blog/hello"/>
        <updated>2026-11-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[frus has a site of its own. The README's list of known gaps had one line that was not about]]></summary>
        <content type="html"><![CDATA[<p>frus has a site of its own. The README's list of known gaps had one line that was not about
code: <em>a searchable documentation site</em>. This is it.</p>
<!-- -->
<p>The pages are not a second copy of the documentation. They are the repository's own —
<code>docs/getting-started.md</code>, the guide under <code>docs/guide/</code>, the architecture notes and the
<code>frus</code> command's reference — copied in when the site is built. Each example in them is still
a complete piece of Rust that frus's test suite compiles, so what you read here is what
compiles today.</p>
<p>What you will find:</p>
<ul>
<li class=""><strong><a class="" href="https://frus.dev/docs/getting-started">Get started</a></strong>: install the <code>frus</code> command, make a project, and
run it on this computer, a phone and the browser.</li>
<li class=""><strong><a class="" href="https://frus.dev/docs/guide">The guide</a></strong>: one topic per page, from laying out a screen to the tray and
the taskbar.</li>
<li class=""><strong><a class="" href="https://frus.dev/widgets">The widget catalog</a></strong>: the twelve families of widgets, and the live gallery, which
is frus itself built for the web.</li>
<li class=""><strong>The blog</strong>: what each release brings, from 0.1.0 to today.</li>
</ul>
<p>frus is pre-alpha. If something on these pages is wrong, unclear or missing, each documentation page has
a link to edit it on GitHub, and <a href="https://github.com/frus-rs/frus/issues" target="_blank" rel="noopener noreferrer" class="">issues</a> are
open — in English or in French.</p>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Announcements" term="Announcements"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.5.0]]></title>
        <id>https://frus.dev/blog/frus-0.5.0</id>
        <link href="https://frus.dev/blog/frus-0.5.0"/>
        <updated>2026-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The system around the window, screen readers, and phones on any computer. An application now]]></summary>
        <content type="html"><![CDATA[<p>The system around the window, screen readers, and phones on any computer. An application now
reaches what a desktop offers beyond its window; a screen reader can use it on every platform,
the web included; and a phone or a tablet can be tried on any computer.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-system-around-the-window">The system around the window<a href="https://frus.dev/blog/frus-0.5.0#the-system-around-the-window" class="hash-link" aria-label="Direct link to The system around the window" title="Direct link to The system around the window" translate="no">​</a></h2>
<p>Notifications with buttons, a picture and the system's sound, on the desktop, on Android (with
its permission) and on the web. A tray icon with its menu; the taskbar's badge and progress;
global shortcuts; the system's file dialogs; files dropped onto the window. Each one sits behind
a feature of its own, and each is declared from the state.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="screen-readers">Screen readers<a href="https://frus.dev/blog/frus-0.5.0#screen-readers" class="hash-link" aria-label="Direct link to Screen readers" title="Direct link to Screen readers" translate="no">​</a></h2>
<p>Each widget is found where it is drawn and named by what it shows, and a reader can press it,
tick a box and fill a field. On the web, a text field is edited through a real one — the phone's
keyboard, composition for Chinese, Japanese and Korean, dictation — and read once.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="simulated-devices">Simulated devices<a href="https://frus.dev/blog/frus-0.5.0#simulated-devices" class="hash-link" aria-label="Direct link to Simulated devices" title="Direct link to Simulated devices" translate="no">​</a></h2>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">frus run </span><span class="token parameter variable" style="color:hsl(207, 82%, 66%)">-d</span><span class="token plain"> iphone-15          </span><span class="token comment" style="color:hsl(220, 10%, 40%)"># in a window, on Windows, Linux or macOS</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain">frus run </span><span class="token parameter variable" style="color:hsl(207, 82%, 66%)">-d</span><span class="token plain"> iphone-15 </span><span class="token parameter variable" style="color:hsl(207, 82%, 66%)">--web</span><span class="token plain">    </span><span class="token comment" style="color:hsl(220, 10%, 40%)"># the same, in a browser</span><br></div></code></pre></div></div>
<p>A debug build is laid out for the device's screen: its size and density, its safe areas, its
cutout, its keyboard and its orientation, drawn inside the device's outline. iPhone SE, iPhone 15,
iPhone 15 Pro Max, an iPad and an Android phone are built in, and a project can describe its own
in <code>Cargo.toml</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pictures-and-text">Pictures and text<a href="https://frus.dev/blog/frus-0.5.0#pictures-and-text" class="hash-link" aria-label="Direct link to Pictures and text" title="Direct link to Pictures and text" translate="no">​</a></h2>
<p>Lottie animations arrive with the new <code>frus-lottie</code> crate. SVG pictures and Lottie animations can
be loaded from an address, embedded bitmaps included. frus now ships its own copy of glyphon as
<code>frus-glyphon</code>, so text draws on the Android emulator and on devices without Vulkan.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks">What breaks<a href="https://frus.dev/blog/frus-0.5.0#what-breaks" class="hash-link" aria-label="Direct link to What breaks" title="Direct link to What breaks" translate="no">​</a></h2>
<p><code>Badge::label_visible(false)</code> now takes the badge away instead of leaving a dot, and the
navigation bars' counts stop at <code>999+</code>, not <code>99+</code>.
<a href="https://github.com/frus-rs/frus/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">The changelog</a> has every entry.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token punctuation" style="color:hsl(220, 14%, 71%)">[</span><span class="token table class-name" style="color:hsl(29, 54%, 61%)">dependencies</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain"></span><span class="token key property" style="color:hsl(355, 65%, 65%)">frus</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(95, 38%, 62%)">"0.5"</span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.4.0]]></title>
        <id>https://frus.dev/blog/frus-0.4.0</id>
        <link href="https://frus.dev/blog/frus-0.4.0"/>
        <updated>2026-10-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tooling, start-up and pictures. The frus command grows from creating a project into the whole]]></summary>
        <content type="html"><![CDATA[<p>Tooling, start-up and pictures. The <code>frus</code> command grows from creating a project into the whole
loop, true hot reload on every platform included. Applications start faster and survive a lost
GPU, and pictures are decoded at the size they are shown.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-frus-command">The <code>frus</code> command<a href="https://frus.dev/blog/frus-0.4.0#the-frus-command" class="hash-link" aria-label="Direct link to the-frus-command" title="Direct link to the-frus-command" translate="no">​</a></h2>
<p><code>frus devices</code>, <code>frus run</code> (with <code>r</code> to reload keeping the state, <code>R</code> to restart, and keys for
the widget tree, the performance graphs and screenshots), <code>frus build</code>, <code>frus test</code>,
<code>frus analyze</code>, <code>frus doctor</code>, <code>frus emulators</code>, <code>frus daemon</code> for editors, and a VS Code
extension. Each command installs what it needs and the machine lacks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hot-reload">Hot reload<a href="https://frus.dev/blog/frus-0.4.0#hot-reload" class="hash-link" aria-label="Direct link to Hot reload" title="Direct link to Hot reload" translate="no">​</a></h2>
<p><code>frus run --hot</code> patches each saved change into the running application and keeps its state,
on Windows, Linux, macOS, Android and the web.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="start-up-and-the-gpu">Start-up and the GPU<a href="https://frus.dev/blog/frus-0.4.0#start-up-and-the-gpu" class="hash-link" aria-label="Direct link to Start-up and the GPU" title="Direct link to Start-up and the GPU" translate="no">​</a></h2>
<p>The first frame's time is logged. Windows starts in 0.6–0.8 s with DXC, down from 1.3–2.0 s.
Pipelines are kept between launches where the GPU allows, which takes the test phone to 0.33 s
from the second start. A lost GPU device is replaced and the application goes on, and devices
without Vulkan draw through OpenGL ES.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pictures">Pictures<a href="https://frus.dev/blog/frus-0.4.0#pictures" class="hash-link" aria-label="Direct link to Pictures" title="Direct link to Pictures" translate="no">​</a></h2>
<p>Pictures are decoded at the size they are shown: a photograph's thumbnail holds 0.3 MB, not
46 MB. Large ones are decoded off the interface's thread, and memory is given back when the
system runs short. SVG pictures draw as vector paths, through the new <code>frus-svg</code> crate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks">What breaks<a href="https://frus.dev/blog/frus-0.4.0#what-breaks" class="hash-link" aria-label="Direct link to What breaks" title="Direct link to What breaks" translate="no">​</a></h2>
<p>An <code>Image::memory</code> or <code>Image::network</code> resolves its pixels when it is first laid out, not when
it is built. <code>PathGradient</code> is no longer <code>Copy</code>.
<a href="https://github.com/frus-rs/frus/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">The changelog</a> has every entry.</p>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.3.0]]></title>
        <id>https://frus.dev/blog/frus-0.3.0</id>
        <link href="https://frus.dev/blog/frus-0.3.0"/>
        <updated>2026-10-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first release since the crates went on crates.io, and a large one: three weeks of]]></summary>
        <content type="html"><![CDATA[<p>The first release since the crates went on crates.io, and a large one: three weeks of
reviewing widgets and painting one by one, and of adding the pieces that were simply missing.
It breaks things, as a pre-alpha release may.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-widgets-that-were-missing">Basic widgets that were missing<a href="https://frus.dev/blog/frus-0.3.0#basic-widgets-that-were-missing" class="hash-link" aria-label="Direct link to Basic widgets that were missing" title="Direct link to Basic widgets that were missing" translate="no">​</a></h2>
<p><code>Center</code> and <code>Aligned</code>, the single-purpose boxes, <code>GestureDetector</code>, <code>MouseRegion</code>, <code>Listener</code>,
<code>OrientationBuilder</code>, <code>LimitedBox</code>, <code>AnimatedSize</code>, <code>AnimatedCrossFade</code>, <code>SizeTransition</code>,
<code>CustomMultiChildLayout</code>, <code>StickyHeader</code>, <code>SelectionArea</code> and selectable text.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="widgets-reviewed-one-by-one">Widgets reviewed, one by one<a href="https://frus.dev/blog/frus-0.3.0#widgets-reviewed-one-by-one" class="hash-link" aria-label="Direct link to Widgets reviewed, one by one" title="Direct link to Widgets reviewed, one by one" translate="no">​</a></h2>
<p>The buttons, <code>Container</code>, the checkbox, the radio, the switch (its thumb can be dragged now), the
stack, the progress indicators, the app bar, <code>CircleAvatar</code> and <code>Slider</code> were each checked for
what they do, not only for their names. Visual density came with them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="painting">Painting<a href="https://frus.dev/blog/frus-0.3.0#painting" class="hash-link" aria-label="Direct link to Painting" title="Direct link to Painting" translate="no">​</a></h2>
<p><code>BoxDecoration</code> in full: shapes, sides, lists of shadows and blur styles; linear, radial and
sweep gradients; pictures (<code>DecorationImage</code>); and the background's blend mode, with 29 blend
modes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platforms">Platforms<a href="https://frus.dev/blog/frus-0.3.0#platforms" class="hash-link" aria-label="Direct link to Platforms" title="Direct link to Platforms" translate="no">​</a></h2>
<p>Each widget knows which platform's conventions it follows. This release adds scroll behaviours,
page transitions, the iOS back swipe, an Apple theme, and a desktop menu bar (on Windows, on the
title bar's line). Scroll physics gained never-scrollable and always-scrollable modes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling">Tooling<a href="https://frus.dev/blog/frus-0.3.0#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling" translate="no">​</a></h2>
<p>Frame statistics, logs in every platform's console, and an application template that builds
and ships to every platform.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks">What breaks<a href="https://frus.dev/blog/frus-0.3.0#what-breaks" class="hash-link" aria-label="Direct link to What breaks" title="Direct link to What breaks" translate="no">​</a></h2>
<p>The entries marked <strong>Changed</strong> in
<a href="https://github.com/frus-rs/frus/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">the changelog</a> say what breaks,
and how to move.</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token punctuation" style="color:hsl(220, 14%, 71%)">[</span><span class="token table class-name" style="color:hsl(29, 54%, 61%)">dependencies</span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token plain"></span><span class="token key property" style="color:hsl(355, 65%, 65%)">frus</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(220, 14%, 71%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(95, 38%, 62%)">"0.3"</span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.2.1, on crates.io]]></title>
        <id>https://frus.dev/blog/frus-0.2.1</id>
        <link href="https://frus.dev/blog/frus-0.2.1"/>
        <updated>2026-09-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A short release, and a milestone: from 0.2.1, the ten library crates are on crates.io, and an]]></summary>
        <content type="html"><![CDATA[<p>A short release, and a milestone: from 0.2.1, the ten library crates are on crates.io, and an
application depends on frus with one line.</p>
<!-- -->
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(220, 13%, 18%);--prism-color:hsl(220, 14%, 71%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:hsl(220, 13%, 18%);color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(220, 14%, 71%);text-shadow:0 1px rgba(0, 0, 0, 0.3)"><span class="token function" style="color:hsl(207, 82%, 66%)">cargo</span><span class="token plain"> </span><span class="token function" style="color:hsl(207, 82%, 66%)">add</span><span class="token plain"> frus</span><br></div></code></pre></div></div>
<p>The release exists because a version number on crates.io cannot be rewritten. Since the
<code>0.2.0</code> tag, master had gained web accessibility, and the crates had gained their publishing
metadata. Publishing <code>0.2.0</code> from master would have shipped something other than the tag, so
the new code went out as <code>0.2.1</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ready-to-publish">Ready to publish<a href="https://frus.dev/blog/frus-0.2.1#ready-to-publish" class="hash-link" aria-label="Direct link to Ready to publish" title="Direct link to Ready to publish" translate="no">​</a></h2>
<p>Ten crates carry their repository, documentation, keywords and categories, and every path
dependency between them names a version. The sample applications stay unpublished. A dry run of
<code>cargo publish --workspace</code> orders the crates by their dependencies (<code>frus-core</code> first, <code>frus</code>
last) and builds each one from its packaged tarball.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="accessibility-on-the-web">Accessibility on the web<a href="https://frus.dev/blog/frus-0.2.1#accessibility-on-the-web" class="hash-link" aria-label="Direct link to Accessibility on the web" title="Direct link to Accessibility on the web" translate="no">​</a></h2>
<p>A screen reader can now navigate the demo's task list in a browser, and operate it. Every
semantic node is a real, focusable element placed in the canvas's fallback content, so <code>Tab</code> and
assistive technology reach it. Announcements go through an <code>aria-live</code> region.</p>
<p>On the way, we found and fixed a bug on <strong>every</strong> platform. A clickable control merged with its
caption was announced correctly, but did nothing when activated, through AccessKit on the desktop
as much as on the web. This was checked against a real browser's computed accessibility tree.</p>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.2.0]]></title>
        <id>https://frus.dev/blog/frus-0.2.0</id>
        <link href="https://frus.dev/blog/frus-0.2.0"/>
        <updated>2026-09-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The second tagged release, 286 milestones after the first. It is still not an API commitment,]]></summary>
        <content type="html"><![CDATA[<p>The second tagged release, 286 milestones after the first. It is still not an API commitment,
but frus moves a long way from where 0.1.0 left it: applications are made of components now,
with a router whose location is the browser's address.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="applications-are-made-of-components">Applications are made of components<a href="https://frus.dev/blog/frus-0.2.0#applications-are-made-of-components" class="hash-link" aria-label="Direct link to Applications are made of components" title="Direct link to Applications are made of components" translate="no">​</a></h2>
<p><code>StatelessWidget</code>; <code>StatefulWidget</code> with a <code>State</code>; hooks (<code>use_state</code>, <code>use_effect</code>,
<code>use_interval</code>, <code>use_text_controller</code>…); <code>TextEditingController</code>, <code>ChangeNotifier</code> and
<code>ValueNotifier</code>. Then there is <code>FrusApp</code>, an application that is a root widget and whatever it
builds: no message type, no <code>update</code>, no <code>view</code>. The message-based <code>Application</code> is still
there, and <code>FrusApp</code> is one. A <code>host</code> module lets a component change what is not a widget: the
theme, the language, the zoom, a focus, a scroll, work for another thread.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-router-and-addresses">A router, and addresses<a href="https://frus.dev/blog/frus-0.2.0#a-router-and-addresses" class="hash-link" aria-label="Direct link to A router, and addresses" title="Direct link to A router, and addresses" translate="no">​</a></h2>
<p><code>GoRouter</code> holds routes named by a pattern of path. It has <code>go</code>, <code>push</code>, <code>replace</code> and <code>pop</code>,
path parameters and queries, redirects, page transitions and the back gesture. On the web, its
location is the address bar: a page opens at <code>#/users/42</code>, the browser's back and forward
buttons move the application, and a reload comes back to the same page. Android reads its
launch link, and a desktop reads its argument.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="widgets-and-motion">Widgets and motion<a href="https://frus.dev/blog/frus-0.2.0#widgets-and-motion" class="hash-link" aria-label="Direct link to Widgets and motion" title="Direct link to Widgets and motion" translate="no">​</a></h2>
<p>A restyle of the core widgets: buttons, chips, cards, dividers, the app bar, tabs, navigation.
New widgets: <code>DataTable::lazy</code>, <code>DropdownMenu</code>, <code>SearchAnchor</code>, <code>ToggleButtons</code>,
<code>ExpansionPanelList</code>, <code>ReorderableList</code>, a picker wheel, <code>DraggableScrollableSheet</code> and the whole
Material icon set. New motion: implicit animations, explicit transitions, <code>AnimatedSwitcher</code>,
sheets that follow the finger, and drag to reorder that scrolls the list under it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="text-and-input-on-a-phone">Text and input on a phone<a href="https://frus.dev/blog/frus-0.2.0#text-and-input-on-a-phone" class="hash-link" aria-label="Direct link to Text and input on a phone" title="Direct link to Text and input on a phone" translate="no">​</a></h2>
<p>Selection handles, autofill hints, the clipboard on Android and in the browser, emoji, and the
focused field brought back above the soft keyboard. The device's language, and on Android the
reader's font size, night mode and reduced motion, reach the application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quality">Quality<a href="https://frus.dev/blog/frus-0.2.0#quality" class="hash-link" aria-label="Direct link to Quality" title="Direct link to Quality" translate="no">​</a></h2>
<p>All fifteen crates refuse a missing doc comment. Every crate's README example is compiled as a
doctest, the minimum supported Rust version is pinned, and the smallest application has a size
budget in CI. <code>cargo test --workspace</code> runs 2,550 tests, up from 717 at 0.1.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks">What breaks<a href="https://frus.dev/blog/frus-0.2.0#what-breaks" class="hash-link" aria-label="Direct link to What breaks" title="Direct link to What breaks" translate="no">​</a></h2>
<p>A good deal, as the release moves the API. <code>Variant::Primary</code> and <code>Variant::Secondary</code> became
<code>Variant::Filled</code> and <code>Variant::Outlined</code>. <code>Scaffold</code> no longer scrolls its body, <code>AppBar::new()</code>
takes no title, and every <code>Navigator</code> page has a key.
<a href="https://github.com/frus-rs/frus/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">The changelog</a> says what to change
for each one.</p>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[frus 0.1.0, the first release]]></title>
        <id>https://frus.dev/blog/frus-0.1.0</id>
        <link href="https://frus.dev/blog/frus-0.1.0"/>
        <updated>2026-08-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first tagged release: a point in the history that can be cited, cloned and diffed. 277]]></summary>
        <content type="html"><![CDATA[<p>The first tagged release: a point in the history that can be cited, cloned and diffed. 277
milestones went into it. It is not an API commitment: nothing here is stable yet, and the public
surface will move.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="platforms">Platforms<a href="https://frus.dev/blog/frus-0.1.0#platforms" class="hash-link" aria-label="Direct link to Platforms" title="Direct link to Platforms" translate="no">​</a></h2>
<ul>
<li class=""><strong>Desktop</strong> (Windows, Linux, macOS) on winit and wgpu: the clipboard, screen readers through
AccessKit, live reload while developing.</li>
<li class=""><strong>Android</strong>: a native activity, Vulkan, a real IME with composition and swipe typing, window
insets and the full lifecycle, checked on a physical device.</li>
<li class=""><strong>Web</strong> (wasm and WebGPU): rendering, input, animation, subscriptions, and asynchronous
effects, <code>fetch</code> included.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-application-model">The application model<a href="https://frus.dev/blog/frus-0.1.0#the-application-model" class="hash-link" aria-label="Direct link to The application model" title="Direct link to The application model" translate="no">​</a></h2>
<p>An application is <code>update</code> and <code>view</code>. <code>update</code> is pure and synchronous, every effect goes
through a <code>Command</code>, and every long-lived stream through a <code>Subscription</code>. That is what lets 717
tests run with no GPU and no window. A single <code>frus::main!</code> declaration generates the desktop,
Android and web entry points, and an application declares one dependency, <code>frus</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rendering-layout-and-widgets">Rendering, layout and widgets<a href="https://frus.dev/blog/frus-0.1.0#rendering-layout-and-widgets" class="hash-link" aria-label="Direct link to Rendering, layout and widgets" title="Direct link to Rendering, layout and widgets" translate="no">​</a></h2>
<p>A wgpu renderer draws rounded rectangles, borders, shadows, gradients, vector paths, images,
clips and layers. Layout is flexbox and grid over taffy, and text is shaped by cosmic-text,
bidirectional scripts included. Around 80 widget modules ship: text fields, data tables, an
editable grid, charts, date and time pickers, a kanban board, trees, toasts, modals and drawers.
Every one is themed from a Material 3 colour scheme, and every style can be overridden.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="around-them">Around them<a href="https://frus.dev/blog/frus-0.1.0#around-them" class="hash-link" aria-label="Direct link to Around them" title="Direct link to Around them" translate="no">​</a></h2>
<p>Fluent translations with right-to-left layout, a semantics tree for screen readers, and
<code>frus-test</code> for headless rendering and golden images (87 at the time).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-yet">Not yet<a href="https://frus.dev/blog/frus-0.1.0#not-yet" class="hash-link" aria-label="Direct link to Not yet" title="Direct link to Not yet" translate="no">​</a></h2>
<p>Nothing is on crates.io, the web has no clipboard or accessibility yet, and iOS compiles but
does not run.</p>]]></content>
        <author>
            <name>The frus team</name>
            <uri>https://github.com/frus-rs/frus</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
</feed>