<?xml version="1.0" encoding="utf-8"?>
<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>Lynx Blog</title>
        <link>https://lynxjs.org/</link>
        <description>Empower the web community and invite more to build cross-platform apps</description>
        <lastBuildDate>Tue, 08 Sep 2026 06:48:27 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[Lynx × Rspack 2.0: Faster, Smaller, Closer to the Web]]></title>
            <link>https://lynxjs.org/blog/lynx-rspack-2</link>
            <guid isPermaLink="false">/blog/lynx-rspack-2</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Rspeedy 0.15 upgrades to Rspack 2.0 and Rsbuild 2.0, delivering up to 39% faster builds and smaller bundles, alongside PrimJS-tuned output, an Agent Skill for bundle-size optimization, and more flexible code splitting and dynamic loading.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx--rspack-20-faster-smaller-closer-to-the-web"><span>Lynx × Rspack 2.0: Faster, Smaller, Closer to the Web</span><a href="#lynx--rspack-20-faster-smaller-closer-to-the-web" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">June 30, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/upupming.png" alt="Yiming Li"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Yiming Li</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/luhc228.png" alt="Hengchang Lu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Hengchang Lu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/colinaaa.png" alt="Qingyu Wang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Qingyu Wang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/HuJean.png" alt="Jing Hu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Jing Hu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/jkzing.png" alt="Jingkai Zhao"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Jingkai Zhao</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Framework Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/chenjiahan.png" alt="Jiahan Chen"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Jiahan Chen</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Rstack Team</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/huxpro.png" alt="Xuan Huang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Xuan Huang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Architect @ Lynx</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx built its toolchain <a href="/rspeedy/index.html" class="rp-link">Rspeedy</a> on top of Rstack, <a href="https://rsbuild.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rsbuild</a> and <a href="https://rspack.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack</a>, so every Lynx app gets the performance and capabilities of the upstream toolchain as soon as they land.</p>
