<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <atom:link href="https://corex-ui.github.io/soonex_i18n/feed.xml" rel="self" type="application/rss+xml" />
  <title>SoonexI18n</title>
  <link>https://corex-ui.github.io/soonex_i18n</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>استخدام قالب Soonex متعدد اللغات</title>
       <link>https://corex-ui.github.io/ar/docs/</link>
       <pubDate>Fri, 08 May 2026 12:00:00 UTC</pubDate>
       <guid>https://corex-ui.github.io/ar/docs/</guid>
       <description><![CDATA[ <h2><a href="#الحصول-على-الكود" aria-hidden="true" class="anchor" id="الحصول-على-الكود"></a>الحصول على الكود</h2><p>استنسخ مستودع <strong><code class="code" data-scope="code" data-part="root"><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_i18n</span></span></code></strong>:</p><div class="relative"><pre class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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><span class="nf">cd</span><span class="n"> soonex_i18n</span><span class="w"> </span></code></pre><div id="soonex_i18n-md-bce1ca2b3241324fbf7ba599" 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
cd soonex_i18n
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex_i18n-md-bce1ca2b3241324fbf7ba599"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599&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_i18n-md-bce1ca2b3241324fbf7ba599" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:copied"><span class="hero-check "></span></span></button></div></div></div></div><p>لموقع <strong>بلغة واحدة</strong> بدون بادئة مسار لكل لغة، استخدم <strong><code class="code" data-scope="code" data-part="root"><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></strong>.</p><h2><a href="#التشغيل-الأول" aria-hidden="true" class="anchor" id="التشغيل-الأول"></a>التشغيل الأول</h2><p><code class="code" data-scope="code" data-part="root"><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> ثم <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">setup</span></span></code> (أو أوامر <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">localize</span></span></code> المناسبة)، ثم <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">npm</span><span class="w"> </span><span class="n">install</span></span></code> داخل <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">assets</span><span class="o">/</span></span></code>، ثم <code class="code" data-scope="code" data-part="root"><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> و<code class="code" data-scope="code" data-part="root"><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> أو <code class="code" data-scope="code" data-part="root"><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>.</p><h2><a href="#تغيير-اسم-المشروع" aria-hidden="true" class="anchor" id="تغيير-اسم-المشروع"></a>تغيير اسم المشروع</h2><p>من جذر المستودع، اختر اسماً لـ OTP بصيغة <strong>snake_case</strong> (أحرف صغيرة وأرقام و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="bp">_</span></span></code>). <strong>التزم بتفرع أو commit أولاً</strong>, لا يوجد تراجع.</p><div class="relative"><pre class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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_i18n-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_i18n-md-06899abc5d00b50d29560bc9"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:copied"><span class="hero-check "></span></span></button></div></div></div></div><p>المهمة تحدّث <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">test</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">priv</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="o">.</span><span class="n">exs</span></span></code> وبعض ملفات npm، ثم تعيد تسمية المجلدات <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n_web</span><span class="o">/</span></span></code> (وما يقابلهما في <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">test</span><span class="o">/</span></span></code> إن وُجد). بعدها نفّذ <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">format</span></span></code></strong> و**<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">compile</span></span></code>**.</p><p>ملفات <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code></strong> و<strong>README</strong> لا تُعدّل تلقائياً حتى تبقى روابط المستودعات كما هي؛ عدّل النصوص يدوياً عند الحاجة.</p><h2><a href="#اللغة-الافتراضة-واللغات-المتاحة" aria-hidden="true" class="anchor" id="اللغة-الافتراضة-واللغات-المتاحة"></a>اللغة الافتراضة واللغات المتاحة</h2><p>في <a href="lib/soonex_i18n/gettext.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">gettext</span><span class="o">.</span><span class="n">ex</span></span></code></a>: <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">default_locale</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">allowed_locales</span></span></code>. اضبط <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="ss">:localize</span></span></code> في <a href="config/config.exs"><code class="code" data-scope="code" data-part="root"><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></a> (<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">supported_locales</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">default_locale</span></span></code> صريح مثل <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="s">&quot;en&quot;</span></span></code> حتى لا يعتمد البناء على متغير <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">LANG</span></span></code> في بيئات CI). كل منشور Markdown يحتاج <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">permalink</span></span></code></strong> خاص به لكل لغة (مثل <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="o">/</span><span class="n">en</span><span class="o">/</span><span class="n">docs</span><span class="o">/</span></span></code> و<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="o">/</span><span class="n">ar</span><span class="o">/</span><span class="n">docs</span><span class="o">/</span></span></code>).</p><h2><a href="#السمة-والوضع" aria-hidden="true" class="anchor" id="السمة-والوضع"></a>السمة والوضع</h2><p>السمات في <a href="lib/soonex_i18n/theme.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">theme</span><span class="o">.</span><span class="n">ex</span></span></code></a> واستيرادات CSS. الوضع الفاتح/الداكن عبر <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">data</span><span class="o">-</span><span class="n">mode</span></span></code> و<a href="lib/soonex_i18n/mode.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">mode</span><span class="o">.</span><span class="n">ex</span></span></code></a>.</p><h2><a href="#إزالة-السمة-أو-الوضع" aria-hidden="true" class="anchor" id="إزالة-السمة-أو-الوضع"></a>إزالة السمة أو الوضع</h2><p>في <a href="lib/layouts/root/demo.ex"><code class="code" data-scope="code" data-part="root"><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> احذف كتلة <code class="code" data-scope="code" data-part="root"><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> للسمة أو <code class="code" data-scope="code" data-part="root"><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> للوضع أو الاثنين مع الإبقاء على مبدّل اللغة إن رغبت.</p><hr/><blockquote><p><strong>تلميح:</strong> بعد <code class="code" data-scope="code" data-part="root"><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> راجع <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span><span class="n">ar</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>.</p></blockquote> ]]></description>
    </item>
    <item>
       <title>Using the Soonex i18n template</title>
       <link>https://corex-ui.github.io/en/docs/</link>
       <pubDate>Fri, 08 May 2026 12:00:00 UTC</pubDate>
       <guid>https://corex-ui.github.io/en/docs/</guid>
       <description><![CDATA[ <p>This guide walks through cloning <strong>soonex_i18n</strong>, running the static site pipeline, renaming the OTP app, and tuning locales, themes, color mode, and demo chrome. Further down, a <strong>Markdown feature gallery</strong> shows what MDEx emits for the extensions enabled in <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">table</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">tasklist</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">strikethrough</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">autolink</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">alerts</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">footnotes</span></span></code>, and <code class="code" data-scope="code" data-part="root"><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 SoonexI18n 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 localized 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 class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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><span class="nf">cd</span><span class="n"> soonex_i18n</span><span class="w"> </span></code></pre><div id="soonex_i18n-md-bce1ca2b3241324fbf7ba599" 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
cd soonex_i18n
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex_i18n-md-bce1ca2b3241324fbf7ba599"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599&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_i18n-md-bce1ca2b3241324fbf7ba599" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-bce1ca2b3241324fbf7ba599\\: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_i18n-md-bce1ca2b3241324fbf7ba599: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 class="code" data-scope="code" data-part="root"><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_i18n</span><span class="o">.</span><span class="n">git</span></span></code></p><p>Then <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">cd</span></span></code> into the repo directory you cloned.</p><h3><a href="#single-language-template" aria-hidden="true" class="anchor" id="single-language-template"></a>Single-language template</h3><p>For a <strong>single-language</strong> layout without locale path prefixes, use the sibling template <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">soonex</span></span></code></strong>:</p><div class="relative"><pre class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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></code></pre><div id="soonex_i18n-md-d1429106c3dbef2f34988f32" 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
" data-orientation="horizontal" data-trigger-aria-label="Copy code" id="soonex_i18n-md-d1429106c3dbef2f34988f32"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-d1429106c3dbef2f34988f32&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_i18n-md-d1429106c3dbef2f34988f32" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-d1429106c3dbef2f34988f32\\: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_i18n-md-d1429106c3dbef2f34988f32:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-d1429106c3dbef2f34988f32\\: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_i18n-md-d1429106c3dbef2f34988f32:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-d1429106c3dbef2f34988f32\\: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_i18n-md-d1429106c3dbef2f34988f32:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-md-d1429106c3dbef2f34988f32\\: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_i18n-md-d1429106c3dbef2f34988f32: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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">templates</span><span class="o">/</span><span class="n">soonex_i18n</span></span></code>. The default is <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="p" data-group-id="0714431734-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="0714431734-1">}</span></span></code></strong> from Hex; to build against a sibling <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">corex</span></span></code></strong> repo, switch <strong><code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="p" data-group-id="1217004629-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="1217004629-1">}</span></span></code></strong> and run <strong><code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">setup</span></span></code><br/>
Or run <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">mix</span><span class="w"> </span><span class="n">localize</span><span class="o">.</span><span class="n">download_locales</span></span></code> (and any other steps your checkout documents) if you are not using the default <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">setup</span></span></code> alias.</li><li><code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span></span></code>, or <code class="code" data-scope="code" data-part="root"><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 class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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_i18n-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_i18n-md-06899abc5d00b50d29560bc9"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-06899abc5d00b50d29560bc9:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">config</span><span class="o">/</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">test</span><span class="o">/</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">priv</span><span class="o">/</span></span></code>, and <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">package</span><span class="o">.</span><span class="n">json</span></span></code> / <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span></span></code> → <code class="code" data-scope="code" data-part="root"><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> and <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n_web</span><span class="o">/</span></span></code> → <code class="code" data-scope="code" data-part="root"><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>, plus matching <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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_i18n</span></span></code> stay accurate. Update branding copy yourself if you rebrand the app.</p><h2><a href="#locales-and-static-posts" aria-hidden="true" class="anchor" id="locales-and-static-posts"></a>Locales and static posts</h2><h3><a href="#gettext-and-localize" aria-hidden="true" class="anchor" id="gettext-and-localize"></a>Gettext and Localize</h3><ol><li>Open <a href="lib/soonex_i18n/gettext.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">gettext</span><span class="o">.</span><span class="n">ex</span></span></code></a> and set <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">default_locale</span></span></code> and <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">allowed_locales</span></span></code> to the languages you ship.</li><li>Align <a href="config/config.exs"><code class="code" data-scope="code" data-part="root"><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></a><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="ss">:localize</span></span></code> with those locale codes: <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">supported_locales</span></span></code> and an explicit <strong><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">default_locale</span></span></code></strong> string (for example <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="s">&quot;en&quot;</span></span></code>). The explicit default keeps <code class="code" data-scope="code" data-part="root"><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> and CI from depending on POSIX <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">LANG</span></span></code> (often <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">C.UTF</span><span class="o">-</span><span class="mi">8</span></span></code> on GitHub Actions), which is not a valid BCP 47 tag for Localize’s default-locale resolution.</li></ol><h3><a href="#permalinks-and-_posts" aria-hidden="true" class="anchor" id="permalinks-and-_posts"></a>Permalinks and <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code></h3><p>Add or remove Markdown under <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code> with <strong>one permalink per language</strong> (for example <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="o">/</span><span class="n">en</span><span class="o">/</span><span class="n">docs</span><span class="o">/</span></span></code> and <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="o">/</span><span class="n">ar</span><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_i18n/theme.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="p" data-group-id="5492725931-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="5492725931-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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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_i18n/mode.ex"><code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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, and keep the language <code class="code" data-scope="code" data-part="root"><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> if you still want a locale switcher on the static site.</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 class="code" data-scope="code" data-part="root"><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="1061350986-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="1061350986-1">]</span></span></code> and the <strong>SoonexI18n</strong> post-processing step (<code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">SoonexI18n.MDExConverter</span></span></code> → <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">SoonexI18n.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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c1">##</span></span></code> maps to <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c1">###</span></span></code> to <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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> and <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">gettext</span><span class="o">.</span><span class="n">ex</span></span></code> for locales.</li><li>Add posts under <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_posts</span><span class="o">/</span></span></code> with a unique <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">permalink</span></span></code> per file.</li><li>Ship <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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="3454771033-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="3454771033-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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</span><span class="o">/</span><span class="n">md_ex_converter</span><span class="o">.</span><span class="n">ex</span></span></code>, <code class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">lib</span><span class="o">/</span><span class="n">soonex_i18n</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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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="3226729345-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="3226729345-1">]</span></span></code></td></tr><tr><td>Post layout</td><td><code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 SoonexI18n pipeline (Makeup + Corex <strong>Code</strong> + <strong>Clipboard</strong> when a <code class="code" data-scope="code" data-part="root"><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 class="code max-w-none" data-scope="code" data-part="root" tabindex="0"><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="0827514878-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="0827514878-1">end</span><span class="w"> </span></code></pre><div id="soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9"><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9" class=""><div phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9:control" class=""><button phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9:trigger" type="button" aria-label="Copy" class=""><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9:copy"><span class="hero-clipboard "></span></span><span phx-mounted="[[&quot;ignore_attrs&quot;,{&quot;to&quot;:&quot;#clipboard\\:soonex_i18n-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_i18n-md-1214b17feec8e4d70c09d6c9:copied"><span class="hero-check "></span></span></button></div></div></div></div><p>Inline highlighter: <code class="code" data-scope="code" data-part="root"><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="5843428396-1">(</span><span class="s">&quot;tableau.build&quot;</span><span class="p" data-group-id="5843428396-1">)</span></span></code> and <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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="4784075062-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="4784075062-1">]</span></span></code>)</h3><p>With <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="n">details</span></span></code> / <code class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="c">_site</span><span class="o">/</span><span class="n">en</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 class="code" data-scope="code" data-part="root"><span data-scope="code" data-part="content"><span class="nc">SoonexI18n.MDExConverter</span><span class="o">.</span><span class="n">convert</span><span class="o">/</span><span class="mi">4</span></span></code> and <code class="code" data-scope="code" data-part="root"><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="9236241931-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="9236241931-1">)</span><span class="p" data-group-id="9236241931-2">[</span><span class="ss">:markdown</span><span class="p" data-group-id="9236241931-2">]</span><span class="p" data-group-id="9236241931-3">[</span><span class="ss">:mdex</span><span class="p" data-group-id="9236241931-3">]</span></span></code> for the exact option map passed to <code class="code" data-scope="code" data-part="root"><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>
