<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <atom:link href="https://corex-ui.github.io/soonex/feed.xml" rel="self" type="application/rss+xml" />
  <title>Soonex</title>
  <link>https://corex-ui.github.io/soonex</link>
  <description>Elixir static site template: Tableau, Corex, tokens, Tailwind v4, Markdown posts. Waitlist for launch updates.</description>
  <language>en-us</language>
  <generator>Tableau v0.30.0</generator>
    <item>
       <title>Using the Soonex template</title>
       <link>https://corex-ui.github.io/docs/</link>
       <pubDate>Fri, 08 May 2026 12:00:00 UTC</pubDate>
       <guid>https://corex-ui.github.io/docs/</guid>
       <description><![CDATA[ <p>This guide walks through cloning <strong>soonex</strong>, running the static site pipeline, renaming the OTP app, and tuning themes, color mode, and demo chrome. Further down, a <strong>Markdown feature gallery</strong> shows what MDEx emits for the extensions enabled in <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span><span class="n">config</span><span class="o">.</span><span class="n">exs</span></span></code> (<code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">table</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">tasklist</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">strikethrough</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">autolink</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">alerts</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">footnotes</span></span></code>, and <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">syntax_highlight</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span></span></code> plus the Soonex code pipeline).</p><h2><a href="#get-the-code" aria-hidden="true" class="anchor" id="get-the-code"></a>Get the code</h2><p>The Tableau site lives in its own repository under the <strong>corex-ui</strong> organization.</p><h3><a href="#clone-over-https" aria-hidden="true" class="anchor" id="clone-over-https"></a>Clone over HTTPS</h3><div class="relative"><pre data-scope="code" data-part="root" tabindex="0" class="code max-w-none"><code data-scope="code" data-part="content"><span class="nf">git</span><span class="n"> clone https://github.com/corex-ui/soonex.git</span><span class="w"> </span><span class="nf">cd</span><span class="n"> soonex</span><span class="w"> </span></code></pre><div id="soonex-md-964d84dfccd3f32072fc9834" phx-hook="Clipboard" data-loading="data-loading" phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;attrs&quot;:[&quot;data-loading&quot;]}]]" class="clipboard clipboard--sm absolute top-2 right-2 z-10" data-default-value="git clone https://github.com/corex-ui/soonex.git
cd soonex
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex-md-964d84dfccd3f32072fc9834"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-964d84dfccd3f32072fc9834&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="root" data-scope="clipboard" id="clipboard:soonex-md-964d84dfccd3f32072fc9834" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-964d84dfccd3f32072fc9834\\:control&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="control" data-scope="clipboard" id="clipboard:soonex-md-964d84dfccd3f32072fc9834:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-964d84dfccd3f32072fc9834\\:trigger&quot;,&quot;attrs&quot;:[&quot;type&quot;,&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-copied&quot;,&quot;data-disabled&quot;,&quot;data-hover&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;]}]]" data-orientation="horizontal" data-part="trigger" data-scope="clipboard" id="clipboard:soonex-md-964d84dfccd3f32072fc9834:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-964d84dfccd3f32072fc9834\\:copy&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copy" data-scope="clipboard" id="clipboard:soonex-md-964d84dfccd3f32072fc9834:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-964d84dfccd3f32072fc9834\\:copied&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copied" data-scope="clipboard" id="clipboard:soonex-md-964d84dfccd3f32072fc9834:copied"><span class="hero-check "></span></span></button></div></div></div></div><h3><a href="#clone-over-ssh" aria-hidden="true" class="anchor" id="clone-over-ssh"></a>Clone over SSH</h3><p>If you prefer SSH:</p><p><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">git</span><span class="na">@github</span><span class="o">.</span><span class="n">com</span><span class="ss">:corex</span><span class="o">-</span><span class="n">ui</span><span class="o">/</span><span class="n">soonex</span><span class="o">.</span><span class="n">git</span></span></code></p><p>Then <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">cd</span></span></code> into the repo directory you cloned.</p><h3><a href="#localized-variant" aria-hidden="true" class="anchor" id="localized-variant"></a>Localized variant</h3><p>For <strong>Gettext, Localize, and locale path prefixes</strong>, use <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">soonex_i18n</span></span></code></strong>:</p><div class="relative"><pre data-scope="code" data-part="root" tabindex="0" class="code max-w-none"><code data-scope="code" data-part="content"><span class="nf">git</span><span class="n"> clone https://github.com/corex-ui/soonex_i18n.git</span><span class="w"> </span></code></pre><div id="soonex-md-fa03c557ed7cff1cc1f977a8" phx-hook="Clipboard" data-loading="data-loading" phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;attrs&quot;:[&quot;data-loading&quot;]}]]" class="clipboard clipboard--sm absolute top-2 right-2 z-10" data-default-value="git clone https://github.com/corex-ui/soonex_i18n.git
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex-md-fa03c557ed7cff1cc1f977a8"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-fa03c557ed7cff1cc1f977a8&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="root" data-scope="clipboard" id="clipboard:soonex-md-fa03c557ed7cff1cc1f977a8" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-fa03c557ed7cff1cc1f977a8\\:control&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="control" data-scope="clipboard" id="clipboard:soonex-md-fa03c557ed7cff1cc1f977a8:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-fa03c557ed7cff1cc1f977a8\\:trigger&quot;,&quot;attrs&quot;:[&quot;type&quot;,&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-copied&quot;,&quot;data-disabled&quot;,&quot;data-hover&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;]}]]" data-orientation="horizontal" data-part="trigger" data-scope="clipboard" id="clipboard:soonex-md-fa03c557ed7cff1cc1f977a8:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-fa03c557ed7cff1cc1f977a8\\:copy&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copy" data-scope="clipboard" id="clipboard:soonex-md-fa03c557ed7cff1cc1f977a8:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-fa03c557ed7cff1cc1f977a8\\:copied&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copied" data-scope="clipboard" id="clipboard:soonex-md-fa03c557ed7cff1cc1f977a8:copied"><span class="hero-check "></span></span></button></div></div></div></div><h3><a href="#work-inside-the-corex-monorepo" aria-hidden="true" class="anchor" id="work-inside-the-corex-monorepo"></a>Work inside the Corex monorepo</h3><p>If you develop from the monorepo checkout, use <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">templates</span><span class="o">/</span><span class="n">soonex</span></span></code>. The default is <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="p" data-group-id="1655784042-1">{</span><span class="ss">:corex</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;~&gt; 0.1.0-beta.5&quot;</span><span class="p" data-group-id="1655784042-1">}</span></span></code></strong> from Hex; to build against a sibling <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">corex</span></span></code></strong> repo, switch <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="o">.</span><span class="n">exs</span></span></code></strong> to <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="p" data-group-id="4993659218-1">{</span><span class="ss">:corex</span><span class="p">,</span><span class="w"> </span><span class="ss">path</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;../../corex&quot;</span><span class="p" data-group-id="4993659218-1">}</span></span></code></strong> and run <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">deps</span><span class="o">.</span><span class="n">get</span></span></code></strong> so <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">deps</span><span class="o">/</span><span class="n">corex</span></span></code></strong> matches that checkout (the <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">corex</span><span class="o">/</span><span class="n">hooks</span></span></code></strong> and <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">corex</span><span class="o">/</span><span class="n">select</span></span></code></strong> style imports in <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">assets</span><span class="o">/</span><span class="n">js</span><span class="o">/</span><span class="n">site</span><span class="o">.</span><span class="n">js</span></span></code></strong> stay the same).</p><h2><a href="#first-run" aria-hidden="true" class="anchor" id="first-run"></a>First run</h2><p>From the repository root, in order:</p><ol><li><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">deps</span><span class="o">.</span><span class="n">get</span></span></code></li><li><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">setup</span></span></code></li><li><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">cd</span><span class="w"> </span><span class="n">assets</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">npm</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">..</span></span></code></li><li><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">assets</span><span class="o">.</span><span class="n">build</span></span></code></li><li>Either <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">build</span></span></code> for a production tree under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span></span></code>, or <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">server</span></span></code> for the dev server with reload.</li></ol><h2><a href="#rename-the-project" aria-hidden="true" class="anchor" id="rename-the-project"></a>Rename the project</h2><p>From the repo root, choose a <strong>snake_case</strong> OTP application name (lowercase letters, digits, underscores only). <strong>Commit or branch first</strong>, the rename task does not provide an undo.</p><div class="relative"><pre data-scope="code" data-part="root" tabindex="0" class="code max-w-none"><code data-scope="code" data-part="content"><span class="nf">mix</span><span class="n"> project.rename acme</span><span class="w"> </span></code></pre><div id="soonex-md-06899abc5d00b50d29560bc9" phx-hook="Clipboard" data-loading="data-loading" phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;attrs&quot;:[&quot;data-loading&quot;]}]]" class="clipboard clipboard--sm absolute top-2 right-2 z-10" data-default-value="mix project.rename acme
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex-md-06899abc5d00b50d29560bc9"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-06899abc5d00b50d29560bc9&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="root" data-scope="clipboard" id="clipboard:soonex-md-06899abc5d00b50d29560bc9" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-06899abc5d00b50d29560bc9\\:control&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="control" data-scope="clipboard" id="clipboard:soonex-md-06899abc5d00b50d29560bc9:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-06899abc5d00b50d29560bc9\\:trigger&quot;,&quot;attrs&quot;:[&quot;type&quot;,&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-copied&quot;,&quot;data-disabled&quot;,&quot;data-hover&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;]}]]" data-orientation="horizontal" data-part="trigger" data-scope="clipboard" id="clipboard:soonex-md-06899abc5d00b50d29560bc9:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-06899abc5d00b50d29560bc9\\:copy&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copy" data-scope="clipboard" id="clipboard:soonex-md-06899abc5d00b50d29560bc9:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-06899abc5d00b50d29560bc9\\:copied&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copied" data-scope="clipboard" id="clipboard:soonex-md-06899abc5d00b50d29560bc9:copied"><span class="hero-check "></span></span></button></div></div></div></div><h3><a href="#what-the-rename-task-updates" aria-hidden="true" class="anchor" id="what-the-rename-task-updates"></a>What the rename task updates</h3><ul><li><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">test</span><span class="o">/</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">priv</span><span class="o">/</span></span></code>, and <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="o">.</span><span class="n">exs</span></span></code></li><li>Selected <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">package</span><span class="o">.</span><span class="n">json</span></span></code> / <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">package</span><span class="o">-</span><span class="n">lock</span><span class="o">.</span><span class="n">json</span></span></code> entries where applicable</li><li>Directory renames such as <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex</span><span class="o">/</span></span></code> → <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">acme</span><span class="o">/</span></span></code>, plus <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_web</span><span class="o">/</span></span></code> → <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">acme_web</span><span class="o">/</span></span></code> when that directory exists, and matching <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">test</span><span class="o">/</span></span></code> trees when present</li></ul><p>After it finishes, run <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">format</span></span></code></strong> and <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">compile</span></span></code></strong>.</p><h3><a href="#what-you-still-edit-by-hand" aria-hidden="true" class="anchor" id="what-you-still-edit-by-hand"></a>What you still edit by hand</h3><p>Markdown under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code> and the root <strong>README</strong> are intentionally <strong>not</strong> rewritten so clone URLs like <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">corex</span><span class="o">-</span><span class="n">ui</span><span class="o">/</span><span class="n">soonex</span></span></code> stay accurate. Update branding copy yourself if you rebrand the app.</p><h2><a href="#permalinks-and-_posts" aria-hidden="true" class="anchor" id="permalinks-and-_posts"></a>Permalinks and <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code></h2><p>Add or remove Markdown under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code> with a unique <strong><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">permalink</span></span></code></strong> per file (for example <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">/</span><span class="n">docs</span><span class="o">/</span></span></code>). Tableau emits one static tree per permalink.</p><h2><a href="#themes" aria-hidden="true" class="anchor" id="themes"></a>Themes</h2><p>Allowed theme ids and the default live in <a href="lib/soonex/theme.ex"><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex</span><span class="o">/</span><span class="n">theme</span><span class="o">.</span><span class="n">ex</span></span></code></a>.</p><p>Import the matching <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">priv</span><span class="o">/</span><span class="n">design</span><span class="o">/</span><span class="n">corex</span><span class="o">/</span><span class="n">theme</span><span class="o">/</span><span class="o">*</span><span class="o">.</span><span class="n">css</span></span></code> files in <a href="assets/css/site.css"><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">assets</span><span class="o">/</span><span class="n">css</span><span class="o">/</span><span class="n">site</span><span class="o">.</span><span class="n">css</span></span></code></a> so every <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="p" data-group-id="3209628119-1">[</span><span class="n">data</span><span class="o">-</span><span class="n">theme</span><span class="o">=</span><span class="s">&quot;…&quot;</span><span class="p" data-group-id="3209628119-1">]</span></span></code> value you expose is present in the CSS graph.</p><h2><a href="#color-mode-light--dark" aria-hidden="true" class="anchor" id="color-mode-light--dark"></a>Color mode (light / dark)</h2><p>Light and dark preference is driven by <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">data</span><span class="o">-</span><span class="n">mode</span></span></code> on <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;</span></span></code>, with helpers in <a href="lib/soonex/mode.ex"><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex</span><span class="o">/</span><span class="n">mode</span><span class="o">.</span><span class="n">ex</span></span></code></a> and client logic under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">assets</span><span class="o">/</span><span class="n">js</span><span class="o">/</span><span class="n">mode</span><span class="o">.</span><span class="n">js</span></span></code>.</p><h2><a href="#demo-panel-template-options" aria-hidden="true" class="anchor" id="demo-panel-template-options"></a>Demo panel (Template Options)</h2><p>The floating <strong>Template Options</strong> panel lives in <a href="lib/layouts/root/demo.ex"><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">layouts</span><span class="o">/</span><span class="n">root</span><span class="o">/</span><span class="n">demo</span><span class="o">.</span><span class="n">ex</span></span></code></a>. You can remove:</p><ul><li>the theme <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="o">.</span><span class="n">select</span><span class="o">&gt;</span></span></code> block,</li><li>the mode <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="o">.</span><span class="n">toggle_group</span><span class="o">&gt;</span></span></code> block,</li></ul><p>or both.</p><hr/><h2><a href="#markdown-feature-gallery" aria-hidden="true" class="anchor" id="markdown-feature-gallery"></a>Markdown feature gallery</h2><p>The snippets below mirror <strong>MDEx</strong> options under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">config</span><span class="w"> </span><span class="ss">:tableau</span><span class="p">,</span><span class="w"> </span><span class="ss">:config</span><span class="p">,</span><span class="w"> </span><span class="ss">markdown</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="4528692058-1">[</span><span class="ss">mdex</span><span class="p">:</span><span class="w"> </span><span class="err">…</span><span class="p" data-group-id="4528692058-1">]</span></span></code> and the <strong>Soonex</strong> post-processing step (<code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">Soonex.MDExConverter</span></span></code> → <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">Soonex.Markdown.CodeBlocks</span><span class="o">.</span><span class="n">transform</span><span class="o">/</span><span class="mi">1</span></span></code>) for fenced and inline code.</p><h3><a href="#headings" aria-hidden="true" class="anchor" id="headings"></a>Headings</h3><p>The post layout renders the post title as the page <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span></span></code>. In Markdown body text, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c1">##</span></span></code> maps to <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="n">h2</span><span class="o">&gt;</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c1">###</span></span></code> to <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">&lt;</span><span class="n">h3</span><span class="o">&gt;</span></span></code>, and so on.</p><h3><a href="#third-level-heading-example" aria-hidden="true" class="anchor" id="third-level-heading-example"></a>Third-level heading example</h3><h4><a href="#fourth-level-heading-example" aria-hidden="true" class="anchor" id="fourth-level-heading-example"></a>Fourth-level heading example</h4><h3><a href="#emphasis-inline-code-and-strikethrough" aria-hidden="true" class="anchor" id="emphasis-inline-code-and-strikethrough"></a>Emphasis, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">inline</span><span class="w"> </span><span class="n">code</span></span></code>, and strikethrough</h3><p>Use <strong>bold</strong>, <em>italic</em>, <em><strong>combined emphasis</strong></em>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">backticks</span></span></code> for commands and paths, and <del>strikethrough</del> when extensions include <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">strikethrough</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code>.</p><h3><a href="#links-and-autolink" aria-hidden="true" class="anchor" id="links-and-autolink"></a>Links and autolink</h3><p>Markdown link: <a href="https://hex.pm/packages/tableau">Tableau on Hex</a>. With <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">autolink</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code>, bare URLs also become links, for example <a href="https://hexdocs.pm/mdex/MDEx.html">https://hexdocs.pm/mdex/MDEx.html</a>.</p><h3><a href="#unordered-and-nested-lists" aria-hidden="true" class="anchor" id="unordered-and-nested-lists"></a>Unordered and nested lists</h3><ul><li>Clone the template
<ul><li>HTTPS or SSH</li><li>Optional monorepo path</li></ul></li><li>Run <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">setup</span></span></code></li><li>Build with <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">build</span></span></code> or serve with <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">server</span></span></code></li></ul><h3><a href="#ordered-lists" aria-hidden="true" class="anchor" id="ordered-lists"></a>Ordered lists</h3><ol><li>Edit <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span><span class="n">config</span><span class="o">.</span><span class="n">exs</span></span></code> for Tableau and asset tooling.</li><li>Add posts under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code> with a unique <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">permalink</span></span></code> per file.</li><li>Ship <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span></span></code> to your host or CDN.</li></ol><h3><a href="#task-lists" aria-hidden="true" class="anchor" id="task-lists"></a>Task lists</h3><p><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">tasklist</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code> renders GitHub-style checkboxes (inputs are disabled in static HTML):</p><ul><li><input type="checkbox" checked="" disabled=""/> Enable MDEx extensions in config</li><li><input type="checkbox" disabled=""/> Replace demo copy with your product story</li><li><input type="checkbox" disabled=""/> Point the waitlist form at your backend</li></ul><h3><a href="#table" aria-hidden="true" class="anchor" id="table"></a>Table</h3><p>Tables need <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">extension</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="4437958453-1">[</span><span class="ss">table</span><span class="p">:</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="4437958453-1">]</span></span></code>:</p><table><thead><tr><th>Topic</th><th>Where to look</th></tr></thead><tbody><tr><td>Markdown pipeline</td><td><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex</span><span class="o">/</span><span class="n">md_ex_converter</span><span class="o">.</span><span class="n">ex</span></span></code>, <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex</span><span class="o">/</span><span class="n">markdown</span><span class="o">/</span><span class="n">code_blocks</span><span class="o">.</span><span class="n">ex</span></span></code></td></tr><tr><td>MDEx options</td><td><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span><span class="n">config</span><span class="o">.</span><span class="n">exs</span></span></code> → <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">markdown</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="0452629640-1">[</span><span class="ss">mdex</span><span class="p">:</span><span class="w"> </span><span class="err">…</span><span class="p" data-group-id="0452629640-1">]</span></span></code></td></tr><tr><td>Post layout</td><td><code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">layouts</span><span class="o">/</span><span class="n">post_layout</span><span class="o">.</span><span class="n">ex</span></span></code> (<code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">.</span><span class="n">typo</span></span></code> wraps body HTML)</td></tr></tbody></table><h3><a href="#blockquote" aria-hidden="true" class="anchor" id="blockquote"></a>Blockquote</h3><blockquote><p>Blockquotes use the <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">.</span><span class="n">typo</span><span class="w"> </span><span class="n">blockquote</span></span></code> styles: layer background, border, and italic body text for callouts that are not GitHub alerts.</p></blockquote><h3><a href="#image" aria-hidden="true" class="anchor" id="image"></a>Image</h3><p>Site-root paths resolve after <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">build</span></span></code> (static files live under <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span></span></code>):</p><p><img src="/images/og.svg" alt="Default Open Graph image bundled with Soonex"/></p><h3><a href="#github-style-alerts" aria-hidden="true" class="anchor" id="github-style-alerts"></a>GitHub-style alerts</h3><p>With <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">alerts</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code>, MDEx emits <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">div</span><span class="o">.</span><span class="n">markdown</span><span class="o">-</span><span class="n">alert</span></span></code> blocks. Titles come from the alert keyword.</p><div class="markdown-alert markdown-alert-note"><p class="markdown-alert-title">Note</p><p>Use <strong>Note</strong> for neutral context that readers should notice.</p></div><div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title">Tip</p><p>Use <strong>Tip</strong> for shortcuts, conventions, or quality-of-life details.</p></div><div class="markdown-alert markdown-alert-important"><p class="markdown-alert-title">Important</p><p>Use <strong>Important</strong> for security, data loss, or breaking-change warnings.</p></div><div class="markdown-alert markdown-alert-warning"><p class="markdown-alert-title">Warning</p><p>Use <strong>Warning</strong> when behavior may surprise operators.</p></div><div class="markdown-alert markdown-alert-caution"><p class="markdown-alert-title">Caution</p><p>Use <strong>Caution</strong> when the outcome depends on environment or ordering.</p></div><h3><a href="#footnotes" aria-hidden="true" class="anchor" id="footnotes"></a>Footnotes</h3><p>Footnotes need <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">footnotes</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code>. References render as superscript links; definitions are collected at the end of the document<sup class="footnote-ref"><a href="#fn-soonex" id="fnref-soonex" data-footnote-ref="data-footnote-ref">1</a></sup>.</p><h3><a href="#fenced-and-inline-code" aria-hidden="true" class="anchor" id="fenced-and-inline-code"></a>Fenced and inline code</h3><p>Fenced blocks use the Soonex pipeline (Makeup + Corex <strong>Code</strong> + <strong>Clipboard</strong> when a <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">language</span><span class="o">-</span><span class="err">…</span></span></code> class is present):</p><div class="relative"><pre data-scope="code" data-part="root" tabindex="0" class="code max-w-none"><code data-scope="code" data-part="content"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Demo</span><span class="w"> </span><span class="k" data-group-id="9901814416-1">do</span><span class="w"> </span><span class="na">@moduledoc</span><span class="w"> </span><span class="s">&quot;Shown in the gallery&quot;</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">hello</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="ss">:soonex</span><span class="w"> </span><span class="k" data-group-id="9901814416-1">end</span><span class="w"> </span></code></pre><div id="soonex-md-1214b17feec8e4d70c09d6c9" phx-hook="Clipboard" data-loading="data-loading" phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;attrs&quot;:[&quot;data-loading&quot;]}]]" class="clipboard clipboard--sm absolute top-2 right-2 z-10" data-default-value="defmodule Demo do
  @moduledoc &quot;Shown in the gallery&quot;
  def hello, do: :soonex