<p>With <a href="https://rspack.rs/blog/announcing-2-0" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack 2.0</a> and <a href="https://rsbuild.rs/blog/v2-0" target="_blank" rel="noopener noreferrer" class="rp-link">Rsbuild 2.0</a> now out, Lynx picks up the upstream improvements for free: <a href="#rspack-faster" class="rp-link">18–39% faster builds</a>, <a href="#rspack-smaller" class="rp-link">3–9% smaller bundles</a>, and config aligned with web conventions like <a href="#bc-alias" class="rp-link"><code>resolve.alias</code></a> and top-level <a href="#bc-chunksplit" class="rp-link"><code>splitChunks</code></a>. On top of them, we&#x27;ve shipped a series of optimizations tailored to Lynx: <a href="#rspeedy-splitting" class="rp-link">more flexible code splitting and dynamic loading</a>, <a href="#rspeedy-primjs" class="rp-link">PrimJS-tuned output</a>, <a href="#rspeedy-es2017" class="rp-link">ES2017 by default</a>, <a href="#rspeedy-parallel" class="rp-link">parallel Lynx Bundle encoding</a>, and <a href="#rspeedy-debug" class="rp-link">precise error de-mapping</a>. And one more thing: an <a href="#rspeedy-skill" class="rp-link">Agent Skill for bundle-size optimization</a>, to help you systematically shrink an app.</p>
<p>These features are available from Rspeedy 0.15. We expect most projects to get them without any config changes; for the rest, see the <a href="#migration" class="rp-link">upgrade guide</a>.</p>
<h2 class="rp-toc-include" id="rspack"><a href="#rspack" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Rspack 2.0</h2>
<p>Rspack is the bundler at the bottom of the stack. Upgrading to 2.0 brings the most direct performance and size wins, and most projects get them with no config changes. For the full set of changes Rspack 2.0 brings, see the <a href="https://rspack.rs/blog/announcing-2-0" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack 2.0 announcement</a>.</p>
<h3 class="rp-toc-include" id="rspack-faster"><a href="#rspack-faster" class="rp-header-anchor rp-link" aria-hidden="true">#</a>18–39% faster builds</h3>
<p>Across a set of production Lynx apps, we measured build-time reductions of 18–39% with no config changes:</p>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Project (anonymized)</th><th>From version</th><th>Before</th><th>After</th><th>Speedup</th></tr></thead><tbody><tr><td>App A</td><td>0.9.11</td><td>19.1s</td><td>11.6s</td><td>−39%</td></tr><tr><td>App B</td><td>0.9.10</td><td>22.7s</td><td>14.2s</td><td>−37%</td></tr><tr><td>App C</td><td>0.9.10</td><td>40.8s</td><td>28.2s</td><td>−31%</td></tr><tr><td>App D</td><td>0.11.3</td><td>15.3s</td><td>11.2s</td><td>−27%</td></tr><tr><td>App E</td><td>0.11.3</td><td>33.3s</td><td>27.2s</td><td>−18%</td></tr></tbody></table></div>
<p>The core speedup comes from Rspack 2.0&#x27;s engine optimizations; multi-page apps benefit further from <a href="#rspeedy-parallel" class="rp-link">parallel Lynx Bundle encoding</a>.</p>
<h3 class="rp-toc-include" id="rspack-smaller"><a href="#rspack-smaller" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3–9% smaller bundles</h3>
<p>Bundle size shrank as well. Across the intermediate <code>main-thread.js</code>, <code>background.js</code>, and the final Lynx Bundle, <code>main-thread.js</code> and the Lynx Bundle dropped by 3–9%.</p>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Project (anonymized)</th><th><code>background.js</code></th><th><code>main-thread.js</code></th><th>Lynx Bundle</th></tr></thead><tbody><tr><td>App A</td><td>0.47 → 0.48MB (+1.3%)</td><td>0.46 → 0.43MB (−6.7%)</td><td>1.14 → 1.10MB (−3.1%)</td></tr><tr><td>App B</td><td>0.82 → 0.77MB (−6.0%)</td><td>0.93 → 0.84MB (−9.5%)</td><td>2.13 → 1.95MB (−8.5%)</td></tr><tr><td>App C</td><td>2.05 → 1.98MB (−3.6%)</td><td>2.16 → 2.01MB (−7.0%)</td><td>5.03 → 4.74MB (−5.8%)</td></tr><tr><td>App D</td><td>0.30 → 0.30MB (−1.1%)</td><td>0.51 → 0.47MB (−7.2%)</td><td>0.82 → 0.79MB (−3.3%)</td></tr><tr><td>App E</td><td>0.49 → 0.50MB (+1.4%)</td><td>2.98 → 2.79MB (−6.5%)</td><td>4.63 → 4.48MB (−3.1%)</td></tr></tbody></table></div>
<small><p>Sizes are per-page totals of DEBUG-mode intermediate artifacts, before →
after.</p></small>
<p>This comes from Rspack 2.0&#x27;s stronger tree-shaking, plus the <a href="#rspeedy-es2017" class="rp-link">background output target moving to ES2017</a>.</p>
<h3 class="rp-toc-include" id="bc-node"><a href="#bc-node" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Node.js requirement raised</h3>
<p>The minimum is now Node.js 20.19+ or 22.12+; Node.js 18 is no longer supported.</p>
<h3 class="rp-toc-include" id="bc-webpack"><a href="#bc-webpack" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>@lynx-js/*-webpack-plugin</code> drops webpack support</h3>
<p>Now that Rspack is mature, we&#x27;re dropping webpack support in the underlying <code>@lynx-js/*-webpack-plugin</code> packages: they&#x27;re Rspack-only, with public types coming uniformly from <code>@rspack/core</code>. Most projects use them indirectly through Rspeedy and need no changes; if you depend on these plugins directly, you&#x27;ll need to adjust accordingly.</p>
<h2 class="rp-toc-include" id="rsbuild"><a href="#rsbuild" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Rsbuild 2.0</h2>
<p>Rsbuild provides the out-of-the-box build configuration on top of Rspack. 2.0 moves that configuration closer to the web ecosystem&#x27;s common conventions; the changes at this layer are mostly renames and relocations of config options, with unchanged semantics. For the full set of changes, see the <a href="https://rsbuild.rs/blog/v2-0" target="_blank" rel="noopener noreferrer" class="rp-link">Rsbuild 2.0 announcement</a>.</p>
<h3 class="rp-toc-include" id="bc-alias"><a href="#bc-alias" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>source.alias</code> → <code>resolve.alias</code></h3>
<p>Move aliases from <a href="/api/rspeedy/rspeedy.source.alias.html" class="rp-link"><code>source.alias</code></a> to <a href="/api/rspeedy/rspeedy.resolve.alias.html" class="rp-link"><code>resolve.alias</code></a>:</p>
<div class="rp-codeblock language-diff"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="diff"><code><span class="line"><span style="color:var(--shiki-foreground)">export default defineConfig({</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-  source: {</span></span>
<span class="line"><span style="color:var(--shiki-token-inserted)">+  resolve: {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    alias: {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      &#x27;@&#x27;: &#x27;./src&#x27;,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    },</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  },</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">})</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="bc-chunksplit"><a href="#bc-chunksplit" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>performance.chunkSplit</code> → <code>splitChunks</code></h3>
<p>Move <a href="/api/rspeedy/rspeedy.chunksplit.strategy.html" class="rp-link"><code>performance.chunkSplit.strategy</code></a> to the top-level <a href="/api/rspeedy/rspeedy.config.splitchunks.html" class="rp-link"><code>splitChunks.preset</code></a>:</p>
<div class="rp-codeblock language-diff"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="diff"><code><span class="line"><span style="color:var(--shiki-foreground)">export default defineConfig({</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-  performance: {</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-    chunkSplit: {</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-      strategy: &#x27;single-vendor&#x27;,</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-    },</span></span>
<span class="line"><span style="color:var(--shiki-token-deleted)">-  },</span></span>
<span class="line"><span style="color:var(--shiki-token-inserted)">+  splitChunks: {</span></span>
<span class="line"><span style="color:var(--shiki-token-inserted)">+    preset: &#x27;single-vendor&#x27;,</span></span>
<span class="line"><span style="color:var(--shiki-token-inserted)">+  },</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">})</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="bc-decorators"><a href="#bc-decorators" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Default decorators version <code>2023-11</code></h3>
<p><a href="/api/rspeedy/rspeedy.decorators.version.html" class="rp-link"><code>source.decorators.version</code></a> now defaults to <code>2023-11</code> (was <code>2022-03</code>); set it explicitly to keep the old behavior.</p>
<h2 class="rp-toc-include" id="rspeedy"><a href="#rspeedy" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Optimizations for Lynx</h2>
<p>On top of Rspack and Rsbuild, Rspeedy layers a series of optimizations targeting Lynx&#x27;s dual-thread runtime and artifact format.</p>
<h3 class="rp-toc-include" id="rspeedy-splitting"><a href="#rspeedy-splitting" class="rp-header-anchor rp-link" aria-hidden="true">#</a>More flexible code splitting and dynamic loading</h3>
<p>Lynx supports three increasingly powerful ways to split an app, each with a counterpart in the web ecosystem, adapted by Rspeedy to Lynx&#x27;s artifact format:</p>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Scenario</th><th>Web ecosystem</th><th>Lynx</th></tr></thead><tbody><tr><td>Build-time splitting</td><td>Chunk Split (<code>splitChunks</code>)</td><td><a href="/api/rspeedy/rspeedy.config.splitchunks.html" class="rp-link"><code>splitChunks</code></a> (same config name, Lynx-tuned presets)</td></tr><tr><td>In-app on-demand loading</td><td>dynamic <code>import()</code> + <a href="https://react.dev/reference/react/lazy" target="_blank" rel="noopener noreferrer" class="rp-link"><code>React.lazy</code></a></td><td>dynamic <code>import()</code> + ReactLynx <code>lazy()</code>, output as <a href="/react/code-splitting.html#lazy-loading-components" class="rp-link">Lazy Bundle</a></td></tr><tr><td>External / cross-app reuse</td><td>webpack <code>externals</code></td><td><a href="/rspeedy/external-bundle.html" class="rp-link">External Bundle</a></td></tr></tbody></table></div>
<p>Build-time splitting with <code>splitChunks</code> is common (its config moved, see <a href="#bc-chunksplit" class="rp-link"><code>performance.chunkSplit</code> → <code>splitChunks</code></a>), so we won&#x27;t expand on it here; below we focus on Lazy Bundle and External Bundle.</p>
<h4 class="rp-toc-include" id="lazy-bundle"><a href="#lazy-bundle" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lazy Bundle</h4>
<p>Lazy Bundle defers part of a single app, loaded on demand with ReactLynx&#x27;s <a href="/react/code-splitting.html#lazy-loading-components" class="rp-link"><code>lazy()</code></a>, just like dynamic <code>import()</code> on the web:</p>
<div class="rp-codeblock language-ts"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="ts"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { Suspense</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> lazy } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/react&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-constant)"> LazyComponent</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> lazy</span><span style="color:var(--shiki-foreground)">(() </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-keyword)"> import</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;./LazyComponent.jsx&#x27;</span><span style="color:var(--shiki-foreground)">));</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>On top of this, we&#x27;re adding per-import control over when a lazy bundle loads: powered by Rspack 2.0&#x27;s <a href="https://rspack.rs/config/module-rules#ruleswith" target="_blank" rel="noopener noreferrer" class="rp-link">import attribute</a> support, you&#x27;ll be able to specify per import whether it loads synchronously (for <a href="/guide/interaction/ifr.html" class="rp-link">IFR</a>) or asynchronously (background-driven, the default). The usage will look roughly like:</p>
<div class="rp-codeblock language-ts"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="ts"><code><span class="line"><span style="color:var(--shiki-token-function)">lazy</span><span style="color:var(--shiki-foreground)">(() </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-keyword)"> import</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;./LazyComponent.jsx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> { with</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> { mode</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;sync&#x27;</span><span style="color:var(--shiki-foreground)"> } })); </span><span style="color:var(--shiki-token-comment)">// sync, for IFR</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">lazy</span><span style="color:var(--shiki-foreground)">(() </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-keyword)"> import</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;./LazyComponent.jsx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> { with</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> { mode</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;async&#x27;</span><span style="color:var(--shiki-foreground)"> } })); </span><span style="color:var(--shiki-token-comment)">// background-driven (default)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>This is in progress and will land in a future release.</p>
<h4 class="rp-toc-include" id="external-bundle"><a href="#external-bundle" class="rp-header-anchor rp-link" aria-hidden="true">#</a>External Bundle</h4>
<p>External Bundle is a separately built Lynx Bundle that another app can fetch and render at runtime, enabling cross-app reuse. The producer side is built with <a href="https://rslib.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rslib</a> via <a href="/rspeedy/external-bundle.html" class="rp-link"><code>defineExternalBundleRslibConfig</code></a>; the consumer side uses the Rsbuild plugin <a href="/rspeedy/external-bundle.html" class="rp-link"><code>pluginExternalBundle</code></a>.</p>
<h3 class="rp-toc-include" id="rspeedy-primjs"><a href="#rspeedy-primjs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>PrimJS-tuned output: lowering <code>let</code> / <code>const</code> to <code>var</code></h3>
<p>Beyond build time, we also made the output parse faster in Lynx&#x27;s runtime. On Android, Lynx&#x27;s background thread runs on the <a href="https://github.com/lynx-family/primjs" target="_blank" rel="noopener noreferrer" class="rp-link">PrimJS</a> engine, and we found PrimJS parses <code>var</code> noticeably faster than block-scoped <code>let</code> / <code>const</code>. So Rspeedy 0.15 enables SWC&#x27;s <a href="https://github.com/swc-project/swc/tree/main/crates/swc_ecma_compat_es2015/src/block_scoping" target="_blank" rel="noopener noreferrer" class="rp-link"><code>transform-block-scoping</code></a> on both the main- and background-thread layers by default, lowering <code>let</code> / <code>const</code> to <code>var</code>, and sets <code>output.environment.const</code> to <code>false</code> so the bundler&#x27;s own runtime code uses <code>var</code> too.</p>
<h3 class="rp-toc-include" id="rspeedy-es2017"><a href="#rspeedy-es2017" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Background target raised to ES2017</h3>
<p>We raised the background-thread output target from ES2015 to ES2017 (the main thread stays at ES2019). As low-end devices age out, a higher baseline means less down-leveling and smaller, faster output. If you still need to down-level specific syntax, add the matching transform to <a href="/api/rspeedy/rspeedy.tools.swc.html" class="rp-link"><code>tools.swc</code></a>&#x27;s <code>env.include</code>:</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { defineConfig } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/rspeedy&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-token-keyword)"> default</span><span style="color:var(--shiki-token-function)"> defineConfig</span><span style="color:var(--shiki-foreground)">({</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  tools</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    swc</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      env</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        include</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-string-expression)">&#x27;transform-async-to-generator&#x27;</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">});</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="rspeedy-parallel"><a href="#rspeedy-parallel" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Parallel Lynx Bundle encoding</h3>
<p>For multi-page apps, the speedup isn&#x27;t only from Rspack 2.0: Rspeedy runs each entry&#x27;s tasm encode (<a href="https://www.npmjs.com/package/@lynx-js/tasm" target="_blank" rel="noopener noreferrer" class="rp-link"><code>@lynx-js/tasm</code></a>) in a parallel worker pool, parallelizing what used to be serial Lynx Bundle encoding to cut build time further.</p>
<h3 class="rp-toc-include" id="rspeedy-debug"><a href="#rspeedy-debug" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Precise error de-mapping</h3>
<p>Rspeedy 0.15 lets production errors resolve precisely back to your source: it generates a unified <code>debug-metadata.json</code> per Lynx entry that brings the JS, CSS, and UI source maps together, so both main-thread and background-thread errors can find the right de-mapping info. See <a href="/rspeedy/map-errors-to-source.html" class="rp-link">Map Production Errors to Source</a> for how it works.</p>
<h2 class="rp-toc-include" id="rspeedy-skill"><a href="#rspeedy-skill" class="rp-header-anchor rp-link" aria-hidden="true">#</a>One More Thing: an Agent Skill for Bundle-Size Optimization</h2>
<p>Pinpointing where the bytes are is often harder than the optimization itself. It takes understanding Lynx&#x27;s artifact format and Rspeedy&#x27;s dual-thread build. <a href="/ai/skills/rspeedy-bundle-size.html" class="rp-link"><code>rspeedy-bundle-size</code></a> encodes that knowledge into an Agent skill: it teaches the AI how a Lynx dual-thread bundle&#x27;s size breaks down, measures first, then ranks the biggest wins (assets, background JS, redundant code that leaked into the main thread).</p>
<p><img src="/assets/blog/lynx-rspack-2/lynx-bundle-anatomy.en.png" alt="Anatomy of a Lynx dual-thread bundle"/></p>
<p>Install it into your agent (Claude Code, Codex, etc.):</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">npx</span><span style="color:var(--shiki-token-string)"> skills</span><span style="color:var(--shiki-token-string)"> add</span><span style="color:var(--shiki-token-string)"> lynx-community/skills</span><span style="color:var(--shiki-token-string)"> -s</span><span style="color:var(--shiki-token-string)"> rspeedy-bundle-size</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>Then just describe the goal in natural language, e.g. &quot;break down this app&#x27;s bundle and tell me where it&#x27;s big and how to shrink it.&quot; The skill runs <a href="https://rsdoctor.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rsdoctor</a>, reports the per-layer breakdown, and hands back a prioritized plan; code only changes once you confirm. In real projects, this workflow has cut page size by 10–13%, mainly by correctly marking <a href="/react/thinking-in-reactlynx.html" class="rp-link">background-only</a> code (logging, network requests, telemetry) that had leaked into the main-thread render path and moving it out, plus de-duplicating packages via aliases.</p>
<h2 class="rp-toc-include" id="migration"><a href="#migration" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Migration</h2>
<p>For migration steps, see the <a href="/rspeedy/upgrade.html" class="rp-link">Rspeedy upgrade guide</a>. The breaking changes listed by layer above mostly come with the Rspack 2.0 / Rsbuild 2.0 upgrade. To check them off one by one, see the <a href="https://github.com/lynx-family/lynx-stack/blob/main/packages/rspeedy/core/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="rp-link">Rspeedy CHANGELOG</a>, the <a href="https://rsbuild.rs/guide/upgrade/v1-to-v2" target="_blank" rel="noopener noreferrer" class="rp-link">Rsbuild v1 → v2 guide</a>, and the <a href="https://rspack.rs/guide/migration/rspack_1.x" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack v1 → v2 migration guide</a>.</p>
<h2 class="rp-toc-include" id="whats-next"><a href="#whats-next" class="rp-header-anchor rp-link" aria-hidden="true">#</a>What&#x27;s next</h2>
<p>We&#x27;ll keep working with the Rstack team on both build performance and output performance, and make more mature web capabilities work out of the box on Lynx, such as Module Federation.</p>
<p>You may have also noticed the Rspack → Rsbuild → Rspeedy layering above and found it confusing. We did too. We&#x27;ll explore how to retire the Rspeedy layer by pushing Lynx specifics like the dual-thread model upstream into Rstack, reducing Lynx-only config, concepts, and documentation, so that long term you can configure and build a Lynx project directly with Rsbuild.</p>
<p>Try it on an existing project. If you hit anything or have suggestions, open an Issue or join the discussion on <a href="https://github.com/lynx-family/lynx-stack" target="_blank" rel="noopener noreferrer" class="rp-link">GitHub</a>.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Generative UI on Lynx with A2UI]]></title>
            <link>https://lynxjs.org/blog/lynx-a2ui</link>
            <guid isPermaLink="false">/blog/lynx-a2ui</guid>
            <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are officially releasing our renderer for A2UI, an open Agent-to-UI protocol, that brings Generative UI to Lynx, enabling AI-generated UI to render natively with streaming and customizable component catalogs.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="generative-ui-on-lynx-with-a2ui"><span>Generative UI on Lynx with A2UI</span><a href="#generative-ui-on-lynx-with-a2ui" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">June 8, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/HuJean.png" alt="Jing Hu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Jing Hu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/PupilTong.png" alt="HaoYang Wang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">HaoYang Wang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/Sherry-hue.png" alt="Hao Ai"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Hao Ai</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/gaoachao.png" alt="ChenChao Gao"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">ChenChao Gao</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/fzx2666-fz.png" alt="Zhou Fang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Zhou Fang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/MoonfaceX.png" alt="MoonfaceX"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">MoonfaceX</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Component Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/jkzing.png" alt="Jingkai Zhao"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Jingkai Zhao</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Framework Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/huxpro.png" alt="Xuan Huang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Xuan Huang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Architect @ Lynx</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Since the rise of AI Agents, we have been exploring what it would take to make Agent-driven generative UI feel truly native inside real apps. Lynx is uniquely placed for this: it renders natively across Mobile, Web, and Desktop, and embeds directly into the apps people already use. So when Google introduced <a href="https://a2ui.org/" target="_blank" rel="noopener noreferrer" class="rp-link">A2UI</a>, an open Agent-to-UI protocol that lets AI Agents safely generate rich interactive interfaces without executing arbitrary code, we saw a clean fit.</p>
<p>Today, we are officially releasing our A2UI renderer that brings Generative UI to Lynx.</p>
<div style="padding:10px;border-radius:8px;border:1px solid var(--semi-color-border)"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/overview.png" alt="Lynx A2UI Overview"/></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)">Agents reason. Lynx renders.</div>
<h2 class="rp-toc-include" id="streaming-generation-native-rendering"><a href="#streaming-generation-native-rendering" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Streaming Generation, Native Rendering</h2>
<p>The A2UI protocol natively supports <a href="https://a2ui.org/concepts/data-flow/" target="_blank" rel="noopener noreferrer" class="rp-link">streaming</a>:
the Agent sends UI fragments as it reasons, and the client renders them progressively.
This incremental interaction model eliminates blank waiting screens, letting users watch the interface take shape as the Agent produces output.</p>
<p>Lynx A2UI inherits Lynx&#x27;s <a href="/react/thinking-in-reactlynx.html" class="rp-link">dual-thread architecture</a>, parsing A2UI protocol messages on the Background Thread while committing UI updates on the Main Thread, both running in parallel without blocking each other.
Even when the Agent outputs UI fragments at high frequency, the interface remains smooth and responsive.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>a2ui</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/gallery/Gallery.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p>The <code>&lt;A2UI&gt;</code> container parses streamed protocol messages on
the Background Thread and commits updates to the Main Thread, keeping the UI
responsive even at high message frequency.</p></div>
<h2 class="rp-toc-include" id="a-catalog-built-on-lynx-ui"><a href="#a-catalog-built-on-lynx-ui" class="rp-header-anchor rp-link" aria-hidden="true">#</a>A Catalog Built on lynx-ui</h2>
<p>The core mechanism of A2UI is the <a href="https://a2ui.org/concepts/catalogs/" target="_blank" rel="noopener noreferrer" class="rp-link">Catalog</a>:
the client declares which components, functions, and parameters it supports, and the Agent can only choose from that authorized scope.
This keeps generation bounded, while leaving how each component renders to the renderer.</p>
<p>Lynx A2UI ships with a built-in <a href="https://lynx-stack.dev/genui/#/a2ui/catalog" target="_blank" rel="noopener noreferrer" class="rp-link">default component catalog</a> based on <a href="/ui/index.html" class="rp-link">lynx-ui</a>, covering common components such as buttons, lists, and dialogs, ready to use out of the box.
Beyond the defaults, developers will likely want to <a href="https://lynx-stack.dev/guide/genui/a2ui/catalog-guide" target="_blank" rel="noopener noreferrer" class="rp-link">define their own components</a>, registering business capabilities into the Catalog so the Agent can invoke them on demand during conversations.</p>
<div style="overflow:hidden;height:500px;position:relative;border-radius:8px;border:1px solid var(--semi-color-border);box-sizing:border-box"><iframe src="https://lynx-stack.dev/genui/?embed=1&amp;theme=light#/a2ui/catalog" title="Lynx A2UI Catalog" sandbox="allow-scripts allow-same-origin" style="display:block;width:100%;height:100%;border:none"></iframe></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p>The default Catalog, rendered live inside the Lynx GenUI Playground.</p></div>
<h2 class="rp-toc-include" id="programmable-actions"><a href="#programmable-actions" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Programmable Actions</h2>
<p>A2UI handles user interaction through the <a href="https://a2ui.org/concepts/actions/" target="_blank" rel="noopener noreferrer" class="rp-link"><code>Action</code> mechanism</a>: components describe user intent as structured payloads instead of running arbitrary code. The spec also distinguishes <a href="https://a2ui.org/concepts/actions/" target="_blank" rel="noopener noreferrer" class="rp-link"><code>functionCall</code></a>, which runs locally without informing the Agent, from <code>event</code>, which round-trips back to the Agent.</p>
<p>What Lynx A2UI adds is the API shape on top. The <code>&lt;A2UI&gt;</code> render container subscribes to a <code>MessageStore</code> that holds raw protocol messages in arrival order. When an Action fires, <code>onAction</code> hands your code a unified <code>{ name, context }</code> payload: push a follow-up message into the same store for a local update, or post to the Agent and stream the response back into it. The renderer stays the same; you own the round-trip.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>a2ui</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/actions/Actions.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p>Forward an Action to the Agent, or consume it on the rendering side to drive
UI updates directly.</p></div>
<h2 class="rp-toc-include" id="try-it-now"><a href="#try-it-now" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Try It Now</h2>
<p><a href="https://lynx-stack.dev/genui/#/a2ui" target="_blank" rel="noopener noreferrer" class="rp-link">Lynx GenUI Playground</a> provides a complete interactive experience covering the full pipeline from model conversation to UI rendering.
No local setup required: open your browser, chat with the Agent, and watch the interface generate in real time. To experience native rendering on a real device, download <a href="/guide/start/quick-start.html#prepare-lynx-explorer" class="rp-link">Lynx Explorer</a> and scan the QR code on the page.</p>
<p>Read the <a href="/react/genui/a2ui.html" class="rp-link">A2UI Guide under ReactLynx</a>, or jump straight to the more detailed preview version of the <a href="https://lynx-stack.dev/guide/genui/a2ui" target="_blank" rel="noopener noreferrer" class="rp-link">integration guide</a> to integrate Lynx A2UI into your app. The renderer ships as the <a href="/api/genui/a2ui/index.html" class="rp-link"><code>@lynx-js/genui/a2ui</code></a> package, with support starting at <a href="https://a2ui.org/specification/v0.9-a2ui/" target="_blank" rel="noopener noreferrer" class="rp-link">A2UI 0.9</a>; we&#x27;ll work with the A2UI team at Google to adapt the <a href="https://a2ui.org/specification/v1.0-a2ui/" target="_blank" rel="noopener noreferrer" class="rp-link">v1.0 candidate</a> soon.
If you encounter issues, have feature suggestions, or want to share your use cases, feel free to open an Issue or join the discussion on <a href="https://github.com/lynx-family/lynx-stack" target="_blank" rel="noopener noreferrer" class="rp-link">GitHub</a>.</p>
<p>We believe that cross-platform frameworks in the AI era should do more than just run AI-generated code: they should provide Agents with a secure, efficient, and native channel for rendering interfaces. Lynx A2UI is our first step in that direction, and we look forward to exploring the future of Generative UI, Open UI included, together with the community.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.8: WebAssembly on Android, Adaptive Layout, and More]]></title>
            <link>https://lynxjs.org/blog/lynx-3-8</link>
            <guid isPermaLink="false">/blog/lynx-3-8</guid>
            <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.8 starts the monthly release cadence with WebAssembly on Android, adaptive layout and text fitting, HarmonyOS SessionStorage, LynxEngine reuse, and DevTool protocol support.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-38-webassembly-on-android-adaptive-layout-and-more"><span>Lynx 3.8: WebAssembly on Android, Adaptive Layout, and More</span><a href="#lynx-38-webassembly-on-android-adaptive-layout-and-more" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">May 31, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/mitchilling.png" alt="Mitchell Yue"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Mitchell Yue</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Infrastructure Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx 3.8 is now officially released!</p>
<p>As outlined in our <a href="/next/blog/lynx-open-source-roadmap-2026.html" class="rp-link">2026 roadmap</a>, Lynx 3.8 kicks off our new monthly release cadence. Moving to monthly means each release will be smaller and more focused. For 3.8, that&#x27;s <strong>WebAssembly</strong> on Android, <code>&lt;frame&gt;</code> auto-sizing, line-aware text fitting, HarmonyOS SessionStorage, <code>LynxEngine</code> reuse, and DevTool protocol updates.</p>
<p>Before diving into 3.8, don&#x27;t miss our recent <a href="/next/blog/lynx-ui.html" class="rp-link">lynx-ui</a> announcement, where we introduced ready-to-use components for building cross-platform Lynx interfaces.</p>
<h2 class="rp-toc-include" id="webassembly-on-android"><a href="#webassembly-on-android" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WebAssembly on Android</h2>
<p>This release introduces initial <a href="/guide/scripting-runtime/webassembly.html" class="rp-link">WebAssembly</a> support on Android via the PrimJS runtime. Lynx apps can now load and execute WebAssembly modules on the background thread, making it possible to move computation-heavy logic into WebAssembly when JavaScript isn&#x27;t fast enough.</p>
<p>The current implementation focuses on common constructor-based flows:</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-constant)"> module</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-constant)"> WebAssembly</span><span style="color:var(--shiki-token-function)">.Module</span><span style="color:var(--shiki-foreground)">(wasmBytes);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-constant)"> instance</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-constant)"> WebAssembly</span><span style="color:var(--shiki-token-function)">.Instance</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">module</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> imports);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-constant)"> result</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-constant)"> instance</span><span style="color:var(--shiki-token-function)">.</span><span style="color:var(--shiki-token-constant)">exports</span><span style="color:var(--shiki-token-function)">.add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>The complete example below shows the same flow in a Lynx page:</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>webassembly</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/App.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<p>The current implementation covers <code>WebAssembly.Module</code> and <code>WebAssembly.Instance</code> fully, plus common-case usage of <code>WebAssembly.Memory</code>, <code>WebAssembly.Table</code>, and <code>WebAssembly.Global</code>.</p>
<h2 class="rp-toc-include" id="adaptive-layout-text-and-platform-behavior"><a href="#adaptive-layout-text-and-platform-behavior" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Adaptive Layout, Text, and Platform Behavior</h2>
<p>This release improves how Lynx content adapts to its host container, fits text into constrained layouts, and closes platform-specific behavior gaps.</p>
<h3 class="rp-toc-include" id="frame-auto-sizing-and-load-metrics"><a href="#frame-auto-sizing-and-load-metrics" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>&lt;frame&gt;</code> Auto-sizing and Load Metrics</h3>
<p><a href="/api/elements/built-in/frame.html" class="rp-link"><code>&lt;frame&gt;</code></a> can now size itself based on the embedded Lynx page&#x27;s content with the new <code>auto-width</code> and <code>auto-height</code> attributes, reducing the need for host-side dimension calculation.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">frame</span><span style="color:var(--shiki-token-function)"> src</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{url} </span><span style="color:var(--shiki-token-function)">auto-width</span><span style="color:var(--shiki-token-function)"> auto-height</span><span style="color:var(--shiki-foreground)"> /&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>It also improves startup and observability with preset layouts, better <code>data</code> and <code>global-props</code> passing, intrinsic size reporting through <code>layoutchange</code>, and <code>&lt;frame&gt;</code> load metrics on Android and iOS.</p>
<h3 class="rp-toc-include" id="line-aware-auto-font-sizing"><a href="#line-aware-auto-font-sizing" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Line-aware Auto Font Sizing</h3>
<p>The new <a href="/api/css/properties/-x-auto-font-size-line-ranges.html" class="rp-link"><code>-x-auto-font-size-line-ranges</code></a> CSS property lets developers define different font-size search ranges based on the actual number of rendered lines. Use it with <code>-x-auto-font-size: true</code>:</p>
<div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="css"><code><span class="line"><span style="color:var(--shiki-token-function)">.title</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  -x-auto-font-size</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  -x-auto-font-size-line-ranges</span><span style="color:var(--shiki-token-keyword)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    line-range(1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-keyword)">px</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-keyword)">px</span><span style="color:var(--shiki-foreground)">), </span><span style="color:var(--shiki-token-constant)">line-range</span><span style="color:var(--shiki-foreground)">(2, 16</span><span style="color:var(--shiki-token-constant)">px</span><span style="color:var(--shiki-foreground)">, 18</span><span style="color:var(--shiki-token-constant)">px</span><span style="color:var(--shiki-foreground)">),</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    line-range</span><span style="color:var(--shiki-foreground)">(3 </span><span style="color:var(--shiki-token-constant)">to</span><span style="color:var(--shiki-token-constant)"> infinity</span><span style="color:var(--shiki-foreground)">, 14</span><span style="color:var(--shiki-token-constant)">px</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>This is useful for titles, cards, and feed layouts where one-line, two-line, and multi-line text need different fitting behavior.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-scss"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="scss"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/doc/auto-font-size-line-ranges.jpeg" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>css-api</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/-x-auto-font-size-line-ranges/index.scss</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="desktop-exposure"><a href="#desktop-exposure" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Desktop Exposure</h3>
<p>macOS and Windows now support <a href="/api/elements/built-in/view.html#enable-exposure-ui-clip" class="rp-link"><code>enable-exposure-ui-clip</code></a>, giving developers more control over exposure calculations in complex layouts.</p>
<h2 class="rp-toc-include" id="native-integration"><a href="#native-integration" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Integration</h2>
<h3 class="rp-toc-include" id="lynx-engine-reuse-in-lynxviewgroup"><a href="#lynx-engine-reuse-in-lynxviewgroup" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lynx Engine Reuse in LynxViewGroup</h3>
<p>On Android, <code>LynxViewGroup</code> can now cache and reuse a <code>LynxEngine</code> across <code>LynxView</code> instances created from the same group. This is useful when an application repeatedly creates views from the same template bundle, such as in multi-page or embedded-view scenarios.</p>
<p>We&#x27;ve seen many apps where users leave and re-enter the same Lynx page. In these cases, caching the <code>LynxEngine</code> avoids the cost of repeatedly destroying and recreating it, and can reuse work the engine has already done, like the constructed UI tree, so re-entering the page renders faster.</p>
<p>Applications don&#x27;t need to manage <code>LynxEngine</code> directly. Create a group with caching enabled, attach it to each <code>LynxViewBuilder</code>, and release it when no longer needed:</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">ILynxViewGroup</span><span style="color:var(--shiki-foreground)"> group </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> LynxViewGroupBuilder()</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setContext</span><span style="color:var(--shiki-foreground)">(context)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setTemplateBundle</span><span style="color:var(--shiki-foreground)">(templateBundle)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setGlobalProps</span><span style="color:var(--shiki-foreground)">(globalProps)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setEnableCacheEngine</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-comment)">// Enable caching.</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">build</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">LynxView</span><span style="color:var(--shiki-foreground)"> first </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> LynxViewBuilder()</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setLynxViewGroup</span><span style="color:var(--shiki-foreground)">(group)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">build</span><span style="color:var(--shiki-foreground)">(context);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// Later, another LynxView created from the same group can reuse the cached engine.</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">LynxView</span><span style="color:var(--shiki-foreground)"> second </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> LynxViewBuilder()</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">setLynxViewGroup</span><span style="color:var(--shiki-foreground)">(group)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    .</span><span style="color:var(--shiki-token-function)">build</span><span style="color:var(--shiki-foreground)">(context);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-constant)">group</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">release</span><span style="color:var(--shiki-foreground)">();</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="resource-loading-callback"><a href="#resource-loading-callback" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Resource Loading Callback</h3>
<p><code>LynxViewClientV2</code> adds an <code>onResourceLoaded</code> callback so clients can observe resource loading from native code. This gives host applications a single hook for resource timing, success/failure status, and other diagnostics.</p>
<h3 class="rp-toc-include" id="sessionstorage-on-harmonyos"><a href="#sessionstorage-on-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SessionStorage on HarmonyOS</h3>
<p>HarmonyOS now supports the SessionStorage API for cross-page data sharing. Front-end code can use the existing <a href="/api/lynx-api/lynx/lynx-set-session-storage.html" class="rp-link"><code>lynx.setSessionStorageItem</code></a>, <a href="/api/lynx-api/lynx/lynx-get-session-storage.html" class="rp-link"><code>lynx.getSessionStorageItem</code></a>, <a href="/api/lynx-api/lynx/lynx-subscribe-session-storage.html" class="rp-link"><code>lynx.subscribeSessionStorage</code></a>, and <a href="/api/lynx-api/lynx/lynx-unsubscribe-session-storage.html" class="rp-link"><code>lynx.unsubscribeSessionStorage</code></a> APIs to share session-scoped state across pages.</p>
<h2 class="rp-toc-include" id="devtool-protocol-and-debugging"><a href="#devtool-protocol-and-debugging" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DevTool Protocol and Debugging</h2>
<p>DevTool protocol and debugging improvements include:</p>
<ul>
<li>MTS debugging now works with pre-executed and pre-decoded <code>MTSRuntime</code> instances.</li>
<li>CDP support adds <code>DOM.describeNode</code>.</li>
<li><code>DOM.getDocument</code> now supports the <code>depth</code> parameter.</li>
<li>DevTool can query <code>PerformanceEntry</code> data through the CDP Performance domain.</li>
</ul>
<h2 class="rp-toc-include" id="upgrade-guide"><a href="#upgrade-guide" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade Guide</h2>
<p>To upgrade to Lynx 3.8, follow the <a href="https://lynxjs.org/3.8/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer" class="rp-link">integration guide</a> and update your Lynx dependency versions accordingly.</p>
<h2 class="rp-toc-include" id="thank-you"><a href="#thank-you" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Thank You</h2>
<p>Lynx 3.8 is the first step in our monthly release cadence: smaller releases, clearer upgrade paths, and faster feedback loops.</p>
<p>Thanks to everyone building with Lynx, trying new releases early, filing issues, and helping the project improve in the open. See you in the next monthly release.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing lynx-ui]]></title>
            <link>https://lynxjs.org/blog/lynx-ui</link>
            <guid isPermaLink="false">/blog/lynx-ui</guid>
            <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing lynx-ui, a set of ready-to-use components that preserve native user experience while delivering the velocity of the web. With LUNA design language, Motion integration, and support for iOS, Android, and HarmonyOS.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="announcing-lynx-ui"><span>Announcing lynx-ui</span><a href="#announcing-lynx-ui" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">May 22, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/fzx2666-fz.png" alt="Zhou Fang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Zhou Fang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/f0rdream.png" alt="Ryan Wang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Ryan Wang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/AdrianLCA.png" alt="Adrian Luo"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Adrian Luo</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/MoonfaceX.png" alt="MoonfaceX"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">MoonfaceX</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Component Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/Dugyu.png" alt="Guangyu Du"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Guangyu Du</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Design Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/huxpro.png" alt="Xuan Huang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Xuan Huang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Architect @ Lynx</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p><a href="https://github.com/lynx-family/lynx-ui" target="_blank" rel="noopener noreferrer" class="rp-link">lynx-ui</a> has been quietly open-sourced since we gave an early preview at <a href="https://reactadvanced.com/" target="_blank" rel="noopener noreferrer" class="rp-link">React Advanced London</a> last December. After months of polishing components, building the documentation site, and adding examples, today we are excited to announce it as generally available.</p>
<style>[data-image-wall=&quot;image-wall-R1baed&quot;]{--image-wall-cols:4;--image-wall-gap:8px;--image-wall-aspect-ratio:1;}
@media (min-width:768px){[data-image-wall=&quot;image-wall-R1baed&quot;]{--image-wall-cols:8;--image-wall-gap:8px;--image-wall-aspect-ratio:1;}}</style><div class="" data-image-wall="image-wall-R1baed" style="display:grid;grid-template-columns:repeat(var(--image-wall-cols, 8), minmax(0, 1fr));gap:var(--image-wall-gap, 8px)"><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-button.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-checkbox.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-switch.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-radio-group.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-input.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-form.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-popover.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-dialog.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-swiper.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-sheet.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-swipe-action.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-sortable.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-draggable.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-scroll-view.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-feed-list.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button><button type="button" class="block w-full overflow-hidden rounded-md bg-muted/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"><div class="relative w-full" style="aspect-ratio:var(--image-wall-aspect-ratio, 1)"><div class="absolute inset-0 bg-muted/30 animate-pulse"></div><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-lazy-component.webm" muted="" loop="" autoplay="" playsinline="" preload="metadata" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-200 opacity-0"></video></div></button></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)">lynx-ui components at a glance</div>
<h2 class="rp-toc-include" id="native-foundations-web-velocity"><a href="#native-foundations-web-velocity" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Foundations, Web Velocity</h2>
<p><a href="/guide/ui/elements-components.html#built-in-elements" class="rp-link">Built-in elements</a> and <a href="/guide/ui/elements-components.html#xelement" class="rp-link">XElement</a> give Lynx the low-level capabilities that matter: fast scrolling, precise gestures, and <a href="/guide/ui/elements-components.html#behind-the-elements-native-rendering" class="rp-link">native rendering</a>. But products are not built from atoms alone. That is where <a href="/guide/ui/elements-components.html#components-composition-of-elements" class="rp-link">components</a> belong. At Lynx, native provides the foundation; the web-inspired frontend stack provides the extension layer for composition, state, styling, and product-specific behavior.</p>
<p>lynx-ui delivers on this layering principle: <strong>preserve native user experience, deliver the velocity of the web.</strong></p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><video muted="" loop="" playsinline="" autoplay="" preload="auto" style="max-width:100%;max-height:100%;object-fit:contain"><source src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-scroll-view.webm"/></video></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>lynx-ui-scroll-view</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>Basic/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p>lynx-ui&#x27;s <a href="/ui/components/scroll-view.html" class="rp-link"><code>ScrollView</code></a> is built on
top of the native <a href="/api/elements/built-in/scroll-view.html" class="rp-link"><code>&lt;scroll-view&gt;</code>
</a> primitive</p></div>
<h2 class="rp-toc-include" id="composable-primitives"><a href="#composable-primitives" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Composable Primitives</h2>
<p>Encapsulation can become a trap. lynx-ui does not treat components as black boxes with endlessly growing prop surfaces. Instead, it is an <a href="/ui/styling-theming.html" class="rp-link">unstyled</a> component library where each component is a <strong>primitive</strong> that handles behavior and state, but ships with no visual design. A primitive is composed of <strong>parts</strong> that you render and style independently.</p>
<p><a href="/ui/components/popover.html" class="rp-link"><code>Popover</code></a> shows the idea. It is not a single opaque component, but a composition of parts with separate responsibilities: <code>PopoverRoot</code> owns state, <code>PopoverTrigger</code> defines intent, <code>PopoverPositioner</code> handles placement, and <code>PopoverContent</code> stays structurally independent.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><video muted="" loop="" playsinline="" autoplay="" preload="auto" style="max-width:100%;max-height:100%;object-fit:contain"><source src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-popover.webm"/></video></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>lynx-ui-popover</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>Basic/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)">Composition is all you need.</div>
<p>Because primitives are unstyled, the same composable model creates a foundation for design systems. You can define your own themes through the <a href="/ui/styling-theming.html" class="rp-link">styling and theming</a> system, or follow the <a href="https://ui.shadcn.com/" target="_blank" rel="noopener noreferrer" class="rp-link">shadcn/ui</a> pattern to compose themed wrappers on top of the primitives.</p>
<h3 class="rp-toc-include" id="luna"><a href="#luna" class="rp-header-anchor rp-link" aria-hidden="true">#</a>LUNA</h3>
<p><a href="/ui/luna-themes-tokens.html" class="rp-link">LUNA</a> is a reference design language we built on top of that foundation.</p>
<p>It grows from Lynx&#x27;s signature gradient, adapting the brand expression into a softer palette for UI: warm pinks and rose tones moving into lavender and aqua. In LUNA, gradients act as first-class visual materials for expressing form and movement, giving components a sense of changing mediums. That sensitivity also carries into token names: LUNA describes how surfaces are felt, not where they are placed. <code>ambient</code> dissolves into the background, <code>faint</code> sits near the threshold of perception, <code>veil</code> and <code>film</code> create soft translucent layers.</p>
<div class="relative isolate w-full overflow-hidden rounded-[24px] transition-all duration-300 @container bg-canvas-ambient text-foreground"><div class="relative z-0 w-full p-8 px-10 @xl:px-12 @3xl:px-14 h-[360px] @sm:h-[400px] @md:h-[440px] @lg:h-[480px] @xl:h-[500px] @2xl:h-[520px] @3xl:h-[580px]"><div class="gap-4" style="width:100%;height:100%;pointer-events:none;position:relative;display:grid;grid-template-columns:repeat(5, minmax(0, 1fr));grid-template-rows:repeat(2, minmax(0, 1fr));align-items:stretch"><div style="grid-column:5 / 6;grid-row:1 / 2;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:1 / 2;grid-row:1 / 2;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:5 / 6;grid-row:2 / 3;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:2 / 3;grid-row:1 / 2;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:3 / 4;grid-row:1 / 2;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:4 / 5;grid-row:1 / 2;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:1 / 2;grid-row:2 / 3;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:4 / 5;grid-row:2 / 3;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:3 / 4;grid-row:2 / 3;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div><div style="grid-column:2 / 3;grid-row:2 / 3;z-index:0;pointer-events:none;display:flex;justify-content:center;align-items:center;overflow:hidden"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible"><div style="position:relative;width:4px;height:4px;display:flex;justify-content:center;align-items:center;overflow:visible;transform-origin:center;opacity:0;transform:translateX(-300px)"><div style="position:relative;width:0;height:0;overflow:visible;pointer-events:none"><div style="background-color:rgb(0 0 0 / 0.04);position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:387px;height:824px;clip-path:path(&quot;M0 96C0 62.3968 0 45.5953 6.53961 32.7606C12.292 21.4708 21.4708 12.292 32.7606 6.53961C45.5953 0 62.3969 0 96 0H291C324.603 0 341.405 0 354.239 6.53961C365.529 12.292 374.708 21.4708 380.46 32.7606C387 45.5953 387 62.3968 387 96V728C387 761.603 387 778.405 380.46 791.239C374.708 802.529 365.529 811.708 354.239 817.46C341.405 824 324.603 824 291 824H96C62.3969 824 45.5953 824 32.7606 817.46C21.4708 811.708 12.292 802.529 6.53961 791.239C0 778.405 0 761.603 0 728V96Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:auto;will-change:transform;overflow:hidden;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div><div style="position:absolute;top:0;left:0;transform-origin:top left;pointer-events:none;will-change:transform;width:375px;height:812px;clip-path:path(&quot;M0 86.4C0 56.1572 0 41.0357 5.88565 29.4845C11.0628 19.3238 19.3238 11.0628 29.4845 5.88565C41.0357 0 56.1572 0 86.4 0H288.6C318.843 0 333.964 0 345.516 5.88565C355.676 11.0628 363.937 19.3238 369.114 29.4845C375 41.0357 375 56.1572 375 86.4V725.6C375 755.843 375 770.964 369.114 782.516C363.937 792.676 355.676 800.937 345.516 806.114C333.964 812 318.843 812 288.6 812H86.4C56.1572 812 41.0357 812 29.4845 806.114C19.3238 800.937 11.0628 792.676 5.88565 782.516C0 770.964 0 755.843 0 725.6V86.4Z&quot;);background-color:#f5f5f5;transform:translate(0px, 0px) translate(0px, 0px) scale(0)"></div></div></div></div></div></div></div><div class="absolute z-50 rounded-full shadow-sm backdrop-blur transform-gpu bottom-2 left-1/2 -translate-x-1/2 @3xl:left-auto @3xl:right-2 @3xl:translate-x-0 bg-soft"><div class="flex items-center gap-1 px-2 py-2 @3xl:flex-col @3xl:justify-between @3xl:gap-2 @3xl:px-2 @3xl:py-3"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-transparent text-black/60 opacity-70 hover:bg-black/5 hover:text-black hover:opacity-100" type="button" aria-pressed="false" aria-label="Compare" title="Compare"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-columns2 h-4 w-4 md:h-5 md:w-5"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M12 3v18"></path></svg></button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-transparent text-black/60 opacity-70 hover:bg-black/5 hover:text-black hover:opacity-100" type="button" aria-pressed="false" aria-label="Focus" title="Focus"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gallery-horizontal-end h-4 w-4 md:h-5 md:w-5"><path d="M2 7v10"></path><path d="M6 5v14"></path><rect width="12" height="18" x="10" y="3" rx="2"></rect></svg></button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-black text-white ring-1 ring-black/20 shadow-sm" type="button" aria-pressed="true" aria-label="Lineup" title="Lineup"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-grid2x2 h-4 w-4 md:h-5 md:w-5"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 12h18"></path><path d="M12 3v18"></path></svg></button><div class="mx-1 h-px w-2 @3xl:mx-0 @3xl:h-6 @3xl:w-px bg-rule"></div><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-transparent text-black/60 opacity-70 hover:bg-black/5 hover:text-black hover:opacity-100" type="button" aria-pressed="false" aria-label="Luna" title="Luna"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkle h-4 w-4 md:h-5 md:w-5"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path></svg></button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-black text-white ring-1 ring-black/20 shadow-sm" type="button" aria-pressed="true" aria-label="Lunaris" title="Lunaris"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sparkles h-4 w-4 md:h-5 md:w-5"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path><path d="M20 3v4"></path><path d="M22 5h-4"></path><path d="M4 17v2"></path><path d="M5 18H3"></path></svg></button><div class="mx-1 h-px w-2 @3xl:mx-0 @3xl:h-6 @3xl:w-px bg-rule"></div><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-black text-white ring-1 ring-black/20 shadow-sm" type="button" aria-pressed="true" aria-label="Light" disabled="" title="Light"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun h-4 w-4 md:h-5 md:w-5"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-transparent text-black/60 opacity-70 hover:bg-black/5 hover:text-black hover:opacity-100" type="button" aria-pressed="false" aria-label="Dark" disabled="" title="Dark"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon h-4 w-4 md:h-5 md:w-5"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg></button><div class="mx-1 h-px w-1 @3xl:mx-0 @3xl:h-6 @3xl:w-px bg-rule"></div><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-9 w-9 rounded-full border transition-all hover:scale-110 focus-visible:ring-2 focus-visible:ring-offset-2 border-black/10 focus-visible:ring-black/30 focus-visible:ring-offset-background bg-black text-white ring-1 ring-black/20 shadow-sm" type="button" aria-pressed="true" aria-label="Theme synced" title="Theme synced"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lock h-4 w-4 md:h-5 md:w-5"><rect width="18" height="11" x="3" y="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg></button></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)">L.U.N.A Studio</div>
<h2 class="rp-toc-include" id="programmable-interaction"><a href="#programmable-interaction" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Programmable Interaction</h2>
<p>Components built around continuous input need two things at once: highly customizable behavior and low-latency response. A swipe, drag, or snap is judged frame by frame. If the visual response trails behind the gesture, the component may still work, but it no longer feels native.</p>
<p>Lynx&#x27;s <a href="/next/blog/lynx-unlock-native-for-more.html#use-the-main-thread-responsibly-for-interactivity" class="rp-link">dual-thread model</a> defaults JavaScript to the background thread, keeping the main thread free for rendering. But <a href="/react/main-thread-script.html" class="rp-link">Main-Thread Script</a> can move interaction logic onto the main thread when it matters, making per-frame behavior fully programmable without crossing a thread boundary. <a href="/ui/components/swiper.html" class="rp-link"><code>Swiper</code></a> shows the idea directly: drag input feeds transform updates frame by frame, so the card follows the gesture instead of catching up to it later.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><video muted="" loop="" playsinline="" autoplay="" preload="auto" style="max-width:100%;max-height:100%;object-fit:contain"><source src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-swiper.webm"/></video></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>lynx-ui-swiper</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>CustomTinder/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p>A <code>&#x27;main thread&#x27;</code> function passed to<!-- --> <!-- -->
<code>main-thread:customAnimation</code> runs per-frame logic on the main
thread</p></div>
<p>With native foundations and programmable interaction in place, motion becomes practical, not just decorative.</p>
<h3 class="rp-toc-include" id="motion"><a href="#motion" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Motion</h3>
<p><a href="https://motion.dev/" target="_blank" rel="noopener noreferrer" class="rp-link">Motion</a> is one of the most popular animation libraries in the Web community, supporting both spring-based and bezier-based transitions. Thanks to the programmability that <a href="/react/main-thread-script.html" class="rp-link">Main-Thread Script</a> brings, we adapted Motion for Lynx as <a href="/ui/motion.html" class="rp-link"><code>@lynx-js/motion</code></a>, a thin layer that reuses Motion&#x27;s source directly, and ship an experimental version together with lynx-ui. If you know Motion on the web, you already know how to use it in Lynx.</p>
<p><a href="/ui/components/sheet.html" class="rp-link"><code>Sheet</code></a> shows why that matters. Drag, resistance, release, and settling need to read as one continuous behavior. With <a href="/react/main-thread-script.html" class="rp-link">Main-Thread Script</a> keeping interaction close to rendering and Motion defining how the surface moves, the sheet feels held, not just played back.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><video muted="" loop="" playsinline="" autoplay="" preload="auto" style="max-width:100%;max-height:100%;object-fit:contain"><source src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/lynx-ui/lynx-ui-cover-sheet.webm"/></video></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>lynx-ui-sheet</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>Basic/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<div style="margin-top:12px;font-size:14px;text-align:center;color:var(--rp-c-text-3)"><p><code>Sheet</code> uses <code>@lynx-js/motion</code> under the hood for
spring-driven drag and settle transitions</p></div>
<h2 class="rp-toc-include" id="try-it-today"><a href="#try-it-today" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Try it today</h2>
<p>lynx-ui is available on iOS, Android, and HarmonyOS today, with partial Web and Desktop support on the horizon. Read the <a href="/ui/index.html" class="rp-link">introduction</a> to get oriented, or jump straight to the <a href="/ui/introduction.html#quick-start" class="rp-link">quick start</a> to install <a href="https://www.npmjs.com/package/@lynx-js/lynx-ui" target="_blank" rel="noopener noreferrer" class="rp-link"><code>@lynx-js/lynx-ui-*</code></a>.</p>
<p>To see the components in action, grab <a href="/guide/start/quick-start.html#prepare-lynx-explorer" class="rp-link">Lynx Explorer</a>, scan the QR codes in the <a href="/ui/components/button.html" class="rp-link">component demos</a>, and see them running right away. Or bring it into your own Lynx app and try it in a real product flow.</p>
<p>We want lynx-ui to grow from the way real apps are built. If it feels great, gets in your way, or leaves something missing, let us know in the <a href="https://github.com/lynx-family/lynx-ui" target="_blank" rel="noopener noreferrer" class="rp-link">lynx-family/lynx-ui repository</a>. Help shape what comes next.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.7: Desktop Support, SVG, Skills, and ReactLynx Updates]]></title>
            <link>https://lynxjs.org/blog/lynx-3-7</link>
            <guid isPermaLink="false">/blog/lynx-3-7</guid>
            <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.7 is now officially released! This release brings official desktop platform support for macOS and Windows, introduces the new SVG element, introduces new agent skills for better observability, and updates ReactLynx with simpler External Bundle presets and shared runtime modules.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-37-desktop-support-svg-skills-and-reactlynx-updates"><span>Lynx 3.7: Desktop Support, SVG, Skills, and ReactLynx Updates</span><a href="#lynx-37-desktop-support-svg-skills-and-reactlynx-updates" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">April 16, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/icecreamx10.png" alt="icecreamx10"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">icecreamx10</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Multiplatform Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/MoonfaceX.png" alt="MoonfaceX"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">MoonfaceX</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Component Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/upupming.png" alt="Yiming Li"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Yiming Li</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx 3.7 is now officially released!</p>
<p>This release brings official desktop platform support for <strong>macOS</strong> and <strong>Windows</strong>, introduces the new <strong>SVG</strong> element, introduces new <strong>Agent Skills</strong> for better observability, and updates <strong>ReactLynx</strong> with simpler External Bundle presets and cross-thread shared modules.</p>
<video src="/static/media/bringing-lynx-to-desktop.0fde71958b.mp4" autoplay="" muted="" loop="" playsinline="" style="width:100%;border-radius:12px;margin:24px 0;pointer-events:none"></video>
<h2 class="rp-toc-include" id="desktop-support-macos-and-windows"><a href="#desktop-support-macos-and-windows" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Desktop Support: macOS and Windows</h2>
<p>We <a href="/next/blog/lynx-open-source-roadmap-2025.html" class="rp-link">previously planned</a> to open source desktop support in Lynx 3.5, and <a href="/next/blog/lynx-3-5.html#one-more-thing-desktop-support-preview" class="rp-link">later decided</a> to go further and open source the full desktop stack. With Lynx 3.7, that vision is now a reality.</p>
<p>Lynx officially supports <strong>macOS</strong> and <strong>Windows</strong> as first-class platforms. You can now build and render Lynx views inside native desktop applications, using the same front-end stack and tooling you already use for mobile and web.
We also plan to open source Lynxtron soon, an Electron-like desktop application framework that uses Lynx as its UI renderer. Stay tuned!</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="/static/image/mouse-cursor.f148022b03.png" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>desktop</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/mouse-cursor/App.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="css-and-element-coverage-on-desktop"><a href="#css-and-element-coverage-on-desktop" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS and Element Coverage on Desktop</h3>
<p>The rendering core, which includes the CSS engine, is reused across platforms, so CSS coverage is naturally near-complete. The desktop UI is powered by <a href="https://github.com/lynx-family/lynx/tree/develop/clay" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>Lynx&#x27;s own rendering engine</strong></a> rather than native platform widgets, which means primitive elements need to be reimplemented for this custom backend, and coverage is still growing.</p>
<p><strong>CSS: 97% property coverage.</strong> 311 out of 319 supported Lynx CSS properties are now available on desktop, including:</p>
<ul>
<li><strong>Layout</strong>: Flexbox, Grid, Linear Layout, the full box model, positioning, and relative positioning.</li>
<li><strong>Styling</strong>: typography, borders, shadows, gradients, masks, filters, and <a href="/api/css/properties/css-variable.html" class="rp-link">CSS custom properties</a>.</li>
<li><strong>Animation</strong>: <code>animation</code>, <code>transition</code>, <code>@keyframes</code>, and the full transform stack.</li>
</ul>
<p><strong>Elements: 73% attribute coverage.</strong> 179 out of 246 element attributes are already available on desktop, with identical support on macOS and Windows. Most built-in elements work directly on desktop today.</p>
<p>In practice, most Lynx pages built for mobile can already render on desktop with minimal or no front-end changes.</p>
<p>Each API page includes a compatibility overview and a detailed compatibility table. For a cross-API view, the <a href="https://lynxjs.org/api/status" target="_blank" rel="noopener noreferrer" class="rp-link">API Status Dashboard</a> now includes <strong>macOS</strong> and <strong>Windows</strong> columns.</p>
<h3 class="rp-toc-include" id="desktop-specific-capabilities"><a href="#desktop-specific-capabilities" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Desktop-Specific Capabilities</h3>
<h4 class="rp-toc-include" id="mouse-events"><a href="#mouse-events" class="rp-header-anchor rp-link" aria-hidden="true">#</a><a href="/api/lynx-api/event/mouse-event.html" class="rp-link">Mouse Events</a></h4>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">view</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  onMouseDown</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{(e) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">`Button </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.button</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)"> at (</span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.clientX</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">, </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.clientY</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">)`</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  onMouseMove</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{(e) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-function)"> handleHover</span><span style="color:var(--shiki-foreground)">(e)}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  onMouseLeave</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{() </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-function)"> resetState</span><span style="color:var(--shiki-foreground)">()}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">/&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="keyboard-events"><a href="#keyboard-events" class="rp-header-anchor rp-link" aria-hidden="true">#</a><a href="/api/lynx-api/event/key-event.html" class="rp-link">Keyboard Events</a></h4>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">input</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  onKeyDown</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{(e) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-constant)"> console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">`Key down: </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.key</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">`</span><span style="color:var(--shiki-foreground)">)}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  onKeyUp</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{(e) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-constant)"> console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">`Key up: </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.key</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">`</span><span style="color:var(--shiki-foreground)">)}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">/&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="wheel-events"><a href="#wheel-events" class="rp-header-anchor rp-link" aria-hidden="true">#</a><a href="/api/lynx-api/event/wheel-event.html" class="rp-link">Wheel Events</a></h4>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-token-function)"> onWheel</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{(e) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-token-constant)"> console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">`Wheel delta: </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.deltaX</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">, </span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">e</span><span style="color:var(--shiki-foreground)">.deltaY</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">`</span><span style="color:var(--shiki-foreground)">)} /&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="css-cursor"><a href="#css-cursor" class="rp-header-anchor rp-link" aria-hidden="true">#</a><a href="/api/css/properties/cursor.html" class="rp-link">CSS <code>cursor</code></a></h4>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-token-function)"> style</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{{ cursor</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;pointer&#x27;</span><span style="color:var(--shiki-foreground)"> }}&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  &lt;</span><span style="color:var(--shiki-token-string-expression)">text</span><span style="color:var(--shiki-foreground)">&gt;Hover me&lt;/</span><span style="color:var(--shiki-token-string-expression)">text</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;/</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="getting-started"><a href="#getting-started" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Getting Started</h3>
<p>For platform-specific integration details, see <a href="/guide/start/integrate-with-existing-apps.html" class="rp-link">Integrate with Existing Apps</a>, which now includes desktop guides alongside Android, iOS, HarmonyOS, and Web.
A playground app built with Lynxtron will also provide a more direct way to fetch and run Lynx examples on desktop.</p>
<h2 class="rp-toc-include" id="svg-scalable-vector-graphics"><a href="#svg-scalable-vector-graphics" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>&lt;svg&gt;</code>: Scalable Vector Graphics</h2>
<p><a href="/api/elements/built-in/svg.html" class="rp-link"><code>&lt;svg&gt;</code></a> is now available as a standalone Lynx element in 3.7, bringing native vector rendering across platforms for icons, charts, and other resolution-independent graphics.</p>
<p>The <code>&lt;svg&gt;</code> element supports inline vector content:</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="/static/image/svg-example.266b0cc2ca.png" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>svg</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/base/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<p>You can also load external SVG assets directly:</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">svg</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  style</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{{ width</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;100px&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> height</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;100px&#x27;</span><span style="color:var(--shiki-foreground)"> }}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  src</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;https://example.com/icon.svg&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">/&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>To maximize performance, <code>&lt;svg&gt;</code> offloads SVG parsing to a dedicated background thread and renders the entire graphic as a single native view rather than creating individual element nodes. This keeps the main thread lightweight in both parsing time and node count, making it ideal for static display of icons, illustrations, and charts. It supports <a href="/api/elements/built-in/svg.html" class="rp-link">17 commonly used SVG tags and over 40 attributes</a>, with consistent rendering behavior across Android, iOS, HarmonyOS, macOS, Windows, and Web.</p>
<h2 class="rp-toc-include" id="agent-skills"><a href="#agent-skills" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Agent Skills</h2>
<p>As part of the <a href="/ai/index.html" class="rp-link">Lynx for AI</a> initiative, six <a href="https://github.com/lynx-community/skills" target="_blank" rel="noopener noreferrer" class="rp-link">agent skills</a> are now open-sourced. Install any skill with:</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">npx</span><span style="color:var(--shiki-token-string)"> skills</span><span style="color:var(--shiki-token-string)"> add</span><span style="color:var(--shiki-token-string)"> lynx-community/skills</span><span style="color:var(--shiki-token-string)"> -s</span><span style="color:var(--shiki-token-keyword)"> &lt;</span><span style="color:var(--shiki-token-string)">skill-nam</span><span style="color:var(--shiki-foreground)">e</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Skill</th><th>What it does</th></tr></thead><tbody><tr><td><strong>reactlynx-best-practices</strong></td><td>Static analysis, auto-fix, and best-practice rules for writing dual-threaded ReactLynx code.</td></tr><tr><td><strong>lynx-devtool</strong></td><td>Inspect DOM, console output, and runtime state of a running Lynx app via CLI.</td></tr><tr><td><strong>lynx-typescript</strong></td><td>Guidance on TypeScript setup, typing, and event handling in Lynx projects.</td></tr><tr><td><strong>trace-analysis</strong></td><td>Analyze <code>.ptrace</code> files to identify rendering bottlenecks and performance regressions.</td></tr><tr><td><strong>trace-record</strong></td><td>Capture Lynx performance traces with system trace and JS profiling support.</td></tr><tr><td><strong>lynx-debug-info-remapping</strong></td><td>Remap minified main-thread error positions back to original source locations.</td></tr></tbody></table></div>
<p>Together with <a href="/ai/lynx-devtool-mcp.html" class="rp-link">Lynx DevTool MCP</a>, coding agents can now inspect running pages, verify interactions, and debug their own changes with tighter feedback loops.</p>
<h2 class="rp-toc-include" id="reactlynx"><a href="#reactlynx" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ReactLynx</h2>
<h3 class="rp-toc-include" id="external-bundle-presets"><a href="#external-bundle-presets" class="rp-header-anchor rp-link" aria-hidden="true">#</a>External Bundle Presets</h3>
<p><a href="/rspeedy/external-bundle.html" class="rp-link">External Bundle</a> lets you build a Lynx bundle once and load it from multiple Lynx apps at runtime. Use it when you want to share ReactLynx components or common business bundles across apps. Unlike <a href="/api/rspeedy/rspeedy.performance.chunksplit.html" class="rp-link">Chunk Splitting</a> which splits code within a single app, External Bundle is designed for cross-application reuse.</p>
<p>Lynx 3.7 adds built-in presets via <a href="/api/rspeedy/lynx-bundle-rslib-config.html" class="rp-link"><code>defineExternalBundleRslibConfig</code></a> to simplify setup:</p>
<div class="rp-codeblock language-ts"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="ts"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { defineExternalBundleRslibConfig } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/lynx-bundle-rslib-config&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { pluginReactLynx } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/react-rsbuild-plugin&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-token-keyword)"> default</span><span style="color:var(--shiki-token-function)"> defineExternalBundleRslibConfig</span><span style="color:var(--shiki-foreground)">({</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  id</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;comp-lib&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  source</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    entry</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">      &#x27;./App.js&#x27;</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;./external-bundle/CompLib.tsx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  plugins</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-function)">pluginReactLynx</span><span style="color:var(--shiki-foreground)">()]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  output</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    externalsPresets</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      reactlynx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">});</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>Then load that bundle in the host app:</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="js"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>external-bundle</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>lynx.config.mjs</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="cross-thread-shared-modules"><a href="#cross-thread-shared-modules" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Cross-Thread Shared Modules</h3>
<p>By default, main thread functions cannot directly call plain functions that lack the <a href="/react/main-thread-script.html" class="rp-link"><code>&#x27;main thread&#x27;</code> directive</a>, making code reuse difficult. <a href="/react/main-thread-script.html#cross-thread-shared-modules" class="rp-link">Shared modules</a> solve this by letting you explicitly declare modules as shareable between threads.</p>
<p>Add <code>with { runtime: &#x27;shared&#x27; }</code> after an import statement, and the exported functions, classes, and objects in that module become directly callable from main thread functions:</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>main-thread</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/shared-module/App.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="upgrade-guide"><a href="#upgrade-guide" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade Guide</h2>
<p>To upgrade to Lynx 3.7, follow the <a href="https://lynxjs.org/3.7/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer" class="rp-link">integration guide</a> and update your Lynx dependency versions accordingly.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx Roadmap 2026]]></title>
            <link>https://lynxjs.org/blog/lynx-open-source-roadmap-2026</link>
            <guid isPermaLink="false">/blog/lynx-open-source-roadmap-2026</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx is moving to a faster release cadence in 2026, investing in AI-ready docs and tooling, improving desktop readiness, strengthening production infrastructure, and deepening collaboration with the open-source community.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-roadmap-2026"><span>Lynx Roadmap 2026</span><a href="#lynx-roadmap-2026" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">April 13, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="Shouqun Liu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Shouqun Liu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering Manager @ Lynx</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p><a href="/next/blog/lynx-unlock-native-for-more.html" class="rp-link">Last year</a>, we open-sourced the Lynx framework under TikTok&#x27;s sponsorship. Since then, we&#x27;ve received valuable feedback from developers and the broader community. We also shared our <a href="/next/blog/lynx-open-source-roadmap-2025.html" class="rp-link">2025 roadmap</a>, focusing on maintaining a consistent release cadence, expanding multi-platform support, and opening more core capabilities.</p>
<p>With the continuous releases from v3.2 to v3.6, Lynx has delivered several important improvements:</p>
<ul>
<li>Full support for the Web and <a href="/next/blog/lynx-harmony.html" class="rp-link">OpenHarmony</a>.</li>
<li>Expanded <a href="https://github.com/lynx-family/lynx-ui" target="_blank" rel="noopener noreferrer" class="rp-link">lynx-ui</a> coverage and improved native API stability.</li>
<li>A growing ecosystem of community projects such as <a href="https://github.com/haskell-miso/miso-lynx" target="_blank" rel="noopener noreferrer" class="rp-link">miso-lynx</a>, <a href="https://vue.lynxjs.org/" target="_blank" rel="noopener noreferrer" class="rp-link">Vue Lynx</a>, and more.</li>
</ul>
<p>At the same time, we recognize that building a great developer framework is a long-term effort, especially in the rapidly evolving AI era. Today, we&#x27;re excited to share the Lynx open-source roadmap for 2026.</p>
<h2 class="rp-toc-include" id="1-faster-and-more-predictable-release-cadence"><a href="#1-faster-and-more-predictable-release-cadence" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1. Faster and More Predictable Release Cadence</h2>
<p>Over the past year, Lynx followed a bi-monthly release cycle. With the upcoming v3.7 release wrapping up this cycle, we will move to a monthly release cadence starting in mid-2026.</p>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Stable Version</th><th>3.8</th><th>3.9</th><th>4.0</th><th>4.1</th><th>4.2</th><th>4.3</th><th>4.4</th><th>4.5</th></tr></thead><tbody><tr><td>Release Plan</td><td>2026/05</td><td>2026/06</td><td>2026/07</td><td>2026/08</td><td>2026/09</td><td>2026/10</td><td>2026/11</td><td>2026/12</td></tr></tbody></table></div>
<p>During development and releases, we will continue improving:</p>
<ul>
<li>Release notes and upgrade guides.</li>
<li>Stability guarantees for core APIs.</li>
<li>Long-term maintainability across versions.</li>
</ul>
<h2 class="rp-toc-include" id="2-embracing-ai"><a href="#2-embracing-ai" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2. Embracing AI</h2>
<p>AI is fundamentally reshaping how software is built. We believe that building in the open is essential for a framework to keep pace with AI and become truly AI-native.</p>
<p>This year, we will focus on delivering more stable and well-structured APIs, along with high-quality, LLM-friendly documentation in the <a href="https://github.com/lynx-family/lynx-website" target="_blank" rel="noopener noreferrer" class="rp-link">lynx-website</a>, <a href="https://github.com/lynx-community/skills" target="_blank" rel="noopener noreferrer" class="rp-link">Agent Skills</a>, tooling, and examples.</p>
<p>We will also explore generative UI with Lynx, as we see this as a key direction for cross-platform frameworks in the AI era. Our goal is to make Lynx one of the most AI-ready cross-platform frameworks.</p>
<h2 class="rp-toc-include" id="3-committed-multi-platform-including-desktop"><a href="#3-committed-multi-platform-including-desktop" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3. Committed Multi-Platform, Including Desktop</h2>
<p>Multi-platform support remains a core mission, not only in rendering, but also across capabilities, APIs, and the overall developer experience.</p>
<p>We now have official support for Android, iOS, the Web, and <a href="/next/blog/lynx-harmony.html" class="rp-link">OpenHarmony</a>. We also have an open-source rendering engine, <a href="https://github.com/lynx-family/lynx/tree/develop/clay" target="_blank" rel="noopener noreferrer" class="rp-link">Clay</a>, for desktop platforms including macOS and Windows.</p>
<p>This year, we&#x27;ll continue to improve the production readiness of desktop platforms and deepen integration with industry ecosystems, including Lynxtron (coming soon), which brings Lynx and Electron together for desktop development.</p>
<h2 class="rp-toc-include" id="4-production-ready-infrastructure"><a href="#4-production-ready-infrastructure" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4. Production-Ready Infrastructure</h2>
<p>Following the open-source release, we received extensive feedback from developers who want ready-made solutions for building cross-platform applications with Lynx quickly.</p>
<p>To address these needs, TikTok has open-sourced <a href="https://github.com/tiktok/Sparkling" target="_blank" rel="noopener noreferrer" class="rp-link">Sparkling</a>, which provides application scaffolding and native navigation to help developers get started quickly. We will keep adding more native capabilities, including device APIs.</p>
<p>At the framework level, we will deliver more production-ready UI components through <a href="https://github.com/lynx-family/lynx-ui" target="_blank" rel="noopener noreferrer" class="rp-link">lynx-ui</a>, expand animation and CSS capabilities to enable higher-quality UI experiences, and continue to invest in critical features such as Main Thread Scripting and runtime performance improvements across all supported platforms.</p>
<p>On the tooling side, we will release more profiling and diagnostics tools, and enhance <a href="/guide/start/integrate-lynx-devtool.html" class="rp-link">Lynx DevTool</a> to provide a one-stop development and debugging experience.</p>
<h2 class="rp-toc-include" id="5-stronger-community-engagement"><a href="#5-stronger-community-engagement" class="rp-header-anchor rp-link" aria-hidden="true">#</a>5. Stronger Community Engagement</h2>
<p>Cross-platform frameworks represent a long-term, evolving area driven by the open-source community. Lynx itself has been deeply inspired by this ecosystem.</p>
<p>The Lynx toolchain is built on top of <a href="https://rspack.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack</a>, and we already collaborate closely with the Rspack community to deliver high-performance <a href="/rspeedy/index.html" class="rp-link">Rspeedy</a> toolchains. This partnership with the web tooling ecosystem provides a strong foundation for broader engagement.</p>
<p>Looking ahead, we will deepen engagement with the wider web community, including projects such as React, Vue.js, and Motion, and continue improving MiniApps support to make it a fully production-ready solution.</p>
<hr/>
<p><strong>We are hiring!</strong> We welcome you to join us on the Lynx journey. <a href="https://joinbytedance.com/search?keyword=Cross+Platform" target="_blank" rel="noopener noreferrer" class="rp-link">Click here to explore opportunities</a>.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.6: Lynx for AI, reactlynx-use, CSS for Design Engineering]]></title>
            <link>https://lynxjs.org/blog/lynx-3-6</link>
            <guid isPermaLink="false">/blog/lynx-3-6</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.6 is now officially released! This release introduces Lynx for AI to enhance AI-native development capabilities, introduces reactlynx-use for improved developer experience, and enhances CSS capabilities for design expressiveness. On the native side, Lynx 3.6 improves platform integration with standalone BackgroundRuntime and asynchronous TemplateBundle creation on HarmonyOS, along with Auto Layout support for LynxView on iOS.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-36-lynx-for-ai-reactlynx-use-css-for-design-engineering"><span>Lynx 3.6: Lynx for AI, reactlynx-use, CSS for Design Engineering</span><a href="#lynx-36-lynx-for-ai-reactlynx-use-css-for-design-engineering" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">January 30, 2026</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/loongliu.png" alt="Leron Liu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Leron Liu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Performance Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/Dugyu.png" alt="Guangyu Du"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Guangyu Du</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Design Engineering @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx 3.6 is now officially released!</p>
<p>This release introduces Lynx for AI to enhance AI-native development capabilities, introduces <code>reactlynx-use</code> for improved developer experience, and enhances CSS capabilities for design expressiveness.</p>
<p>On the native side, Lynx 3.6 improves platform integration with standalone <code>BackgroundRuntime</code> and asynchronous <code>TemplateBundle</code> creation on HarmonyOS, along with Auto Layout support for LynxView on iOS.</p>
<p>Let&#x27;s take a closer look at what&#x27;s new in Lynx 3.6.</p>
<h2 class="rp-toc-include" id="lynx-for-ai-agentsmd-and-mcps"><a href="#lynx-for-ai-agentsmd-and-mcps" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lynx for AI: <code>AGENTS.md</code> and MCPs</h2>
<p>AI assistants are quickly becoming part of everyday development. With Lynx 3.6, we’re introducing <strong>Lynx for AI</strong>—a new section on our website at <a href="/ai/index.html" class="rp-link">/ai</a> to help coding agents understand Lynx, follow best practices, and help you ship.</p>
<p>In this release, we’re shipping <a href="/ai/agentsmd.html" class="rp-link"><code>AGENTS.md</code></a> and two MCP servers as the first building blocks for agent-friendly Lynx projects (Skills coming soon!).</p>
<h3 class="rp-toc-include" id="lynx-docs-mcp"><a href="#lynx-docs-mcp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lynx Docs MCP</h3>
<p><a href="/ai/lynx-docs-mcp.html" class="rp-link">Lynx Docs MCP</a> connects your coding agent (Gemini, Claude, Cursor, Copilot, etc.) to Lynx documentation via MCP, using <a href="https://lynxjs.org/llms.txt" target="_blank" rel="noopener noreferrer" class="rp-link">llms.txt</a> plus carefully designed prompts so the agent can retrieve the right docs and act on them.</p>
<h3 class="rp-toc-include" id="lynx-devtool-mcp"><a href="#lynx-devtool-mcp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lynx DevTool MCP</h3>
<p><a href="/ai/lynx-devtool-mcp.html" class="rp-link">Lynx DevTool MCP</a> helps coding agents connect to devices and inspect/control Lynx pages like DevTools: read elements/console/source code, perform interactions such as clicks and drags, and capture screenshots for multimodal analysis.</p>
<h2 class="rp-toc-include" id="reactlynx-use-hooks-for-reactlynx"><a href="#reactlynx-use-hooks-for-reactlynx" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>reactlynx-use</code>: Hooks for ReactLynx</h2>
<p><a href="https://lynx-community.github.io/reactlynx-use" target="_blank" rel="noopener noreferrer" class="rp-link"><code>reactlynx-use</code></a> is a hooks toolkit for ReactLynx projects.</p>
<p>It combines two sets of hooks: community-proven utilities that follow standard React patterns (such as <code>useEffectOnce</code>, <code>useDebounce</code>, etc.), built upon the excellent foundation provided by <a href="https://github.com/streamich/react-use" target="_blank" rel="noopener noreferrer" class="rp-link">react-use</a>, and Lynx-specific hooks that expose Lynx capabilities and its dual-thread model through a React-friendly API.</p>
<p>Notable Lynx-specific hooks include:</p>
<ul>
<li><strong>useVelocity</strong>: Track the velocity and direction of tap events on the main thread.</li>
<li><strong>useTapLock</strong>: Constrain main-thread tap interactions to a specific direction or range.</li>
<li><strong>useMainThreadImperativeHandle</strong>: A main-thread counterpart of <code>useImperativeHandle</code>.</li>
<li><strong>useEventListener</strong>: A flexible event subscription hook supporting <code>exposure</code>, <code>disexposure</code>, and more.</li>
</ul>
<p>This keeps everyday logic in familiar hooks, while making it straightforward to tap into Lynx’s main-thread input model and runtime events when you need to.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/reactlynx-use.jpeg" alt="reactlynx-use"/></p>
<h2 class="rp-toc-include" id="css-for-design-engineering"><a href="#css-for-design-engineering" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS for Design Engineering</h2>
<p>From Lynx 3.6 onward, CSS takes on a more explicit role in design engineering and design systems.
As a medium for expressing design intent, CSS describes how decisions are scoped and composed, and how visual structure and perception are formed in the interface.</p>
<p>This release focuses on improving CSS expressiveness through <strong>CSS variables</strong>, <strong>gradients</strong>, and <strong>filters</strong>.</p>
<p>For each capability, we’ve also prepared a polished demo that you can render and interact with on the web.</p>
<h3 class="rp-toc-include" id="inline-css-variables-for-computable-styling"><a href="#inline-css-variables-for-computable-styling" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Inline CSS Variables for Computable Styling</h3>
<p>As of Lynx 3.6, <a href="/api/css/properties/css-variable.html" class="rp-link">CSS variables</a> can be defined and referenced inline. This allows them to be applied directly at component boundaries (where JS-defined parameters are handed off to CSS), without relying on ancestor class switches (such as <code>theme-light</code> / <code>theme-dark</code>) or imperative JS <code>setProperty</code> calls.</p>
<p>It becomes essential when a component&#x27;s style is user-selected or computed at runtime, since such continuous values cannot be represented by a finite set of predefined classes and would otherwise require imperative style updates.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">style</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{{</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">  &#x27;--x&#x27;</span><span style="color:var(--shiki-foreground)">: </span><span style="color:var(--shiki-token-constant)">pointer</span><span style="color:var(--shiki-foreground)">.x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-comment)">  // normalized parameter from JS</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  backgroundColor</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;var(--dot-accent-color)&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-comment)"> //defer resolution to component CSS</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>Inline CSS variables provide a direct path for passing design parameters from JS into CSS&#x27;s inheritance and computation model, so that design intent can be dynamically expressed and resolved while preserving component-level scoping and the declarative styling model.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/design-guide/design_force_field_10fps_go.webp" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>design-guide</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/force_field/field.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="nested-css-variables-for-token-layering"><a href="#nested-css-variables-for-token-layering" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Nested CSS Variables for Token Layering</h3>
<p>With Lynx 3.6, <a href="/api/css/properties/css-variable.html" class="rp-link">CSS variables</a> can be defined in terms of other variables, allowing <a href="https://m3.material.io/foundations/design-tokens/overview" target="_blank" rel="noopener noreferrer" class="rp-link">design tokens</a> to be layered and resolved compositionally.</p>
<p>Design tokens capture high-level design decisions, such as colors, typography, spacing, shadows, and glows. Nested CSS variables enable these tokens to flow down into component-level variables and concrete visual styles.</p>
<div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="css"><code><span class="line"><span style="color:var(--shiki-token-comment)">/* Resolve and compose shadow tokens via nested CSS variables. */</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">.card</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  --blur</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-keyword)">px</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  --ambient-shadow</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0 0 </span><span style="color:var(--shiki-token-function)">var</span><span style="color:var(--shiki-token-constant)">(--blur) </span><span style="color:var(--shiki-token-function)">var</span><span style="color:var(--shiki-token-constant)">(--color)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  box-shadow</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> var</span><span style="color:var(--shiki-token-constant)">(--ambient-shadow)</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> var</span><span style="color:var(--shiki-token-constant)">(--rim-shadow)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>This is especially important for composite declarations like <code>box-shadow</code>. A single <code>box-shadow</code> may contain multiple shadow layers, each combining several interacting dimensions such as offset, blur, spread, and color.
With nested CSS variables, shadow layers can now be derived, combined, and adjusted from design tokens, while keeping their structure explicit and traceable in CSS.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="css"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/design-guide/design_soft_glow.jpg" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>design-guide</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/soft_glow/index.css</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="conic-gradients-as-design-primitives"><a href="#conic-gradients-as-design-primitives" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Conic Gradients as Design Primitives</h3>
<p>Lynx 3.6 adds support for the <a href="/api/css/data-type/gradient.html" class="rp-link"><code>conic-gradient()</code></a> CSS image function. You can use it in CSS properties that accept <code>&lt;image&gt;</code> values, such as in <code>background-image</code> and <code>mask-image</code>, to create continuous angular color transitions directly in CSS.</p>
<div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="css"><code><span class="line"><span style="color:var(--shiki-token-function)">.bg</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  background-image</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> conic-gradient</span><span style="color:var(--shiki-token-constant)">(</span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-keyword)">deg</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> #ff7385</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> #fe69a1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> #00d0f1)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p>Conic gradients are a natural fit for angular or cyclic representations, including color wheels and hue pickers. In practice, they’re a lightweight design primitive you can compose into interactive controls and visual tools.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="css"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/design-guide/design_color_wheels_go.jpg" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>design-guide</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/color_wheels/index.css</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="css-filters-for-shape-formation"><a href="#css-filters-for-shape-formation" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS Filters for Shape Formation</h3>
<p>Lynx 3.6 extends CSS filter support with <code>contrast</code>, <code>brightness</code>, and <code>saturate</code>.</p>
<p>With these additions, the CSS <a href="/api/css/properties/filter.html" class="rp-link"><code>filter</code></a> property becomes a composable tool for shape formation.
The newly supported <code>contrast</code> filter, when combined with the existing <code>blur</code> capability, amplifies overlapping regions and allows soft shapes to merge into coherent forms.</p>
<p>Visual structures such as merging, perceptual grouping, and fluid boundaries can be constructed directly in CSS, without relying on bitmap assets or custom rendering pipelines.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="css"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/design-guide/design_gooey_effect_20fps.webp" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>design-guide</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/gooey_effect/index.css</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="native-apis"><a href="#native-apis" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native APIs</h2>
<h3 class="rp-toc-include" id="standalone-backgroundruntime-on-harmonyos"><a href="#standalone-backgroundruntime-on-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Standalone BackgroundRuntime on HarmonyOS</h3>
<p>HarmonyOS now supports standalone <a href="/api/lynx-native-api/lynx-background-runtime.html" class="rp-link">BackgroundRuntime</a>, aligning more closely with existing Android and iOS capabilities.</p>
<p>With standalone BackgroundRuntime, developers can run JavaScript tasks independently of rendering, or pre-create background runtimes to reduce LynxView initialization latency.</p>
<h3 class="rp-toc-include" id="asynchronous-templatebundle-creation-on-harmonyos"><a href="#asynchronous-templatebundle-creation-on-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Asynchronous TemplateBundle Creation on HarmonyOS</h3>
<p>On Android and iOS, <a href="/api/lynx-native-api/template-bundle/from-template.html" class="rp-link"><code>TemplateBundle.fromTemplate</code></a> can be called from any thread. On HarmonyOS, however, ArkTS logic must run on the application&#x27;s main thread.</p>
<p>To reduce main-thread I/O blocking, Lynx 3.6 introduces asynchronous APIs for creating <code>TemplateBundle</code> instances on HarmonyOS:</p>
<ul>
<li><a href="/api/lynx-native-api/template-bundle/from-template-async.html" class="rp-link"><code>TemplateBundle.fromTemplateAsync</code></a></li>
<li><a href="/api/lynx-native-api/template-bundle/from-template-async-with-option.html" class="rp-link"><code>TemplateBundle.fromTemplateAsyncWithOption</code></a></li>
</ul>
<h3 class="rp-toc-include" id="autolayout-support-for-lynxview-on-ios"><a href="#autolayout-support-for-lynxview-on-ios" class="rp-header-anchor rp-link" aria-hidden="true">#</a>AutoLayout Support for LynxView on iOS</h3>
<p>On iOS, LynxView now supports Auto Layout via <a href="/api/lynx-native-api/lynx-view/enable-auto-layout.html" class="rp-link"><code>[LynxView enableAutoLayout]</code></a>.</p>
<p>When enabled, LynxView can derive layout parameters directly from client-side Auto Layout constraints, eliminating the need to configure layout values manually.</p>
<h2 class="rp-toc-include" id="upgrade-guide"><a href="#upgrade-guide" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade Guide</h2>
<p>To upgrade to Lynx 3.6, follow the <a href="https://lynxjs.org/3.6/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer" class="rp-link">integration guide</a> and update your Lynx dependency versions accordingly.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.5: Main Thread Script, React Compiler, HarmonyOS Improvements]]></title>
            <link>https://lynxjs.org/blog/lynx-3-5</link>
            <guid isPermaLink="false">/blog/lynx-3-5</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.5 is now officially released! Following our stable bi-monthly release cadence, Lynx 3.5 brings several key improvements. This release adds experimental support for React Compiler, enhances main thread scripts with `stopPropagation` for better event bubbling control, enables immediate interactivity after first-frame rendering, and improves cross-thread communication. We've also expanded HarmonyOS platform support and introduced new features like the `pointer-events` CSS property.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-35-main-thread-script-react-compiler-harmonyos-improvements"><span>Lynx 3.5: Main Thread Script, React Compiler, HarmonyOS Improvements</span><a href="#lynx-35-main-thread-script-react-compiler-harmonyos-improvements" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">November 10, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/loongliu.png" alt="Leron Liu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Leron Liu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Performance Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/huxpro.png" alt="Xuan Huang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Xuan Huang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Architect @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx 3.5 is now officially released!</p>
