<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://wave.h2o.ai/blog</id>
    <title>H2O Wave Blog</title>
    <updated>2023-10-09T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://wave.h2o.ai/blog"/>
    <subtitle>H2O Wave Blog</subtitle>
    <icon>https://wave.h2o.ai/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Wave reached 1.0!]]></title>
        <id>release-1.0</id>
        <link href="https://wave.h2o.ai/blog/release-1.0"/>
        <updated>2023-10-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Despite Wave being used in production for quite some time already, we thought it would be nice to cut an official 1.0 version, which includes a few big features and minor breaking changes. See the full changelog to learn more.]]></summary>
        <content type="html"><![CDATA[<p>Despite Wave being used in production for quite some time already, we thought it would be nice to cut an official <code>1.0</code> version, which includes a few big features and minor breaking changes. See the <a href="https://github.com/h2oai/wave/releases/tag/v1.0.0" target="_blank" rel="noopener noreferrer">full changelog</a> to learn more.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="wave-share">Wave share<a class="hash-link" href="#wave-share" title="Direct link to heading">​</a></h2><p>If you have ever developed a Wave app and wanted to show it to your colleagues to play around, but didn't feel like deploying so you just fired up a quick screen sharing call, we have a good news for you. The latest version of Wave CLI includes a <code>wave share</code> command which exposes your locally running app to the public world by tunneling your <code>localhost</code> to <a href="https://some-id.h2oai.app" target="_blank" rel="noopener noreferrer">https://some-id.h2oai.app</a> which your colleagues can then just paste into their browser and play around immediately.</p><p>Wanna choose your own subdomain that is easily remembered? No problem!</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">wave share --subdomain foo                 </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"> _       _____ _    ________   _____ __  _____    ____  ______</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">| |     / /   | |  / / ____/  / ___// / / /   |  / __ \/ ____/</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">| | /| / / /| | | / / __/     \__ \/ /_/ / /| | / /_/ / __/</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">| |/ |/ / ___ | |/ / /___    ___/ / __  / ___ |/ _, _/ /___</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">|__/|__/_/  |_|___/_____/   /____/_/ /_/_/  |_/_/ |_/_____/</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">┌────────────────────────────────────────────────────────────┐</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">│  Sharing http://localhost:10101 ==&gt; https://foo.h2oai.app  │</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">└────────────────────────────────────────────────────────────┘</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">DO NOT SHARE IF YOUR APP CONTAINS SENSITIVE INFO</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>See <a href="/docs/cli/">CLI docs</a> or <code>wave share --help</code> for the list of available options.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_S0QG"><p>This feature allows for at most 10 concurrent browser tabs of your Wave app open. For real deployments that can serve 1000s of users, see <a href="https://h2oai.github.io/h2o-ai-cloud/" target="_blank" rel="noopener noreferrer">our enterprise offering</a> or <a href="/docs/deployment/">deployment docs</a>.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-routing">Improved routing<a class="hash-link" href="#improved-routing" title="Direct link to heading">​</a></h2><p>Wave strives to be as simple and as flexible as possible and allows for coming up with any routing mechanism one wants. Even plain <code>if</code> statements are enough in most cases. However, as time went by, the community voiced a need for official mechanism that would reduce the necessary boilerplate - <code>handle_on</code> was born. Unfortunately, it had a few design flaws that couldn't be easily fixed without breaking changes:</p><ul><li>The decision about which handler would be called was based on the order of <code>q.args</code>, which is not guaranteed. That led to unexpected behavior.</li><li>Bug causing that handlers handling boolean values would not fire on <code>False</code> values.</li><li>No pattern matching beyond <code># routing</code>.</li></ul><p>All of the points above were addressed by a new mechanism called <code>run_on</code> which always calls a handler associated with the user action that caused the <code>serve</code> function to run. Let's consider a simple example app to understand what that actually means.</p><p>Our app has a textbox and a button.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> handle_on</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> on</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"/"</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">-</span><span class="token operator" style="color:#a9b7c6">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">None</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">textbox</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'textbox'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Textbox'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Hello!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'button'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Click me'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> handle_on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">textbox</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'Textbox triggered.'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'Button triggered.'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Since textbox has value set, it will be added to <code>q.args</code> during render first. Then, we click the button, which sets its name to <code>q.args</code> as second. Since <code>handle_on</code> looks at order only, despite clicking button, <code>textbox</code> handler is called, which is unexpected.</p><p>Let's now consider the <code>run_on</code>. Whole migration consists of replacing <code>handle_on</code> with <code>run_on</code> - simple.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> on</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> run_on</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"/"</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">-</span><span class="token operator" style="color:#a9b7c6">&gt;</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">None</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">textbox</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'textbox'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Textbox'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Hello!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'button'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Click me'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> run_on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">textbox</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'Textbox triggered.'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'Button triggered.'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once the button is clicked, the expected (button) handler is invoked.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="animations">Animations<a class="hash-link" href="#animations" title="Direct link to heading">​</a></h2><p>We got a feedback that the Wave apps work fine, but are boring UI-wise. Although we consider boring, fast and reliable better than fancy, we heard our community out and introduced an experimental API for animations.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="card-animations">Card animations<a class="hash-link" href="#card-animations" title="Direct link to heading">​</a></h3><p>Cards can be animated during their creation by setting <code>animate=True</code> on the <code>ui.meta_card</code>.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> animate</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><video autoplay="" loop="" muted=""><source src="/assets/medias/animation-4428e46386678acc691474b6eb1dcccd.mp4" type="video/mp4"></video><div class="theme-admonition theme-admonition-warning alert alert--danger admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_S0QG"><p>An animation is considered fluid when it is able to reach <code>60fps</code> (frames per second). To achieve such fps, one needs to make sure the browser has enough resources to paint the animation at such rate. Loading too many data or doing too much browser work may result in janky animations so use at your own risk.</p></div></div><p>Default animation is a simple <code>fade in</code> animation (opacity 0 =&gt; 1) lasting for <code>0.5s</code>. The default values can be overriden via <a href="/docs/custom-css/">custom CSS</a>.</p><div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token selector pseudo-class" style="color:#cc7832">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token comment" style="color:#808080">/* Custom CSS properties to configure duration and animation. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token variable" style="color:#9876aa">--wave-animation-duration</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">0.5</span><span class="token unit">s</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token variable" style="color:#9876aa">--wave-card-animation</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> wave-fade-in</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token comment" style="color:#808080">/* Override this class to get full control over animations. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token selector class" style="color:#cc7832">.wave-animate-card</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token property" style="color:#9876aa">animation</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">var</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token variable" style="color:#9876aa">--wave-card-animation</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token property" style="color:#9876aa">animation-duration</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">var</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token variable" style="color:#9876aa">--wave-animation-duration</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token atrule rule" style="color:#cc7832">@keyframes</span><span class="token atrule" style="color:#cc7832"> wave-fade-in</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token selector" style="color:#cc7832">from</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token property" style="color:#9876aa">opacity</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token selector" style="color:#cc7832">to</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token property" style="color:#9876aa">opacity</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="plot-animations">Plot animations<a class="hash-link" href="#plot-animations" title="Direct link to heading">​</a></h3><p>Plots support basic animations when <code>animate=True</code>.</p><p><img loading="lazy" alt="plot-animation" src="/assets/images/plot-animation-f0e1aa41dfe638bc480615c9e427703f.gif" width="600" height="457" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> data</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Line'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    animate</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    data</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'year value'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> rows</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1991'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">3</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1992'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">4</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1993'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">3.5</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1994'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">5</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1995'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">4.9</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1996'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">6</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1997'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">7</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1998'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">9</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1999'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">13</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    plot</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">mark</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token builtin" style="color:#e8bf6a">type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'line'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> x_scale</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'time'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> x</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=year'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=value'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y_min</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-warning alert alert--danger admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_S0QG"><p>An animation is considered fluid when it is able to reach <code>60fps</code> (frames per second). To achieve such fps, one needs to make sure the browser has enough resources to paint the animation at such rate. Loading too many data or doing too much browser work may result in janky animations so use at your own risk.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="audio-annotator">Audio annotator<a class="hash-link" href="#audio-annotator" title="Direct link to heading">​</a></h2><p>Wave can build UI for audio annotaion in addtion to images now. See the <a href="https://caniuse.com/?search=audio%20format" target="_blank" rel="noopener noreferrer">list</a> of supported audio formats based on your target browser.</p><p><img loading="lazy" alt="audio-annotator" src="/assets/images/audio-annotator-abc56b51730c1a6fa5cdd6c041200da7.png" width="2032" height="1132" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.26.0]]></title>
        <id>release-0.26</id>
        <link href="https://wave.h2o.ai/blog/release-0.26"/>
        <updated>2023-06-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Another Wave release arrived! This time, with a main focus on LLMs. See the full changelog to learn more.]]></summary>
        <content type="html"><![CDATA[<p>Another Wave release arrived! This time, with a main focus on LLMs. See the <a href="https://github.com/h2oai/wave/releases/tag/v0.26.0" target="_blank" rel="noopener noreferrer">full changelog</a> to learn more.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chatbot">Chatbot<a class="hash-link" href="#chatbot" title="Direct link to heading">​</a></h2><p>Large language models are all the rage nowadays, the race is on. Wave aims to help with showing the results of the LLMs and what can be better than an interactive chatbot widget?</p><p>As with most things in Wave, we try our best to make the code as simple and straightforward as possible:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> data</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># List buffer is a dynamic array. Cyclic buffer can also be used. Must have exactly 2 fields - content and from_user.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">chatbot_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 5 5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            data</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'content from_user'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> t</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'list'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'chatbot_name'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># A new message arrived.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">chatbot_name</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># Append user message.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">data </span><span class="token operator" style="color:#a9b7c6">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">chatbot_name</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># Append bot response.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">data </span><span class="token operator" style="color:#a9b7c6">+=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'I am a fake chatbot. Sorry, I cannot help you.'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">False</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The <code>chatbot_card</code> requires a new type of buffer called <code>list buffer</code> to be used. It acts as a dynamic array, providing a simple append operation (<code>+=</code>) and indexing (negative indexing is supported as well).</p><p>The widget supports features like:</p><ul><li><a href="/docs/examples/chatbot-stream">Streaming</a>.</li><li><a href="/docs/examples/chatbot-events-stop">Stream stop</a>.</li><li><a href="/docs/examples/chatbot-events-stop">Infinite scroll</a> for performant loading of history.</li></ul><p>Stay tuned for a Github repo with a sample ChatGPT-like Wave app.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="by-name-component-access">By-name component access<a class="hash-link" href="#by-name-component-access" title="Direct link to heading">​</a></h2><p>Wave allows for updating component attributes like <code>label</code>, <code>content</code>, <code>value</code> etc.:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'step_button'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Step 1'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Update button label.</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">label </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'Step 2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The problem is that this code is not very flexible as it depends on the order of <code>items</code>, which can easily change. Wave <code>0.26.0</code> comes with a better mechanism - use component <code>name</code> as index.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'step_button'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Step 1'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token comment" style="color:#808080"># ❌ Pre Wave 0.26.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">label </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'Step 2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token comment" style="color:#808080"># ✅ Use the "name" attribute to access to component.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">step_button</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">label </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'Step 2'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="file-configuration">File configuration<a class="hash-link" href="#file-configuration" title="Direct link to heading">​</a></h2><p>Waved can now be configured via <code>.env</code> files in addition to command-line arguments and environment variables. The priority goes: <code>cmd arg &gt; env var &gt; config &gt; default</code>. By default, waved looks for a file called <code>.env</code> in the same directory. The configuration file location can also be specified by <code>-conf</code> argument or <code>H2O_WAVE_CONF</code> env variable.</p><p>The app can be also configured by <code>.env</code> file - <code>uvicorn foo:main --nv file</code>. See <a href="/docs/deployment/#deploying-wave-apps">deplyoment docs</a> for more info.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="live-demos">Live demos<a class="hash-link" href="#live-demos" title="Direct link to heading">​</a></h2><p>In order to bring Wave closer to the AI community without the need for any installation, we decided to put some of our core Wave apps to <a href="https://huggingface.co/h2oai" target="_blank" rel="noopener noreferrer">Hugging Face spaces</a>!</p><ul><li><a href="https://huggingface.co/spaces/h2oai/wave-tour" target="_blank" rel="noopener noreferrer">Wave Tour</a> - 200+ interactive examples.</li><li><a href="https://huggingface.co/spaces/h2oai/theme-generator" target="_blank" rel="noopener noreferrer">Theme generator</a> - Interactive Wave theme picker.</li><li><a href="https://huggingface.co/spaces/h2oai/wave-university" target="_blank" rel="noopener noreferrer">Wave University</a> - Interactive introduction to Wave.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="sprinkle-code-blocks-with-colors">Sprinkle code blocks with colors<a class="hash-link" href="#sprinkle-code-blocks-with-colors" title="Direct link to heading">​</a></h2><p>From now on, Wave supports markdown code syntax highlighting natively.</p><ul><li>See <a href="https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md" target="_blank" rel="noopener noreferrer">supported languages and aliases</a>.</li><li>See <a href="https://highlightjs.org/static/demo/" target="_blank" rel="noopener noreferrer">supported themes</a>. To learn how to change the default theme, see <a href="/docs/widgets/content/markdown#code-syntax-highlighting">the docs</a>.</li></ul><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">sample_markdown </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#6a8759">'''=</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">```html</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;!DOCTYPE html&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;title&gt;Title&lt;/title&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="display:inline-block;color:#6a8759"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;style&gt;body {width: 500px;}&lt;/style&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="display:inline-block;color:#6a8759"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;script type="application/javascript"&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">  function $init() {return true;}</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;/script&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="display:inline-block;color:#6a8759"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;body&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">  &lt;p checked class="title" id='title'&gt;Title&lt;/p&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">  &lt;!-- here goes the rest of the page --&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">&lt;/body&gt;</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">'''</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">markdown_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'I was made using markdown!'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    content</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">sample_markdown</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="syntax-highlight" src="/assets/images/syntax-highlight-a5863f7cd9edd6fc75c8abc075379d51.png" width="1218" height="770" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.25.0]]></title>
        <id>release-0.25</id>
        <link href="https://wave.h2o.ai/blog/release-0.25"/>
        <updated>2023-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first Wave release of 2023 is here and brings a lot of exciting features!]]></summary>
        <content type="html"><![CDATA[<p>The first Wave release of 2023 is here and brings a lot of exciting features!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="form-card-layout">Form card layout<a class="hash-link" href="#form-card-layout" title="Direct link to heading">​</a></h2><p>A lot of Wave developers would love to get more control over laying out components within cards. Key role in this is played by <code>ui.inline</code> component which acts as a container for other components and allows to:</p><ul><li>Align the items across vertical and horizontal axes.</li><li>Specify height for cases when the default content height is not enough or "fill remaining card space" scenario.</li><li>Specify the direction within which the components supplied should be rendered - either <code>row</code> (default) or <code>column</code>.</li></ul><p><img loading="lazy" alt="inline_alignment_options" src="/assets/images/inline_align-81476c753710374c38f0af8fb9a06d65.gif" width="600" height="201" class="img_ev3q">
<img loading="lazy" alt="inline_layout" src="/assets/images/inline_layout-4e619e1b7d168a0fef5e09ac2855cc25.png" width="1694" height="572" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-upload-performance">Improved upload performance<a class="hash-link" href="#improved-upload-performance" title="Direct link to heading">​</a></h2><p>Uploading files to the Wave server using <code>q.site.upload</code> is one of the most common things our developers do. This allows for ability to provide file downloads or simply use the uploaded files as resources (images, CSS, JS etc.). Another interesting finding is that most of the Wave apps run on the very same machine as their Wave server. We decided to leverage this fact and do a simple file system copy instead of HTTP upload which is significantly <a href="https://github.com/h2oai/wave/pull/1765" target="_blank" rel="noopener noreferrer">faster</a> since the data doesn't need to be serialized/deserialized during transport. This means if you use <code>q.site.upload</code> for large files a lot, your app should suddenly become much faster.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-image-annotator">Improved image annotator<a class="hash-link" href="#improved-image-annotator" title="Direct link to heading">​</a></h2><p>Our <a href="/docs/widgets/ai/image_annotator/">image annotator</a> component now supports exciting features like keyboard shortcuts or zooming that greatly improve UX.</p><p><img loading="lazy" alt="image_annotator_shortcuts" src="/assets/images/img_annotator-680231464651bc77a1206a1bae3adf1f.png" width="724" height="728" class="img_ev3q">
<img loading="lazy" alt="image_annotator_zoom" src="/assets/images/img_annotator-675a51841aa9f128a8ffbea497c7aac8.gif" width="300" height="295" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="lightwave">Lightwave<a class="hash-link" href="#lightwave" title="Direct link to heading">​</a></h2><p>We heard out our community asking to use Wave in other poular python Web frameworks like Starlette, FastAPI etc, thus Lightwave was born. The general idea was to get rid of Wave Server (waved) and hook into existing web server provided by your framework of choice. The whole integration consists of registering a websocket route and exposing static directory with Wave HTML/CSS/JS files. Once done, you can render your Wave UI and handle user interactions as you would in Wave. As of initial release, only frameworks that are capable of registering async websockets are supported. In case of community interest, sync API can be added as well.</p><p>Since there is no Wave server anymore, features like built-in OIDC integration or uploading files would not work - these need to be handled by your framework.</p><p>Lightwave is currently beta, meaning good for playing-around and experimenting. We are more than happy to get as much feedback as possible. For now, the minimal documentation is condensed into a <a href="https://pypi.org/project/h2o-lightwave/" target="_blank" rel="noopener noreferrer">README</a>. A separate docs site is planned. You can also read a <a href="https://medium.com/@unusualcode/h2o-lightwave-building-web-uis-with-fastapi-and-python-88a915383490" target="_blank" rel="noopener noreferrer">dedicated Lightwave blog post</a> to get more info.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.24.0]]></title>
        <id>release-0.24</id>
        <link href="https://wave.h2o.ai/blog/release-0.24"/>
        <updated>2022-11-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Another Wave release has arrived with quite a few exciting new features. Let's quickly go over the biggest ones.]]></summary>
        <content type="html"><![CDATA[<p>Another Wave release has arrived with quite a few exciting new features. Let's quickly go over the biggest ones.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="wave-init-cli">Wave init CLI<a class="hash-link" href="#wave-init-cli" title="Direct link to heading">​</a></h2><p>How many times you wanted to build a Wave app fast, but then you realized you need to start from scratch, copy over the skeleton of your app and work up from there? For these exact reasons, we introduced a new <code>wave init</code> CLI that allows you to pick an app template and give you a head start when developing. All the templates are the ones already available in IDE extensions under <code>w_app_</code> prefix.</p><p><img loading="lazy" alt="wave-init-cli" src="/assets/images/wave-init-e07671daa8e988ef697fe122783548ca.gif" width="600" height="293" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="polygon-support-for-image-annotator">Polygon support for image annotator<a class="hash-link" href="#polygon-support-for-image-annotator" title="Direct link to heading">​</a></h2><p>Although rectangles are good, they will never be as precise as polygons.</p><p><img loading="lazy" alt="image_annotator_polygon" src="/assets/images/image_annotator_polygon-ed3c9af01f923d336b0db061ac84e7af.png" width="1434" height="1266" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="image-detail">Image detail<a class="hash-link" href="#image-detail" title="Direct link to heading">​</a></h2><p>Some apps need to display a lot of images at the same time. This means that the images must be smaller in order to fit into the screen. However, if you wanted to allow your users to see the image in it's full dimensions, there was no simple way that wouldn't require jumping through hoops.</p><p>That's where the <code>path_popup</code> attribute comes into play. If specified, your <code>ui.image</code> or <code>ui.image_card</code> will have clickable image that can open a fullscreen popup with a high resolution version of the original image.</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>We recommend using smaller-sized images for the <code>path</code> attribute since it serves as a preview and bigger images (high resolution) for the <code>path_popup</code> attribute. This would improve your app's initial loading performance drastically.</p></div></div><p><img loading="lazy" alt="image-popup" src="/assets/images/image_popup-68a09d96693a9999204cdb38f3b1ec32.gif" width="600" height="484" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.23.0]]></title>
        <id>release-0.23</id>
        <link href="https://wave.h2o.ai/blog/release-0.23"/>
        <updated>2022-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Summertime is over, but you do not need to worry, a new 0.23 Wave release is here with a few big new features and plenty of bugfixes, docs improvements and better performance. Let's dive in!]]></summary>
        <content type="html"><![CDATA[<p>Summertime is over, but you do not need to worry, a new <code>0.23</code> Wave release is here with a few big new features and plenty of bugfixes, docs improvements and better performance. Let's dive in!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="time-picker">Time picker<a class="hash-link" href="#time-picker" title="Direct link to heading">​</a></h2><p>It took us some time to bring this component (pun intended), but the result is well worth it. Times of gathering time data in textbox and running regex validations are over.</p><p><img loading="lazy" alt="time-picker" src="/assets/images/time_picker-8084c5e6b6d0301845e98fcff4de4ce4.gif" width="600" height="479" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="wave-studio">Wave Studio<a class="hash-link" href="#wave-studio" title="Direct link to heading">​</a></h2><p>We are experimenting with bringing Wave development experience to the browser with literally zero installation necessary for our <a href="https://h2oai.github.io/h2o-ai-cloud/" target="_blank" rel="noopener noreferrer">cloud users</a>. The result is a Wave app called Wave Studio with features like:</p><ul><li>Auto reload.</li><li>Autocomplete.</li><li>File system.</li><li>Logging output.</li><li>App export/import.</li><li>Editor actions like find/replace etc.</li></ul><p><img loading="lazy" alt="wave-studio-gif" src="/assets/images/wave_studio-ad3a55267848e33045ffc3a38c4a37db.gif" width="600" height="302" class="img_ev3q"></p><p>The complexity of this app confirms that there are almost no limitations of what's possible with Wave.</p><p>Although the app is originally intended for our <a href="https://h2oai.github.io/h2o-ai-cloud/" target="_blank" rel="noopener noreferrer">cloud platform</a>, we have made it fully <a href="https://github.com/h2oai/wave/tree/main/studio" target="_blank" rel="noopener noreferrer">open-source</a> so feel free to try it out or even deploy it to your own environment.</p><p>Note that the app is very alpha currently and not suited for production use. If you spot a bug, don't hesitate and try to fix it yourself. PRs are always more than welcome.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.22.0]]></title>
        <id>release-0.22</id>
        <link href="https://wave.h2o.ai/blog/release-0.22"/>
        <updated>2022-05-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Another Wave release is here! 0.22.0 brings some exciting features like more R support, improved tables, image annotator, development in browser and much more.]]></summary>
        <content type="html"><![CDATA[<p>Another Wave release is here! <code>0.22.0</code> brings some exciting features like more R support, improved tables, image annotator, development in browser and much more.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="r-support">R support<a class="hash-link" href="#r-support" title="Direct link to heading">​</a></h2><p>Python is the most dominant programming language when it comes to Data Science community. That's why we started with it. However, we did not forget about R community and thanks to awesome work of <a href="https://github.com/ashrith" target="_blank" rel="noopener noreferrer">Ashrith Barthur</a>, Wave supports R apps and dashboards as well. See the <a href="https://github.com/h2oai/wave/tree/main/r/R/examples" target="_blank" rel="noopener noreferrer">R examples</a> and let us know what you think in <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">discussions</a>.</p><p>Example R h2o_wave app</p><div class="language-r codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-r codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">h2owave</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">serve </span><span class="token operator" style="color:#a9b7c6">&lt;-</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">function</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">qo</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test </span><span class="token operator" style="color:#a9b7c6">&lt;-</span><span class="token plain"> ifelse</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">is.null</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ifelse</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">args</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">increment </span><span class="token operator" style="color:#a9b7c6">==</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">TRUE</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test </span><span class="token operator" style="color:#a9b7c6">&lt;-</span><span class="token plain"> qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test </span><span class="token operator" style="color:#a9b7c6">+</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test </span><span class="token operator" style="color:#a9b7c6">&lt;-</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">if</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">length</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">==</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">0</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">||</span><span class="token plain"> qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">args</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">increment </span><span class="token operator" style="color:#a9b7c6">==</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">FALSE</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">add_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"button_entry"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">ui_form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                        box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 12 10'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                        </span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">items </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> list</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                            ui_button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                                name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'increment'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                                </span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">paste0</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'Count= '</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                                </span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">primary </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">TRUE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                                </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                            </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                        </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">set</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"button_entry"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token string" style="color:#6a8759">"items"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token string" style="color:#6a8759">"0"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token string" style="color:#6a8759">"button"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token string" style="color:#6a8759">"label"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">paste0</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"Count="</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">client</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">test</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    qo</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"/"</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Example R h2o_wave dashbaord</p><div class="language-r codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-r codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">h2owave</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page </span><span class="token operator" style="color:#a9b7c6">&lt;-</span><span class="token plain"> Site</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"/demo"</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">drop</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">add_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"hello"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui_markdown_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">"1 1 2 2"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">"Hello World!"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    content</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'And now for something completely different!'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page</span><span class="token operator" style="color:#a9b7c6">$</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-tables">Improved tables<a class="hash-link" href="#improved-tables" title="Direct link to heading">​</a></h2><p>Since most of the apps display tabular data, extra formatting might come in handy.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="markdown-support">Markdown support<a class="hash-link" href="#markdown-support" title="Direct link to heading">​</a></h3><p>Leverage the power and versatility of <a href="https://www.markdownguide.org/" target="_blank" rel="noopener noreferrer">Markdown</a> by setting <code>cell_type</code> to <code>markdown_cell_type</code>.
To open links in a new tab use <code>target='_blank'</code>.</p><p><img loading="lazy" alt="markdown-table" src="/assets/images/markdown-table-5fb80cd63b810f72baff3f726150ec16.png" width="402" height="484" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 3 6'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text_xl</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">content</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Table with Markdown'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'table'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        columns</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_column</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'description'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Description'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> min_width</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'200'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                            cell_type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">markdown_table_cell_type</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">target</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'_blank'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_column</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'markdown'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Markdown'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                            cell_type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">markdown_table_cell_type</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">target</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'_blank'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        height</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'450px'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        rows</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Normal text'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'Hello World!'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Bold text'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'This is a **bold** text.'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row3'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Italicized text'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'This is a _italicized_ text.'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Link'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'&lt;http://wave.h2o.ai&gt;'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Absolute link with label'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'[Wave website](http://wave.h2o.ai/)'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row6'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Relative link with label'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'[Go to /wave](/wave)'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row7'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Email'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'&lt;fake@email.com&gt;'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row8'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Code'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'``inline code``'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># change to monospaced font</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="commands">Commands<a class="hash-link" href="#commands" title="Direct link to heading">​</a></h3><p>You can group multiple actions in a context menu for each row by setting <code>cell_type</code> to <code>ui.menu_table_cell_type</code> and providing the commands you want. Use <code>q.args.&lt;command_name&gt;</code> to identify which command was clicked. Since every cell in the actions column will have the same content (an icon that opens a menu) you can simply specify an empty string as a placeholder so that the cells are provided in the correct order.</p><p><img loading="lazy" alt="markdown-table" src="/assets/images/commands-table-43aa01fcf7da9172ac468702c5526eec.png" width="561" height="206" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">commands </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">command</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'details'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Details'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> icon</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Info'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">command</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'delete'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Delete'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> icon</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Delete'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 3 3'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'table'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        columns</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_column</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'actions'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Actions'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cell_type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">menu_table_cell_type</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'commands'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> commands</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">commands</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        rows</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'first_row'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="let-your-users-draw">Let your users draw<a class="hash-link" href="#let-your-users-draw" title="Direct link to heading">​</a></h2><p>Do you work with computer vision and need to show your users the resulting annotations or even let them draw their own? The <code>ui.image_annotator</code> component is there for you.</p><p><img loading="lazy" alt="image-annotator" src="/assets/images/image-annotator-61f200cdab61c06ebf52b72c367808ce.png" width="1296" height="867" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 9 -1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">image_annotator</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'annotator'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Drag to annotate'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        image</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'https://images.pexels.com/photos/2696064/pexels-photo-2696064.jpeg?auto=compress&amp;cs=tinysrgb&amp;w=1260&amp;h=750&amp;dpr=1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        image_height</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'700px'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        tags</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">image_annotator_tag</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'p'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Person'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> color</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'$cyan'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">image_annotator_tag</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'f'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Food'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> color</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'$blue'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">image_annotator_item</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">shape</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">image_annotator_rect</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">x1</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">649</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y1</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">393</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> x2</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">383</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y2</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">25</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> tag</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'p'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'submit'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Submit'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> primary</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="develop-directly-in-your-browser">Develop directly in your browser<a class="hash-link" href="#develop-directly-in-your-browser" title="Direct link to heading">​</a></h2><p>If you are not new to Wave, the chances are you have stumbled upon our Tour app that provides a lot of examples showing different Wave aspects. In order to allow even better exploration experience, we made the examples editable via browser VSCode-like editor called <a href="https://microsoft.github.io/monaco-editor/" target="_blank" rel="noopener noreferrer">Monaco</a>.</p><p><img loading="lazy" alt="editable-tour" src="/assets/images/editable-tour-a1fa7cbb4e69ef8d31e15f5363d58797.gif" width="600" height="302" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Code Snippets and Autocomplete for VSCode]]></title>
        <id>h2o-wave-vscode-extension</id>
        <link href="https://wave.h2o.ai/blog/h2o-wave-vscode-extension"/>
        <updated>2022-04-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In addition to the most recent 0.21 release, we also published a VSCode extension that aims to ease the Wave app development even more. This extension adds plenty of code snippets and autocomplete functionality for wave-specific code.]]></summary>
        <content type="html"><![CDATA[<p>In addition to the most recent <a href="https://wave.h2o.ai/blog/release-0.21" target="_blank" rel="noopener noreferrer">0.21 release</a>, we also published a <a href="https://marketplace.visualstudio.com/items?itemName=h2oai.h2o-wave" target="_blank" rel="noopener noreferrer">VSCode extension</a> that aims to ease the Wave app development even more. This extension adds plenty of code snippets and autocomplete functionality for wave-specific code.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="code-snippets">Code snippets<a class="hash-link" href="#code-snippets" title="Direct link to heading">​</a></h2><p>Code snippets are reusable blocks of code that save you from writing out the whole code yourself, saving you time and mental energy. They also give you easy access to Wave code best practices. Thus they allow writing Wave code somewhat declaratively - the developer needs to only focus on the big picture. Let's take the following scenario: I want to create a new Wave app, but I do not remember the base boilerplate needed. In this case, you can simply use the <code>w_app_base</code> snippet and you are good to go!</p><p>The plugin supports the following types of code snippets:</p><ul><li>Code blocks - useful code blocks, e.g. <code>w_init_client</code> provides boilerplate for a client initialization.</li><li>App templates - prebuilt Wave apps using the most common layouts and patterns, e.g. <code>w_app_header</code> provides an app with a body and header.</li><li>Component snippets<ul><li>Minimal snippets - prefixed with <code>w_</code>, e.g. <code>w_button</code> provides snippet with required attributes only.</li><li>Full snippets - prefixed with <code>w_full_</code>, e.g. <code>w_full_button</code> provides snippet with all attributes so you can easily see and learn all customizing options.</li></ul></li></ul><p><img loading="lazy" alt="autocomplete1" src="/assets/images/autocomplete1-234d93252af2fe9afded23e526001180.png" width="818" height="392" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="autocomplete">Autocomplete<a class="hash-link" href="#autocomplete" title="Direct link to heading">​</a></h2><p>Have you ever wanted to handle that button click in Wave, but didn't remember the <code>name</code> attribute you used? If the answer is yes, we have some good news for you! This plugin will offer you all the available options for:</p><ul><li>q.args</li><li>q.client</li><li>q.user</li><li>q.app</li><li>zone attributes</li><li>icon attributes</li><li>theme attributes</li></ul><p><img loading="lazy" alt="autocomplete2" src="/assets/images/autocomplete2-48e47416439f6e7a8e3446c5bfac05d3.png" width="536" height="521" class="img_ev3q">
<img loading="lazy" alt="autocomplete3" src="/assets/images/autocomplete3-dc007b6e43e21a48abb7cf41e8347497.png" width="781" height="365" class="img_ev3q">
<img loading="lazy" alt="autocomplete4" src="/assets/images/autocomplete4-0f5d626b8cf935b9bfb70e607a043dd9.png" width="755" height="407" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a class="hash-link" href="#installation" title="Direct link to heading">​</a></h2><p>The plugin is part of public <a href="https://marketplace.visualstudio.com/items?itemName=h2oai.h2o-wave" target="_blank" rel="noopener noreferrer">VScode marketplace</a> and can be installed directly from the web (if you have your VSCode currently open) or within VSCode via <code>Extensions</code> pane.</p><p>Once installed, set <code>python.pythonPath</code> or <code>python.defaultInterpreterPath</code> configuration options to a python3.7+ installation (e.g. <code>python3</code> for a global, system-wide python).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="not-a-vscode-user">Not a VSCode user?<a class="hash-link" href="#not-a-vscode-user" title="Direct link to heading">​</a></h2><p>If you do not use VSCode, but still would like to enjoy an improved dev experience we also support <a href="https://plugins.jetbrains.com/plugin/18530-h2o-wave" target="_blank" rel="noopener noreferrer">PyCharm plugin</a>. See <a href="https://wave.h2o.ai/blog/h2o-wave-pycharm-plugin" target="_blank" rel="noopener noreferrer">blog post</a> to learn more.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We are eager to hear your feature requests, bugfixes or just general feedback in our <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">discussions</a> and <a href="https://github.com/h2oai/wave/issues" target="_blank" rel="noopener noreferrer">issues</a> sections.</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="community-content" term="community-content"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.21.0]]></title>
        <id>release-0.21</id>
        <link href="https://wave.h2o.ai/blog/release-0.21"/>
        <updated>2022-04-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we are proud to announce a new Wave version - 0.21.0 with support for server-side tables, Apple M1 chip, plot interactions and plenty of new widgets.]]></summary>
        <content type="html"><![CDATA[<p>Today, we are proud to announce a new Wave version - <code>0.21.0</code> with support for server-side tables, Apple M1 chip, plot interactions and plenty of new widgets.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="let-your-table-handle-any-data-size">Let your table handle any data size<a class="hash-link" href="#let-your-table-handle-any-data-size" title="Direct link to heading">​</a></h2><p>In previous versions, all the data passed to <code>ui.table</code> as rows were sent at once to the browser. All operations (sorting, filtering etc.) were happening in the browser, which has its limits. These were approximately around 100k rows with 10 cols to keep the UX smooth. However, if a developer needed to display larger data, let's say in order of millions, there was no way to make it happen.</p><p>This release adds support for pagination and lets developers handle all the operations in form of events: <code>'search'</code>, <code>'sort'</code>, <code>'filter'</code>, <code>'download'</code>, <code>'page_change'</code>, <code>'reset'</code>. See <a href="/docs/examples/table-pagination">complete example</a> for a comprehensive example. Also note that you can use any arbitrary data source like SQL, <a href="/docs/examples/table-pagination-pandas">pandas dataframe</a> or <a href="/docs/examples/table-pagination-h2o3">H2OFrame</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="grouped-tabular-data">Grouped tabular data<a class="hash-link" href="#grouped-tabular-data" title="Direct link to heading">​</a></h2><p>In previous versions, app developers could only specify the <code>groupable</code> attribute which adds a group by dropdown that lets users pick a column to group by on. However, if app developers wanted to present their tabular data organized into groups, that was a problem - until now. We introduced a new <code>groups</code> attribute which takes a list of <code>ui.table_group</code>.</p><p>It is even possible to control whether the groups should be expanded or collapsed initially.</p><p><img loading="lazy" alt="table groups" src="/assets/images/table-groups-51130da1932afb9703b78142f4fd684f.png" width="402" height="292" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'form'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 -1 6'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'issues'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        columns</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_column</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'text'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Issues reported by'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        groups</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_group</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"Bob"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Issue1'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Issue2'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_group</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">"John"</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row3'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Issue3'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Issue4'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">table_row</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'row5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> cells</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Issue5'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        height</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'500px'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="m1-chip-no-problem">M1 chip? No problem<a class="hash-link" href="#m1-chip-no-problem" title="Direct link to heading">​</a></h2><p>If you own Apple's newest Macbooks with M1 chips, you no longer need <a href="https://en.wikipedia.org/wiki/Rosetta_(software)" target="_blank" rel="noopener noreferrer">Rosetta</a> to be running under the hood to run the Wave server binary. We are now building a binary for M1 as well.</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>Make sure to keep your <a href="https://pypi.org/project/pip/" target="_blank" rel="noopener noreferrer">pip</a> up to date so that it can correctly identify what system you are using and provide the correct python wheel file during <code>pip install</code>.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="box-plots">Box plots<a class="hash-link" href="#box-plots" title="Direct link to heading">​</a></h2><p>Wave now supports <a href="https://en.wikipedia.org/wiki/Box_plot" target="_blank" rel="noopener noreferrer">box plots</a>.</p><p><img loading="lazy" alt="box plot" src="/assets/images/box-plot-560e5996904f9353ff2fed3a652034a7.png" width="879" height="438" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 6 5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Box plot'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    data</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        fields</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'region'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'low'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'q1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'q2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'q3'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'high'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        rows</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Oceania'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">9</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">16</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">22</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">24</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'East Europe'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">5</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">12</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">16</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'Australia'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">12</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">19</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">26</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'South America'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">2</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">12</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">21</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">28</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'North Africa'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">14</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">18</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">24</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'North America'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">3</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">10</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">17</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">28</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">30</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'West Europe'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">7</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">10</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">17</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">22</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'West Africa'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">6</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">13</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">16</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        pack</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    plot</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">mark</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token builtin" style="color:#e8bf6a">type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'schema'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        x</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=region'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        y1</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=low'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># min</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        y_q1</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=q1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># lower quartile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        y_q2</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=q2'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># median</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        y_q3</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=q3'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># upper quartile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        y2</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=high'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># max</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        fill_color</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#ccf5ff'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="let-your-plots-come-to-life">Let your plots come to life<a class="hash-link" href="#let-your-plots-come-to-life" title="Direct link to heading">​</a></h2><p>We enabled plot <a href="/blog/docs/widgets/plots/interactions">interactions</a> like zoom, brush, and drag so that your users can poke around your plot data easily.</p><p><img loading="lazy" alt="plot brush" src="/assets/images/plot_interaction_brush-fa06b1535a166712e63ed6cb150c08b6.gif" width="600" height="458" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 5'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Line plot brush'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    data</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'year value'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">8</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> rows</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1991'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">3</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1992'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">4</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1993'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">3.5</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1994'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">5</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1995'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">4.9</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1996'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">6</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1997'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">7</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1998'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">9</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'1999'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">13</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    plot</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">mark</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token builtin" style="color:#e8bf6a">type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'line'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> x_scale</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'time'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> x</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=year'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'=value'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y_min</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Register an interaction.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    interactions</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'brush'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-warning alert alert--danger admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_S0QG"><p>Due to limitations of our plotting library, <code>zoom</code> is currently not available in Firefox. It is recommended to use <code>brush</code> instead.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="notification-bar">Notification bar<a class="hash-link" href="#notification-bar" title="Direct link to heading">​</a></h2><p>Need a slick way of informing your users about something? Use <code>ui.notification_bar</code>!</p><p><img loading="lazy" alt="notification bar" src="/assets/images/notification_bar-1a97ecb33025e494a49ce8ec71032c52.gif" width="600" height="198" class="img_ev3q"></p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'form'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 2 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'top_right'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Success top-right'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">top_right</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        notification_bar</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">notification_bar</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Success notification'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token builtin" style="color:#e8bf6a">type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'success'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            position</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'top-right'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            buttons</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'btn'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Link button'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> link</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="icons-gone-missing">Icons gone missing?<a class="hash-link" href="#icons-gone-missing" title="Direct link to heading">​</a></h2><p>We had to replace our original icon set with a new one which means it is very likely that some of the icons used will turn invisible. The solution is to <a href="/docs/icons">search</a> for new ones.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-docs">Improved docs<a class="hash-link" href="#improved-docs" title="Direct link to heading">​</a></h2><p>Check out the new <a href="/docs/widgets/plots/overview">plot</a> and <a href="/docs/widgets/overlays/dialog">overlays</a> widget sections.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Code Snippets and Autocomplete for PyCharm]]></title>
        <id>h2o-wave-pycharm-plugin</id>
        <link href="https://wave.h2o.ai/blog/h2o-wave-pycharm-plugin"/>
        <updated>2022-02-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In addition to the most recent 0.20 release, we also published a PyCharm plugin that aims to ease the Wave app development even more. This plugin adds plenty of code snippets and autocomplete functionality for wave-specific code.]]></summary>
        <content type="html"><![CDATA[<p>In addition to the most recent <a href="https://wave.h2o.ai/blog/release-0.20" target="_blank" rel="noopener noreferrer">0.20 release</a>, we also published a PyCharm plugin that aims to ease the Wave app development even more. This plugin adds plenty of code snippets and autocomplete functionality for wave-specific code.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="code-snippets">Code snippets<a class="hash-link" href="#code-snippets" title="Direct link to heading">​</a></h2><p>Code snippets are reusable blocks of code that save you from writing out the whole code yourself, saving you time and mental energy. They also give you easy access to Wave code best practices. Thus they allow writing Wave code somewhat declaratively - the developer needs to only focus on the big picture. Let's take the following scenario: I want to create a new Wave app, but I do not remember the base boilerplate needed. In this case, you can simply use the <code>w_app_base</code> snippet and you are good to go! See it in action in the following video by <a href="https://github.com/mtanco" target="_blank" rel="noopener noreferrer">Michelle Tanco</a>:</p><iframe width="100%" height="315" src="https://www.youtube.com/embed/Z1SJmk8qUFI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>The plugin supports the following types of code snippets:</p><ul><li>Code blocks - useful code blocks, e.g. <code>w_init_client</code> provides boilerplate for a client initialization.</li><li>App templates - prebuilt Wave apps using the most common layouts and patterns, e.g. <code>w_app_header</code> provides an app with a body and header.</li><li>Component snippets<ul><li>Minimal snippets - prefixed with <code>w_</code>, e.g. <code>w_button</code> provides snippet with required attributes only.</li><li>Full snippets - prefixed with <code>w_full_</code>, e.g. <code>w_full_button</code> provides snippet with all attributes so you can easily see and learn all customizing options.</li></ul></li></ul><p><img loading="lazy" alt="autocomplete1" src="/assets/images/autocomplete1-ac9ec4aa83cc266cbeddd46efbc98722.png" width="1280" height="800" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="autocomplete">Autocomplete<a class="hash-link" href="#autocomplete" title="Direct link to heading">​</a></h2><p>Have you ever wanted to handle that button click in Wave, but didn't really remember the <code>name</code> attribute you used? If the answer is yes, we have some good news for you! This plugin will offer you all the available options for:</p><ul><li>q.args</li><li>q.client</li><li>q.user</li><li>q.app</li><li>zone attributes</li><li>icon attributes</li><li>theme attributes</li></ul><p><img loading="lazy" alt="autocomplete2" src="/assets/images/autocomplete2-34759cc22a04a05439ad9d2bdd76dd25.png" width="1280" height="800" class="img_ev3q">
<img loading="lazy" alt="autocomplete3" src="/assets/images/autocomplete3-1bdca457aaf7434f17469bd8ba659f91.png" width="1280" height="800" class="img_ev3q">
<img loading="lazy" alt="autocomplete4" src="/assets/images/autocomplete4-748a33e550b0395ede142e8a6a7f3e3f.png" width="1280" height="800" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a class="hash-link" href="#installation" title="Direct link to heading">​</a></h2><p>The plugin is part of public <a href="https://plugins.jetbrains.com/plugin/18530-h2o-wave" target="_blank" rel="noopener noreferrer">Jetbrains marketplace</a> and can be installed directly from the web (if you have you Pycharm currently open) or within Pycharm directly via <code>Preferences -&gt; Plugins -&gt; Marketplace</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We are eager to hear your feature requests, bugfixes or just general feedback in our <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">discussions</a> and <a href="https://github.com/h2oai/wave/issues" target="_blank" rel="noopener noreferrer">issues</a> sections.</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="community-content" term="community-content"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.20]]></title>
        <id>release-0.20</id>
        <link href="https://wave.h2o.ai/blog/release-0.20"/>
        <updated>2022-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The newest Wave release includes plenty of useful features that aim to ease the development process and make your Wave apps more appealing. In this post, we explore the most important features that shipped with v0.20.]]></summary>
        <content type="html"><![CDATA[<p>The newest Wave release includes plenty of useful features that aim to ease the development process and make your Wave apps more appealing. In this post, we explore the most important features that shipped with v0.20.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="simpler-quicker-installation-experience">Simpler, quicker installation experience<a class="hash-link" href="#simpler-quicker-installation-experience" title="Direct link to heading">​</a></h2><p>Prior to v0.20, it was necessary to manually download and run the Wave server (<code>waved</code> or <code>waved.exe</code>) from <a href="https://github.com/h2oai/wave/releases" target="_blank" rel="noopener noreferrer">Github</a> prior to running your app. This step is no longer necessary.</p><p>Starting with v0.20, all you need to do is <code>pip install h2o_wave</code> and then <code>wave run app.py</code>. The Wave server is automatically started for you.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token comment" style="color:#808080"># Automatically starts the Wave server!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave run app.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This behavior makes it simpler to get started with Wave app development. For production deployments, you might want to pass additional configuration options to <code>waved</code> or even switch your python ASGI server (see <a href="/docs/deployment#deploying-wave-apps">deployment docs</a>).</p><p>If you do not want to start <code>waved</code> during <code>wave run</code>, you can turn it off by passing <code>--no-autostart to </code>wave run<code>, e.g. </code>wave run --no-autostart app.py<code>, or setting the </code>H2O_WAVE_NO_AUTOSTART<code>environment variable, e.g.</code>H2O_WAVE_NO_AUTOSTART=1 wave run app.py`.</p><p>To download Wave app examples, demos, and the interactive tour locally, simply run <code>wave fetch</code>. </p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave fetch</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Fetching examples and related files. Please wait</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Downloading https://github.com/h2oai/wave/releases/download/v0.19.0/wave-0.19.0-linux-amd64.tar.gz</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Extracting</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">All additional files downloaded and extracted successfully</span><span class="token operator" style="color:#a9b7c6">!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Examples and tour</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain">. /home/wave/examples</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Demos and layout samples</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain"> /home/wave/demo</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Automated </span><span class="token builtin class-name" style="color:#e8bf6a">test</span><span class="token plain"> harness</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain"> /home/wave/test</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">Wave daemon </span><span class="token keyword" style="color:#cc7832">for</span><span class="token plain"> deployments</span><span class="token punctuation" style="color:#a9b7c6">..</span><span class="token plain">. /home/wave</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You should now have access to 200+ examples locally.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="base-url-support">Base URL support<a class="hash-link" href="#base-url-support" title="Direct link to heading">​</a></h2><p>By default, Wave apps are all hosted at the root path <code>/</code>. This path can be customized by specifying a route via, say, <code>@app('/foo')</code> or <code>site['/foo']</code>. Starting with v0.20, you can additionally specify a base URL, so that all the apps or sites hosted by a Wave server are served at a path other than <code>/</code>. </p><p>Using this feature, specifying a base URL, say <code>/my/apps</code>, will make your apps available at <code>/my/apps/app1</code>, <code>/my/apps/app2</code>, and so on.</p><p>To enable a base URL, launch <code>waved</code> with <code>-base-url</code> or launch <code>waved</code> with <code>$H2O_WAVE_BASE_URL</code>. Setting base URL to <code>/foo/</code> will allow serving an app with route <code>/</code> at <code>/foo/</code>, or an app with route <code>/bar</code> at <code>/foo/bar/</code>. Accessing <code>/foo/</code>'s parent(s) from either a browser or API call will return a 404 error. If a base URL is set, an app must be launched with <code>$H2O_WAVE_BASE_URL</code> set to the same base URL value.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="card-and-component-documentation">Card and component documentation<a class="hash-link" href="#card-and-component-documentation" title="Direct link to heading">​</a></h2><p>The documentation now includes a whole new section on <a href="/docs/widgets/overview">Widgets</a>, which includes explanations and examples on how to best use each of the cards and components available in Wave. This is a work in progress, and will be improved over time. We've tried to include screenshots of each example wherever possible, which should make it easier for you to browse, copy and adapt the sample code for your apps.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-cards-components-and-improvements">New cards, components, and improvements<a class="hash-link" href="#new-cards-components-and-improvements" title="Direct link to heading">​</a></h2><p>v0.20 ships with more new cards and improvements. Here's an overview of the most important changes.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="header">Header<a class="hash-link" href="#header" title="Direct link to heading">​</a></h3><p>The header received 3 new attributes:</p><ul><li><code>items</code> - Components that should be displayed on the right side of the header.</li><li><code>secondary_items</code> - Items that should be displayed in the center of the header</li><li><code>color</code> - Header background color. Available colors are 'card' | 'transparent' | 'primary'. Defaults to 'primary'.</li></ul><p><img loading="lazy" alt="header-improvements" src="/assets/images/header-e12130c2448c7e4eaeb2cc918479b26f.png" width="2672" height="542" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/header">header</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="sidebar">Sidebar<a class="hash-link" href="#sidebar" title="Direct link to heading">​</a></h3><p>Sidebar (<code>ui.nav</code>) got 4 new attributes:</p><ul><li><code>image</code> - The logo displayed at the top.</li><li><code>persona</code> - The user avatar displayed at the top.</li></ul><ul><li><code>secondary_items</code> - Items that should be displayed at the bottom of the card if items are not empty, otherwise displayed under subtitle.</li><li><code>color</code> - Card background color. Available colors are <code>'card'</code> and <code>'primary'</code>. Defaults to <code>'card'</code>.</li></ul><p><img loading="lazy" alt="sidebar-improvements" src="/assets/images/sidebar-0f8de3cbaba4d8054ab892160026761b.png" width="1172" height="1832" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/navigation">navigation</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="footer">Footer<a class="hash-link" href="#footer" title="Direct link to heading">​</a></h3><p>A new <code>items</code> attribute was added to allow displaying of components (preferably <code>ui.links</code>) to the right side of the caption.</p><p><img loading="lazy" alt="footer-improvements" src="/assets/images/footer-17e17de861affd2b852fbf43cd059154.png" width="1028" height="205" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/footer">footer</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="tall-stats-card">Tall stats card<a class="hash-link" href="#tall-stats-card" title="Direct link to heading">​</a></h3><p><img loading="lazy" alt="tall-stat-card" src="/assets/images/tall-stats-f829670b4741fba2f6c03a5486b53e1e.png" width="283" height="349" class="img_ev3q"></p><p>See <a href="/docs/widgets/stat/tall_stats">tall stats</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="post-card">Post card<a class="hash-link" href="#post-card" title="Direct link to heading">​</a></h3><p><img loading="lazy" alt="post-card" src="/assets/images/postcard-44e3a50b4aff14176fb4c731dabe220c.png" width="432" height="440" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/post">post card</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="preview-card">Preview card<a class="hash-link" href="#preview-card" title="Direct link to heading">​</a></h3><p><img loading="lazy" alt="preview-card" src="/assets/images/preview-3434ba0e6fa0b261283b4243d0c8195f.png" width="432" height="349" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/preview">preview card</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="wide-article-preview">Wide article preview<a class="hash-link" href="#wide-article-preview" title="Direct link to heading">​</a></h3><p><img loading="lazy" alt="wide-article-preview-card" src="/assets/images/wide-article-04ae4569059b3880badd3e404eaa00eb.png" width="879" height="440" class="img_ev3q"></p><p>See <a href="/docs/widgets/content/wide_article_preview">wide article preview card</a> for more info.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="menu">Menu<a class="hash-link" href="#menu" title="Direct link to heading">​</a></h3><p><img loading="lazy" alt="menu" src="/assets/images/menu-73eaa765ba2c683c0cf3e8ee42dab4a1.png" width="195" height="202" class="img_ev3q"></p><p>See <a href="/docs/widgets/form/menu">menu</a> for more info.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-themes">New Themes<a class="hash-link" href="#new-themes" title="Direct link to heading">​</a></h2><p>v0.20 includes a dozen new built-in themes to choose from. Most of the themes were inspired by popular editor/IDE themes of the same name. If you have ideas for other themes that would be useful to have in Wave, please <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">let us know</a>!</p><p>If you are unsure how to use these, checkout the <a href="/docs/color-theming">docs</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="winter-is-coming">Winter is coming<a class="hash-link" href="#winter-is-coming" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://marketplace.visualstudio.com/items?itemName=johnpapa.winteriscoming" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=johnpapa.winteriscoming</a>.</p><p><img loading="lazy" alt="winter-is-coming-theme" src="/assets/images/winter-is-coming-406a8bf0937b755803e971b14c18d45f.png" width="3358" height="1872" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="fuchasia">Fuchasia<a class="hash-link" href="#fuchasia" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://github.com/thvardhan/Gradianto" target="_blank" rel="noopener noreferrer">https://github.com/thvardhan/Gradianto</a>.</p><p><img loading="lazy" alt="fuchasia-theme" src="/assets/images/fuchasia-2eae4f38bbe37f3c5d391e3d35d7d779.png" width="3358" height="1882" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="monokai">Monokai<a class="hash-link" href="#monokai" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://monokai.pro/" target="_blank" rel="noopener noreferrer">https://monokai.pro/</a>.</p><p><img loading="lazy" alt="monokai-theme" src="/assets/images/monokai-3524ebf2b43679e38ab2bc30c6d9d08c.png" width="3352" height="1864" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="nature">Nature<a class="hash-link" href="#nature" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://github.com/thvardhan/Gradianto" target="_blank" rel="noopener noreferrer">https://github.com/thvardhan/Gradianto</a>.</p><p><img loading="lazy" alt="nature-theme" src="/assets/images/nature-ab8ba4aa840346ac67253bc56d17daff.png" width="3354" height="1856" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="nord">Nord<a class="hash-link" href="#nord" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://www.nordtheme.com/" target="_blank" rel="noopener noreferrer">https://www.nordtheme.com/</a>.</p><p><img loading="lazy" alt="nord-theme" src="/assets/images/nord-e69578c2c91485e2f0a1634dbb4f831a.png" width="3354" height="1880" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="oceanic">Oceanic<a class="hash-link" href="#oceanic" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://material-theme.com/" target="_blank" rel="noopener noreferrer">https://material-theme.com/</a>.</p><p><img loading="lazy" alt="oceanic-theme" src="/assets/images/oceanic-6e6c52b901f8b5bbcae0f828d8968373.png" width="3350" height="1878" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-dark-pro">One dark pro<a class="hash-link" href="#one-dark-pro" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme</a>.</p><p><img loading="lazy" alt="one-dark-pro-theme" src="/assets/images/one-dark-pro-c283ad53d5416276f3761460faab1135.png" width="3356" height="1880" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="benext">Benext<a class="hash-link" href="#benext" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://slackthemes.net/#/benext" target="_blank" rel="noopener noreferrer">https://slackthemes.net/#/benext</a>.</p><p><img loading="lazy" alt="benext-theme" src="/assets/images/benext-f7015bda01409737ae5a242d25fea1c9.png" width="3358" height="1878" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="ember">Ember<a class="hash-link" href="#ember" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://emberjs.com/" target="_blank" rel="noopener noreferrer">https://emberjs.com/</a>.</p><p><img loading="lazy" alt="ember-theme" src="/assets/images/ember-3a55feb8688f69819d1ecb98ddba6f2f.png" width="3354" height="1862" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="kiwi">Kiwi<a class="hash-link" href="#kiwi" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://rainglow.io/" target="_blank" rel="noopener noreferrer">https://rainglow.io/</a>.</p><p><img loading="lazy" alt="kiwi-theme" src="/assets/images/kiwi-50954c0cab23f7af573e3f16e5af99fd.png" width="3348" height="1872" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="lighting">Lighting<a class="hash-link" href="#lighting" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://slackthemes.net/#/lightning" target="_blank" rel="noopener noreferrer">https://slackthemes.net/#/lightning</a>.</p><p><img loading="lazy" alt="lighting-theme" src="/assets/images/lighting-444e44cdd696cc15715fe3960e41cab7.png" width="3346" height="1872" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solarized">Solarized<a class="hash-link" href="#solarized" title="Direct link to heading">​</a></h3><p>Credit: <a href="https://ethanschoonover.com/solarized/" target="_blank" rel="noopener noreferrer">https://ethanschoonover.com/solarized/</a>.</p><p><img loading="lazy" alt="solarized-theme" src="/assets/images/solarized-15e8d4112da020fe89ec1ca5bcccd765.png" width="3346" height="1868" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feedback">Feedback<a class="hash-link" href="#feedback" title="Direct link to heading">​</a></h2><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Learning H2O Wave - Community Resources]]></title>
        <id>community-content-ar</id>
        <link href="https://wave.h2o.ai/blog/community-content-ar"/>
        <updated>2021-11-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This blog is intended to help new users learn and become comfortable with the H2O Wave framework. Use the Overview section for an ordered-list of how to get started, learn more, and get hands on with the capabilities of H2O Wave. Move onto the Examples and Existing Apps to see what’s possible and being built by other developers. In the Friends of Wave section you can learn about companion libraries which help take your Wave projects to the next level.]]></summary>
        <content type="html"><![CDATA[<p>This blog is intended to help new users learn and become comfortable with the H2O Wave framework. Use the <a href="#overview">Overview</a> section for an ordered-list of how to get started, learn more, and get hands on with the capabilities of H2O Wave. Move onto the <a href="#examples-and-existing-apps">Examples and Existing Apps</a> to see what’s possible and being built by other developers. In the <a href="#friends-of-wave">Friends of Wave</a> section you can learn about companion libraries which help take your Wave projects to the next level.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a class="hash-link" href="#overview" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="setup-and-tutorials">Setup and Tutorials<a class="hash-link" href="#setup-and-tutorials" title="Direct link to heading">​</a></h3><p>The best way to get started with a product is to read it’s docs and do some examples. It’s not always fun or glamorous, but each link below will take 1 to 10 minutes to read/execute and is the best way to get you up to speed on what is possible, where Wave excels, and to have everything running on your local machine.</p><p>Have feedback? Documentation is often written by the product experts. Have an opinion on something that is confusing, could be more clear, or is missing? Add a note in the <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">Wave Discussions</a> or feel free to make the changes and open a pull request (PR).</p><ol><li><a href="https://wave.h2o.ai/docs/getting-started" target="_blank" rel="noopener noreferrer">Learn what Wave does</a></li><li><a href="https://wave.h2o.ai/docs/installation" target="_blank" rel="noopener noreferrer">Install the software on your local workstation</a></li><li><a href="/docs/installation#run-the-tour">Run a pre-built app on your local workstation to have access to over 150 examples</a></li><li>Work through the <a href="https://wave.h2o.ai/docs/tutorial-hello" target="_blank" rel="noopener noreferrer">Hello World</a>, <a href="https://wave.h2o.ai/docs/tutorial-beer" target="_blank" rel="noopener noreferrer">Beer Wall</a>, <a href="https://wave.h2o.ai/docs/tutorial-monitor" target="_blank" rel="noopener noreferrer">System Monitor</a>, <a href="https://wave.h2o.ai/docs/tutorial-counter" target="_blank" rel="noopener noreferrer">Bean Counter</a>, and <a href="https://wave.h2o.ai/docs/tutorial-todo" target="_blank" rel="noopener noreferrer">Todo List</a> tutorials</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="detailed-guides">Detailed Guides<a class="hash-link" href="#detailed-guides" title="Direct link to heading">​</a></h3><p>The best way to learn details on the intricacies of a product is to read it’s docs. It’s not always fun or glamorous, but each guide topic will take 3 to 15 minutes to read and make you the expert at various topics in the Wave framework.</p><p>Start at the <a href="https://wave.h2o.ai/docs/guide" target="_blank" rel="noopener noreferrer">introduction</a> and then use the left hand navigation to read through all topics or pick the ones you are most interested in.</p><ul><li>Architecture</li><li>Wave Scripts</li><li>Wave Apps</li><li>Pages</li><li>Layouts</li><li>Cards</li><li>Data Buffers</li><li>Components</li><li>Query Arguments</li><li>App State</li><li>Routing</li><li>Realtime Sync</li><li>Background Tasks</li><li>Data-binding</li><li>Files</li><li>Plots</li><li>Javascript</li><li>Graphics</li><li>Security</li><li>Logging</li><li>Command Line Interface</li><li>Development</li><li>Browser Testing</li><li>Configuration</li><li>Deployment</li><li>Backup and Recovery</li><li>WaveML</li><li>WaveDB</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="straight-to-the-source">Straight to the Source<a class="hash-link" href="#straight-to-the-source" title="Direct link to heading">​</a></h3><p>Once you are feeling like you get how Wave works and what it is good for, it’s time to find the code. Start by reading the <a href="https://github.com/h2oai/wave" target="_blank" rel="noopener noreferrer">GitHub README</a> which explains more about the project from a technical perspective.</p><p>Browse the recent <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">Discussions</a> to get an idea of what types of questions people have. A great way to learn is to teach! Look for an unanswered question, if it’s a bug and there’s no reproducible example, make one! If it’s asking how to do some specific task see if you can make an example.</p><p>Checkout specifically the Show and Tell section of the Discussions to get some inspiration for using Wave and best practices. Don’t forget to contribute to the community and make your own Show and Tell post when you develop something you’re proud of.</p><p>Another great way to learn about a product is to check out the <a href="https://github.com/h2oai/wave/issues" target="_blank" rel="noopener noreferrer">Issues</a>. Read through the suggested features from the community and the new features documented by the Development team to see where the product is going. Again, see a bug ticket with no reproducible example? Make one!</p><p>Finally, <a href="https://wave.h2o.ai/docs/api/index" target="_blank" rel="noopener noreferrer">get details on the entire API</a> from the documentation page to learn what functions are available and the parameters and outputs of each one.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new">What’s New<a class="hash-link" href="#whats-new" title="Direct link to heading">​</a></h3><p>Another good way of knowing what the product can do is to look at what features are new. Checkout the <a href="https://wave.h2o.ai/docs/change-log" target="_blank" rel="noopener noreferrer">Change Log</a> for a simple, ordered list. You can also check out the <a href="https://wave.h2o.ai/blog" target="_blank" rel="noopener noreferrer">Blog</a> for more news and details on Wave and releases.</p><p>See a point in the Change Log or Blog that you want to know more about? Head over to the <a href="http://github.com/h2oai/wave" target="_blank" rel="noopener noreferrer">source code</a> and search for your key word in the Issues, PRs, and generally in GitHub. Then browse the conversations, code, and docs to learn more.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="examples-and-existing-apps">Examples and Existing Apps<a class="hash-link" href="#examples-and-existing-apps" title="Direct link to heading">​</a></h2><p>A great way to learn what is possible with H2O Wave is to look at existing apps! Find an app you like? Go to the source code in GitHub, clone the repo, and try running the app on your local workstation. Make some changes to the app and see what happens. Read through the code to learn how it works. Maybe even fix a bug or add a new feature and submit a pull request (PR).</p><p>Here is a list of some apps you may want to use as reference:</p><ul><li>A Tour of Wave - these are 150+ short examples which can be accessed in several different ways<ul><li>Use the documentation at <a href="http://wave.h2o.ai/" target="_blank" rel="noopener noreferrer">wave.h2o.ai</a> when you want to search for something and get an example app returned. Look for the Examples title in the search results.</li><li>Explore the examples directly in the <a href="https://wave.h2o.ai/docs/examples" target="_blank" rel="noopener noreferrer">documentation gallery</a></li><li><a href="/docs/installation#run-the-tour">Run the examples as single app, a Tour of Wave, on your local workstation</a></li></ul></li><li><a href="https://github.com/h2oai/wave-apps" target="_blank" rel="noopener noreferrer">Sample Applications</a> - these eight apps can be used as a starting point in your app development journey. Have an idea for how to improve them or streamline the source code or make the code more readable? Make some changes and a PR.<ul><li><a href="https://github.com/h2oai/wave-apps/blob/main/explaining-ratings/README.md" target="_blank" rel="noopener noreferrer">Explainable Hotel Ratings</a>: This app allows you to filter hotel reviews and compare the most common phrases from the subset to the overall most common phrases.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/guess-the-number/README.md" target="_blank" rel="noopener noreferrer">Guess the Number</a>: This a game where the machine "thinks" of a number and the human has to guess, getting told higher or lower. This application has a leader board where different users can compete to see who can guess numbers in the fewest number of turns, on average. This application teaches the developer about different app states and could be fun for new users.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/credit-risk/README.md" target="_blank" rel="noopener noreferrer">Human-in-the-Loop Credit Risk</a>: This application allows a business user to review model predictions on whether or not someone will pay off their credit card - a model used to approve or deny credit card applications. Specifically, this app provides a list of predictions the model is not confident about (predictions in the 0.4 to 0.6 range) and allows the end user to mark someone as approved or not.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/churn-risk/README.md" target="_blank" rel="noopener noreferrer">Mitigating Churn Risk</a>: This application builds a churn prediction model with H2O-3 and provides the likelihood to churn and actionable recommendations to prevent churn via nicely-presented top shapley values.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/shopping-cart-recommendations/README.md" target="_blank" rel="noopener noreferrer">Online Shopping Recommendations</a>: This application allows a marketing analyst to understand how their recommendation engine works. It allows them to add items to their cart and as they do a list of recommended products is updated.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/sales-forecasting/README.md" target="_blank" rel="noopener noreferrer">Sales Forecasting EDA</a>: This application provides an easy-to-use interface for exploring historical sales values and looking at future forecasts across store segments.</li><li><a href="https://github.com/h2oai/wave-apps/blob/main/twitter-sentiment/README.md" target="_blank" rel="noopener noreferrer">Social Media Sentiment</a>: This application pulls tweets and uses the open source VaderSentiment to understand positive and negative tweets.</li><li><a href="https://github.com/h2oai/wave-big-data-visualizer" target="_blank" rel="noopener noreferrer">Big Data Visualizer</a> - This application was started <a href="https://youtu.be/alYWqXv8Sdg" target="_blank" rel="noopener noreferrer">live in a webinar</a> which gives you an idea of both how to build your own apps and also what is possible in an hour once you’re comfortable with the product. You can learn more about the inspiration for this app in <a href="https://wave.h2o.ai/blog/community-content-bdv" target="_blank" rel="noopener noreferrer">this blog pos</a>t.</li></ul></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="friends-of-wave">Friends of Wave<a class="hash-link" href="#friends-of-wave" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="machine-learning-with-wave-waveml">Machine Learning with Wave: WaveML<a class="hash-link" href="#machine-learning-with-wave-waveml" title="Direct link to heading">​</a></h3><p>WaveML is a companion package to H2O Wave which makes it quick and easy to integrate machine learning models into Wave applications. This is done with a simple, high-level API to train, deploy, score, and explain ML models. This package uses H2O’s open source AutoML and can optionally use Driverless AI.</p><p>Get started by first reading the <a href="https://github.com/h2oai/wave-ml" target="_blank" rel="noopener noreferrer">ReadMe</a> in Github which includes an installation guide to and quickstart example to get started.</p><p>Information we have already looked at is pertinent for WaveML, too:</p><ul><li>There is a <a href="https://wave.h2o.ai/docs/wave-ml" target="_blank" rel="noopener noreferrer">guide section on WaveML</a></li><li>Twelve of the Tour of Wave examples are on WaveML</li><li>The <a href="https://github.com/h2oai/wave-apps/blob/main/churn-risk/README.md" target="_blank" rel="noopener noreferrer">Mitigating Churn Risk</a> and <a href="https://github.com/h2oai/wave-apps/blob/main/credit-risk/README.md" target="_blank" rel="noopener noreferrer">Human-in-the-Loop Credit Risk</a> OSS example apps use Wave-ML</li><li>WaveML API can be found in the <a href="https://wave.h2o.ai/docs/wave-ml/" target="_blank" rel="noopener noreferrer">Wave API</a> documentation</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="data-storage-with-wave-wavedb">Data Storage with Wave: WaveDB<a class="hash-link" href="#data-storage-with-wave-wavedb" title="Direct link to heading">​</a></h3><p>WaveDB is a lightweight companion database to Wave, based on SQLite. WaveDB is <a href="https://www.sqlite.org/index.html" target="_blank" rel="noopener noreferrer">SQLite</a> with a HTTP interface. It is a ~6MB (~2MB <a href="https://upx.github.io/" target="_blank" rel="noopener noreferrer">UPX</a>-compressed) self-contained, zero-dependency executable that bundles SQLite 3.35.5 (2021-04-19) with JSON1, RTREE, FTS5, GEOPOLY, STAT4, and SOUNDEX.</p><p>If you are already a fan of SQLite, WaveDB acts as a thin HTTP-server wrapper that lets you access your SQLite databases over a network. WaveDB can be used as a lightweight, cross-platform, installation-free companion SQL database for Wave apps. The h2o-wave package includes non-blocking async functions to access WaveDB.</p><p>Information we have already looked at is pertinent for WaveDB, too:</p><ul><li>There is a <a href="https://wave.h2o.ai/docs/wavedb/" target="_blank" rel="noopener noreferrer">Guide section on WaveDB</a> which included how to download and install the database</li><li>Two of the Tour of Wave examples are on WaveDB</li><li>WaveDB API can be found in the <a href="https://wave.h2o.ai/docs/api/db/" target="_blank" rel="noopener noreferrer">Wave API</a> documentation</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapping-up">Wrapping Up<a class="hash-link" href="#wrapping-up" title="Direct link to heading">​</a></h2><p>We hope that this helps with getting started and learning more about H2O Wave. Use the GitHub discussion board or tag us on Twitter with any questions or reference to what you’re building!</p>]]></content>
        <author>
            <name>Michelle Tanco</name>
            <uri>https://github.com/mtanco</uri>
        </author>
        <category label="community-content" term="community-content"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.19: Custom Colors]]></title>
        <id>release-0.19</id>
        <link href="https://wave.h2o.ai/blog/release-0.19"/>
        <updated>2021-11-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[With the latest release, we are excited to announce Wave becoming more colorful! In addition to existing color themes (default, neon) we added h2o-dark and plan on expanding the list to at least a dozen, so stay tuned. If interested, you can track the progress here. However, having only predefined color palettes keeps you from matching your Wave app to your specific color brand, so we have added custom, user-defined palettes.]]></summary>
        <content type="html"><![CDATA[<p>With the latest release, we are excited to announce Wave becoming more colorful! In addition to existing color themes (<code>default</code>, <code>neon</code>) we added <code>h2o-dark</code> and plan on expanding the list to at least a dozen, so stay tuned. If interested, you can track the progress <a href="https://github.com/h2oai/wave/issues/696" target="_blank" rel="noopener noreferrer">here</a>. However, having only predefined color palettes keeps you from matching your Wave app to your specific color brand, so we have added custom, user-defined palettes.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How it works?<a class="hash-link" href="#how-it-works" title="Direct link to heading">​</a></h2><p>Firstly, a new <code>ui.theme</code> needs to be registered within the <code>themes</code> attribute in <code>ui.meta_card</code>. It takes the name of the theme and 4 main colors as arguments:</p><ul><li><code>primary</code> - Accent color for primary buttons, checkboxes etc.</li><li><code>text</code> - Default text color.</li><li><code>card</code> - Card background color.</li><li><code>page</code> - Base background color behind cards.</li></ul><p>After the theme is successfully registered, you can use it in the same fashion as predefined themes, by setting <code>ui.meta_card</code>'s <code>theme</code> attribute.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    themes</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">theme</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'my-awesome-theme'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            primary</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#13ebe7'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#e8e1e1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            card</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#12123b'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            page</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#070b1a'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    theme</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'my-awesome-theme'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>You can register multiple themes, which might be handy for switching between the light / dark mode of your app.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="theme-generator">Theme generator<a class="hash-link" href="#theme-generator" title="Direct link to heading">​</a></h2><p>Wave ships with a simple app that allows you to pick colors and see how they work together instantly.</p><p>This Wave app provides:</p><ul><li>Immediate visual feedback.</li><li>Color contrast warnings when a particular contrast ratio is less than <a href="https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html" target="_blank" rel="noopener noreferrer">4.5</a>.</li><li>Quick theme copy-pasting.</li></ul><p>Simply run:</p><div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">./venv/bin/wave run examples.theme_generator</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then visit <a href="http://localhost:10101/demo" target="_blank" rel="noopener noreferrer">http://localhost:10101/demo</a>.</p><p><img loading="lazy" alt="theme-generator" src="/assets/images/theme-generator-9390de4b37186832a799698d755938fa.gif" width="600" height="303" class="img_ev3q"></p><p>We would love to see all the beautiful themes our community came up with so don't hesitate and post the screenshots into our <a href="https://github.com/h2oai/wave/discussions/categories/show-and-tell" target="_blank" rel="noopener noreferrer">show and tell</a> Github Discussions section! The best ones might even be included as predefined themes within Wave itself in the future.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="can-individual-colors-be-changed">Can individual colors be changed?<a class="hash-link" href="#can-individual-colors-be-changed" title="Direct link to heading">​</a></h2><p>In general, the answer is no. Wave tries to be smart and do all the minor decisions for you, e.g. picking a color for primary/secondary buttons, checkboxes, etc. This way, a consistent UX is ensured and you can focus solely on the product itself rather than wasting time on nitpicking small stuff.</p><p>However, some cards allow changing colors of particular parts, for example, icons, but this is more of an exception rather than a strict rule.</p><p>If full control over colors/typography etc. is needed, going with regular HTML/CSS/JS is probably a better choice.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-cards-added">New cards added<a class="hash-link" href="#new-cards-added" title="Direct link to heading">​</a></h2><p>To improve the look of Wave apps in general, Wave 0.19.0 ships with about a dozen of new cards and components.</p><p>The following section includes some of the latest release highlights. For a full list, refer to <a href="https://github.com/h2oai/wave/releases/tag/v0.19.0" target="_blank" rel="noopener noreferrer">CHANGELOG</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="text-annotator">Text annotator<a class="hash-link" href="#text-annotator" title="Direct link to heading">​</a></h3><p>As the name suggests, this is a component to be used for text annotation purposes, this is very handy for NLP-related needs. See <a href="/docs/widgets/form/text_annotator/">example</a>.</p><p><img loading="lazy" alt="text-annotator" src="/assets/images/text-annotator-bc61c876838a7e4f05d5f26dd077f550.gif" width="600" height="264" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="copyable-text">Copyable text<a class="hash-link" href="#copyable-text" title="Direct link to heading">​</a></h3><p>A simple component to provide a way to quickly copy text into the user's clipboard without the need for doing a manual selection. See <a href="/docs/widgets/form/copyable_text/">example</a>.</p><p><img loading="lazy" alt="copyable-text" src="/assets/images/copyable-text-0faf9595d4e30351077439043821f1f1.png" width="856" height="154" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="table-redesign--table-tags">Table redesign + table tags<a class="hash-link" href="#table-redesign--table-tags" title="Direct link to heading">​</a></h3><p>The table component underwent a significant redesign. New tags were introduced that can be used for emphasizing certain states within a table column. See <a href="/docs/widgets/form/table#tags">example</a>.</p><p><img loading="lazy" alt="table-tags" src="/assets/images/table-tags-1b76c3d0fb831a4f9126eea935b3e1e8.png" width="883" height="625" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="facepile">Facepile<a class="hash-link" href="#facepile" title="Direct link to heading">​</a></h3><p>Used when you need to show who has access or who is included within a specified workflow. See <a href="/docs/widgets/form/facepile/">example</a>.</p><p><img loading="lazy" alt="facepile" src="/assets/images/facepile-660fbc87548978dfe5054cfeafef94ff.png" width="588" height="172" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="compact-file-upload">Compact file upload<a class="hash-link" href="#compact-file-upload" title="Direct link to heading">​</a></h3><p>A more space-efficient version of file upload, best used when you expect a single file to be uploaded and need to conserve space. See <a href="/docs/widgets/form/file_upload#compact">example</a>.</p><p><img loading="lazy" alt="file-upload-compact" src="/assets/images/file-upload-compact-b41e4234faebc17460289c65db090a99.png" width="1138" height="152" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="profile-card">Profile card<a class="hash-link" href="#profile-card" title="Direct link to heading">​</a></h3><p>As the name suggests, use for user profile pages. See <a href="/docs/widgets/content/profile">example</a>.</p><p><img loading="lazy" alt="profile" src="/assets/images/profile-0edf8d055727cdf5fb32c444676b98c3.png" width="876" height="894" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="article-card">Article card<a class="hash-link" href="#article-card" title="Direct link to heading">​</a></h3><p>Use for long-form articles. See <a href="/docs/widgets/content/article">example</a>.</p><p><img loading="lazy" alt="article" src="/assets/images/article-954f2400f0f3ce25850890e276060d58.png" width="1178" height="1084" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="tall-article-preview-card">Tall article preview card<a class="hash-link" href="#tall-article-preview-card" title="Direct link to heading">​</a></h3><p>As the name suggests, use for article previews. See <a href="/docs/widgets/content/tall_article_preview">example</a>.</p><p><img loading="lazy" alt="tall-article-preview" src="/assets/images/tall-article-preview-549d991a40462cabf2ce4863efae6a64.png" width="1178" height="1082" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="tall-info-card">Tall info card<a class="hash-link" href="#tall-info-card" title="Direct link to heading">​</a></h3><p>The intended use of this card is to "lead into" another page. See <a href="/docs/widgets/content/tall_info">example</a>.</p><p><img loading="lazy" alt="tall-info" src="/assets/images/tall-info-8743f6f2dd67a5af2ee075e3a20357d8.png" width="594" height="898" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="wide-pie-stat-card">Wide pie stat card<a class="hash-link" href="#wide-pie-stat-card" title="Direct link to heading">​</a></h3><p>Need a pie chart? We've got you covered. See <a href="/docs/widgets/stat/wide_pie_stat">example</a>.</p><p><img loading="lazy" alt="wide-pie-stat" src="/assets/images/stat-wide-pie-e66483efc1a5b9ed450ac833744c41b0.png" width="882" height="532" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="wide-plot">Wide plot<a class="hash-link" href="#wide-plot" title="Direct link to heading">​</a></h3><p>Used when a title and a short caption with further explanation are needed for a plot. See <a href="/docs/examples/wide-plot">example</a>.</p><p><img loading="lazy" alt="wide-plot" src="/assets/images/wide-plot-ba37004f28ff48b4ed001fc91f831096.png" width="740" height="360" class="img_ev3q"></p>]]></content>
        <author>
            <name>Martin Turoci</name>
            <uri>https://github.com/mturoci</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wave Workshop - Big Data Visualizer]]></title>
        <id>community-content-bdv</id>
        <link href="https://wave.h2o.ai/blog/community-content-bdv"/>
        <updated>2021-09-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[H2O Wave allows for easily building front ends to your projects. I was recently inspired by this tutorial notebook which explains how to use open source H2O-3 for finding anomalies in a dataset. Part of this process is using the H2O-3 aggregator function to visualize relationships in large datasets. A data scientist is at home in a Jupyter Notebook, but we could make it easier for ourselves and analysts or other business users to run this code and benefit from the H2O-3 aggregator function by building a front-end using H2O Wave.]]></summary>
        <content type="html"><![CDATA[<p>H2O Wave allows for easily building front ends to your projects. I was recently inspired by <a href="https://github.com/h2oai/h2o-tutorials/blob/master/best-practices/anomaly-detection/anomaly_detection.ipynb" target="_blank" rel="noopener noreferrer">this tutorial notebook</a> which explains how to use open source H2O-3 for finding anomalies in a dataset. Part of this process is using the H2O-3 aggregator function to visualize relationships in large datasets. A data scientist is at home in a Jupyter Notebook, but we could make it easier for ourselves and analysts or other business users to run this code and benefit from the H2O-3 aggregator function by building a front-end using H2O Wave.</p><p>Below you can see our data aggregation and visualization app. Currently, the app itself is creating a 1M row dataset as a demo. We can see that the H2O-3 aggregation function reduces this down into 68 exemplar rows and tells us how many of the original rows fall into each exemplar.</p><p><img loading="lazy" src="https://github.com/h2oai/wave-big-data-visualizer/blob/master/static/screenshot-1.png?raw=true" alt="Aggregated data as a table." class="img_ev3q"></p><p><img loading="lazy" src="https://github.com/h2oai/wave-big-data-visualizer/blob/master/static/screenshot-2.png?raw=true" alt="Aggregated data as a plot." class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><p>You can find the full source code for this app on <a href="https://github.com/h2oai/wave-big-data-visualizer" target="_blank" rel="noopener noreferrer">GitHub</a>.</p><p>Interested in seeing what it takes to make this type of application? In a 1 hour live-coding session we were able to:</p><ul><li>Create the layout of our application</li><li>Create two interactive tabs for navigating in the app</li><li>Create a table view for a dataset</li><li>Create a plot view for a dataset</li></ul><p>Here's the replay:</p><iframe width="560" height="315" src="https://www.youtube.com/embed/alYWqXv8Sdg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="ideas-for-improvement">Ideas for Improvement<a class="hash-link" href="#ideas-for-improvement" title="Direct link to heading">​</a></h2><p>For this app to be fully useful to our business users, we would probably want to add the following features:</p><ul><li>Easily add data: allow users to aggregate and visualize on their own datasets<ul><li>File upload from local machine</li><li>Connect to common SQL warehouses</li><li>Connect to common cloud data stores like s3</li></ul></li><li>Improved backend performance<ul><li>Connect to a production H2O-3 cluster rather than creating a cluster on the local machine of the H2O Wave server</li></ul></li><li>Added user control<ul><li>Let the end user decide parameters of the aggregator function like how many exemplar rows to attempt to make</li></ul></li><li>Improved and new visualizations<ul><li>Add new visualizations based on different data types</li></ul></li><li>Robustness<ul><li>Add unit tests!</li></ul></li></ul><p>If you do decide to work on this project, or use this as a template for your own projects, be sure to tag us on Twitter @h2o_wave or post as a Show and Tell on our <a href="https://github.com/h2oai/wave/discussions" target="_blank" rel="noopener noreferrer">GitHub discussions</a>!</p>]]></content>
        <author>
            <name>Michelle Tanco</name>
            <uri>https://github.com/mtanco</uri>
        </author>
        <category label="community-content" term="community-content"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.16: Custom Javascript]]></title>
        <id>release-0.16</id>
        <link href="https://wave.h2o.ai/blog/release-0.16"/>
        <updated>2021-05-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Wave ships with a growing library of cards and components for assembling user interfaces. For most apps, the built-in components can be adequate. They're designed to work well with each other, with consistent typography, layout and theming; and the library of components keeps expanding with each new release.]]></summary>
        <content type="html"><![CDATA[<p>Wave ships with a growing library of cards and components for assembling user interfaces. For most apps, the built-in components can be adequate. They're designed to work well with each other, with consistent typography, layout and theming; and the library of components keeps expanding with each new release.</p><p>However, no matter how comprehensive the Wave library gets over time, there will be situations where an app needs to use external Javascript components to supplement Wave's capabilities, like custom visualizations, UI enhancements, and graphics.</p><p>Wave 0.16+ allows importing and using third-party Javascript libraries on a page. This provides an escape-hatch of sorts, allowing you to add UI capabilities that are not yet possible with stock Wave.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="basic-usage">Basic Usage<a class="hash-link" href="#basic-usage" title="Direct link to heading">​</a></h2><p>The simplest way to run custom Javascript code on a page is to use an inline script (<code>ui.inline_script()</code>):</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> script</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'alert("Hello World!");'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To execute additional bits of Javascript code, set the <code>meta_card</code>'s <code>script</code> property again:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'console.log("One Mississippi");'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'console.log("Two Mississippi");'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'console.log("Three Mississippi");'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Passing <code>scripts</code> to <code>ui.meta_card()</code> dynamically imports external Javascript libraries.</p><p>Import a library:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> scripts</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Import multiple libraries:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> scripts</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'https://cdnjs.cloudflare.com/ajax/libs/bokeh/2.3.2/bokeh.min.js'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Import and use a library:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Load anime.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    scripts</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    script</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># The Javascript code for this script.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        content</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'anime.timeline(...);'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># Execute this script only if the 'anime' library is available.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        requires</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'anime'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># Execute this script only if the 'animation' element is available.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        targets</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'animation'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'example'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">markup_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 10 8'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Animation'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    content</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'&lt;div id="animation"/&gt;'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In the above example, we create an empty <code>div</code> HTML element on the page, load an animation library (anime.js), add a bit of Javascript to animate the <code>div</code> element. To tie things together correctly, we pass two additional arguments to <code>ui.inline_script()</code>:</p><ul><li>The <code>requires</code> argument ensures that the library we intend to use (in this case, <code>anime.js</code>) is downloaded, imported, and ready to use.</li><li>The <code>targets</code> argument ensures that the HTML element the scripts operates on (in this case, the <code>div</code> element named <code>animation</code>), is available on the page.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="handling-events">Handling Events<a class="hash-link" href="#handling-events" title="Direct link to heading">​</a></h2><p>In most cases, when employing custom Javascript libraries, you'll want to handle and transmit events from the library to your app. To do this, use the Javascript function <code>wave.emit()</code>:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token comment" style="color:#808080">// Javascript</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">wave</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token method function property-access" style="color:#ffc66d">emit</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'event_source'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'event_name'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> event_data</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">;</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can then access this information in your app using:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token comment" style="color:#808080"># Python</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">event_data </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">events</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">event_source</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">event_name</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>For example, emitting an event using <code>wave.emit('graph', 'node_clicked', 42)</code> in Javascript will set <code>q.events.graph.node_clicked</code> to <code>42</code> in Python.</p><p>All three arguments to <code>wave.emit()</code> are arbitrary. In the above example, we use:</p><ul><li><code>graph</code> to indicate the source of the event.</li><li><code>node_clicked</code> to indicate the type of event.</li><li>the third argument can be a string, number, boolean or any complex structure, like <code>{ foo: 'bar', qux: 42 }</code>.</li></ul><p>Here's a complete, minimal example that prints mouse coordinates each time you click on a page.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> script</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">inline_script</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token comment" style="color:#808080"># Handle and transmit event</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token string" style="color:#6a8759">'window.onclick = (e) =&gt; wave.emit("window", "clicked", { x: e.clientX, y: e.clientY });'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">else</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token comment" style="color:#808080"># Capture event</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">events</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            click </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">events</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">clicked</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> click</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                </span><span class="token keyword" style="color:#cc7832">print</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">click</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'x'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> click</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'y'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="examples">Examples<a class="hash-link" href="#examples" title="Direct link to heading">​</a></h2><p>You can see more of these examples in the <a href="/docs/installation#run-the-tour">Wave Tour</a> as well.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/tag/v0.16.0" target="_blank" rel="noopener noreferrer">here</a>.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[New in Wave 0.15: WaveDB]]></title>
        <id>release-0.15</id>
        <link href="https://wave.h2o.ai/blog/release-0.15"/>
        <updated>2021-05-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Wave v0.15 is out. This release ships with WaveDB, a lightweight companion database to Wave, based on SQLite.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://github.com/h2oai/wave/releases/tag/v0.15.0" target="_blank" rel="noopener noreferrer">Wave v0.15 is out</a>. This release ships with <strong><a href="https://wave.h2o.ai/docs/wavedb" target="_blank" rel="noopener noreferrer">WaveDB</a></strong>, a lightweight companion database to Wave, based on SQLite. </p><p><strong>WaveDB</strong> is <a href="https://www.sqlite.org/index.html" target="_blank" rel="noopener noreferrer">SQLite</a> with a HTTP interface.</p><p>It is a ~6MB (~2MB <a href="https://upx.github.io/" target="_blank" rel="noopener noreferrer">UPX</a>-compressed) self-contained, zero-dependency executable that bundles SQLite 3.35.5 (2021-04-19) with JSON1, RTREE, FTS5, GEOPOLY, STAT4, and SOUNDEX.</p><p>If you are already a fan of SQLite, WaveDB acts as a thin HTTP-server wrapper that lets you access your SQLite databases over a network.</p><p>WaveDB can be used as a lightweight, cross-platform, installation-free companion SQL database for Wave apps. The <code>h2o-wave</code> package includes non-blocking <code>async</code> functions to access WaveDB. </p><p><a href="https://wave.h2o.ai/docs/wavedb" target="_blank" rel="noopener noreferrer">Learn more about WaveDB</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/tag/v0.15.0" target="_blank" rel="noopener noreferrer">here</a>. Check out the release notes for more details.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing R API for Wave]]></title>
        <id>r-api-preview</id>
        <link href="https://wave.h2o.ai/blog/r-api-preview"/>
        <updated>2021-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we are happy to announce preliminary support for the R language in H2O Wave. We now ship an R package that allows you build and control dashboards in Wave, and has feature-parity with Python Wave Scripts.]]></summary>
        <content type="html"><![CDATA[<p>Today, we are happy to announce preliminary support for the R language in H2O Wave. We now ship an R package that allows you build and control dashboards in Wave, and has feature-parity with <a href="https://wave.h2o.ai/docs/scripts" target="_blank" rel="noopener noreferrer">Python Wave Scripts</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>The R language driver allows you to author R programs that can publish and control live web content using the Wave server. The entire suite of cards, components and page layout controls previously only available via Python are now accessible via R.</p><p>H2O Wave supports two kinds of programs:</p><ul><li><strong>Wave apps</strong> are interactive programs that can update content and respond to user actions.</li><li><strong>Wave scripts</strong> are simpler, non-interactive (batch) programs: they can update content, but not respond to user actions.</li></ul><p>The current release of the R language driver only supports Wave scripts. Support for Wave apps will ship in the near future.</p><p>To learn more about H2O Wave and what it can do for you, <a href="https://wave.h2o.ai/docs/getting-started" target="_blank" rel="noopener noreferrer">explore our documentation</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a class="hash-link" href="#installation" title="Direct link to heading">​</a></h2><ol><li>Install the prerequisites:</li></ol><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">&gt; install.packages(c("R6","devtools","jsonlite","stringr","httr"))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="2"><li><p><a href="https://github.com/h2oai/wave/releases/download/v0.14.0/h2owave_0.0.14.tar.gz" target="_blank" rel="noopener noreferrer">Download the h2owave R package</a></p></li><li><p>There are two ways to install <code>h2owave</code></p></li></ol><p>From command line:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">$ R CMD INSTALL h2owave_0.0.14.tar.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>From R interactive environment:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">&gt; install.packages(“h2owave_0.0.14.tar.gz",repos=NULL,type="source")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="hello-world-example">Hello World Example<a class="hash-link" href="#hello-world-example" title="Direct link to heading">​</a></h2><p>To be able to use the <code>h2owave</code> library it must first be loaded to the R environment.
Once the library is loaded we follow that up by creating a <code>page</code> object. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once the <code>page</code> object is created we add a card on to the page. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("hello",ui_markdown_card(box="1 1 2 2",</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    title="Hello World!"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ,content='And now for something completely different!'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Finally, we save the page. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here is the entire code for the <code>Hello World</code> example. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("hello",ui_markdown_card(box="1 1 2 2",</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    title="Hello World!"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ,content='And now for something completely different!'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ))</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here is the output. </p><p><img loading="lazy" alt="hello_world" src="/assets/images/hello_world-ee9bdf77c76f2e7cececcb8ceb606ea8.jpg" width="626" height="422" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="design-and-api-overview">Design and API Overview<a class="hash-link" href="#design-and-api-overview" title="Direct link to heading">​</a></h2><p>Firstly, lets go over the hiearchy of the basic components. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">[Site] -&gt; [Page] -&gt; [card]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A <code>Site</code> can contain multiple <code>Pages</code>. Each <code>Page</code> can have multiple <em>cards</em>. Each <code>Page</code> is uniquely identified by a <code>route</code> on a <code>Site</code>. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("hello",ui_markdown_card(box="1 1 2 2",</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    title="Hello World!"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ,content='And now for something completely different!'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                    ))</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="site">Site<a class="hash-link" href="#site" title="Direct link to heading">​</a></h3><p>The <code>Site()</code> function takes in a <code>route</code> string and returns a <code>Page</code> object. In the above example <code>/demo</code> is the <code>route</code> on <code>Site</code> that points to the <code>Page</code> object - <em>page</em>. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="page">Page<a class="hash-link" href="#page" title="Direct link to heading">​</a></h3><p>A <code>Page</code> object has four methods:</p><ul><li><p><code>page$add_card()</code>: Adds a card to the page. </p><p>  The <code>add_card()</code> method takes in two parameters as follows: <code>add_card(card_name,*_card(...))</code>.
In the above example, <code>card_name</code> is <code>"hello"</code> and <code>*_card()</code> function is <code>ui_markdown_card()</code>.</p></li><li><p><code>page$set()</code>: Modify a variable on a card (already on a page).</p><p>  The <code>set()</code> method takes in variable number of parameters - <code>set("card_name","parameter_name","new_parameter_value")</code>.
The first parameter is the <code>card_name</code> followed by the <code>parameter_name</code> which needs to be modified. And finally the <code>new_parameter_value</code>.</p><p>  When modifying an element in a parameter that is a list, the first parameter is the <code>card_name</code>, followed by the <code>parameter_list_name</code>,<code>element_name</code>, and the
<code>new_element_value</code> - <code>set("card_name","parameter_list_name","element_name","new_element_value")</code>. If the element is nested within multiple nested parameter lists
then all the <em>parameter list names</em> preceed the <code>element_name</code>.</p></li><li><p><code>page$save()</code>: The <code>save()</code> method does not take in any variable. It saves or updates a page and pushes
the changes to the <code>wave</code> server. </p></li><li><p><code>page$drop()</code>: Similar to the <code>save()</code>, the <code>drop()</code> method does not take any parameter. It plainly removes a page from the <code>Site</code>. </p></li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="card">Card<a class="hash-link" href="#card" title="Direct link to heading">​</a></h3><p>The <code>*_card()</code> function takes in variable number of parameters. The number of parameters are dependent on the type of <code>*_card()</code>. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">ui_markdown_card(box="1 1 2 2"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ,title="Hello World!"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ,content='And now for something completely different!'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">                ))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above example <code>ui_markdown_card()</code> accepts three parameters. </p><ul><li><code>box</code> : The box defines the position and the size of the card. The four integers represent: starting column and row number, and
the number of columns and rows occupied by the card. </li><li><code>title</code>: The title of the markdown card. </li><li><code>content</code>: The message of the markdown card. </li></ul><p><em>Note:</em> While going through the above <em>Hello World</em> example you would have noticed that we created a
<code>Page</code> <em>object</em> - <code>page</code>. This is because we have used the <code>R6</code> library to create objects and their respective
methods. The ability to create these objects and methods helps manage each instance of a <code>Page</code> object.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-example">Advanced Example<a class="hash-link" href="#advanced-example" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="initial-card-setup">Initial Card Setup<a class="hash-link" href="#initial-card-setup" title="Direct link to heading">​</a></h3><p>Let's take an advanced example and introduce a few more variables within the <code>*_card()</code> function. In this example, we will also dynamically update a few variables in the card. The card that we will use here is the <code>ui_wide_bar_stat_card()</code>. </p><p>First, we load the library and create a <code>Page</code> object. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Following the creation of the <code>Page</code> object, we add the card <code>ui_wide_bar_stat</code> to the page. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price &lt;- runif(1,1,500)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price_change &lt;- runif(1,0,1)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("wide_bar",ui_wide_bar_stat_card(box="1 1 2 1"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,title="ETH"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,value='=${{intl price minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,aux_value='={{intl change style="percent" minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,plot_color='$red'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,data=list(price=crypto_price,change=crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,progress = crypto_price_change</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">))</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here,</p><ul><li>The card is named <code>"wide_bar"</code>. </li><li>The card function is <code>ui_wide_bar_stat_card()</code>. The following are the parameters of the <code>*_card()</code> function:<ul><li><code>box</code> : Defines the position and the size of the card. The four integers represent: starting column and row number, and
the number of columns and rows occupied by the card. In this example, the card starts from the 1st column and 1st row, and spans 2 columns and 1 row. </li><li><code>title</code>: The main title that appears on the card, here it is "ETH".</li><li><code>value</code>: Displays the primary value on the card. The value is of type numeric, and holds a maximum and minimum of 2 decimal places. The variable that will populate <code>value</code> is <code>price</code>. This value is fed through the parameter <code>data</code> which is a list. </li><li><code>aux_value</code>: Displays the secondary value on the card. The value is also of type numeric, and holds a maximum and minimum of 2 decimal places. The name of the <code>aux_value</code> on the card is <code>change</code>. This value is fed through the parameter <code>data</code> which is a list. </li><li><code>plot_color</code>: This is a parameter that takes in the name of a color. In this case it is <code>$red</code></li><li><code>data</code>: Specifies a list of parameters that populate <code>value</code> and <code>aux_value</code>. Here <code>price</code> is fed by <code>crypto_price</code>, and <code>change</code> is fed by <code>crypto_price_change</code> variables, respectively. </li><li><code>progress</code>: This card paramter displays a visual that show progress. In this example, the variable <code>crypto_price_change</code> (between 0 - 1) populates <code>progress</code>.</li></ul></li></ul><p>Once the card is populated with all the parameters, the page is saved and sent to the <code>wave</code> server. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here is the entire code for setting up the card. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price &lt;- runif(1,1,500)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price_change &lt;- runif(1,0,1)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("wide_bar",ui_wide_bar_stat_card(box="1 1 2 1"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,title="ETH"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,value='=${{intl price minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,aux_value='={{intl change style="percent" minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,plot_color='$red'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,data=list(price=crypto_price,change=crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,progress = crypto_price_change</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">))</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="dynamically-updating-the-card">Dynamically Updating the Card<a class="hash-link" href="#dynamically-updating-the-card" title="Direct link to heading">​</a></h3><p>Once the <code>ui_wide_bar_stat_card</code> is setup we now add code to the same example which will dynamically update few parameters. </p><p>In the example, we will update three parameters:</p><ul><li><code>price</code>: This is a parameter in the <code>data</code> list, and is fed by <code>crypto_price</code>.</li><li><code>change</code>: This is the second parameter in the <code>data</code> list, and is fed by <code>crypto_price_change</code>.</li><li><code>progress</code>: Provided by the variable <code>crypto_price_change</code>.</li></ul><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">while(TRUE){</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  Sys.sleep(3)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  crypto_price &lt;- runif(1,1,500)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  crypto_price_change &lt;- runif(1,0,1)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>We simulate the dynamic behaviour by placing the entire dynamic-card-update code in a <code>while(TRUE)</code> loop, with a interval of 3 seconds, <code>Sys.sleep(3)</code>.
Following the while loop, we set a value for <code>crypto_price</code> and <code>crypto_price_change</code>. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","price",crypto_price)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","change",crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","progress",crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$save()</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Next, we use the <code>page$set()</code> method to dynamically update the values. The order of parameters that go into <code>set()</code> is, <code>"card_name"</code>,<code>"parameter_name"</code>, or <code>"parameter_list_name"</code> and <code>"element_name"</code>, and finally, the <code>new_parameter_value</code> or <code>element_value</code>.</p><p>In the example, the below two set-values are elements in the parameter <code>data</code>. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","price",crypto_price)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","change",crypto_price_change)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here, <code>page$set("wide_bar","progress",crypto_price_change)</code> sets the parameter <code>progress</code>. And is followed by saving/updating the page. </p><p>Here is the entire code for dynamically updating the card. </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">library(h2owave)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page &lt;- Site("/demo")</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price &lt;- runif(1,1,500)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">crypto_price_change &lt;- runif(1,0,1)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$add_card("wide_bar",ui_wide_bar_stat_card(box="1 1 2 1"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,title="ETH"</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,value='=${{intl price minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,aux_value='={{intl change style="percent" minimum_fraction_digits=2 maximum_fraction_digits=2}}'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,plot_color='$red'</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,data=list(price=crypto_price,change=crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">              ,progress = crypto_price_change</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">))</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">page$save()</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">while(TRUE){</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  Sys.sleep(3)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  crypto_price &lt;- runif(1,1,500)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  crypto_price_change &lt;- runif(1,0,1)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","price",crypto_price)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","data","change",crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$set("wide_bar","progress",crypto_price_change)</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  page$save()</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here is the output</p><p><img loading="lazy" alt="ui_wide_bar_stat_card" src="/assets/images/stat_wide_bar-63fa7439d5f8bb49c77bd6167edd1da5.gif" width="640" height="242" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a class="hash-link" href="#conclusion" title="Direct link to heading">​</a></h2><p>The above examples illustrate the possibility of building dynamic dashboards using the <code>h2owave</code> R library. In a future release we will be adding the ability to build interactive web applications. </p><p>In the R <code>h2owave</code> library we have tried to keep programming easy, simple, and idiomatic, we understand that there is always room for improvement and would love to hear from you in case you have comments, and suggestions. <a href="https://github.com/h2oai/wave/discussions/761" target="_blank" rel="noopener noreferrer">Link</a></p><p>We look forward to continuing our collaboration with the community. Follow updates to Wave on Github: <a href="https://github.com/h2oai/wave" target="_blank" rel="noopener noreferrer">https://github.com/h2oai/wave</a></p>]]></content>
        <author>
            <name>Ashrith Barthur</name>
            <uri>https://github.com/ashrith</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wave 0.14 released]]></title>
        <id>release-0.14</id>
        <link href="https://wave.h2o.ai/blog/release-0.14"/>
        <updated>2021-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Wave v0.14 is released. This is mainly a security, performance, and bugfix release. The release also includes experimental support for building and controlling Wave dashboards using the R programming language.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://github.com/h2oai/wave/releases/tag/v0.14.0" target="_blank" rel="noopener noreferrer">Wave v0.14 is released</a>. This is mainly a security, performance, and bugfix release. The release also includes experimental support for building and controlling Wave dashboards using the R programming language.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a class="hash-link" href="#highlights" title="Direct link to heading">​</a></h2><p>The Wave server now ships with a built-in utility to generate, use, and manage API keys conveniently. See <a href="https://wave.h2o.ai/docs/security" target="_blank" rel="noopener noreferrer">Security</a>.</p><p>The Wave server also provides additional control over how it handles external requests. See <a href="https://wave.h2o.ai/docs/configuration" target="_blank" rel="noopener noreferrer">Configuration</a>.</p><p>Additionally, starting v0.14, Python app servers now only process requests originating from the Wave server. The API key/secret pair for accessing the app server is automatically generated for each launch, and can be overridden using the new <code>H2O_WAVE_APP_ACCESS_KEY_ID</code> and <code>H2O_WAVE_APP_ACCESS_KEY_SECRET</code> for development and testing, if required. See <a href="https://wave.h2o.ai/docs/configuration" target="_blank" rel="noopener noreferrer">Configuration</a>.</p><p>Adding R language support also introduced major changes and simplification in the backend app and communication protocols, which should make it simpler to ship support for interactive R web apps in the near future.</p><p>All the work that has gone into this release sets the stage for adding support for many more languages, scripting and command-line control of content and visualizations displayed in Wave.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/tag/v0.14.0" target="_blank" rel="noopener noreferrer">here</a>. Check out the release notes for more details.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We'd like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Wave ML - AutoML for Wave Apps]]></title>
        <id>ml-release-0.3.0</id>
        <link href="https://wave.h2o.ai/blog/ml-release-0.3.0"/>
        <updated>2021-03-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we're excited to announce H2O Wave ML, an open-source extension to Wave that makes it easy to use automatic machine learning in your Wave apps.]]></summary>
        <content type="html"><![CDATA[<p>Today, we're excited to announce H2O Wave ML, an open-source extension to Wave that makes it easy to use automatic machine learning in your Wave apps.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">$ pip install h2o-wave[ml]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In this article, we look at what Wave ML can do for you, how to get started, and what predictive applications look like in practice.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a class="hash-link" href="#introduction" title="Direct link to heading">​</a></h2><p>H2O Wave ML makes it quick and easy to build and integrate predictive (AI/ML) models into your Wave apps.  It provides a simple, high-level API for training, deploying, scoring and explaining machine learning models, letting you rapidly build and deploy  interactive predictive and decision-support applications over the web.</p><p>Wave ML uses the open-source <a href="https://www.h2o.ai/products/h2o/" target="_blank" rel="noopener noreferrer">H2O AutoML</a> under the hood, and is designed to (optionally) transparently switch over to <a href="https://www.h2o.ai/products/h2o-driverless-ai/" target="_blank" rel="noopener noreferrer">Driverless AI</a> when deployed on <a href="https://www.h2o.ai/hybrid-cloud/" target="_blank" rel="noopener noreferrer">H2O.ai Hybrid Cloud</a>.</p><p><a href="https://github.com/h2oai/wave" target="_blank" rel="noopener noreferrer">Wave</a>, <a href="https://github.com/h2oai/wave-ml" target="_blank" rel="noopener noreferrer">Wave ML</a> and <a href="https://github.com/h2oai/h2o-3" target="_blank" rel="noopener noreferrer">H2O AutoML</a> are all 100% open source under Apache v2, so you can build and deploy predictive apps on your own, in your preferred deployment environment. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-wave-ml">Why Wave ML?<a class="hash-link" href="#why-wave-ml" title="Direct link to heading">​</a></h2><p>Even as the number of data scientists worldwide is increasing by leaps and bounds, there are even more developers who are building applications for various business needs. There are anywhere from 7M to 23M Python developers in the world currently, of which many are not proficient with data science. With H2O Wave ML, we abstract away the complexity of machine learning and empower developers to solve business needs in their applications with the power of AutoML.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a class="hash-link" href="#installation" title="Direct link to heading">​</a></h2><p><a href="https://pypi.org/project/h2o-wave-ml/" target="_blank" rel="noopener noreferrer">H2O Wave ML</a> is a companion Python package to <a href="https://pypi.org/project/h2o-wave/" target="_blank" rel="noopener noreferrer">H2O Wave</a> (both available on PyPI). Both Wave and Wave ML can be installed in tandem using <code>pip</code>: </p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ pip </span><span class="token function" style="color:#ffc66d">install</span><span class="token plain"> h2o-wave</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ml</span><span class="token punctuation" style="color:#a9b7c6">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To use the package, simply import <code>h2o_wave_ml</code>:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> h2o_wave_ml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="api-overview">API Overview<a class="hash-link" href="#api-overview" title="Direct link to heading">​</a></h2><p>Wave ML provides four high-level functions:</p><ul><li><code>build_model()</code>: Train a model on a dataset, given the column to be predicted.</li><li><code>Model.predict()</code>: Make a prediction.</li><li><code>save_model()</code>: Save your model.</li><li><code>load_model()</code>: Load your previously saved model.</li></ul><p>Use <a href="https://github.com/h2oai/wave-ml#build_model" target="_blank" rel="noopener noreferrer"><code>build_model()</code></a> to train a model. The function accepts a dataset and a <em>target column</em> (the column to be predicted):</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave_ml </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> build_model</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'./train.csv'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> target_column</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'depth'</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The call to <code>build_model()</code> automatically determines if the prediction task is <em>classification</em> (predict a category or class) or <em>regression</em> (predict a real value, often a quantity).</p><p>Once the model is built, we can get the model's predictions using its <a href="https://github.com/h2oai/wave-ml#modelpredict" target="_blank" rel="noopener noreferrer"><code>predict()</code></a> method:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave_ml </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> build_model</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'./train.csv'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> target_column</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'depth'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">predictions </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">predict</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">file_path</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'./test.csv'</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can aso get the model's predictions by directly passing in the test rows:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">predictions </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">predict</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'width'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'height'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">width1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> height1</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">width2</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> height2</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To save this model locally, use <a href="https://github.com/h2oai/wave-ml#save_model" target="_blank" rel="noopener noreferrer"><code>save_model()</code></a>:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave_ml </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> save_model</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'./train.csv'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> target_column</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'depth'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">model_path </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> save_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">model</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> output_dir_path</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'./'</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To load a saved model, use <a href="https://github.com/h2oai/wave-ml#load_model" target="_blank" rel="noopener noreferrer"><code>load_model()</code></a>:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> load_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">model_path</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">predictions </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">predict</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">file_path</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'./test.csv'</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>See <a href="https://github.com/h2oai/wave-ml#api" target="_blank" rel="noopener noreferrer">API</a> for more information. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="predicting-wine-ratings">Predicting Wine Ratings<a class="hash-link" href="#predicting-wine-ratings" title="Direct link to heading">​</a></h2><p>Let's build a simple web app for predicting wine ratings. The app will prompt for the wine's features, and display the predicted rating.</p><p><img loading="lazy" alt="demo" src="/assets/images/wine-0397eafc72ef7e2cb00f21693c163189.gif" width="438" height="721" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="train-the-model">Train the model<a class="hash-link" href="#train-the-model" title="Direct link to heading">​</a></h3><p>We use the <a href="https://www.kaggle.com/christopheiv/winemagdata130k" target="_blank" rel="noopener noreferrer">Kaggle wine dataset</a> with just the <code>country</code>, <code>points</code>, <code>price</code>, <code>province</code>, <code>region_1</code>, <code>variety</code> and <code>winery</code> columns. The preprocessing steps can be found <a href="https://github.com/h2oai/wave-ml/blob/main/examples/wine.py" target="_blank" rel="noopener noreferrer">here</a>.</p><p>First, we train the model to predict the <code>points</code> (ratings) column.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave_ml </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> build_model</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'./winemag_edit.csv'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> target_column</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'points'</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-the-ui">Build the UI<a class="hash-link" href="#build-the-ui" title="Direct link to heading">​</a></h3><p>Next, we build a user interface that prompts the user for a wine's features. We'll use dropdowns to prompt for the all of wine's features, except for the <code>price</code>, which we'll display as a slider.</p><p>To display unique values in the UI's dropdowns, load up the dataset in <code>datatable</code>, then use <code>unique()</code> to compute the unique values in each column.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> datatable </span><span class="token keyword" style="color:#cc7832">as</span><span class="token plain"> dt</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">df </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> dt</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">fread</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'./winemag_edit.csv'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">features </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'country'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'price'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'province'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'region_1'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'variety'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'winery'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">columns </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain">f</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> dt</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">unique</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">f</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">to_list</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">for</span><span class="token plain"> f </span><span class="token keyword" style="color:#cc7832">in</span><span class="token plain"> features</span><span class="token punctuation" style="color:#a9b7c6">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Next, use Wave's <code>ui.choice()</code> function to build up dropdown choices from the unique values:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">choices </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">{</span><span class="token plain">key</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">choice</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token builtin" style="color:#e8bf6a">str</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">item</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">for</span><span class="token plain"> item </span><span class="token keyword" style="color:#cc7832">in</span><span class="token plain"> columns</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">key</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> item</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">for</span><span class="token plain"> key </span><span class="token keyword" style="color:#cc7832">in</span><span class="token plain"> columns</span><span class="token punctuation" style="color:#a9b7c6">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Finally, we display all the inputs in a form: </p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'wine'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'body'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">dropdown</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'country'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Country'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">country</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> choices</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">choices</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'country'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">dropdown</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'province'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Province'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">province</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> choices</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">choices</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'province'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">dropdown</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'region'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Region'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">region</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> choices</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">choices</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'region_1'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">dropdown</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'variety'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Variety'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">variety</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> choices</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">choices</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'variety'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">dropdown</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'winery'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Winery'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">winery</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> choices</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">choices</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'winery'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">slider</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'price'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Price in $'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">min</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">4</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">max</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">150</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> step</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">price</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="compute-and-show-predictions">Compute and show predictions<a class="hash-link" href="#compute-and-show-predictions" title="Direct link to heading">​</a></h3><p>To compute the wine's rating, we read all the inputs from <code>q.args</code> and call <code>predict()</code> on our model:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    country </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">country </span><span class="token keyword" style="color:#cc7832">or</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'country'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    price </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">float</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">price</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">price </span><span class="token keyword" style="color:#cc7832">else</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'price'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    province </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">province </span><span class="token keyword" style="color:#cc7832">or</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'province'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    region </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">region </span><span class="token keyword" style="color:#cc7832">or</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'region_1'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    variety </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">variety </span><span class="token keyword" style="color:#cc7832">or</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'variety'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    winery </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">winery </span><span class="token keyword" style="color:#cc7832">or</span><span class="token plain"> default_value</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'winery'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    input_data </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">features</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">country</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> price</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> province</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> region</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> variety</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> winery</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    rating </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">predict</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">input_data</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    rating </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> rating</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Finally, we use a stat card from the Wave component library to display the predicted wine rating:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'result'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">tall_gauge_stat_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">box</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'body'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> height</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'180px'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    title</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">''</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token builtin" style="color:#e8bf6a">str</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">rating</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    aux_value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'points'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    plot_color</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'$red'</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> rating </span><span class="token operator" style="color:#a9b7c6">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">90</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">else</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'$green'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    progress</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">rating</span><span class="token operator" style="color:#a9b7c6">/</span><span class="token number" style="color:#6897bb">100</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>See the full example <a href="https://github.com/h2oai/wave-ml/blob/main/examples/wine.py" target="_blank" rel="noopener noreferrer">here</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="another-example">Another Example<a class="hash-link" href="#another-example" title="Direct link to heading">​</a></h2><p>Here's another example that displays variations in <a href="https://en.wikipedia.org/wiki/Confusion_matrix" target="_blank" rel="noopener noreferrer">confusion matrices</a> for a model built on the popular Titanic dataset.</p><p><img loading="lazy" alt="confusion matrix" src="/assets/images/cm-7ad2d3235b3efbc7d94bbd15893e3d41.gif" width="425" height="340" class="img_ev3q"></p><p>Here's the complete example (~25 lines of code!):</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> datatable </span><span class="token keyword" style="color:#cc7832">as</span><span class="token plain"> dt</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave_ml </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> save_model</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> load_model</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> sklearn</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">metrics </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> confusion_matrix</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">dataset </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'./titanic.csv'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">target_column </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'Survived'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">model </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> build_model</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">dataset</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> target_column</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">target_column</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">prediction </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">predict</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">file_path</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">dataset</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token comment" style="color:#808080"># Prepare the actual values from target_column</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">df </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> dt</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">fread</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">dataset</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">y_true </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> df</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">target_column</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">to_list</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">template </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:#6a8759">'''</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">## Confusion Matrix for Titanic</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">|              |           |              |</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">| :-:          |:-:        |:-:           |</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">|              | Survived  | Not survived |</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">| Survived     | **{tp}**  | {fp} (FP)    |</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">| Not survived | {fn} (FN) | **{tn}**     |</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token triple-quoted-string string" style="color:#6a8759">'''</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Get a threshold value if available or 0.5 by default</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    threshold </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">slider </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'slider'</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">in</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args </span><span class="token keyword" style="color:#cc7832">else</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">0.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Compute confusion matrix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    y_pred </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">p</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">&lt;</span><span class="token plain"> threshold </span><span class="token keyword" style="color:#cc7832">for</span><span class="token plain"> p </span><span class="token keyword" style="color:#cc7832">in</span><span class="token plain"> prediction</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    tn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fp</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> tp </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> confusion_matrix</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">y_true</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> y_pred</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">ravel</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># Handle interaction</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># First visit, create a card for the matrix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'matrix'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 3 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">template</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token builtin" style="color:#e8bf6a">format</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">tn</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">tn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fp</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">fp</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fn</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">fn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> tp</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">tp</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">slider</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'slider'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Threshold'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">min</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">max</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> step</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">0.01</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> value</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token number" style="color:#6897bb">0.5</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> trigger</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token boolean" style="color:#cc7832">True</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">initialized </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token boolean" style="color:#cc7832">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">else</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'matrix'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">0</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">text</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">content </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> template</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token builtin" style="color:#e8bf6a">format</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">tn</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">tn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fp</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">fp</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> fn</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">fn</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> tp</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">tp</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'matrix'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token number" style="color:#6897bb">1</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">slider</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">value </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> threshold</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><a href="https://github.com/h2oai/wave-ml/blob/main/examples/quickstart.py" target="_blank" rel="noopener noreferrer">Source</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a class="hash-link" href="#conclusion" title="Direct link to heading">​</a></h2><p>With just a couple of lines of code, you can now harness the power of the H2O platform and integrate predictive models into your Wave apps. In an upcoming release, we'll be automating this even further, letting you code-generate complete, interactive apps like the examples above with a single command. Stay tuned!</p><p>Follow updates to Wave ML on Github: <a href="https://github.com/h2oai/wave-ml" target="_blank" rel="noopener noreferrer">https://github.com/h2oai/wave-ml</a>. Let us know what you think, and how we can improve it.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p>]]></content>
        <author>
            <name>Peter Szabó</name>
            <uri>https://github.com/geomodular</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Routing, Themes and Analytics]]></title>
        <id>release-0.12.1</id>
        <link href="https://wave.h2o.ai/blog/release-0.12.1"/>
        <updated>2021-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Wave v0.12 shipped last week, with support for handling queries and routes using decorators and experimental support for switching themes. Here's a rundown of the major features.]]></summary>
        <content type="html"><![CDATA[<p>Wave v0.12 shipped last week, with support for handling queries and routes using decorators and experimental support for switching themes. Here's a rundown of the major features.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="routing">Routing<a class="hash-link" href="#routing" title="Direct link to heading">​</a></h2><p>In most Wave applications, queries are typically handled using <code>if/elif/else</code> conditionals that in turn call other functions:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">on_heads</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">message_bar</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Heads!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">on_tails</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">message_bar</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Tails!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">setup_page</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#heads'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Heads'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#tails'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Tails'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/toss'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token builtin" style="color:#e8bf6a">hash</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">args</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'#'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">hash</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">==</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'heads'</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> on_heads</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">elif</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">hash</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">==</span><span class="token plain"> </span><span class="token string" style="color:#6a8759">'tails'</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> on_tails</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">else</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> setup_page</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>As your application gets larger, using <code>if/elif/else</code> for routing can seem tedious or repetitive. Starting with Wave 0.12, you can use the new <code>@on()</code> and <code>handle_on()</code> functions to reduce boilerplate:</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> on</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> handle_on</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'#heads'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">on_heads</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">message_bar</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Heads!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'#tails'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">on_tails</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">items </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">message_bar</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">text</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Tails!'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">setup_page</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'sides'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">form_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        box</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'1 1 4 4'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        items</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#heads'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Heads'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">            ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">button</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">name</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'#tails'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> label</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'Tails'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/toss'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">if</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">not</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> handle_on</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">        </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> setup_page</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">save</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The <code>handle_on()</code> function analyzes the incoming query and calls the matching <code>@on()</code> function. There's also support for specifying patterns (<code>@on('#menu/donuts/{donut_name}')</code>) and matching query arguments (<code>@on('buy_donut')</code>).</p><p>Using <code>@on()</code> and <code>handle_on()</code> functions are entirely optional.</p><p>Learn how to use routes in the guide: <a href="/docs/routing">Routing</a> and <a href="/docs/arguments">Query Arguments</a>.</p><p>See <code>routing</code> example in Tour app.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="themes">Themes<a class="hash-link" href="#themes" title="Direct link to heading">​</a></h2><p>Wave v0.12 also ships with experimental support for switching themes, and includes a new <code>neon</code> dark theme. To switch your app's theme, simply set the <code>theme</code> attribute of your app's <code>meta_card</code>.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">  theme</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'neon'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="theme" src="/assets/images/toggle-theme-e3d2c18618cb44b25db89b8c9821bbfd.gif" width="312" height="743" class="img_ev3q"></p><p>See <code>meta-theme</code> example in Tour app.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="web-analytics">Web Analytics<a class="hash-link" href="#web-analytics" title="Direct link to heading">​</a></h2><p>You can now configure your app to send basic usage information to Google Analytics. You can use this feature to measure analyze how users are interacting with various parts of your app.</p><p>To enable usage tracking, use the new <code>ui.tracker()</code> API to set the <code>tracker</code> attribute of your app's <code>meta_card</code>.</p><div class="language-py codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-py codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">page</span><span class="token punctuation" style="color:#a9b7c6">[</span><span class="token string" style="color:#6a8759">'meta'</span><span class="token punctuation" style="color:#a9b7c6">]</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">meta_card</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  tracker</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">tracker</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token builtin" style="color:#e8bf6a">type</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain">ui</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">TrackerType</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">GA</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">id</span><span class="token operator" style="color:#a9b7c6">=</span><span class="token string" style="color:#6a8759">'G-XXXXXXXXXX'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">  </span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Read more about configuring analytics: <a href="/docs/configuration#web-analytics">Configuration</a></p><p>See <code>meta-tracking</code> example in Tour.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/latest" target="_blank" rel="noopener noreferrer">here</a>. Check out the release notes for more details.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We’d like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Responsive Layouts and Inline Components]]></title>
        <id>release-0.11.0</id>
        <link href="https://wave.h2o.ai/blog/release-0.11.0"/>
        <updated>2021-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we're excited to announce H2O Wave v0.11.0, with support for responsive layouts, inline form components, new cards for organizing content, and lots more.]]></summary>
        <content type="html"><![CDATA[<p>Today, we're excited to announce H2O Wave v0.11.0, with support for responsive layouts, inline form components, new cards for organizing content, and lots more.</p><p>The Wave release now ships with a <code>demo</code> directory containing examples showing how you can combine various Wave cards and components to form complete applications. Over 2021, we plan to add many more cards and components, and this demo app can be used as a design guide for inspiration and reference for building your apps.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboards-f32b01c8c07e2a1ded1ce2ce265bbbcf.png" width="1024" height="830" class="img_ev3q"></p><p>You can explore this demo application (and dashboards) by running <code>demo.app</code> (see <code>demo/app.py</code> in the 0.11 release):</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave run demo.app</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboards_demo-1143b3fab018b50f5fd6a4f1c6198a30.png" width="1242" height="568" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="responsive-layouts">Responsive Layouts<a class="hash-link" href="#responsive-layouts" title="Direct link to heading">​</a></h2><p>You can now build apps having responsive layouts (layouts that adapt to varying viewport sizes). See <a href="/docs/layout">Layout</a> in the guide.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboards_responsive-7e306ae02d67f49effa4ba3922f38c26.png" width="1026" height="569" class="img_ev3q"></p><p>Here are a few examples of what's possible in Wave 0.11+:</p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_red-7e0bf422365e6eceb8bec7dc8e695221.png" width="1200" height="1348" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_blue-ae85814564c8a969c952120b9eb2f670.png" width="1203" height="1151" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_orange-72c70ac710794925a711d7f2babd191c.png" width="1202" height="1171" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_cyan-be4d839fa6960467b252d03cdcc6e349.png" width="1201" height="1539" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_mint-c5aebe035f23b3185e05f2f5ad90588d.png" width="1202" height="1257" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/dashboard_purple-9a29d1ea728562c448cb870e766ddf79.png" width="1201" height="1335" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resizable-components">Resizable Components<a class="hash-link" href="#resizable-components" title="Direct link to heading">​</a></h2><p>We've reworked all existing components to dynamically resize when the layout is resized, especially for flex layouts. Although these card do resize or expand their contents to fit available size, it's best to use them at sizes they were originally intended for - this is especially true of the sparkline-style stats cards. At larger sizes, plot cards are more appropriate.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/scaling-1ed013cfb64482f8eaa0808888c40b3b.png" width="1024" height="501" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="section-card">Section Card<a class="hash-link" href="#section-card" title="Direct link to heading">​</a></h2><p>A section card (<code>ui.section_card()</code>) allows you to visually divide your page into various sub-sections, and provide components and controls specific to those sub-sections.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/section-97b470e00b7932d2795c95be9cd22543.png" width="1210" height="264" class="img_ev3q"></p><p>Sections can contain nested components, just like a form card, but displayed horizontally to the right of the card.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_1-eeb31d0e6c5a43abb92c456456dcd6e4.png" width="1200" height="56" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_2-aa7a7627456b3455fdf0cdd77c3de49c.png" width="1199" height="52" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_3-7dff0fecb5c9aa35d769fae64d1d0cda.png" width="1200" height="54" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_4-872edf7d8d4bbead96bbcc7840d22cf5.png" width="903" height="62" class="img_ev3q"></p><p>Sections are also a good way to display tabs on a page (similar to a tab card).</p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_5-3065b7aed493f3c0e4f4172914003a1d.png" width="1192" height="72" class="img_ev3q"></p><p><img loading="lazy" alt="dashboard" src="/assets/images/section_6-31f91f3195622bace7ade25d484b329f.png" width="1200" height="68" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="inline-components">Inline Components<a class="hash-link" href="#inline-components" title="Direct link to heading">​</a></h2><p>Forms (and, in general, any card that supported nested components) can now display inline components using <code>ui.inline()</code>.</p><p><img loading="lazy" alt="dashboard" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+UAAACBCAYAAACmThtbAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAtdEVYdENyZWF0aW9uIFRpbWUAU2F0IDE2IEphbiAyMDIxIDExOjI2OjE5IEFNIFBTVLS2Gn8AACAASURBVHic7d13XFZ1/8fx93UBKrhQQVFzr5w5MAc4GFpiQ21plt2uHLhXjsqVNhylkqvclrgSu52I+btLbXgr5roVFU1zgICCAbKu6/cHeSWCAopeAq/n48EjrnPO93s+5xzz4fv6fs85htjYWLMAAAAAAMBjZ7R2AQAAAAAA5FeEcgAAAAAArIRQDgAAAACAlRDKAQAAAACwEkI5AAAAAABWQigHAAAAAMBKCOUAAAAAAFiJbXYbmM281hwAAAAAgLsZDIZst8k0lN8ZwgnkAAAAAABkzGw2pwnmWQnp9wzltwN44cKFc6A0AAAAAADyl9jYWEn3D+cZhnKz2Wz5AQAAAAAA2WcymSyB/F7B/J4PeiOUAwAAAADw4LKSq9ONlN85Sk4oBwAAAADgwdzO1Lf/m9FoeYYj5Xc3BAAAAAAA2ZOVbH3f6esmkynnqwIAAAAAIB8wmUyZDnanC+W8Ag0AAAAAgIeXlXydJpTfObR+9/vVAAAAAABA1hkMhjTPa8somN9z+joAAAAAAHi07hvKmb4OAAAAAMCDyUqmZqQcAAAAAAArIZQDAAAAAGAlhHIAAAAAAKyEUA4AAAAAgJUQygEAAAAAsBJCOQAAAAAAVkIoBwAAAADASgjlAAAAAABYCaEcAAAAAAAreWyhvFvXN9SkcSMtWfJ1muUHfvtNixYtlMlkelylaNOmTWrSuJFOnTr12PZ5t507d6hJ40Y6ceK4ToeEqG2b1tq3b68kafPmAG3eHJBhu9u13/1z4sTxx1k+AAAAACAH2D6OnZw/f14hISEqXLiwAnfuVO/efSzrDhw4oCVLvlbv3n1kNObPgftixYurfv0GcnJyliR9v3mzJOnllzvds03fd99VmTIuls9ly5Z7tEVKMpvNMhgMj3w/AAAAAJBfPJYUvCswULa2thow0FdnzpxRaGioJGnVypWWkfNmzzbVnj17JEkrViyXl6eHOvp00LatW9WkcSOtWrlSkuTu1lKffvKJpe933umhd/v+E/J37tyhzp1eVit3Nw0eNEiXLl26b20nThy3jOC/9OILatO6ldau9dfq1avk0baNOvp00C+//GKpt0njRtq0aZOef669vDw9tGLFcktf0dHRGjv2PbVyd9MLHX205ttvLetu3bqliR9+IHe3lnqre3ddvHjRsi4yMkL79+/TxYsXNXToEB0+fFiHDx9Wk8aNdPPmzQzr9vDwVOfOnS0/JUqU0M2bNzV50iR5e3nK06Otpk+bpqSkJEmSyWTSwoUL1L6dt9xattCY0aN0/fp1SVJKSooWzJ+vdt5e8vL00MfTpyk+Pl6SNHToEL3T421NmDBezZs9q4SEBJ06dUq9ev5Lbi1b6M1uXXXgt9/ue44BAAAAABl7LKE8MHCnXF1d9cILL8jW1lY7d+6QJHm3a6d69etLkub5+alhw4bav3+f5s6Zo7p162rAwIHy91+T5f0cOfK7JowfrwYNGuj9Dz5QRMQ1jRk9KktT43cHBWnAgIGqWLGiPp89W8GHDmn06DFKSUnRZ59+kmbbf3+/WRPe/0CuTZtq7pw52r9/nyRpwvjxOnTwoMaMeU8vvPiiZs6coT0//CBJ+mrxYm3ZskVduryiTp07yX9Nxsfl6+tr+X3+goWyt7fPcLvo6BuKiIhQRESEbty4IUlatnSpfvhht8aMeU+DBg3Wd99t1MaNGySlftHx1eLF6uDjo5EjR+mXX37R9GnTJEkrV67QsmVL1bVbNw0eMkQ7duyQn988y75Onjyp5KQkjR07Trdu3dIg34EymcyaOHGSKlSooOHDhyksLCzTcwwAAAAASOuRT1+/PTLu49NRklSrVi39+/vvNWDAQJUtW1bNnm2mY0eP6tlnm8nW1lZBu4Jka2ur6R9/oiJFiqhcuXLq26dPJntJ9f3338vJyUmTJk+RwWCQs7Oz+vbpo+PHjql+gwb3bdu1azd18PFRcnKyJk2aqH79+6tmzVo6fuK41q1dm2bbocOG65lnnpGrq6v+b88e7Q4KUvXqNfTzz/s1fsIEvfjSS5Kk4OBgbdy4UR6engoK2qV69etrxMiRkqTrUde1cOGCdHXUrFlLDRs2lCQ1a9bsnvUO6N//jjY1tcZ/rYYMHap+/fsrLi5O58+fl52dnU6HhKSem82b1bBRIw0fPkKSVLpMGV25csWyztvb23JbwbXwa1qxYrlGjEittWjRovrk089kMBi0fft2RUVF6auvl6hy5cry8PRUm9attG3bVvXs2eu+5xgAAAAAkNYjD+W7AgMlSX5+89KNvj799NPpto+KipKTk7OKFCkiSapQoUKW93Xl8mVdu3ZNrdzdJKXeAy1JYeHhqp9JW4fChSVJNjY2kiQ7uwKSJFtb23Qj7eXKpd6/bW9vr1KlSikq6rrCw8MlSdOnTdPns2dLkpKSklSpUiXLcd0O25L0VDaOKyNjx45T+afKS5IKF049V3t++EFffPG5wsLCVLlyFRkMBiWnpEiSwsPD1bBhI0t7d3d3y+8XLlzQhQsX9OOPP0pKnc6emJiomJgYSVLJkiUt95KHh6eOiL/SpbNlFD8xMVHhYeEPdTwAAAAAkB898lAeGLhTkrRo8VeSpIiICE0YP067AgMzDOWlSpXUzz9f082bN1W0aFGFhp5Ls97GxkZxcbGWzxHXrql8+dRwevvBZ9+u8ZfBIJlMqQ8mc3JyytFjOn/unJydnRUdHa2IiAi1dCtl2UfXbt3UtWtXSVJycooKFSokSSpZspTOnz9v6ePc3/fVP6gGzzyjWrVqpVk2bdpHatiwkdZv2Cg7Ozu1bdPasq506dI6f/6fc7l3715duvSn3nijq5ycnFWiRAnNmDnDUretrY2KFSuWbr+3j3PmzFmqXqO6ZXtHR8eHOh4AAAAAyI8e6T3lJ0+e1IULFzR06DC5urrK1dVVzz//vBo0aGAJ6w6FHSRJy5YtVWRkpLy8vZWcnKyxY9/T5s0B+uLz2Wn6rFq1qnbv3q21a/01dcpkRUVFWdZ1fOEFSdKihQsUEhKiBQvmq1vXN+75sLQHNXv2LAUEbNL4cWOVkpIiLy9vubi4yLVpU+3Yvl0HfjuggwcPqlfPf2n16lWSJG9vbx07dkwzPvtU/v5rLPd6Z8TBobBCQ0P13caN2arLZDIpJiZawcHBmj1rluLi4izrXnr5ZR05ckSzZ82Sv/8aTRg/TocOHZIkvfrqqzp79oy2bdumkydPacL4cRozerRl1sCdWrVqLUdHRy1dukTHj5/Qju079Pprr+rQoYPZqhUAAAAA8IhD+e2p6x6eHmmWe3h46vLlyzp65IheeulluTZtqmVLl+r33w+rZUs3DR4yRCf/9z8tXrRIXbt1S9N29JgxcnJy0tw5c2RrZ5dmSniTJk00ZepUnThxQh9+8IEuXrigz2bMUJkyZXL0uN58s7u+WrxYJ0+e1OAhQ9SiRQtJ0scff6ImTZroiy8+1/wvv5Snl5cGDBgoKfUVZj4+HbV582Zt3bJFPXvd+/7rd/v1U8mSJTVz5ow0Xzpk5sOJk3T16lWNGT1KRhujKlasaFnXo8c76t27j7Zv36Z5c+fKtWlTjR07TpLUs1cv9ejxjjasX6+Ppk5RiZIl9cmnn2W4j2LFimnuPD/Z2NhqyuRJ2rLl3xo8eIg8Pb2yXCcAAAAAIJUhNjbWfPuD2WyW2WyWyWSSyWRSSkqKSpUqZc36FBERoefat9OwYcP1do8eVq1l1cqV+uKLzxW0+weVKFHCqrUAAAAAAJ5skZGRsrGxkdFolNFolMFgsDyv67bH8ko0AAAAAACQHqEcAAAAAAAreeKnrwMAAAAAkBtlZfr6I30l2p1P/wYAAAAAILdxcHB4pP0zfR0AAAAAACshlAMAAAAAYCWEcgAAAAAArIRQDgAAAACAlRDKAQAAAACwEkI5AAAAAABWQigHAAAAAMBKCOUAAAAAAFgJoRwAAAAAACuxtXYBAB6/qKgo+c2bo7CrV61dCqzExaWsfAcPUcmSJa1dCgAAQL5GKAfyIb+5c/RGt25q1KixtUuBlQQHH5LfvDn6cOJka5cCAACQrzF9HciHwsKuEsjzuUaNGjNTAgAA4AlAKAcAAAAAwEoI5QAAAAAAWAmhHAAAAAAAK3liH/R28eJFeXp66vLlyw/VT9myZRUQEKB69erlUGX5T1hYmEYMH6YLFy48VD8VK1bSrNmz5eLikkOVAQAAAEDu9sSGcg8PD125cuWh+7ly5Yo6d+6s06dP50BV+dOI4cM1cKCv3NzdH6qffXv3auSI4frm2zU5VBkAAAAA5G5P7PT1nAjktz3saHt+d+HCHw8dyCXJzd39oUfbAQAAACAveWJDOQAAAAAAeR2h/C6xsbHy85unV17ponbeXurdq6d27tiRbrvr169r5MgRauftpQ3r12e47PDhw3qlS2ddu3YtS/t97dVX9NNPP0mSxowZrQUL5ufsweUSycnJauXuluFPTs2g+OD9CVq6dIkkZes6ZeZ27X/88cdD9/Wk+OOPPzR27Hvy8vSQp0dbDfL11ZEjv1u7LAAAACBPeGLvKbeGW7duaZDvQBkMBvn6+srZubSOHj2q2bNn6c8//1TvPn0s265auVJ/3fxLCxcuUukypTNcFh9/S17e3ipWrFim+7a3t5d3u3aqXKmSJKmVeys5l3Z+NAeaS0ybPl01atRMs8zZOefPSbly5bJ8nfKbM2fOqG+f3nJ1baqPpk2XrY2N9uzZo3f79pXfl/Pl6upq7RKfGBs2rNf2bdu0ZOkya5cCAACAXCTPhfKePXvq7Nmz+vHHH7PddsWK5UpOTtHir76Svb29JKl+/fqqX6+ehgwZrLYeHqpWrZokKep6lJq4NlG16tUt7e9eVrRoMQ0c6JulfRuNRvXr19/y+cWXXsp2/XlNqVKlVLZs2Ue+n9KlS2f5OuU30z6aqtZt2mjy5CmWZU2ffVaOjo6a8dmnWrtuvRWry5/i4uJUqFAhGY2ZT3T666+/VKRIkcdQFQAAAB5Unpq+3rNnT/n6+uro0aPZbms2mxW4c6feevttSyC/rX6DBmr67LPauTN1GnuXzp20OyhIq1auVCt3Nx0/fizDZaGhoWrl7mbpJzk5WYsWLlSnl1+St5enxo0bqxvXr1vWv9DRR8HBhySlnV4tSf5r1qjTyy/L28tTQwYP1uXLl7J9jHlFcnKy3n7rLa1cscKybOPGDer6xutKSEhQaGio2rfz1sGDB/X6a6/K28tTI4YP06VLGZ+z7F6nw8HBGjzIV+3beatL505atnRpuj4v/fmnevfuJS9PD73bt4+OHTuWZv327dv0Zrdu8vL0UO/evXTgwG8Pe1py3MWLF3TkyBENGDAw3brX33hD7dq3V3x8vCQpKSlJ8+bO1XPt26mVu5uGDB6kP//807L9mNGjtHDhAo0eNUpuLVuoo08Hbdu6NU2fq1at0nPt28utZQv1e7dvmvZRUVF6770xatO6lZ5r304zZnym2NhYy/qEhAR9/PF0ebRtI4+2bfTtN99ozOhRWrVypSRp7Vp/vdu3T5r9TZ0yWTNnzsjS+jNnzsjdraV27w7SCx191LJFcw0bOlTR0dGSpJkzZ+jj6dN1+PBhNWncSJs2bZIkeXl66L///a+lz7CwMDVp3Eg3b960nJc5X3yhAf37qdmzTXXx4sVMr8vRo0e05OvFMplM993u7Nkz8ps7R8nJyZn2CQAAAOvJM6H8diBv166drt8RoLIq+sYNhYeHq2HDZzJc/0yDZxQSEiJJ8l+7Tu6tWqlr124K2v2D6tSpm+Gyu/n5zdP+/fs0ZepULVu2XA729ho6dIjMZvN9awsMDNTatf6aNn2a1vivVfXq1TV92rRsH2NeYWtrqxEjR+ibb1YrKipKf/31l5YvW6bhw0eoYMGCkqTExER9s3qVPv9ijjZ//2/VqFlTw4cPU0JCQqb93+86Xbt2TSNHjlCz5s317Rp/TZo8WRs3btB//vN/afpYsGC++vTpq1WrV6tFi5YaMXyYwsKuSpJ2796tuXPm6N1+/bRq9Td68cWXNPa993Tq5MkcP1cP4+TJUypfvnyG75V3dHRUnz59LV9gzZzxmfbt26dPP5uhb75do7Jly6rfu++mCc7r162Tj4+PAncFqWevXpo8eZLCwsIkSdu3bdM3q1dp5syZ2hSwWTVq1tSkiRMlpX5JMnhQ6kyG5StWas7ceTp+7LimTJ5k6XvaRx/p2LFjmjt3npYuW66jR4/q8OHDOXo+EhISFLQrSF8vWaoNG79TeHiY5n/pJ0kaNmy4Ro4cpdq162j/z7/opWzMdAkI2KSXXu6krdu2Z2lmSLNmzVWtWvX7BvOzZ89orf8aDRw0WLa2eW5CFAAAQJ6Sa/61VrBgQdnb2+vGjRvp1j1sIJdkGbkqWjTj+4qLFSummzExkqQCBQqoYIECqf/9OwRmtOzu/jcHBOirr79W9eo1JEmjx7yn77/frPj4eDk4ONyztrCrV1W+fHnVqVNXBoNBA319Mw3yecHgQYNkMBgsn6tVr67Fi7+SJDVq1Fhubu5a8vXXKlyksBo1aqxmzZtbtk1JSVHPXr1Vvnx5SVL//gP0w+7d2rdvrzw9ve65z8yuk7OzszZu/E6OJUpIkpycnNS4cRMdO3pMbdq0tfTTqXNntWjRQpLUs1cvHQo+pK1bt6pXr9769ttv9K9/9VTbtqnbd+rUSSEhp+Tv76+JkyY99HnLKTdjYlQ0C/fZx8TEKCAgQMtXrFTt2rUlSWPHjderr3TRzh071OWVVyRJLVq2lIenpyTp1Vdf04rlqeG5TJkyunLlip56qoLq1a8vg8GgYcOGW/6M//zzz4qNjdVHH02TnZ2dJOmTTz/Viy901M2bN5WcnKwdO7br2zX+qv73rSMTJ01SO+97X+cHYTKZNNB3oOVLim5vdteqlamzNWxtbVWgYAEVLJjx///34+npqQ4dOmSvjZe3JGnJ14vVu8+7aaay3w7kgwYP5TkJAAAAuUCuCeWenp6aMmWK2rdvnyZ450Qgl6SiRYtKkm7ejMkwIN+8eTNLAeVezp0Llb29vSXoSVKhQoX0+utvZNq2Xfv2CgjYpLff6q7mLVqoZUs3NW7c+IFryS0mvP+BJWRJqV983Ml30CD1ePstGQwGLVu+4u7mlvv/JclgMKhmzVo6e+bsfUN5Vq5TQmKi1vr768yZM/rz0p86dfKkXnwx7cho7adrp/lct05dnQsNldlsVujZs6o7vF6a9fXr19c3q1ffsy5rKHrHF1H3c/bsWdna2qpWrVqWZQaDQfUbNNCpU/+M/leoUCFNu+LFHRUfFydJ6uDTQRs2rNerr7wid3c3ubdqraZNm0qSTp06qYsXL8rbyzNNe5PJpPDwcMVER8vOzi7N9S5UqJCq3vE5p1SoUNHyu2Px4or7u/6HUbpMmQdql1EwJ5ADAADkPrkmlG/fnjq1MzAw0BLMcyqQS1JxR0eVLl1av/9+RO3bp5+u+/vvv6tmzZoZtMwas1kPPLrt4uKib9f469dff9Ghgwc1ZfIkNWrU+IkaVX0UXFzKqNLfT6O/F5PJdM/zmpSUdNfnxDQj7xnJ7DqdOnVKw4YOUes2beTq6qrOXbpo03ffpdsu5a5pxXdOMzabzcqkjCdCrVq1dPnyZYWFhanMXcHxxo0b2rBhvbp3fyv1pD2ksmXL6btNAfp5/34dOHBA708YL1dXV02b/rGk1JkRU6ZOTdfO2dlZx44eldlslslkko2NjWWdKSXlvvvMrOxHMRklp2e43BnM23p4af06fwI5AABALpOr7ilfunSpFixYoMDAQA0dOjTHArmUOrLX/rnntHrVSt26dSvNumPHjum3337Vc889/8D9V61aRfHx8WnuG46Pj9fGjRsyHW2LjIxUdHS0Wrduo2HDR2jmrFkKCtplechUfvWln59cXV3Vtq2H5s2dm279yf/9z/J7cnKyQkJCVLVa1fv2mdl12rdvr+rUqaNx48brueefV506dRQeHpZ+3yf/2bfZbNbh3w+ratVqMhgMqla9uoKDg9NsH3zoULrXv1lbxYoVVb9+fS1csCDduvXr1ilw507Z29urarVqSk5O1vE7HmaXlJSk3w8fVq1aT2dpXxEREYqOjpaHp6fGvPee5vn5aceOHbpx44Zq1Kihq1evqHTp0ipXrpzKlSunwoULKzw8XHZ2dqpStWrq/o//s//4+HidO3fO8tm+UPpbXy5d+jPL67PCYDCkC92F7ur3Xg8bfBieXt6qVq26Vq9cQSAHAADIhXLNSPltS/9+0vXAgQNzLJDf1qPHO/r55581yNdX3bt3l3Pp0jp+7JiWL1+m7t3fSjM9NruKFi2mF198UdOmfaRRo0ereHFHLV+2TGfPnlGXLq/ct63/mjUKDg7WuHHj5FC4sLZs2aJSpZxUuHDhB64nN4iMjNSVK1fSLHNycpKdnZ2Cgw/pp59+1KrV36hgwYJ6881u+vWXX9LcV75ixQrZO9irhGMJrVi5QoUKFZKbm/t995nZdapQoYI2BwTocHCwyri4KDBwp44fP67Klauk6Wfrli0qX668KleprIBNATp/7rymTv1IktS9e3dNnzZNTz1VQbVq1dL+/fu0a9cuLVy4KGdOXA4aP+F99e3TW3HxcercuYvs7Oz0f3v2aP36dZo3L/UhZ8WLF1enzp01adJEfThxkkqUKKFlS5cqMTFJzz2ftS+yVq1aqYP/PaiJEyeqcJEi2hwQICcnZxUpUkQtW7qpcJEimjjxQ/Xq1Vsmk0lz58xRQsItLf7qazk6OqqDj4+mTJ6siZMmq0iRwlq4YEGae7vrN2ig0NBQrV+3Tu6t3LV582adOnVKNf6e/ZLZ+qxwcnLSuXPndPDgQdWsWVNFixZVw4bPaNmypapWrapu3rypOV98no2zn3WeXt5q3aYtD3UDAADIhXLlv+CWLl2qlStX5virfuzt7eXn96WWLlkiP795io6OVsWKFTV48BD5dOz40P0PHTZcixcv0gfvv6/Y2Fg1btxYX8yZm+mU6j59+2rOnC80dOgQxcfHq07dupo5a2ae/wf4hPHj0y376uslql69umbPmq033+xueehWr1699Pnns7Vi5SrLtgMGDtS0j6YqIiJC9es30OzPP8/SQ7jud528vdvp0qVLev/9CZIkLy9veXp6putj2PAR+tJvnkJDQ1W1alXNmj3bMgXc09NLCQkJWrxokcLCrqpylSr6bMYM1Xo6a6PKj1ONGjW0bPkKLZj/pcaPGyuTyaTatWtr4aLFatiwoWW7UaNGa8H8+Ro9aqTi4uLUuHFjLVq8OMtfHA0YMFAzZ85Q//79FB8fr3r16mme3zzLn/H58xdo5owZ6tXzX7Kzs1OzZs00avQ/09nHjRuv2bNmafAgXxmNRvXr31+xsf/MQKlSpYpGjxmjRYsWys9vnjp17pzm2QKZrc8Kd/dWav/ccxo+bKgGDxmq1157TUOHDdf7E8brzW7dVLlyZQ0YOFDDhw3LVr9Zldf/PgAAAMirDLGxsZb5lmaz2XJvpslkUkpKikqVKvXAnT/MQ5ByehT4zlczIXtaubvpp737nri+7iU0NFTv9Hj7ke8nN/Md0E/LVqzKfMNcbJCvr5o1a6a3e/SwdilPrJ7vvK0vFzx5MzQAAACeJPd7U1ZmIiMjZWNjI6PRKKPRKIPBkG5QNlfdUw4AAAAAQF5CKAcAAAAAwEqe2JsQXVxcdPXq1Rzpq3z58jnST35VsWIl7du7V27u939IWmb27d2rihXv/4qznFC1alWmrkN+X35p7RIAAACATD2xoXzz5s3q0qXLQ79CyMXFRbt27cqhqvKnWbNna+SIERo79r2H6qdixUqaOWtWDlUFAAAAALnfExvK69Wrp5CQEGuXAaV+sfHNt99auwwAAAAAyHO4pxwAAAAAACshlAMAAAAAYCWEcgAAAAAArIRQDuRDLi4uCg4+ZO0yYEXBwYfk4lLW2mUAAADke4bY2Fjz7Q9ms1lms1kmk0kmk0kpKSkqVarUA3ceFxeXI0UCyFmRkZH6ct5chYXlzGsHkfu4uLho4KAhD/V3PAAAQH7g4ODwwG0jIyNlY2Mjo9Eoo9Eog8Egg8GQZhtCOQAAAAAA9/CoQznT1wEAAAAAsBJCOQAAAAAAVkIoBwAAAADASgjlAAAAAABYCaEcAAAAAAArIZQDAAAAAGAlhHIAAAAAAKyEUA4AAAAAgJUQygEAAAAAsBLbR9m5g4PDo+weAAAAAIBcjZFyAAAAAACshFAOAAAAAICVEMoBAAAAALASQjkAAAAAAFZCKAcAAAAAwEoI5QAAAAAAWAmhHAAAAAAAKyGUAwAAAABgJYRyAAAAAACsxNbaBTwq165dU1BQkOLi4mRra6vWrVurSpUqkqRz587phx9+UGxsrMqVKycfHx85ODgoOTlZgYGBOnv2rOzs7NSyZUs1aNBAknTjxg3t2LFDYWFhKl68uNq3b69y5cpZ8xABAAAAALlcnh0p37p1qxo1aqTevXurQ4cO2rJli5KSkpSQkKBt27bJ29tbgwYNkrOzs3bv3i1J+vXXX5WQkKD+/fvr9ddf1759+xQRESFJ2rFjhypXrqzBgwfLzc1NW7ZskclksuYhAgAAAAByuTwZys1ms6KiolSpUiVJUunSpWVjY6OYmBidP39eLi4uqlSpkoxGo5o3b67Q0FClpKQoJCREzZs3l52dnUqWLKnatWvr9OnTiouLU3h4uJ599lkZjUbVqFFD9vb2unz5spWPFAAAAACQm+XJUG4wGFShQgWFhIRIki5duqQCBQqoRIkSun79ukqUKGHZtmDBgipYsKBiYmJ048aNNOtKliyp69ev6/r16ypevLiMRmOadVFRUY/voAAAAAAAeU6evae8bdu2Wr9+LlasZwAAA4JJREFUvfbt26ekpCR17NhRRqNRycnJsrVNe9g2NjZKSEiQyWSSjY1NmuWJiYn3bJOUlPRYjgUAAAAAkDflyVCenJysgIAA+fj4qHLlyoqKitK6devk5OQkOzs7xcTEpNk+MTFRBQsWlNFoVGJiouzs7CRJCQkJKlCggOzs7JSYmJiuze3t7sVsNqdrBwAAACBvMxqNmWYF4LY8OX09KipKKSkpqly5sqTUqeZOTk66fPlyumnnsbGxSk5OVrFixdKti4yMVMmSJVWiRAnFxMQoOTk5zbpSpUo9tmMCAAAAAOQ9eXKkvHjx4kpMTNSVK1dUtmxZxcbGKjw8XK1bt5ajo6OCgoL0xx9/6KmnntIvv/yiGjVqyMbGRrVq1dKBAwfk4uKi6OhonT59Wl27dpW9vb3Kly+vAwcOqFmzZjp16pSSk5NVtmzZ+9ZhMBhUsGDBx3TUAAAAAIDcxhAbG2u+/cFsNstsNstkMslkMiklJSXXjgaHhoZq7969SkpKktFoVOPGjfXMM89Iki5cuKCgoCD99ddfeuqpp9ShQwfZ29srJSVFu3bt0unTp1WgQAG1atVKderUkSTFxMRo+/btunr1qhwdHfX888+rTJky1jxEAAAAAMATLDIyUjY2NjIajTIajTIYDDIYDGm2ybOhHAAAAAAAa8pKKM+T09cBAACARyk2KVbnoy88UNu6TrVzuBoAuRmhHAAAAMimc9F/6MO9Ux+o7Xed1uRwNQByM0I5AAAA8r1jESd0POJ/Wd4+PO6aJMnBzkFVilfKUpvs9A8g/yCUAwAAII1rcdcUHheR7XalHZzk7OD8CCp69I5FnNC6kxuz3a5K8Uqa6v5hlrbtEtAt2/0DyPsI5QAAAEhj94X/PFBAff3pV9T16VcfQUWPT12n2qrrVCfL25fJpV9CAHhyEMoBAACQIWcHZ5V2cMp0u/C4CF37ezp3blfXqU6u/2IBQO5CKAcAAECGPCq2zlJA9T+54YFG1gEAktHaBQAAAAAAkF8xUg4AAIAccS0uIltPGM/Ok8sBIK8ilAMAACBH7LnwH+258J8sb1/XqXaWn1wOAHkVoRwAAAAPpYyDs+o61c7y9rFJcTof/ccjrAgAcg9COQAAAB6KR8U28qjYJsvbH4s4oQ/3Tn2EFQFA7sGD3gAAAAAAsBJCOQAAAAAAVkIoBwAAAADASv4fOjuaNUMcz0wAAAAASUVORK5CYII=" width="997" height="129" class="img_ev3q"></p><p>When used judiciously, inline components help design compact layouts, especially when grouping related fields together.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/inline_2-4bf7e9cee7574388d3434c79b250d430.png" width="905" height="148" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="inline-stats">Inline Stats<a class="hash-link" href="#inline-stats" title="Direct link to heading">​</a></h2><p>Stats or metrics can now be displayed inside forms, laid out horizontally from left to right. Each stat is created using <code>ui.stat()</code>, and grouped together using <code>ui.stats()</code>.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_4-1f9d8e2ef7c4ab59be8e79f9c6d6b06c.png" width="907" height="185" class="img_ev3q"></p><p>Stats can be used to display various scalar values/metrics associated with plots.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_2-85969423403568ab077789ecd23458e2.png" width="1206" height="408" class="img_ev3q"></p><p>Stats can optionally contain icons as well.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_1-3d795dabf58580168c08af871ef00680.png" width="467" height="389" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="stat-lists">Stat Lists<a class="hash-link" href="#stat-lists" title="Direct link to heading">​</a></h2><p>Stat lists (<code>ui.stat_list_card()</code>) offer a simple way to display two-column lists with optional links, icons, subtitles, values and auxiliary values. They provide a simpler way to display lists of things compared to the more heavyweight <code>ui.table()</code>.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_list_3-604ecf10a42d2e87feb60141d2777f5b.png" width="341" height="641" class="img_ev3q"></p><p>Icons can be colored differently.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_list_1-e5298c8479345c53d2e1197a118d0770.png" width="396" height="393" class="img_ev3q"></p><p>Values can be colored differently as well.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_list_2-7b410ad4b07a18411a671a7c70f6f057.png" width="478" height="417" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="stat-tables">Stat Tables<a class="hash-link" href="#stat-tables" title="Direct link to heading">​</a></h2><p>Stat tables (<code>ui.stat_table_card()</code>) offer a simple way to display a table of metrics with optional links, icons and subtitles. They provide a simpler way to display tabular data compared to the more heavyweight <code>ui.table()</code>.</p><p><img loading="lazy" alt="dashboard" src="/assets/images/stats_table-45b32e215b9672e14fa49d726704b772.png" width="738" height="386" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-documentation">Improved Documentation<a class="hash-link" href="#improved-documentation" title="Direct link to heading">​</a></h2><p>We have a long way to go improving our documentation, but hopefully these small changes help for now.</p><p>Most importantly, the Wave documentation now sports a search bar, thanks to <a href="https://www.algolia.com/" target="_blank" rel="noopener noreferrer">Algolia</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/latest" target="_blank" rel="noopener noreferrer">here</a>. Check out the release notes for more details.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We’d like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Live Reload]]></title>
        <id>release-0.9.0</id>
        <link href="https://wave.h2o.ai/blog/release-0.9.0"/>
        <updated>2020-10-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we're excited to announce H2O Wave v0.9.0, with a new wave CLI, live-reload, improved performance, background tasks and ASGI compatibility.]]></summary>
        <content type="html"><![CDATA[<p>Today, we're excited to announce H2O Wave v0.9.0, with a new <code>wave</code> CLI, live-reload, improved performance, background tasks and ASGI compatibility.</p><video autoplay="" loop="" muted=""><source src="/assets/medias/livereload-c8ab0ea721f98fca13da5bc0b1ab26e1.mp4" type="video/mp4"></video><br><br><p>Among other changes, the Wave server executable <code>wave</code> is now called <code>waved</code> (as in <code>wave</code> daemon), and the <a href="https://pypi.org/project/h2o-wave/" target="_blank" rel="noopener noreferrer">h2o-wave</a> Python package ships with a new CLI named <code>wave</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="no-more-listening">No more listening<a class="hash-link" href="#no-more-listening" title="Direct link to heading">​</a></h2><p><code>listen()</code> has been deprecated in favor of <code>@app</code>. Wave apps are now one line shorter.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="old-way">Old way<a class="hash-link" href="#old-way" title="Direct link to heading">​</a></h3><p>In versions &lt;= v0.8.0, a skeleton app looked like this:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockTitle_Ktv7">foo.py</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> listen</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">pass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">listen</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> serve</span><span class="token punctuation" style="color:#a9b7c6">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above app could be run like this:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ python foo.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-way">New way<a class="hash-link" href="#new-way" title="Direct link to heading">​</a></h3><p>In versions v0.9.0+, a skeleton app looks like this:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockTitle_Ktv7">foo.py</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">from</span><span class="token plain"> h2o_wave </span><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> main</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> app</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> Q</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">pass</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Notably:</p><ol><li><code>listen(route)</code> has been replaced by an <code>@app(route)</code> decorator on the <code>serve()</code> function.</li><li><code>main</code> needs to be imported into the file (but you don't have to do anything with the symbol <code>main</code> other than simply <code>import</code> it).</li></ol><p>The above app can be run using <code>wave run</code>, built into the new <code>wave</code> command line interface.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave run foo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="live-reload">Live reload<a class="hash-link" href="#live-reload" title="Direct link to heading">​</a></h2><p>The <code>wave run</code> command runs your app using live-reload, which means you can view your changes live as you code, without having to refresh your browser manually.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave run foo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To run your app without live-reload, simply pass <code>--no-reload</code>:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ wave run --no-reload foo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improved-performance">Improved performance<a class="hash-link" href="#improved-performance" title="Direct link to heading">​</a></h2><p>Both the Wave server and application communication architecture has undergone significant performance and concurrency improvements across the board. Apps should now feel lighter, quicker, and more responsive under concurrent or increased load.</p><p>The changes in v0.9 brings us closer to a v1.0 release. v1.0 will include the ability to increase the number of worker processes to scale apps, while preserving the simplicity of the Wave API.</p><p>The Wave Tour (<code>tour.py</code>) is now quicker and more reliable:</p><p><img loading="lazy" alt="tour" src="/assets/images/tour-968f92ad1236ec66ad30ed613ba324db.png" width="1791" height="979" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="background-tasks">Background tasks<a class="hash-link" href="#background-tasks" title="Direct link to heading">​</a></h2><p>The API now provides the ability to run blocking calls in the background to improve app responsiveness. The query context <code>q</code> now has  two lightweight wrappers over <a href="https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor" target="_blank" rel="noopener noreferrer">asyncio.run_in_executor()</a>: <code>q.run()</code> and <code>q.exec()</code></p><p>Here is an example of a function that blocks:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> time</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">blocking_function</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token operator" style="color:#a9b7c6">-</span><span class="token operator" style="color:#a9b7c6">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:#e8bf6a">str</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    time</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain">  </span><span class="token comment" style="color:#808080"># Blocks!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">return</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#6a8759">f'Done!'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To call the above function from an app, don't do this:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    message </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> blocking_function</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token number" style="color:#6897bb">42</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Instead, do this:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    message </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">blocking_function</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">42</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><code>q.run()</code> runs the blocking function in the background, in-process.</p><p>Depending on your use case, you might want to use a separate process pool or thread pool from Python's <a href="https://docs.python.org/3/library/multiprocessing.html" target="_blank" rel="noopener noreferrer">multiprocessing</a> library, like this:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token keyword" style="color:#cc7832">import</span><span class="token plain"> concurrent</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">futures</span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#a9b7c6">@app</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token string" style="color:#6a8759">'/demo'</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain"></span><span class="token keyword" style="color:#cc7832">async</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">def</span><span class="token plain"> </span><span class="token function" style="color:#ffc66d">serve</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">q</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"> Q</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token keyword" style="color:#cc7832">with</span><span class="token plain"> concurrent</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">futures</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token plain">ThreadPoolExecutor</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">as</span><span class="token plain"> pool</span><span class="token punctuation" style="color:#a9b7c6">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#a9b7c6"><span class="token plain">        message </span><span class="token operator" style="color:#a9b7c6">=</span><span class="token plain"> </span><span class="token keyword" style="color:#cc7832">await</span><span class="token plain"> q</span><span class="token punctuation" style="color:#a9b7c6">.</span><span class="token keyword" style="color:#cc7832">exec</span><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">pool</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> blocking_function</span><span class="token punctuation" style="color:#a9b7c6">,</span><span class="token plain"> </span><span class="token number" style="color:#6897bb">42</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#a9b7c6"><span class="token plain">    </span><span class="token comment" style="color:#808080"># ...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><code>q.exec()</code> accepts a custom process pool or thread pool to run the blocking function.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="asgi-compatibility">ASGI compatibility<a class="hash-link" href="#asgi-compatibility" title="Direct link to heading">​</a></h2><p>Wave apps are now <a href="https://asgi.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer">ASGI</a>-compatible, based on <a href="https://www.uvicorn.org" target="_blank" rel="noopener noreferrer">Uvicorn</a> / <a href="https://www.starlette.io/" target="_blank" rel="noopener noreferrer">Starlette</a>, a <a href="https://www.techempower.com/benchmarks/#section=data-r17&amp;hw=ph&amp;test=fortune&amp;l=zijzen-1" target="_blank" rel="noopener noreferrer">high-performance</a> Python server.</p><p>You can run Wave apps behind any ASGI server, like <a href="https://www.uvicorn.org" target="_blank" rel="noopener noreferrer">uvicorn</a>, <a href="https://gunicorn.org/" target="_blank" rel="noopener noreferrer">gunicorn</a>, <a href="https://github.com/django/daphne/" target="_blank" rel="noopener noreferrer">daphne</a>, <a href="https://pgjones.gitlab.io/hypercorn/" target="_blank" rel="noopener noreferrer">hypercorn</a>, etc.</p><p>To run your app using an ASGI server like uvicorn, append <code>:main</code> to the <code>app</code> argument:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#a9b7c6;--prism-background-color:#2b2b2b"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#a9b7c6"><span class="token punctuation" style="color:#a9b7c6">(</span><span class="token plain">venv</span><span class="token punctuation" style="color:#a9b7c6">)</span><span class="token plain"> $ uvicorn foo:main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="download">Download<a class="hash-link" href="#download" title="Direct link to heading">​</a></h2><p>Get the release <a href="https://github.com/h2oai/wave/releases/latest" target="_blank" rel="noopener noreferrer">here</a>. Check out the release notes for more details.</p><p>We look forward to continuing our collaboration with the community and hearing your feedback as we further improve and expand the H2O Wave platform.</p><p>We’d like to thank the entire Wave team and the community for all of the contributions to this work!</p>]]></content>
        <author>
            <name>Prithvi Prabhu</name>
            <uri>https://github.com/lo5</uri>
        </author>
        <category label="release" term="release"/>
    </entry>
</feed>