end
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex-md-1214b17feec8e4d70c09d6c9"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-1214b17feec8e4d70c09d6c9&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="root" data-scope="clipboard" id="clipboard:soonex-md-1214b17feec8e4d70c09d6c9" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-1214b17feec8e4d70c09d6c9\\:control&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;]}]]" data-orientation="horizontal" data-part="control" data-scope="clipboard" id="clipboard:soonex-md-1214b17feec8e4d70c09d6c9:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-1214b17feec8e4d70c09d6c9\\:trigger&quot;,&quot;attrs&quot;:[&quot;type&quot;,&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-copied&quot;,&quot;data-disabled&quot;,&quot;data-hover&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;]}]]" data-orientation="horizontal" data-part="trigger" data-scope="clipboard" id="clipboard:soonex-md-1214b17feec8e4d70c09d6c9:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-1214b17feec8e4d70c09d6c9\\:copy&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copy" data-scope="clipboard" id="clipboard:soonex-md-1214b17feec8e4d70c09d6c9:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex-md-1214b17feec8e4d70c09d6c9\\:copied&quot;,&quot;attrs&quot;:[&quot;data-orientation&quot;,&quot;dir&quot;,&quot;id&quot;,&quot;data-active&quot;,&quot;data-focus&quot;,&quot;data-focus-visible&quot;,&quot;data-hover&quot;,&quot;data-disabled&quot;]}]]" data-orientation="horizontal" data-part="copied" data-scope="clipboard" id="clipboard:soonex-md-1214b17feec8e4d70c09d6c9:copied"><span class="hero-check "></span></span></button></div></div></div></div><p>Inline highlighter: <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">Mix.Task</span><span class="o">.</span><span class="n">run</span><span class="p" data-group-id="4123282596-1">(</span><span class="s">&quot;tableau.build&quot;</span><span class="p" data-group-id="4123282596-1">)</span></span></code> and <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">deps</span><span class="o">.</span><span class="n">get</span></span></code>.</p><h3><a href="#raw-html-render-unsafe-true" aria-hidden="true" class="anchor" id="raw-html-render-unsafe-true"></a>Raw HTML (<code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">render</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="9411850004-1">[</span><span class="ss">unsafe</span><span class="p">:</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="9411850004-1">]</span></span></code>)</h3><p>With <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="ss">unsafe</span><span class="p">:</span><span class="w"> </span><span class="no">true</span></span></code>, trusted HTML passes through MDEx. Use sparingly in content you control:</p><details><summary>Example: native <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">details</span></span></code> / <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">summary</span></span></code></summary><p>Pair with <kbd>Ctrl</kbd>+<kbd>B</kbd> style keys using the <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="o">.</span><span class="n">typo</span><span class="w"> </span><span class="n">kbd</span></span></code> styles.</p></details><hr/><blockquote><p><strong>Tip:</strong> After <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">tableau</span><span class="o">.</span><span class="n">build</span></span></code>, open <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span><span class="n">docs</span><span class="o">/</span><span class="n">index</span><span class="o">.</span><span class="n">html</span></span></code> to confirm exactly what shipped for this permalink.</p></blockquote><section class="footnotes" data-footnotes="data-footnotes"><ol><li id="fn-soonex"><p>See <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">Soonex.MDExConverter</span><span class="o">.</span><span class="n">convert</span><span class="o">/</span><span class="mi">4</span></span></code> and <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">Application</span><span class="o">.</span><span class="n">get_env</span><span class="p" data-group-id="9194358970-1">(</span><span class="ss">:tableau</span><span class="p">,</span><span class="w"> </span><span class="ss">:config</span><span class="p" data-group-id="9194358970-1">)</span><span class="p" data-group-id="9194358970-2">[</span><span class="ss">:markdown</span><span class="p" data-group-id="9194358970-2">]</span><span class="p" data-group-id="9194358970-3">[</span><span class="ss">:mdex</span><span class="p" data-group-id="9194358970-3">]</span></span></code> for the exact option map passed to <code data-scope="code" data-part="root" class="code"><span data-scope="code" data-part="content"><span class="nc">MDEx</span><span class="o">.</span><span class="n">to_html!</span><span class="o">/</span><span class="mi">2</span></span></code>. <a href="#fnref-soonex" class="footnote-backref" data-footnote-backref="data-footnote-backref" data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p></li></ol></section> ]]></description>
    </item>
  </channel>
</rss>