<p>Following our stable bi-monthly release cadence, Lynx 3.5 brings several key improvements. This release adds experimental support for React Compiler, enhances main thread scripts with <code>stopPropagation</code> for better event bubbling control, enables immediate interactivity after first-frame rendering, and improves cross-thread communication. We&#x27;ve also expanded HarmonyOS platform support and introduced new features like the <code>pointer-events</code> CSS property.</p>
<p>Let&#x27;s dive in and see what&#x27;s new!</p>
<h2 class="rp-toc-include" id="react-compiler"><a href="#react-compiler" class="rp-header-anchor rp-link" aria-hidden="true">#</a>React Compiler <span class="rp-badge rp-badge--warning"><svg width="1em" height="1em" stroke-linejoin="round" data-testid="geist-icon" style="color:currentcolor" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M9 7.674V2.5H7v5.174l-.503.447L4.383 10h7.234L9.503 8.121zM5.5 2.5H4V1h8v1.5h-1.5V7l3.573 3.177A2.76 2.76 0 0 1 12.24 15H3.76a2.76 2.76 0 0 1-1.834-4.823L5.5 7zm-3 9.74c0-.268.085-.527.24-.74h10.52a1.26 1.26 0 0 1-1.02 2H3.76a1.26 1.26 0 0 1-1.26-1.26" clip-rule="evenodd"></path></svg><span>experimental</span></span></h2>
<p><a href="https://react.dev/learn/react-compiler" target="_blank" rel="noopener noreferrer" class="rp-link">React Compiler</a> optimizes components at compile time, so you don&#x27;t need to manually add <code>useMemo</code>, <code>useCallback</code>, or <code>memo</code>. You can now use React Compiler in ReactLynx to optimize your app&#x27;s performance.</p>
<p><a href="/react/react-compiler.html" class="rp-link">Learn how to enable React Compiler in ReactLynx</a>.</p>
<h2 class="rp-toc-include" id="main-thread-script"><a href="#main-thread-script" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Main Thread Script</h2>
<h3 class="rp-toc-include" id="event-stop-propagation"><a href="#event-stop-propagation" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Event Stop Propagation <span class="rp-badge rp-badge--tip">Web Friendly</span></h3>
<p>When an event fires, it <a href="https://lynxjs.org/3.5/guide/interaction/event-handling/event-propagation" target="_blank" rel="noopener noreferrer" class="rp-link">propagates</a> through event bubbling, allowing different parts of your UI to handle it. Previously, Lynx only supported static event bubbling interception via <a href="https://lynxjs.org/3.5/guide/interaction/event-handling/event-propagation#event-interception" target="_blank" rel="noopener noreferrer" class="rp-link"><code>catch</code>-type event handler attributes</a>, which lacked the flexibility of web standards. With Lynx 3.5, main thread scripts now support <a href="https://lynxjs.org/3.5/api/lynx-api/event/event.html#stoppropagation" target="_blank" rel="noopener noreferrer" class="rp-link"><code>event.stopPropagation()</code></a>, giving you runtime control over event bubbling that matches what you&#x27;d expect on the web.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-token-function)"> handleInnerTap</span><span style="color:var(--shiki-foreground)">(e</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> MainThread</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-function)">TouchEvent</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">  &#x27;main thread&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-constant)">  e</span><span style="color:var(--shiki-token-function)">.stopPropagation</span><span style="color:var(--shiki-foreground)">(); </span><span style="color:var(--shiki-token-comment)">// ✋ stop event bubbling</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  flash</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;inner&#x27;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/event_stop.webp" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>event</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/event_stop_propagation/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="immediate-interactivity-after-first-frame"><a href="#immediate-interactivity-after-first-frame" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Immediate Interactivity After <a href="https://lynxjs.org/3.5/guide/interaction/ifr.html" target="_blank" rel="noopener noreferrer" class="rp-link">First-Frame</a></h3>
<p>Previously, main thread events had to wait for the background thread to complete <a href="https://lynxjs.org/3.5/react/lifecycle.html" target="_blank" rel="noopener noreferrer" class="rp-link">hydration</a> before responding, creating a frustrating delay where the page looked ready but wasn&#x27;t interactive, similar to the <a href="https://web.dev/articles/rendering-on-the-web#rehydration" target="_blank" rel="noopener noreferrer" class="rp-link">uncanny valley effect commonly seen in server-side rendering</a>.</p>
<p>To eliminate this delay, we optimized the hydration process so that main thread events can respond immediately after the first frame is rendered. After the background thread hydrates, it correctly takes over the state from the main thread and replays <a href="https://lynxjs.org/3.5/api/react/Function.runOnBackground.html" target="_blank" rel="noopener noreferrer" class="rp-link"><code>runOnBackground</code></a> calls, ensuring proper synchronization between threads while achieving immediate interactivity as soon as the first frame is visible.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-token-function)"> App</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-function)"> gotoUser</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> () </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-string-expression)">    &#x27;main thread&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // go to second page</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  };</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-keyword)">  return</span><span style="color:var(--shiki-foreground)"> (</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-token-function)"> main-thread</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">bindtap</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{gotoUser}&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      &lt;</span><span style="color:var(--shiki-token-string-expression)">text</span><span style="color:var(--shiki-foreground)">&gt;goto user&lt;/</span><span style="color:var(--shiki-token-string-expression)">text</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  );</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="cross-thread-function-calls-now-return-values"><a href="#cross-thread-function-calls-now-return-values" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Cross-Thread Function Calls Now Return Values</h3>
<p>Lynx provides <a href="https://lynxjs.org/3.5/api/react/Function.runOnMainThread#function-runonmainthread" target="_blank" rel="noopener noreferrer" class="rp-link"><code>runOnMainThread</code></a> and <a href="https://lynxjs.org/3.5/api/react/Function.runOnBackground.html" target="_blank" rel="noopener noreferrer" class="rp-link"><code>runOnBackground</code></a> for cross-thread function calls. In Lynx 3.5, both APIs now support async return values, making cross-thread communication more flexible and intuitive.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { runOnMainThread</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> useMainThreadRef } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/react&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-token-function)"> App</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-constant)"> countRef</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> useMainThreadRef</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-function)"> addCount</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> (value) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">    &#x27;main thread&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    countRef</span><span style="color:var(--shiki-foreground)">.current </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> value;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> countRef</span><span style="color:var(--shiki-foreground)">.current;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-function)"> increaseMainThreadCount</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-keyword)"> async</span><span style="color:var(--shiki-foreground)"> () </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // await for return value from main thread</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-keyword)">    const</span><span style="color:var(--shiki-token-constant)"> result</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-keyword)"> await</span><span style="color:var(--shiki-token-function)"> runOnMainThread</span><span style="color:var(--shiki-foreground)">(addCount)(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(result);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="built-in-animations-for-list-updates"><a href="#built-in-animations-for-list-updates" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Built-in Animations for <code>&lt;list&gt;</code> Updates</h2>
<p>The <code>&lt;list&gt;</code> element now includes default <a href="https://lynxjs.org/3.5/api/elements/built-in/list.html#update-animation" target="_blank" rel="noopener noreferrer" class="rp-link">update animations</a> out of the box. When you add, remove, or update list items, smooth transitions are applied automatically—no extra code needed.</p>
<div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="tsx"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">list</span><span style="color:var(--shiki-token-function)"> update-animation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;default&quot;</span><span style="color:var(--shiki-foreground)">&gt;&lt;/</span><span style="color:var(--shiki-token-string-expression)">list</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<table border="0"><tr><td><p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/5_delete.gif" alt=""/></p></td><td><p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/5_update.gif" alt=""/></p></td><td><p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/5_insert.gif" alt=""/></p></td></tr><tr><td>Delete</td><td>Update</td><td>Insert</td></tr></table>
<h2 class="rp-toc-include" id="css-property-pointer-events"><a href="#css-property-pointer-events" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS Property: <code>pointer-events</code> <span class="rp-badge rp-badge--tip">Web Friendly</span></h2>
<p>Lynx 3.5 adds support for the <a href="https://lynxjs.org/3.5/api/css/properties/pointer-events.html" target="_blank" rel="noopener noreferrer" class="rp-link"><code>pointer-events</code></a> CSS property, giving you control over whether an element can receive touch events.</p>
<div class="rp-codeblock language-css"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="css"><code><span class="line"><span style="color:var(--shiki-token-string-expression)">pointer-events</span><span style="color:var(--shiki-foreground)">: auto;  // Default value. The </span><span style="color:var(--shiki-token-string-expression)">element</span><span style="color:var(--shiki-foreground)"> can be the target of touch events.</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">pointer-events</span><span style="color:var(--shiki-foreground)">: none;  // The </span><span style="color:var(--shiki-token-string-expression)">element</span><span style="color:var(--shiki-foreground)"> cannot be the target of touch events.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/pointer-events.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>css-api</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/pointer-events/App.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="harmonyos-improvements"><a href="#harmonyos-improvements" class="rp-header-anchor rp-link" aria-hidden="true">#</a>HarmonyOS Improvements</h2>
<h3 class="rp-toc-include" id="fetch-api"><a href="#fetch-api" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Fetch API</h3>
<p>Lynx provides a <a href="https://lynxjs.org/3.5/api/lynx-api/global/fetch" target="_blank" rel="noopener noreferrer" class="rp-link">Fetch API</a> that follows web standards, so it works just like you&#x27;d expect. With Lynx 3.5, Fetch API support extends to HarmonyOS, making cross-platform development even easier.</p>
<h3 class="rp-toc-include" id="accessibilityannounce"><a href="#accessibilityannounce" class="rp-header-anchor rp-link" aria-hidden="true">#</a>accessibilityAnnounce</h3>
<p>Lynx 3.5 adds <a href="https://lynxjs.org/3.5/api/lynx-api/lynx/lynx-accessibility-announce.html" target="_blank" rel="noopener noreferrer" class="rp-link"><code>accessibilityAnnounce()</code></a> support on HarmonyOS, bringing it in line with Android and iOS. This method lets screen readers announce specific text, helping visually impaired users understand interface changes and action results.</p>
<div class="rp-codeblock language-jsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="jsx"><code><span class="line"><span style="color:var(--shiki-token-constant)">lynx</span><span style="color:var(--shiki-token-function)">.accessibilityAnnounce</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    content</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;hello lynx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  (res) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;result: &#x27;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> JSON</span><span style="color:var(--shiki-token-function)">.stringify</span><span style="color:var(--shiki-foreground)">(res));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="requestresourceprefetch"><a href="#requestresourceprefetch" class="rp-header-anchor rp-link" aria-hidden="true">#</a>requestResourcePrefetch</h3>
<p>The <a href="https://lynxjs.org/3.5/api/lynx-api/lynx/lynx-request-resource-prefetch.html" target="_blank" rel="noopener noreferrer" class="rp-link"><code>requestResourcePrefetch</code></a> API is now available on HarmonyOS, matching Android and iOS support. Use it to prefetch CDN resources like images, videos, and audio files for faster loading.</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-token-constant)">lynx</span><span style="color:var(--shiki-token-function)">.requestResourcePrefetch?.</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    data</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        uri</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;https://demo.org/test.jpg&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        type</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;image&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        params</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> { priority</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;high&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> cacheTarget</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;disk&#x27;</span><span style="color:var(--shiki-foreground)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  (res) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">      &#x27;prefetch status of each resource:&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      JSON</span><span style="color:var(--shiki-token-function)">.stringify</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">res</span><span style="color:var(--shiki-foreground)">.details)</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    );</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="upgrade-guide"><a href="#upgrade-guide" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade Guide</h2>
<p>To upgrade to Lynx 3.5, follow the <a href="https://lynxjs.org/3.5/guide/start/integrate-with-existing-apps.html" target="_blank" rel="noopener noreferrer" class="rp-link">integration guide</a> and update your Lynx dependency versions.</p>
<h2 class="rp-toc-include" id="one-more-thing-desktop-support-preview"><a href="#one-more-thing-desktop-support-preview" class="rp-header-anchor rp-link" aria-hidden="true">#</a>One More Thing: Desktop Support Preview</h2>
<p>We <a href="/next/blog/lynx-open-source-roadmap-2025.html" class="rp-link">previously planned</a> for Lynx 3.5 to introduce desktop support. At the time, our plan was to open source our custom rendering pipeline and low-level integration APIs for desktop. Since then, we&#x27;ve decided to go further and open source the full desktop stack to give you a more battery-included experience. As a result, we would have to adjust our timeline to early 2026.</p>
<p>To get a preview of where we are heading, and how our approach both learns from and differs from prior arts like
<a href="https://www.electronjs.org/" target="_blank" rel="noopener noreferrer" class="rp-link">Electron</a> and <a href="https://www.qt.io/" target="_blank" rel="noopener noreferrer" class="rp-link">Qt</a>, check out the talk <strong>&quot;Bringing Lynx to Desktop and Beyond&quot;</strong> from our Multi-Platform Lead <a href="https://x.com/adservc1" target="_blank" rel="noopener noreferrer" class="rp-link">ZhiXuan Wang</a> at <a href="https://ubuntu.com/summit" target="_blank" rel="noopener noreferrer" class="rp-link">Ubuntu Summit 2025</a>:</p>
<div class="relative h-0 overflow-hidden pt-[56.25%]"><iframe class="absolute inset-0 w-full h-full" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="YouTube video player" src="https://www.youtube.com/embed/n0jDZSI4tXg"></iframe></div><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Lynx for HarmonyOS]]></title>
            <link>https://lynxjs.org/blog/lynx-harmony</link>
            <guid isPermaLink="false">/blog/lynx-harmony</guid>
            <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are happy to share that Lynx now provides public beta support for HarmonyOS, delivering feature parity in CSS, Elements, and APIs — along with the same level of native performance and user experience.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="announcing-lynx-for-harmonyos"><span>Announcing Lynx for HarmonyOS</span><a href="#announcing-lynx-for-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">September 25, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/rel-q.png" alt="Qiang Bai"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Qiang Bai</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Software Engineer</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/toretto-wt.png" alt="Wentao Shi"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Wentao Shi</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Rendering Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-background1.png" alt="lynx-harmony-background"/></p>
<p>As introduced in the <a href="/next/blog/lynx-unlock-native-for-more.html" class="rp-link">open-sourcing blog</a>, Lynx&#x27;s vision continues to be unlocking native for more platforms and more users. With HarmonyOS now adding new platform and device diversity to the market, we want to enable Lynx developers to reach these users with the same ease they already enjoy on Android, iOS, and Web with Lynx.</p>
<p>Today, we are happy to share that <strong>Lynx now provides public beta support for HarmonyOS</strong>, delivering feature parity in <a href="/guide/ui/styling.html" class="rp-link">CSS</a>, <a href="/api/elements/built-in/view.html" class="rp-link">Elements</a>, and <a href="/api/index.html" class="rp-link">APIs</a> — along with the same level of native performance and user experience.</p>
<h2 class="rp-toc-include" id="consistent-rendering-for-harmonyos"><a href="#consistent-rendering-for-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Consistent Rendering for HarmonyOS</h2>
<p>In <a href="/learn/gallery.html" class="rp-link">Tutorial: Product Gallery</a> we built a complex page using Lynx. Let&#x27;s see how Lynx performs on Android vs HarmonyOS. As shown below, it achieves pixel-perfect alignment. This allows Lynx developers to <strong>write once, run everywhere</strong> - one codebase for Android, iOS, Web, and HarmonyOS apps, improving efficiency and maintainability.</p>
<div style="display:table;margin:36px 0;width:100%;table-layout:fixed"><div style="display:table-row"><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/ifr-harmony.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">Running Lynx on HarmonyOS</div></div><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/ifr-android1.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">Running Lynx on Android</div></div></div></div>
<p>The high consistency of Lynx&#x27;s CSS and native elements across Android, iOS, and HarmonyOS is attributed to our architectural decision: <strong>Lynx&#x27;s rendering pipeline is shared and consistent across multiple platforms</strong>. On HarmonyOS, we implement the same set of CSS, animations, and custom component by swapping the paint layer to issue instructions to <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer" class="rp-link">ArkUI</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-imp.png" alt="lynx-harmony-background"/></p>
<h2 class="rp-toc-include" id="native-lynx-for-harmonyos"><a href="#native-lynx-for-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Lynx for HarmonyOS</h2>
<h3 class="rp-toc-include" id="native-painting-with-arkui"><a href="#native-painting-with-arkui" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Painting with ArkUI</h3>
<p>Lynx on Harmony uses <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer" class="rp-link">ArkUI components</a> for painting. Lynx with OpenHarmony explored two approaches: <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-ui-development-overview" target="_blank" rel="noopener noreferrer" class="rp-link">ArkTS</a> and <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ndk-build-ui-overview" target="_blank" rel="noopener noreferrer" class="rp-link">C API</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/lynx-harmony-ui.png" alt="lynx-harmony-ui"/></p>
<p>We finally chose C API to directly map Lynx <a href="https://lynxjs.org/guide/spec.html#platform-ui-tree" target="_blank" rel="noopener noreferrer" class="rp-link">platform-ui-tree</a> to HarmonyOS native UI, combining Lynx performance with ArkTS ecosystem benefits.</p>
<ul>
<li>
<p><strong>Native UI Rendering</strong>: Using <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-overview" target="_blank" rel="noopener noreferrer" class="rp-link">ArkUI&#x27;s</a> <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ndk-build-ui-overview" target="_blank" rel="noopener noreferrer" class="rp-link">C API</a> to convert <a href="https://lynxjs.org/guide/spec.html#element-tree" target="_blank" rel="noopener noreferrer" class="rp-link">element-tree</a> operations directly to native UI calls, eliminating data conversion overhead for better performance in complex UI updates.</p>
</li>
<li>
<p><strong>Custom Native Element</strong>: By utilizing HarmonyOS&#x27;s <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-user-defined-arktsnode-buildernode" target="_blank" rel="noopener noreferrer" class="rp-link"><code>BuilderNode</code></a> and <a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builder" target="_blank" rel="noopener noreferrer" class="rp-link"><code>Builder</code></a> capabilities, developers can dynamically construct ArkTS subtrees and seamlessly embed them into the ArkUI node tree created by Lynx, achieving highly customized component implementations.</p>
</li>
</ul>
<h3 class="rp-toc-include" id="native-interactions"><a href="#native-interactions" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Interactions</h3>
<p>Lynx designed a complete event system that captures and responds to gestures and events in complex interactions.</p>
<table rules="none" align="center" width="100%" style="table-layout:fixed"><thead align="center"><th colSpan="1"><span style="font-weight:bold">Gesture Support</span></th><th colSpan="1"><span style="font-weight:bold"><p>Custom Gesture Control in Hybrid Scenarios</p></span></th></thead><tr><td style="padding:15px 0 15px 15px"><center><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/base-event.gif" style="width:200px;height:380px;aspect-ratio:1/1"/></center></td><td style="padding:15px 0 15px 15px"><center><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/complex-event.gif" style="width:200px;height:380px;aspect-ratio:1/1"/></center></td></tr></table>
<ul>
<li><strong>Custom HitTest</strong>: Accurately find the nodes responding to events on the Lynx platform-ui-tree, ensuring precise interactions.</li>
<li><strong>Gesture Support</strong>: Integrates HarmonyOS gesture like <a href="https://lynxjs.org/api/lynx-api/event/touch-event#tap" target="_blank" rel="noopener noreferrer" class="rp-link"><code>tap</code></a> and <a href="https://lynxjs.org/api/lynx-api/event/touch-event#longpress" target="_blank" rel="noopener noreferrer" class="rp-link"><code>longpress</code></a>, ensuring native-like gesture experience on Lynx.</li>
<li><strong>Custom Gesture Control in Embedded Scenarios</strong>: Offers a comprehensive set of event APIs, including <a href="https://lynxjs.org/api/elements/built-in/view.html#user-interaction-enabled" target="_blank" rel="noopener noreferrer" class="rp-link"><code>user-interaction-enabled</code></a> and <a href="https://lynxjs.org/api/elements/built-in/view.html#block-native-event" target="_blank" rel="noopener noreferrer" class="rp-link"><code>block-native-event</code></a>, empowering Lynx developers to manage event propagation and handling logic for efficient processing of nested scrolling scenarios with native pages.</li>
</ul>
<h3 class="rp-toc-include" id="native-extensions"><a href="#native-extensions" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Native Extensions</h3>
<ul>
<li><strong>Native Element Customization</strong>: Lynx provides rich <a href="https://lynxjs.org/api/elements/built-in/view.html" target="_blank" rel="noopener noreferrer" class="rp-link">built-in elements</a> and supports integration of custom HarmonyOS native elements (via ArkTS), enabling developers to extend UI capabilities for highly customized interfaces while preserving native performance. More details: <a href="/guide/custom-native-component.html?platform=harmony" class="rp-link">Custom Element</a>.</li>
<li><strong>Native Modules</strong>: Lynx enables developers to call HarmonyOS native APIs from JavaScript, supporting both system services and custom native modules. More detail: <a href="/guide/use-native-modules.html?platform=harmony" class="rp-link">Native Modules</a>。</li>
</ul>
<h2 class="rp-toc-include" id="create-your-first-lynx-on-harmonyos"><a href="#create-your-first-lynx-on-harmonyos" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Create Your First Lynx on HarmonyOS</h2>
<p>Lynx&#x27;s official website offers <a href="/guide/start/integrate-with-existing-apps.html?platform=harmony" class="rp-link">development documentation</a> and <a href="https://github.com/lynx-family/integrating-lynx-demo-projects/tree/release/4.0/harmony/HarmonyEmptyProject" target="_blank" rel="noopener noreferrer" class="rp-link">demo code</a> for developers to get started quickly and efficiently.</p>
<ol>
<li>
<p><strong>Use the Pre-built Lynx Explorer</strong>: For the easiest development setup, follow the <a href="/guide/start/quick-start.html" class="rp-link">Quick Start</a> to install the Lynx Explorer hap package and begin Lynx development.</p>
</li>
<li>
<p><strong>Local Build of Lynx Explorer</strong>: Developers interested in exploring the Lynx on HarmonyOS source code can also attempt local builds by following the guide <a href="https://github.com/lynx-family/lynx/tree/develop/explorer/harmony" target="_blank" rel="noopener noreferrer" class="rp-link">Building Lynx Explorer for Harmony</a>.</p>
</li>
<li>
<p><strong>Integrate with Existing Apps on HarmonyOS</strong>: For developers with existing HarmonyOS application projects seeking to integrate Lynx, the official website provides <a href="/guide/start/integrate-with-existing-apps.html?platform=harmony" class="rp-link">Integrate with Existing Apps</a>.</p>
</li>
</ol>
<p>Welcome to the Lynx community. Let&#x27;s build outstanding native experiences with Lynx on HarmonyOS!</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx 3.4: HarmonyOS Support, Trace and Recorder, Text Input Elements]]></title>
            <link>https://lynxjs.org/blog/lynx-3-4</link>
            <guid isPermaLink="false">/blog/lynx-3-4</guid>
            <pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.4 is now officially released! This release features new platform support for HarmonyOS, enables Windows development, launches new developer tools *Trace* and *Recorder*, open-sources the highly requested `<input>` and `<textarea>` elements, offers even more flexible animations, supports variable fonts, and more.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-34-harmonyos-support-trace-and-recorder-text-input-elements"><span>Lynx 3.4: HarmonyOS Support, Trace and Recorder, Text Input Elements</span><a href="#lynx-34-harmonyos-support-trace-and-recorder-text-input-elements" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">September 3, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/loongliu.png" alt="Leron Liu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Leron Liu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Performance Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Lynx 3.4 is now officially released!</p>
<p>In line with the <a href="/next/blog/lynx-open-source-roadmap-2025.html" class="rp-link">technical roadmap</a> announced earlier this year, we&#x27;ve kept a steady bimonthly release rhythm. We skipped a blog for Lynx 3.3 since it had few user-facing features, but that release set the stage for a packed 3.4 releases, bringing new platform support for HarmonyOS, enabling Windows development, launching new developer tools <em>Trace</em> and <em>Recorder</em>, open-sourcing the highly-requested <code>&lt;input&gt;</code> and <code>&lt;textarea&gt;</code> elements, even more flexible animations, variable fonts, and more!</p>
<h2 class="rp-toc-include" id="new-platform-support"><a href="#new-platform-support" class="rp-header-anchor rp-link" aria-hidden="true">#</a>New Platform Support</h2>
<h3 class="rp-toc-include" id="harmonyos-support-public-beta"><a href="#harmonyos-support-public-beta" class="rp-header-anchor rp-link" aria-hidden="true">#</a>HarmonyOS Support Public Beta</h3>
<p>Lynx now officially supports the <a href="https://www.harmonyos.com/en/" target="_blank" rel="noopener noreferrer" class="rp-link">HarmonyOS</a> platform. Developers can integrate Lynx into their HarmonyOS applications by following our <a href="/guide/start/integrate-with-existing-apps.html?platform=harmony" class="rp-link">Integration Guide</a>.
Additionally, we will soon be publishing a dedicated blog that takes a closer look at Lynx on HarmonyOS. Stay tuned.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-harmony/background.png" alt=""/></p>
<h3 class="rp-toc-include" id="support-for-windows-development"><a href="#support-for-windows-development" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Support for Windows Development</h3>
<ul>
<li>
<p>The build tool <a href="/rspeedy/index.html" class="rp-link">Rspeedy</a> now supports the Windows, enabling developers to develop and build Lynx projects on Windows PCs;</p>
</li>
<li>
<p>Developers can successfully compile the Android Lynx Engine and <a href="/guide/start/quick-start.html#prepare-lynx-explorer" class="rp-link">LynxExplorer</a> application in a Windows environment;</p>
</li>
</ul>
<p>Support for the Windows version of Devtool desktop is currently in development and will be released soon.</p>
<h2 class="rp-toc-include" id="new-developer-tools"><a href="#new-developer-tools" class="rp-header-anchor rp-link" aria-hidden="true">#</a>New Developer Tools</h2>
<p>Lynx 3.4 introduces two developer tools dedicated to improving the developer experience and debugging efficiency.</p>
<h3 class="rp-toc-include" id="trace"><a href="#trace" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Trace</h3>
<p><a href="/guide/devtool/trace.html" class="rp-link">Trace</a> delivers comprehensive, end-to-end insight into your Lynx app’s rendering pipeline. From parsing and construction to layout and rendering, Trace captures and visualizes every stage of your page’s lifecycle. What was once a “black box” is now a transparent, interactive map of your app’s inner workings. Developers can finally observe, understand, and optimize performance at the deepest levels, making it easier than ever to identify bottlenecks and fine-tune for maximum efficiency.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/trace-tool-overview-latest2.png" alt=""/></p>
<h3 class="rp-toc-include" id="recorder"><a href="#recorder" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Recorder</h3>
<p><a href="/guide/devtool/recorder.html" class="rp-link">Recorder</a> is your time machine for Lynx apps. It logs every aspect of your app’s runtime behavior—from external resource loading and native module calls (with results), to the complete stream of user interactions. These sessions can be exported and replayed with pixel-perfect accuracy in LynxExplorer, transforming elusive, hard-to-reproduce bugs and tricky asynchronous issues into solvable problems. With Recorder, debugging is as easy as pressing “play,” offering clarity and confidence even in the most complex scenarios.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/recorder-concept.png" alt=""/></p>
<h2 class="rp-toc-include" id="text-input-elements"><a href="#text-input-elements" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Text Input Elements</h2>
<p>In a recent UI capability survey conducted within the Lynx community, <code>&lt;input&gt;</code>/<code>&lt;textarea&gt;</code> elements emerged as the most highly anticipated core features, garnering over 50% of the vote.</p>
<p>Lynx 3.4 delivers two core text input elements.
We will continue to improve core elements. Developers are welcome to continue voting in the <a href="https://github.com/lynx-family/lynx/discussions/673" target="_blank" rel="noopener noreferrer" class="rp-link">discussion</a> to help shape Lynx&#x27;s future.</p>
<h3 class="rp-toc-include" id="single-line-input-element"><a href="#single-line-input-element" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Single-line <a href="/api/elements/built-in/input.html" class="rp-link"><code>&lt;input&gt;</code></a> Element</h3>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/input_basic.PNG" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>input</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/base/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="multi-line-textarea-element"><a href="#multi-line-textarea-element" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Multi-line <a href="/api/elements/built-in/textarea.html" class="rp-link"><code>&lt;textarea&gt;</code></a> element</h3>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/textarea_basic.PNG" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>textarea</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/base/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="list-recycle-optimization"><a href="#list-recycle-optimization" class="rp-header-anchor rp-link" aria-hidden="true">#</a>List Recycle Optimization</h2>
<p>Lynx 3.4 optimizes the recycling strategy of the <code>&lt;list&gt;</code> element to improve rendering performance.</p>
<h3 class="rp-toc-include" id="recycle-list-sticky-item"><a href="#recycle-list-sticky-item" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Recycle <code>&lt;list&gt;</code> Sticky Item</h3>
<p>When a <code>&lt;list-item&gt;</code> is scrolled out of the <code>&lt;list&gt;</code> viewport, the original recycling mechanism would cache the item for reuse. Prior to Lynx 3.4, <code>&lt;list-item&gt;</code> elements with the sticky attribute were not recycled. In long lists making heavy use of the sticky feature, this could lead to high memory usage. Lynx 3.4 optimizes this strategy; sticky items are now also recycled after scrolling out of the viewport.
If this change adversely affects your existing scenarios, you can temporarily disable this optimization by setting <a href="/api/elements/built-in/list.html#experimental-recycle-sticky-item" class="rp-link"><code>experimental-recycle-sticky-item={false}</code></a>. If you encounter any issues, please provide feedback via an issue.</p>
<table border="0"> <tr> <td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/not-recycle-sticky-1.gif" alt=""/></td> <td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/recycle-sticky-1.gif" alt=""/></td> </tr> <tr> <td>sticky <code>&lt;list-item&gt;</code> in Lynx 3.3</td> <td>sticky <code>&lt;list-item&gt;</code> in Lynx 3.4</td> </tr> </table>
<h3 class="rp-toc-include" id="prevent-list-item-from-being-recycled"><a href="#prevent-list-item-from-being-recycled" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Prevent <code>&lt;list-item&gt;</code> from Being Recycled</h3>
<p>When a <code>&lt;list-item&gt;</code> contains complex components, recycling and re-updating the node incurs significant CPU overhead. Developers can now set <code>recyclable={false}</code> to <a href="/api/elements/built-in/list.html#not-recycle-list-item" class="rp-link">prevent specific <code>&lt;list-item&gt;</code> from being recycled</a>. Once disabled, the item will not be recycled when it slides out of the viewport and won&#x27;t require re-rendering when it reappears, making it suitable for scenarios demanding rendering performance.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/20250828-213840.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>list</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/recyclable/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="more-flexible-animations"><a href="#more-flexible-animations" class="rp-header-anchor rp-link" aria-hidden="true">#</a>More Flexible Animations</h2>
<h3 class="rp-toc-include" id="elementanimate"><a href="#elementanimate" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>Element.animate()</code></h3>
<p>The <a href="/api/lynx-api/main-thread/main-thread-element.html" class="rp-link"><code>MainThread.Element</code></a> now features an animate() method for finely controlling CSS animations on the MTS (Main Thread Scripting), including operations like play, pause, and seeking, enabling more flexible interactive animations.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/mt_animation.webp" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>animation</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/animate_mt/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h3 class="rp-toc-include" id="css-variables-triggering-transition"><a href="#css-variables-triggering-transition" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS Variables Triggering Transition</h3>
<p>Transition animations can now be triggered by changes in CSS variables, enhancing the flexibility and maintainability of transition animations. In multi-theme designs, developers can associate animation parameters with theme variables. Switching themes only requires modifying the variable values without changing selector logic to complete the theme transition.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-scss"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="scss"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/transition-variable.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>animation</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/transition_variable/index.scss</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="variable-fonts"><a href="#variable-fonts" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Variable Fonts</h2>
<p>Lynx 3.4 adds support for variable fonts. Developers can now perform finer adjustments to font styles using underlying CSS properties like font-variation-settings and font-optical-sizing.
Read the <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_fonts/Variable_fonts_guide" target="_blank" rel="noopener noreferrer" class="rp-link">MDN</a> and <a href="https://web.dev/articles/variable-fonts" target="_blank" rel="noopener noreferrer" class="rp-link">web.dev</a> guides to learn more about variable fonts technology.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/plugin/static/variable-font.jpeg" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>text</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/variable_font/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="upgrade-guide"><a href="#upgrade-guide" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade Guide</h2>
<p>Refer to the official guide on <a href="/zh/guide/start/integrate-with-existing-apps.html" class="rp-link">Integrating Lynx into Existing Apps</a>, update the Lynx and LynxService dependency versions to complete the upgrade to Lynx 3.4.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What's new in Lynx 3.2]]></title>
            <link>https://lynxjs.org/blog/lynx-3-2</link>
            <guid isPermaLink="false">/blog/lynx-3-2</guid>
            <pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Lynx 3.2 delivers updates across its framework, engine, and tools, including the ReactLynx testing tools, `llms.txt` support, new Grid Layout features, improvements to `<list>` and `<text>`, and more.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="whats-new-in-lynx-32"><span>What&#x27;s new in Lynx 3.2</span><a href="#whats-new-in-lynx-32" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">May 14, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/toretto-wt.png" alt="Wentao Shi"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Wentao Shi</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Rendering Lead @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/lynx-3-2.png" alt="lynx-in-3-2"/></p>
<p>Today, I&#x27;m pleased to share that Lynx 3.2, the first version of Lynx since we <a href="/next/blog/lynx-unlock-native-for-more.html" class="rp-link">open-sourced</a> it in March 2025, is now stable!</p>
<p>Lynx 3.2 delivers updates across its framework, engine, and tools, including the <a href="#reactlynx-testing-library" class="rp-link">ReactLynx testing tools</a>, <a href="#website-llmstxt-support" class="rp-link"><code>llms.txt</code> support</a>, <a href="#css-grid-layout-minmax-max-content-fit-content" class="rp-link">new Grid Layout features</a>, improvements to <a href="#improvements-to-list" class="rp-link"><code>&lt;list&gt;</code></a> and <a href="#text-can-be-customized-to-select-across-multiple-elements" class="rp-link"><code>&lt;text&gt;</code></a>, and more, to bring you more familiar development experience and more capabilities. With over <a href="https://github.com/lynx-family/lynx/releases/" target="_blank" rel="noopener noreferrer" class="rp-link">296 commits</a> from 61 contributors (including some first-time contributors). Let’s explore what’s new!</p>
<h2 class="rp-toc-include" id="reactlynx-testing-library"><a href="#reactlynx-testing-library" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ReactLynx Testing Library</h2>
<p><a href="https://testing-library.com/" target="_blank" rel="noopener noreferrer" class="rp-link">Testing Library</a> is a popular way in the JavaScript community to test UI components, and we&#x27;ve adapted it for Lynx. We now introduce a new package <a href="/api/reactlynx-testing-library/index.html" class="rp-link"><code>@lynx-js/react/testing-library/</code></a> to provide testing abstractions such as <a href="/api/reactlynx-testing-library/Function.render.html" class="rp-link"><code>render</code></a>. It can also be used with the official <a href="https://github.com/testing-library/jest-dom" target="_blank" rel="noopener noreferrer" class="rp-link"><code>@testing-library/jest-dom</code></a> to assert the presence and behavior of elements using matchers such as <a href="https://github.com/testing-library/jest-dom?tab=readme-ov-file#tobeinthedocument" target="_blank" rel="noopener noreferrer" class="rp-link"><code>toBeInTheDocument</code></a>.</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@testing-library/jest-dom&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { expect</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> it } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;vitest&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> { render } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-token-string-expression)"> &#x27;@lynx-js/react/testing-library&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">it</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;renders&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> () </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-function)"> Wrapper</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> ({ children }) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> (</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-token-function)"> data-testid</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;wrapper&quot;</span><span style="color:var(--shiki-foreground)">&gt;{children}&lt;/</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  );</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-token-function)"> Comp</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> () </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> (</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">view</span><span style="color:var(--shiki-token-function)"> data-testid</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;inner&quot;</span><span style="color:var(--shiki-token-function)"> style</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;background-color: yellow;&quot;</span><span style="color:var(--shiki-foreground)"> /&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  );</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  const</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">container</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> getByTestId</span><span style="color:var(--shiki-foreground)"> } </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> render</span><span style="color:var(--shiki-foreground)">(&lt;</span><span style="color:var(--shiki-token-constant)">Comp</span><span style="color:var(--shiki-foreground)"> /&gt;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> { wrapper</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> Wrapper });</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">  expect</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">getByTestId</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;wrapper&#x27;</span><span style="color:var(--shiki-foreground)">))</span><span style="color:var(--shiki-token-function)">.toBeInTheDocument</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  expect</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">container</span><span style="color:var(--shiki-foreground)">.firstChild)</span><span style="color:var(--shiki-token-function)">.toMatchInlineSnapshot</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">`</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">    &lt;view data-testid=&quot;wrapper&quot;&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">      &lt;view data-testid=&quot;inner&quot; style=&quot;background-color: yellow;&quot;/&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">    &lt;/view&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">  `</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">});</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<p><a href="/react/reactlynx-testing-library.html" class="rp-link">Learn more about how to use ReactLynx Testing Library here.</a></p>
<h2 class="rp-toc-include" id="website-llmstxt-support"><a href="#website-llmstxt-support" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Website: <code>llms.txt</code> Support</h2>
<p>By upgrading to <a href="https://v2.rspress.dev/" target="_blank" rel="noopener noreferrer" class="rp-link">Rspress v2</a> and taking advantage of the new <a href="https://x.com/rspack_dev/status/1917844832149725695" target="_blank" rel="noopener noreferrer" class="rp-link">LLM plugin</a>, the Lynx website is now fully equipped with <a href="https://lynxjs.org/llms.txt" target="_blank" rel="noopener noreferrer" class="rp-link">https://lynxjs.org/llms.txt</a> and <a href="https://lynxjs.org/llms-full.txt" target="_blank" rel="noopener noreferrer" class="rp-link">https://lynxjs.org/llms-full.txt</a> to help with AI understanding and improve your experience vibe-coding with Lynx. For every page you can get the original markdown by replacing the .html extension with .md.</p>
<p><a href="https://llmstxt.org/" target="_blank" rel="noopener noreferrer" class="rp-link">Learn more about what is <code>llms.txt</code></a>.</p>
<h2 class="rp-toc-include" id="css-grid-layout-minmax-max-content-fit-content"><a href="#css-grid-layout-minmax-max-content-fit-content" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS Grid Layout: <code>minmax()</code>, <code>max-content</code>, <code>fit-content</code> <span class="rp-badge rp-badge--tip">Web-friendly</span></h2>
<p>Lynx 3.2 adds three CSS functions <code>minmax()</code>, <code>max-content</code>, and <code>fit-content</code>, to help you better controll grid sizes in the <a href="/guide/ui/layout/grid-layout.html" class="rp-link">CSS Grid Layout</a>. You can use them in <code>grid-template-columns</code>, <code>grid-template-rows</code>, <code>grid-auto-columns</code>, and <code>grid-auto-rows</code>.</p>
<p>Let&#x27;s take a look at an example of building a three-column grid with <code>grid-template-columns: 20% max-content minmax(50px, max-content)</code>:</p>
<ul>
<li>First column: Takes up 20% of the container width</li>
<li>Second column: Sizes itself to fit its content using <code>max-content</code></li>
<li>Third column: Uses <code>minmax(50px, max-content)</code> to have a minimum width of 50px but can grow to fit content</li>
</ul>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/grid-minmax.png" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>css</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/grid_layout/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="improvements-to-list"><a href="#improvements-to-list" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Improvements to <code>&lt;list&gt;</code></h2>
<h3 class="rp-toc-include" id="scroll-snapping-with-item-snap"><a href="#scroll-snapping-with-item-snap" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Scroll Snapping with <code>item-snap</code></h3>
<p>The <a href="/api/elements/built-in/list.html#item-snap" class="rp-link"><strong>scroll snapping</strong></a> feature has graduated to a stable feature in Lynx 3.2. It provides smooth and easy to use pagination across all platforms, enabling developers to create feeds or carousels with precise scrolling interactions.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/list-snap.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>list</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/horizontal-snap/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<p><a href="/api/elements/built-in/list.html#pagination-with-item-snap" class="rp-link">Learn more about implementing Pagination with <code>item-snap</code>.</a></p>
<h3 class="rp-toc-include" id="z-index-support-in-list-item"><a href="#z-index-support-in-list-item" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>z-index</code> Support in <code>&lt;list-item&gt;</code> <span class="rp-badge rp-badge--tip">Web-friendly</span></h3>
<p>Lynx 3.2 supports <a href="/zh/api/css/properties/z-index.html" class="rp-link"><strong>z-index</strong></a> on <code>&lt;list-item&gt;</code>, allowing for more flexible adjustment of the view hierarchy of list items.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/list-z-index.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>list</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/zIndex/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="text-can-be-customized-to-select-across-multiple-elements"><a href="#text-can-be-customized-to-select-across-multiple-elements" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>&lt;text&gt;</code> Can Be Customized to Select Across Multiple Elements <span class="rp-badge rp-badge--tip">Web-friendly</span></h2>
<p>In long article scenarios, with the newly added <a href="/api/elements/built-in/text.html#custom-text-selection" class="rp-link"><code>custom-text-selection</code></a> attribute, you can now <a href="/api/elements/built-in/text.html#cross-text-selection-and-copying" class="rp-link">implement customized logic</a> to select and copy text across text elements, making the text selection experience more similar to the Web.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/cross-text-select.gif" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>text</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/cross_text_selection/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<h2 class="rp-toc-include" id="microtasks"><a href="#microtasks" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Microtasks <span class="rp-badge rp-badge--tip">Web-friendly</span></h2>
<p>Before Lynx 3.2, Lynx did not support micro-task. The behavior of the following code is inconsistent with that in web browsers. In Lynx 3.2, <code>Promise</code> based on microtasks is implemented, and a new API <a href="/api/lynx-api/lynx/lynx-queue-microtask.html" class="rp-link"><code>lynx.queueMicrotask</code></a> is delivered.</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-token-function)">setTimeout</span><span style="color:var(--shiki-foreground)">(() </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;this is a timeout, will exec after&#x27;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-constant)">Promise</span><span style="color:var(--shiki-token-function)">.resolve</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-function)">.then</span><span style="color:var(--shiki-foreground)">((value) </span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">  console</span><span style="color:var(--shiki-token-function)">.log</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;this is a Promise, will exec before&#x27;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">});</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Results in Lynx before 3.2</th><th>Results in Chrome</th></tr></thead><tbody><tr><td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/lynx-test-result.png" alt=""/></td><td><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/chrome-test-result.png" alt=""/></td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="more-console-apis"><a href="#more-console-apis" class="rp-header-anchor rp-link" aria-hidden="true">#</a>More <code>console</code> APIs <span class="rp-badge rp-badge--tip">Web-friendly</span></h2>
<p>Lynx 3.2 further implements most of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/console" target="_blank" rel="noopener noreferrer" class="rp-link">W3C-compliant</a> <code>console</code> APIs to provide a more comprehensive debugging experience. See the <a href="/api/lynx-api/global/console/assert.html" class="rp-link">API Reference</a> for more details.</p>
<center><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/lynx-console.gif" width="400" height="400" align="center"/></center>
<h2 class="rp-toc-include" id="rspeedy-rslib-and-rspack-13"><a href="#rspeedy-rslib-and-rspack-13" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Rspeedy: Rslib and Rspack 1.3</h2>
<p>Rspeedy <a href="https://github.com/lynx-family/lynx-stack/discussions/482" target="_blank" rel="noopener noreferrer" class="rp-link">v0.9.0</a> is now available, featuring significant improvements in size and performance. In v0.9.0, Rspeedy bundles with <a href="https://lib.rsbuild.dev/" target="_blank" rel="noopener noreferrer" class="rp-link">Rslib</a>, reducing installation size by 50%. The upgrade to <a href="https://rspack.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack</a> <a href="https://rspack.rs/blog/announcing-1-3" target="_blank" rel="noopener noreferrer" class="rp-link">1.3</a> delivers enhanced code splitting, optimized bundle size, and improved memory efficiency. Additional enhancements include new CLI flags and configurations. For more details, refer to the complete full CHANGELOG <a href="https://github.com/lynx-family/lynx-stack/blob/main/packages/rspeedy/core/CHANGELOG.md#090" target="_blank" rel="noopener noreferrer" class="rp-link"><code>@lynx-js/rspeedy v0.9.0</code></a>.</p>
<p>To upgrade, run the following command in your Rspeedy project:</p>
<div class="rp-codeblock language-js"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="js"><code><span class="line"><span style="color:var(--shiki-foreground)">npx upgrade</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">rspeedy@latest</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="devtool-screen-mirroring-with-resolution-control"><a href="#devtool-screen-mirroring-with-resolution-control" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DevTool: Screen Mirroring with Resolution Control</h2>
<p>DevTool&#x27;s screen mirroring feature, located in the left panel, now includes resolution switching capabilities. Users can toggle between High Definition (HD) and Standard Definition (SD) modes. The SD mode is particularly useful for reducing bandwidth consumption during unstable device connections, ensuring smoother screen mirroring performance.</p>
<p>Download the latest DevTool Desktop Application from the <a href="https://github.com/lynx-family/lynx-devtool/releases" target="_blank" rel="noopener noreferrer" class="rp-link">DevTool Releases</a> page to get started.</p>
<center><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/news-in-3.2/devtoolsopt.gif" width="800" height="800"/></center>
<h2 class="rp-toc-include" id="upgrade-to-lynx-32"><a href="#upgrade-to-lynx-32" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Upgrade to Lynx 3.2</h2>
<h3 class="rp-toc-include" id="android"><a href="#android" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Android</h3>
<p>Please refer to the <a href="/guide/start/integrate-with-existing-apps.html?platform=ios" class="rp-link">integrate-with-existing-apps</a> and update your Lynx and LynxService dependencies.</p>
<p>In your project&#x27;s <code>build.gradle</code> or <code>build.gradle.kts</code> file, update the Lynx version as follows:</p>
<div class="rp-tabs"><div class="rp-tabs__label rp-tabs__label--no-scrollbar" style="justify-content:flex-start"><div class="rp-tabs__label__item rp-tabs__label__item--selected" data-index="0">build.gradle</div><div class="rp-tabs__label__item rp-tabs__label__item--not-selected" data-index="1">build.gradle.kts</div></div><div class="rp-tabs__content"><div class="rp-tabs__content__item rp-tabs__content__item--active" aria-hidden="false" data-index="0"><div class="rp-codeblock language-groovy"><div class="rp-codeblock__title">build.gradle</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="groovy" data-title="build.gradle"><code><span class="line"><span style="color:var(--shiki-foreground)">dependencies {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // lynx dependencies</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx:3.2.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-jssdk:3.2.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-trace:3.2.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:primjs:2.12.0&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div><div class="rp-tabs__content__item rp-tabs__content__item--hidden" aria-hidden="true" data-index="1"><div class="rp-codeblock language-groovy"><div class="rp-codeblock__title">build.gradle.kts</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="groovy" data-title="build.gradle.kts"><code><span class="line"><span style="color:var(--shiki-foreground)">dependencies {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // lynx dependencies</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-jssdk:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-trace:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:primjs:2.12.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div>
<p>In your project&#x27;s <code>build.gradle</code> or <code>build.gradle.kts</code> file, update the LynxService version:</p>
<div class="rp-tabs"><div class="rp-tabs__label rp-tabs__label--no-scrollbar" style="justify-content:flex-start"><div class="rp-tabs__label__item rp-tabs__label__item--selected" data-index="0">build.gradle</div><div class="rp-tabs__label__item rp-tabs__label__item--not-selected" data-index="1">build.gradle.kts</div></div><div class="rp-tabs__content"><div class="rp-tabs__content__item rp-tabs__content__item--active" aria-hidden="false" data-index="0"><div class="code-fold-wrapper semi-always-light"><div dir="ltr" data-orientation="horizontal" class="w-full"><div data-state="active" data-orientation="horizontal" role="tabpanel" aria-labelledby="radix-:R6obaed:-trigger-example" id="radix-:R6obaed:-content-example" tabindex="0" class="ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 w-full overflow-hidden" style="animation-duration:0s"><div class="flex h-full w-full data-[panel-group-direction=vertical]:flex-col" style="display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%" data-panel-group="" data-panel-group-direction="horizontal" data-panel-group-id=":Rmobaed:"><div class="" id=":R3mobaed:" style="flex-basis:0;flex-grow:75.0;flex-shrink:1;overflow:hidden;position:relative;aspect-ratio:7.111111111111111;height:360px" data-panel-group-id=":Rmobaed:" data-panel="" data-panel-id=":R3mobaed:" data-panel-size="75.0"><div class="codefold-scroll-area"><div class="code-in-tab"><div class="rp-codeblock language-groovy"><div class="rp-codeblock__title">build.gradle</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="groovy" data-title="build.gradle"><code><span class="line"><span style="color:var(--shiki-foreground)">dependencies {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // lynx dependencies</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx:3.2.0&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-jssdk:3.2.0&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-trace:3.2.0&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:primjs:2.12.0&quot;</span></span>
<span class="line"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating image-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-image:3.2.0&quot;</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // image-service dependencies, if not added, images cannot be loaded; if the host APP needs to use other image libraries, you can customize the image-service and remove this dependency</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:fresco:2.3.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-gif:2.3.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-webp:2.3.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:webpsupport:2.3.0&quot;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-base:2.3.0&quot;</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating log-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-log:3.2.0&quot;</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating http-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-http:3.2.0&quot;</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation </span><span style="color:var(--shiki-token-string-expression)">&quot;com.squareup.okhttp3:okhttp:4.9.0&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div></div></div></div><div class="rp-tabs__content__item rp-tabs__content__item--hidden" aria-hidden="true" data-index="1"><div class="code-fold-wrapper semi-always-light"><div dir="ltr" data-orientation="horizontal" class="w-full"><div data-state="active" data-orientation="horizontal" role="tabpanel" aria-labelledby="radix-:Raobaed:-trigger-example" id="radix-:Raobaed:-content-example" tabindex="0" class="ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 w-full overflow-hidden" style="animation-duration:0s"><div class="flex h-full w-full data-[panel-group-direction=vertical]:flex-col" style="display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%" data-panel-group="" data-panel-group-direction="horizontal" data-panel-group-id=":Rqobaed:"><div class="" id=":R3qobaed:" style="flex-basis:0;flex-grow:75.0;flex-shrink:1;overflow:hidden;position:relative;aspect-ratio:7.111111111111111;height:360px" data-panel-group-id=":Rqobaed:" data-panel="" data-panel-id=":R3qobaed:" data-panel-size="75.0"><div class="codefold-scroll-area"><div class="code-in-tab"><div class="rp-codeblock language-groovy"><div class="rp-codeblock__title">build.gradle.kts</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="groovy" data-title="build.gradle.kts"><code><span class="line"><span style="color:var(--shiki-foreground)">dependencies {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // lynx dependencies</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-jssdk:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-trace:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:primjs:2.12.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating image-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-image:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // image-service dependencies, if not added, images cannot be loaded; if the host APP needs to use other image libraries, you can customize the image-service and remove this dependency</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:fresco:2.3.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-gif:2.3.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-webp:2.3.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:webpsupport:2.3.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.facebook.fresco:animated-base:2.3.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating log-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-log:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">    // integrating http-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;org.lynxsdk.lynx:lynx-service-http:3.2.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line highlighted"></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">    implementation(</span><span style="color:var(--shiki-token-string-expression)">&quot;com.squareup.okhttp3:okhttp:4.9.0&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div></div></div></div></div></div>
<h3 class="rp-toc-include" id="ios"><a href="#ios" class="rp-header-anchor rp-link" aria-hidden="true">#</a>iOS</h3>
<p>In your project&#x27;s <code>Podfile</code> file, update the Lynx version as follows:</p>
<div class="code-fold-wrapper semi-always-light"><div dir="ltr" data-orientation="horizontal" class="w-full"><div data-state="active" data-orientation="horizontal" role="tabpanel" aria-labelledby="radix-:Rpraed:-trigger-example" id="radix-:Rpraed:-content-example" tabindex="0" class="ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 w-full overflow-hidden" style="animation-duration:0s"><div class="flex h-full w-full data-[panel-group-direction=vertical]:flex-col" style="display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%" data-panel-group="" data-panel-group-direction="horizontal" data-panel-group-id=":R1praed:"><div class="" id=":R7praed:" style="flex-basis:0;flex-grow:75.0;flex-shrink:1;overflow:hidden;position:relative;aspect-ratio:7.111111111111111;height:360px" data-panel-group-id=":R1praed:" data-panel="" data-panel-id=":R7praed:" data-panel-size="75.0"><div class="codefold-scroll-area"><div class="code-in-tab"><div class="rp-codeblock language-ruby"><div class="rp-codeblock__title">Podfile</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="ruby" data-title="Podfile"><code><span class="line highlighted"><span style="color:var(--shiki-foreground)">source </span><span style="color:var(--shiki-token-string-expression)">&#x27;https://cdn.cocoapods.org/&#x27;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">platform </span><span style="color:var(--shiki-token-constant)">:ios</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;10.0&#x27;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">target </span><span style="color:var(--shiki-token-string-expression)">&#x27;YourTarget&#x27;</span><span style="color:var(--shiki-token-keyword)"> do</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;Lynx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;3.2.0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> :subspecs</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-string-expression)">&#x27;Framework&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;PrimJS&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;2.12.0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> :subspecs</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-string-expression)">&#x27;quickjs&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;napi&#x27;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">end</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div></div></div>
<p>In your project&#x27;s <code>Podfile</code> file, update the LynxService version as follows:</p>
<div class="code-fold-wrapper semi-always-light"><div dir="ltr" data-orientation="horizontal" class="w-full"><div data-state="active" data-orientation="horizontal" role="tabpanel" aria-labelledby="radix-:Rqraed:-trigger-example" id="radix-:Rqraed:-content-example" tabindex="0" class="ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 w-full overflow-hidden" style="animation-duration:0s"><div class="flex h-full w-full data-[panel-group-direction=vertical]:flex-col" style="display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%" data-panel-group="" data-panel-group-direction="horizontal" data-panel-group-id=":R1qraed:"><div class="" id=":R7qraed:" style="flex-basis:0;flex-grow:75.0;flex-shrink:1;overflow:hidden;position:relative;aspect-ratio:7.111111111111111;height:360px" data-panel-group-id=":R1qraed:" data-panel="" data-panel-id=":R7qraed:" data-panel-size="75.0"><div class="codefold-scroll-area"><div class="code-in-tab"><div class="rp-codeblock language-ruby"><div class="rp-codeblock__title">Podfile</div><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables has-highlighted" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="ruby" data-title="Podfile"><code><span class="line"><span style="color:var(--shiki-foreground)">source </span><span style="color:var(--shiki-token-string-expression)">&#x27;https://cdn.cocoapods.org/&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">platform </span><span style="color:var(--shiki-token-constant)">:ios</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;10.0&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">target </span><span style="color:var(--shiki-token-string-expression)">&#x27;YourTarget&#x27;</span><span style="color:var(--shiki-token-keyword)"> do</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;Lynx&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;3.2.0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> :subspecs</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">    &#x27;Framework&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  ]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;PrimJS&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;2.12.0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> :subspecs</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-string-expression)">&#x27;quickjs&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;napi&#x27;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">  # integrate image-service, log-service, and http-service</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">  pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;LynxService&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;3.2.0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> :subspecs</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-string-expression)">      &#x27;Image&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-string-expression)">      &#x27;Log&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line highlighted"><span style="color:var(--shiki-token-string-expression)">      &#x27;Http&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">  ]</span></span>
<span class="line"></span>
<span class="line highlighted"><span style="color:var(--shiki-token-comment)">  # ImageService</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">  pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;SDWebImage&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&#x27;5.15.5&#x27;</span></span>
<span class="line highlighted"><span style="color:var(--shiki-foreground)">  pod </span><span style="color:var(--shiki-token-string-expression)">&#x27;SDWebImageWebPCoder&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;0.11.0&#x27;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">end</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div></div></div>
<h2 class="rp-toc-include" id="final-words"><a href="#final-words" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Final Words</h2>
<p>Thanks to Lynx community for making this release possible! As a newly open-source project, we&#x27;re thrilled about our future and we can’t wait to see the use of Lynx in your apps.</p>
<p>In the future, we will gradually introduce more feature support as our <a href="/next/blog/lynx-open-source-roadmap-2025.html" class="rp-link">roadmap</a>. We&#x27;ll add new components like <code>&lt;Input&gt;</code> and adapt to more platforms such as HarmonyOS and PC.</p>
<p>Please check the <a href="https://github.com/lynx-family/lynx/releases/tag/3.2.0" target="_blank" rel="noopener noreferrer" class="rp-link">release notes and changelog</a>, and let’s embark on a new adventure!</p>
<hr/>
<p><em>Thanks to <a href="https://x.com/huxpro" target="_blank" rel="noopener noreferrer" class="rp-link">Xuan Huang</a>, <a href="https://x.com/zoolsher" target="_blank" rel="noopener noreferrer" class="rp-link">Ray Zhang</a>, and <a href="https://x.com/liushouqun" target="_blank" rel="noopener noreferrer" class="rp-link">Shouqun Liu</a> for their contributions in creating this blog post.</em></p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx Roadmap 2025]]></title>
            <link>https://lynxjs.org/blog/lynx-open-source-roadmap-2025</link>
            <guid isPermaLink="false">/blog/lynx-open-source-roadmap-2025</guid>
            <pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Two weeks ago, we launched Lynx as an open-source project and have since gathered valuable insights and feedback from the community. Thank you for engaging with Lynx, even as we take our first steps as a new member of the open-source cross-platform ecosystem. Today, I'm pleased to share the 2025 roadmap of Lynx.]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-roadmap-2025"><span>Lynx Roadmap 2025</span><a href="#lynx-roadmap-2025" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">March 19, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="Shouqun Liu"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Shouqun Liu</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Engineering Manager @ Lynx</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p><a href="/next/blog/lynx-unlock-native-for-more.html" class="rp-link">Two weeks ago</a>, we launched Lynx as an open-source project and have since gathered valuable insights and feedback from the community. Thank you for engaging with Lynx, even as we take our first steps as a new member of the open-source cross-platform ecosystem. Today, I&#x27;m pleased to share the 2025 roadmap of Lynx.</p>
<p>Our core principles in developing the Lynx technology family and building the Lynx tech ecosystem are:</p>
<ul>
<li><strong>Fast and stable releases</strong>: Ensuring rapid version updates while maintaining a stable API with minimal breaking changes.</li>
<li><strong>Versatile cross-platform</strong>: Empowering developers with efficient, high-performance solutions across major platforms.</li>
<li><strong>Strong community support</strong>: Engaging with developers through <a href="https://github.com/orgs/lynx-family" target="_blank" rel="noopener noreferrer" class="rp-link">GitHub</a>, <a href="https://discord.com/invite/mXk7jqdDXk" target="_blank" rel="noopener noreferrer" class="rp-link">Discord</a>, StackOverflow, etc.</li>
</ul>
<h2 class="rp-toc-include" id="release-schedule"><a href="#release-schedule" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Release Schedule</h2>
<p>We believe that consistent version releases are crucial for a developer framework to ensure features and refinements reach users effectively. In 2025, we plan to publish 5 stable releases.</p>
<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th><strong>Stable Release Version</strong></th><th>3.2</th><th>3.3</th><th>3.4</th><th>3.5</th><th>3.6</th></tr></thead><tbody><tr><td><strong>Planned Release Date</strong></td><td>2025/04</td><td>2025/06</td><td>2025/08</td><td>2025/10</td><td>2025/12</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="documentation"><a href="#documentation" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Documentation</h2>
<p>High-quality documentation and examples are essential for a great developer experience. Our team is committed to publishing and maintaining accurate, up-to-date documentation on our website (<a href="https://lynxjs.org" target="_blank" rel="noopener noreferrer" class="rp-link">https://lynxjs.org</a>).
Additionally, the website&#x27;s repository is open-sourced (<a href="https://github.com/lynx-family/lynx-website" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/lynx-family/lynx-website</a>) and will be maintained transparently. We highly welcome any feedback or contributions to our documentation.</p>
<h2 class="rp-toc-include" id="multiple-platforms"><a href="#multiple-platforms" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Multiple Platforms</h2>
<p>We are providing a cross-platform framework for building apps across a wide range of platforms. This includes mobile platforms like Android, iOS, and the Web, all of which we have already open-sourced. Additionally, Lynx supports desktop environments such as Windows and macOS, as well as emerging platforms like OpenHarmony. With coverage across those major platforms, we have a clear plan to continue open-sourcing our framework this year.</p>
<ul>
<li>Support for Android, iOS, and the Web are already open sourced. We will continue enhancing cross-platform consistency and performance on these platforms to provide developers with better solutions for building mobile applications.</li>
<li>OpenHarmony: We plan to open source Lynx OpenHarmony support on version 3.4.</li>
<li>macOS and Windows: We also plan to release Lynx macOS and Windows support to open source on version 3.5.</li>
</ul>
<h2 class="rp-toc-include" id="more-capabilities--ui-elements"><a href="#more-capabilities--ui-elements" class="rp-header-anchor rp-link" aria-hidden="true">#</a>More Capabilities &amp; UI Elements</h2>
<p>We have received multiple requests for additional APIs and components, as well as feedback on integrating Lynx into various products. To empower developers in building fully fledged applications with Lynx, in addition to the already open-sourced core engine and front-end stack, we plan to open-source more peripherals this year, including:</p>
<ul>
<li>Additional UI elements and components, such as input, view pagers, swiper, and SVG support.</li>
<li>Support for <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" target="_blank" rel="noopener noreferrer" class="rp-link">Canvas</a> and advanced animations, such as <a href="https://airbnb.io/lottie/" target="_blank" rel="noopener noreferrer" class="rp-link">Lottie</a>, along with our open-source implementations.</li>
<li>App-level capabilities, including native navigation and APIs for features like notifications, location, and more.</li>
</ul>
<h2 class="rp-toc-include" id="tooling"><a href="#tooling" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Tooling</h2>
<p>We also received a lot of feedback about the toolchain&#x27;s compatibility on Windows and Linux platforms. Moving forward, we&#x27;ll ensure toolchain support across major development platforms, including macOS, Windows, and Linux.</p>
<p>For developer tools, we will continue improving the capability and stability of DevTools. Later this year, we plan to introduce performance profilers to help developers diagnose and resolve possible performance issues.</p>
<h2 class="rp-toc-include" id="community"><a href="#community" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Community</h2>
<p>As a family of technologies designed to empower developers, we believe a strong community ecosystem is essential to its success. That&#x27;s why we have open-sourced our technologies, and will continue building and enhancing the community.</p>
<ul>
<li>To advance our vision of democratizing cross-platform technologies, we aim to collaborate with the community to further enhance the <a href="/guide/spec.html#element-papi" class="rp-link">Element PAPI</a>, making it more framework-agnostic and better suited to support more frameworks on Lynx engine.</li>
<li>We are dedicated to actively discussing, responding to, and addressing developers&#x27; feedback across all major community platforms, including Discord, GitHub, and StackOverflow.</li>
</ul>
<hr/>
<p>After open-sourcing Lynx, our team has been overwhelmed by the enthusiasm of the community. We&#x27;ve received a wealth of feedback on improving the framework, which has greatly motivated each of us. In the future, we look forward to collaborating with the community and continuously releasing updates to support developers.</p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx: Unlock Native for More]]></title>
            <link>https://lynxjs.org/blog/lynx-unlock-native-for-more</link>
            <guid isPermaLink="false">/blog/lynx-unlock-native-for-more</guid>
            <pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we're excited to introduce Lynx, a family of technologies empowering developers to use their existing web skills to create truly native UIs for both mobile and web from a single codebase...]]></description>
            <content:encoded><![CDATA[<h1 class="rp-toc-include" id="lynx-unlock-native-for-more"><span>Lynx: Unlock Native for More</span><a href="#lynx-unlock-native-for-more" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div><!--$--><a href="/next/blog/" class="backLink-lQPNH7">← <!-- -->All Posts</a><div class="blogHeader-ZKfIZ_"><span class="date-aB5gkw">March 5, 2025</span><div class="blog-avatar-frame-G1eJ1T avatars-aaQ1Kf"><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/huxpro.png" alt="Xuan Huang"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">Xuan Huang</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">Architect @ Lynx</span></div></span><span class="avatar-item-V9KvYV"><img class="avatar-img-lOP8r0" src="https://github.com/lynx-family.png" alt="The Lynx Team"/><div class="avatar-text-bV6Thm"><span class="avatar-name-row-Jwi5ym"><span class="avatar-name-LEqtpc">The Lynx Team</span><span class="avatar-socials-TncjhQ"><span class="avatar-social-link-PObcBr" role="link"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="14" viewBox="0 0 300 271" class="icon-x-XK0uad"><path fill="currentColor" d="M236 0h46L181 115l118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123L-1.1 0h94.9l65.5 86.6zm-16.1 244h25.5L80.4 26H53z"></path></svg></span><span class="avatar-social-link-PObcBr" role="link"><span role="img" aria-label="github_logo" class="semi-icon semi-icon-default semi-icon-github_logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M12.01 1a11 11 0 0 0-3.48 21.45c.55.11.75-.23.75-.52l-.02-2.05c-3.06.66-3.7-1.3-3.7-1.3-.5-1.28-1.22-1.61-1.22-1.61-1-.68.07-.68.07-.68 1.11.08 1.7 1.13 1.7 1.13.98 1.68 2.56 1.2 3.2.92.1-.72.39-1.2.7-1.48-2.45-.26-5.02-1.2-5.02-5.43 0-1.2.44-2.2 1.13-2.96-.1-.27-.49-1.4.11-2.91 0 0 .93-.3 3.03 1.13a10.66 10.66 0 0 1 5.5 0c2.1-1.42 3.03-1.13 3.03-1.13.6 1.51.22 2.64.1 2.91a4.21 4.21 0 0 1 1.14 2.96c0 4.23-2.57 5.16-5.03 5.43.4.35.74 1 .74 2.04l-.01 3.03c0 .29.2.63.74.52A11 11 0 0 0 12.01 1Z" fill="currentColor"></path><path d="M5.17 16.8c-.01.06-.1.08-.18.04-.07-.04-.13-.1-.09-.16.02-.06.11-.08.18-.04.08.04.11.11.1.16Zm.44.5c-.05.05-.16.01-.22-.06-.07-.07-.09-.18-.03-.24.05-.05.14-.01.22.06.07.1.09.2.03.24Zm.44.63c-.07.06-.18 0-.24-.09-.07-.09-.07-.22 0-.25.08-.06.18 0 .24.09.07.09.07.2 0 .25Zm.6.62c-.05.08-.18.06-.3-.03-.08-.1-.12-.22-.05-.28.06-.07.19-.05.3.04.09.07.1.2.05.27Zm.82.35c-.02.1-.14.13-.27.1-.13-.04-.2-.15-.18-.23.01-.09.14-.12.27-.09.13.04.2.13.18.22Zm.9.07c0 .1-.12.17-.24.17-.13 0-.24-.08-.24-.17 0-.09.11-.16.24-.16.12 0 .23.07.23.16Zm.83-.14c.02.09-.07.18-.2.2-.13.02-.23-.04-.25-.13-.02-.1.07-.18.2-.2.13-.02.23.04.25.13Z" fill="currentColor"></path></svg></span></span></span></span><span class="avatar-role-iEvaiB">lynxjs.org</span></div></span></div><div class="rp-not-doc rp-llms-container"><button class="rp-not-doc rp-llms-button rp-llms-copy-button"><div class="rp-llms-copy-button__icon-wrapper"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-llms-copy-button__icon-copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg></div><span>Copy Markdown</span></button><button class="rp-llms-button rp-llms-view-options__trigger "><svg width="1em" height="1em" viewBox="0 0 32 32" class="rp-llms-view-options__arrow "><path fill="currentColor" d="M16 22 6 12l1.4-1.4 8.6 8.6 8.6-8.6L26 12z"></path></svg></button></div></div>
<p>Today, we&#x27;re excited to introduce <strong>Lynx</strong>, a <em>family</em> of technologies empowering developers to use their existing web skills to create truly native UIs for both mobile and web from a single codebase. Designed for diverse use cases and rich interactivity, Lynx delivers vibrant and engaging UIs for large-scale apps like TikTok, featuring a speedy, versatile rendering engine, performance-driven dual-threaded UI programming, modern Rust-based tooling, and more!</p>
<p>We deeply appreciate all the prior arts that have shaped the field of cross-platform development, and aspire to contribute to this movement by <strong>open sourcing</strong> Lynx today, inviting more developers to build applications with more freedom and productivity.</p>
<h2 class="rp-toc-include" id="ship-native-at-scale-and-velocity"><a href="#ship-native-at-scale-and-velocity" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Ship Native at Scale and Velocity</h2>
<p>For the generation of digital natives, mobile phones—and the apps on them—are their first digital experiences. For these app-centric users, a non-native experience isn&#x27;t just inconvenient; it&#x27;s a red flag. A blank screen, a 0.1s lag in a &quot;like&quot; animation, or an unfamiliar UI pattern can make an interface feel &quot;cheap&quot; or untrustworthy. We believe that native primitives and responsiveness aren&#x27;t just nice-to-haves—<strong><em>native is a necessity</em></strong>.</p>
<p>Despite the rapid growth of the app economy, delivering such experiences at <em>scale</em> and <em>velocity</em> remains to be a challenge. The growing diversity of form factors and platforms forces developers to rebuild the same experiences multiple times, leading to wasted effort, siloed teams, and delayed time-to-market. We believe that by enabling developers to build once and reach more platforms, <em>we can deliver joys <strong>for more users, faster</strong></em>.</p>
<p>TikTok, known and loved as a mobile-first platform, continuously brings innovative and engaging experiences to diverse and dynamic users around the world. To meet these demands, it gradually adopted Lynx and has increasingly bet on it. Today, Lynx powers an extremely wide spectrum of surfaces—from the lightweight, high-frequency <strong>Search</strong> panel to full-fledged <a href="https://support.tiktok.com/en/using-tiktok/creating-videos/tiktok-studio" target="_blank" rel="noopener noreferrer" class="rp-link">TikTok Studio</a> app; from complex e-commerce storefronts like <strong>Shop</strong> that demand reliability and trust, to highly engaging experiences like <strong>LIVE</strong>, as well as powering high-profile events and cultural moments such as <a href="https://newsroom.tiktok.com/disney-100?lang=en" target="_blank" rel="noopener noreferrer" class="rp-link">Disney100 on TikTok</a> and <a href="https://newsroom.tiktok.com/tiktok-goes-to-the-met-gala?lang=en" target="_blank" rel="noopener noreferrer" class="rp-link">The Met Gala on TikTok</a>.</p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-in-tiktok.jpg" alt="lynx-in-tiktok"/></p>
<center><span><small>TikTok&#x27;s extensive use of Lynx</small></span></center>
<p>We believe <em>scale</em> and <em>velocity</em> mean more than just applying a feature, bug fix, or optimization across all platforms to improve cost efficiency. It also means the <em>versatility</em> to adapt the same shared technological foundation to a broad spectrum of scenarios—without the need to build new teams or reinvent the wheel for every unique use case.</p>
<h2 class="rp-toc-include" id="inspire-and-enrich-the-web-community"><a href="#inspire-and-enrich-the-web-community" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Inspire and Enrich the Web community</h2>
<p>The web platform was historically created for <a href="https://www.w3.org/People/Berners-Lee/WorldWideWeb.html" target="_blank" rel="noopener noreferrer" class="rp-link">documents</a> and then <a href="https://extensiblewebmanifesto.org/#signatories" target="_blank" rel="noopener noreferrer" class="rp-link">gradually</a> <a href="https://infrequently.org/2015/06/progressive-apps-escaping-tabs-without-losing-our-soul/" target="_blank" rel="noopener noreferrer" class="rp-link">evolved</a> into a development platform. Yet, it continues to <a href="https://infrequently.org/2020/06/platform-adjacency-theory/" target="_blank" rel="noopener noreferrer" class="rp-link">face constraints</a> that slow down its ability to adapt and innovate quickly. Therefore, shaping the web technologies for cross-platform development has become a defining norm in the industry. Since 2008, PhoneGap (later <a href="https://cordova.apache.org/" target="_blank" rel="noopener noreferrer" class="rp-link">Cordova</a>) <a href="https://web.archive.org/web/20161210233245/http://phonegap.com/blog/2012/05/09/phonegap-beliefs-goals-and-philosophy/" target="_blank" rel="noopener noreferrer" class="rp-link">strived to keep the Web as cross-platform solution</a> by augmenting Webview with native capabilities. In 2015, <a href="https://reactnative.dev/blog/2015/03/26/react-native-bringing-modern-web-techniques-to-mobile" target="_blank" rel="noopener noreferrer" class="rp-link">React Native pioneered bridging native UI with web technologies</a>, enabling declarative UI with React.js on mobile. That same year, <a href="https://developers.googleblog.com/en/flutter-10-googles-portable-ui-toolkit/" target="_blank" rel="noopener noreferrer" class="rp-link">Flutter</a>, with its web heritage, adopted a similar declarative UI model and introduced a new approach using a custom rendering engine.</p>
<p>Lynx followed a similar spirit—you can think of it as an <strong><em>&quot;alternative Web tailored for app development</em>&quot;</strong>. It aims to honor the assets of web technologies while taking an opinionated approach, supporting web-like APIs and adding constraints and extensions with clear intent.</p>
<p>To illustrate this balance, let me share two examples: one where we choose to follow the web and another where we intentionally make a difference.</p>
<h3 class="rp-toc-include" id="craft-designs-with-markups-and-css-as-usual"><a href="#craft-designs-with-markups-and-css-as-usual" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Craft Designs with Markups and CSS as Usual</h3>
<p>At its core, UI technologies exist to deliver exceptional product design. Lynx embraces the familiarity of web development, allowing developers to write markup and CSS just as they would for the web. Lynx natively supports <a href="/guide/styling/animation.html" class="rp-link">CSS animations and transitions</a>, <a href="/guide/styling/custom-theming.html" class="rp-link">CSS selectors and variables for theming</a>, and modern CSS visual effects like <a href="/guide/styling/appearance.html#gradient" class="rp-link">gradients</a>, <a href="/guide/styling/appearance.html#clipping-and-masking" class="rp-link">clipping, and masking</a>—all designed to unlock the creativity of the web community to achieve trending <em>design engineering</em>.</p>
<div class="box-LTvjqb   "><div class="container-qARFbv"><div class="content-Yzcw9o"><div class="split-pane" style="display:flex;flex-direction:row;width:100%;height:100%;min-height:0"><div class="split-pane__first" style="flex:1;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="code-wrap-jURSQJ"><div class="code-tab-container-5FhsBL"><div class="code-view-container-lgwabm "><div class="code-kbFEhm"><div class="rp-codeblock language-tsx"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" data-lang="tsx"><code style="padding:1rem 1.25rem"></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap" aria-label="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="currentColor" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M20 8v12H8V8zm0-2H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 16H2V4a2 2 0 0 1 2-2h12v2H4Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="currentColor" d="m9.55 18-5.7-5.7 1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z"></path></svg></button></div></div></div></div></div></div></div></div><div role="separator" class="split-pane__divider" tabindex="0" style="flex:0 0 10px;cursor:col-resize;display:flex;align-items:center;justify-content:center;position:relative;z-index:1;touch-action:none" aria-orientation="vertical"><span role="img" aria-label="handle" class="semi-icon semi-icon-default semi-icon-handle" style="font-size:10px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path d="M9 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M9 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M11 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path><path d="M17 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z" fill="currentColor"></path><path d="M15 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></svg></span></div><div class="split-pane__second" style="flex:0 0 auto;min-width:0;min-height:0;overflow:hidden;transition:opacity 0.15s ease"><div class="preview-wrap-un0XJO"><div class="preview-wrap-content-TYo6um"><div class="preview-header-zYAZlz"><div style="width:24px;flex-shrink:0"></div><div class="semi-radioGroup semi-radioGroup-wrapper semi-radioGroup-buttonRadio" style="display:flex;flex:1;min-width:0;justify-content:center"><div style="width:100%;height:32px"></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div><div class="preview-body-YE5PSF"><div class="preview-panel-amOf1r" style="z-index:1;visibility:visible;pointer-events:auto"><div style="min-height:0px;display:flex;width:100%;height:100%;align-items:center;justify-content:center"><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/doc/guide-mask-image-circle.png" alt="" loading="eager" decoding="async" style="max-width:100%;max-height:100%;object-fit:contain"/></div></div></div></div></div></div></div></div><div class="footer-KtlqMk"><div class="semi-space semi-space-align-center semi-space-horizontal" style="max-width:100%;overflow:hidden;white-space:nowrap;row-gap:2px;column-gap:2px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><span role="img" aria-label="list" class="semi-icon semi-icon-default semi-icon-list" style="color:var(--semi-color-text-2)"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><g opacity="0.99"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM9.5 3a1.5 1.5 0 1 0 0 3h11a1.5 1.5 0 0 0 0-3h-11ZM8 11.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 11.5Zm0 7c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 8 18.5Zm-2-7a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-2 9a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" fill="currentColor"></path></g></svg></span></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="overflow:hidden;row-gap:2px;column-gap:2px" x-semi-prop="children"><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>css</span></span><span role="img" aria-label="chevron_right_stroked" class="semi-icon semi-icon-default semi-icon-chevron_right_stroked" style="color:var(--semi-color-text-2);font-size:12px"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" focusable="false" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z" fill="currentColor"></path></svg></span><span class="semi-typography semi-typography-ellipsis semi-typography-ellipsis-single-line semi-typography-ellipsis-overflow-ellipsis semi-typography-ellipsis-overflow-ellipsis-text semi-typography-tertiary semi-typography-small semi-typography-normal"><span>src/mask_image_circle_gradient/index.tsx</span></span></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:7px;column-gap:7px" x-semi-prop="children"><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span></button><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Code</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><div class="semi-space semi-space-align-center semi-space-horizontal" style="row-gap:6px;column-gap:6px" x-semi-prop="children"><span class="semi-typography toggle-label-SuO63S semi-typography-tertiary semi-typography-small semi-typography-normal">Preview</span><div class="semi-switch semi-switch-checked semi-switch-small" style="background-color:var(--semi-color-info);cursor:pointer"><div class="semi-switch-knob" aria-hidden="true"></div><input type="checkbox" class="semi-switch-native-control" role="switch" aria-checked="true" aria-disabled="false" checked=""/></div></div><button class="semi-button semi-button-tertiary semi-button-size-small semi-button-borderless semi-button-with-icon semi-button-with-icon-only" type="button" aria-disabled="false"><span class="semi-button-content"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" style="color:var(--semi-color-text-2)"><path fill="currentColor" d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"></path></svg></span></button></div></div></div></div>
<center><span><small><p>Using <code>mask-image</code> to create a circle area with fading edge</p></small></span></center>
<h3 class="rp-toc-include" id="use-the-main-thread-responsibly-for-interactivity"><a href="#use-the-main-thread-responsibly-for-interactivity" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Use the Main Thread Responsibly for Interactivity</h3>
<p>One of Lynx&#x27;s most notable architectural decisions is its <strong>statically-enforced division</strong> of user scripting into two distinct runtimes: a <em><a href="/guide/spec.html#main-thread-or-lynx-main-thread" class="rp-link">main-thread</a> runtime</em>, powered by <a href="https://github.com/lynx-family/primjs" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>PrimJS</strong></a>, a custom JavaScript engine specifically optimized for Lynx, dedicated to privileged, synchronous UI tasks like initial launch and high-priority event handling, and a <em><a href="/guide/spec.html#background-thread-aka-off-main-thread" class="rp-link">background</a> runtime</em> as the default for user code, ensuring the main thread remains low workload and <em>non-blocking</em>. This enables two killer features of Lynx:</p>
<ol>
<li>
<p><a href="/guide/interaction/ifr.html" class="rp-link"><em>Instant First-Frame Rendering (IFR)</em></a>: Backed by <a href="https://www.nngroup.com/articles/response-times-3-important-limits/" target="_blank" rel="noopener noreferrer" class="rp-link">usability research</a>, if rendering is fast enough—and Lynx is—no special intermediate feedback is needed. By briefly blocking the main thread until the first frame is fully rendered, Lynx eliminates blank screens, creating a perceived instant experience.</p>
</li>
<li>
<p><a href="/react/main-thread-script.html" class="rp-link"><em>Main-Thread Scripting (MTS)</em></a>: A small, statically scheduled piece of code, privileged to run on the main thread, handles high-priority events and gestures—making it ideal for implementing silky-smooth, highly responsive interfaces that feels native.</p>
</li>
</ol>
<div style="display:table;margin:36px 0;width:100%;table-layout:fixed"><div style="display:table-row"><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/killers/ifr.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">IFR</div></div><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/killers/mts.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">MTS</div></div></div></div>
<p>Do you notice how instant the <em>IFR</em> feels and how snappy the <em>MTS</em> is?
Let&#x27;s <strong>slow them down by 4x</strong> so we can take a closer look!</p>
<div style="display:table;margin:36px 0;width:100%;table-layout:fixed"><div style="display:table-row"><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/killers/ifr.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">IFR (0.25x)</div></div><div style="display:table-cell;vertical-align:top;text-align:center"><div style="border-radius:8px;overflow:hidden;max-width:40vw;margin:0 auto"><video src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/killers/mts.mp4" style="width:100%;height:auto;max-height:50vh;object-fit:contain;display:block" autoplay="" muted="" controls="" loop="" playsinline=""></video></div><div style="margin-top:0.5rem;text-align:center">MTS (0.25x)</div></div></div></div>
<p>Internally, we&#x27;ve seen surfaces migrating from Web to Lynx often achieve a <strong>2–4× reduction in launch times</strong> across the board. Our in-house benchmarks also show that Lynx consistently launches faster on Android while remaining competitive with similar technologies on iOS.</p>
<h2 class="rp-toc-include" id="open-sourcing-lynx"><a href="#open-sourcing-lynx" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Open Sourcing Lynx</h2>
<p>Lynx was originally developed by an engineering team of ByteDance, which continue to drive its development. As a significant user of Lynx, TikTok recognizes the innovation and potential of Lynx and has been making extensive use of it in a series of TikTok applications. TikTok will facilitate the open-source release of Lynx, offering support in several areas, including funding, technical enhancement, community promotion, and ecosystem growth.</p>
<h3 class="rp-toc-include" id="democratize-cross-platform-technologies"><a href="#democratize-cross-platform-technologies" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Democratize Cross-Platform Technologies</h3>
<p>For years, cross-platform development for web developers has been defined by the patterns and solutions established by a few dominant players. While we celebrate their remarkable contribution, there is a growing demand for greater diversity in approaches. Lynx seeks to change that by not open-sourcing a single fixed solution, but a <strong><em>meta-infrastructure</em></strong> that enables teams and businesses facing similar scale and velocity challenges to build their own cross-platform solutions.</p>
<p>We are open-sourcing <a href="/react/index.html" class="rp-link"><strong>ReactLynx</strong></a> (&quot;React on Lynx&quot;) as Lynx&#x27;s initial frontend framework flavor, enabling componentized, declarative UI on Lynx. <em>However, Lynx isn&#x27;t limited to React</em>. In fact, other frameworks already represent roughly half of Lynx&#x27;s overall usage, demonstrating its neutrality in hosting different flavors. As modern apps grow increasingly complex, with dozens or even hundreds of developers collaborating on a single app, Lynx ships with <a href="/rspeedy/index.html" class="rp-link"><strong>Rspeedy</strong></a>, a toolchain based on the popular Rust-based bundler <a href="https://rspack.rs/" target="_blank" rel="noopener noreferrer" class="rp-link">Rspack</a>, to enable fast builds and pave the way for a multi-framework <a href="https://en.wikipedia.org/wiki/Micro_frontend" target="_blank" rel="noopener noreferrer" class="rp-link">micro-frontend</a> future via <a href="https://module-federation.io/" target="_blank" rel="noopener noreferrer" class="rp-link">Module Federation</a>. We are eager to work with the open-source JavaScript framework community to bring even greater diversity to cross-platform development.</p>
<p>Not only is <a href="https://github.com/lynx-family/lynx" target="_blank" rel="noopener noreferrer" class="rp-link">the core engine</a> of Lynx framework-agnostic, but it&#x27;s also agnostic to host platforms and rendering backends. Drawing inspiration from a spectrum of projects like <a href="https://www.chromium.org/chromium-projects/" target="_blank" rel="noopener noreferrer" class="rp-link">Chromium</a>, <a href="https://github.com/flutter" target="_blank" rel="noopener noreferrer" class="rp-link">Flutter</a>, and <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer" class="rp-link">React Native</a>, it&#x27;s designed to adapt to new platform primitives, and it&#x27;s flexible enough to switch to a <em>custom renderer</em>, enabling pixel-perfect, consistent rendering across any platforms with a graphics interface. With <a href="https://github.com/lynx-family/lynx-stack/tree/main/packages/web-platform" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>Lynx for Web</strong></a>, Lynx can even run natively within web browsers. Together, they give Lynx ultimate flexibilities in how it can expand to even more platforms, such as Desktop, TV, or IoT devices.</p>
<h3 class="rp-toc-include" id="this-is-not-the-end-but-a-new-beginning"><a href="#this-is-not-the-end-but-a-new-beginning" class="rp-header-anchor rp-link" aria-hidden="true">#</a>This Is Not the End, But a New Beginning</h3>
<p>Lynx is <em>production-ready</em> and already powers an incredible number of businesses. What we are open-sourcing today is the exact version we use in production, which is why it starts at version 3.x. It even includes legacy code and APIs we intend to deprecate, but we believe in opening source what we actually rely on. In fact, <strong>we are moving all development to</strong> <strong>GitHub</strong>, making it open and transparent to the community.</p>
<p>This release marks only the beginning. What we are open sourcing today is <em>not</em> everything. Many peripherals that we&#x27;re proud of—including additional UI components, advanced built-in graphics capabilities, the custom renderer, and other frameworks—are yet to come.</p>
<p>More importantly, this is the beginning of the journey because, as a relatively young team in the open-source space, we know we have much to learn about working, collaborating, and growing with the community. But we are glad we took this step, because we believe open source is the right path forward—<strong>to foster collaboration, push the boundaries of what&#x27;s possible in cross-platform development, and give back to the community that has given us so much</strong>. We invite you to join us on this exciting journey and welcome your feedback and contributions.</p>
<p><em>What will you build with Lynx?</em></p>
<p><img src="https://lf-lynx.tiktok-cdns.com/obj/lynx-artifacts-oss-sg/lynx-website/assets/blog/lynx-unlock-native-for-more.png" alt="lynx-unlock-native-for-more"/></p><!--/$-->]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lynx Blog]]></title>
            <link>https://lynxjs.org/blog/</link>
            <guid isPermaLink="false">/blog/</guid>
        </item>
    </channel>
</rss>