<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="383544" data-post-id="383544">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-383544-release-010-alpha23-1" class="anchor" href="#p-383544-release-010-alpha23-1" aria-label="Heading link" rel="nofollow"></a>Release 0.1.0-alpha.23</h2>
<p>11 new components:</p>
<ul>
<li>Angle Slider</li>
<li>Avatar</li>
<li>Carousel</li>
<li>Editable</li>
<li>Floating Panel</li>
<li>Listbox</li>
<li>Number Input</li>
<li>Password Input</li>
<li>Pin Input</li>
<li>Radio Group</li>
<li>Timer.</li>
</ul>
<p>So far the development has been pleasant and thanks to my previous integration for static websites, I can focus on the component architecture and life cycle instead of the Vanilla JS integration details.</p>
<p>I would say that core integration of ZagJS is easier on Phoenix compared to a static site because we are able to render server side. While on a static website we require the client to handle the whole structure.</p>
<p>On the other hand, on a static website there is no server updates, or in our case Live View life cycle, which adds another level of integration complexity.</p>
<p>Next is to test and document the missing form components integrations for controllers, Liveview and Ecto changesets</p>
<p>The <a href="https://corex.gigalixirapp.com/en" rel="noopener nofollow ugc">demo site has been updated</a> with the new components.</p>
<p>Happy coding</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383544" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-383544" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383544"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="383792" data-post-id="383792">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>How to render and search 9000+ items in a Combobox?</p>
<p>The <a href="https://hexdocs.pm/corex/Corex.Combobox.html" rel="noopener nofollow ugc">Corex combobox</a> component works great for dozens or even hundreds of items. It receives the full list and filters client-side on every keystroke.</p>
<p>But what happens when your list reaches the thousands?</p>
<p>Client-side filtering breaks down. You can’t ship 10,000 items to the browser and call it a day.</p>
<p>The solution: keep rendering client-side, but let the server own the data.</p>
<p>Disable client-side filtering, listen to the input change event, and update the item list on the fly from the server. The component still renders what it receives, you just control what it receives.</p>
<p>For the curious, this has been made possible with the <a href="https://github.com/chakra-ui/zag/pull/2917" rel="noopener nofollow ugc">latest update</a> on ZagJS Vanilla machine allowing runtime updates of the props combined with the <code>updated()</code> hook life cycle of Live View</p>
<p>This gives you the best of both worlds:</p>
<ul>
<li>Instant client-side rendering, accessibility attributes and keyboard navigation</li>
<li>Server-side queries that scale to any dataset size</li>
<li>Full control over the initial state on mount, you can even display  a totally different list of items</li>
<li>Custom empty state slot when nothing matches</li>
<li>Compatible with groups or items. Search can also include the group name</li>
<li>Integrates with Phoenix form</li>
</ul>
<p><strong>Minimal code</strong></p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyAppWeb.CountryCombobox do
  use MyAppWeb, :live_view

  @items [
    %{id: "fra", label: "France"},
    %{id: "bel", label: "Belgium"},
    %{id: "deu", label: "Germany"},
    %{id: "usa", label: "USA"},
    %{id: "jpn", label: "Japan"}
  ]

  def mount(_params, _session, socket) do
    {:ok, assign(socket, items: [])}
  end

  def handle_event("search", %{"value" =&gt; value, "reason" =&gt; "input-change"}, socket) do
    filtered =
      if byte_size(value) &lt; 1 do
        []
      else
        term = String.downcase(value)
        Enum.filter(@items, fn item -&gt;
          String.contains?(String.downcase(item.label), term)
        end)
      end

    {:noreply, assign(socket, items: filtered)}
  end

  def render(assigns) do
    ~H"""
    &lt;.combobox
      id="country-combobox"
      collection={@items}
      filter={false}
      on_input_value_change="search"
    &gt;
      &lt;:empty&gt;No results&lt;/:empty&gt;
      &lt;:trigger&gt;&lt;.icon name="hero-chevron-down" /&gt;&lt;/:trigger&gt;
    &lt;/.combobox&gt;
    """
  end
end
</code></pre>
<p>Disable client filtering with <code>disabled={false}</code><br>
Use <code>on_input_value_change</code> to filter on the server.<br>
This example uses a local list, you can replace it with a database query.</p>
<p><a href="https://corex.gigalixirapp.com/en/live/combobox-form" rel="noopener nofollow ugc">Try it yourself</a>, search over 9000 airports grouped across 250 cities.</p>
<p><a href="https://corex.gigalixirapp.com/en/live/combobox-form" class="onebox" target="_blank" rel="noopener nofollow ugc">https://corex.gigalixirapp.com/en/live/combobox-form</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383792" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-383792" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383792"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="384947" data-post-id="384947">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h3><a name="p-384947-corex-generators-1" class="anchor" href="#p-384947-corex-generators-1" aria-label="Heading link" rel="nofollow"></a>Corex Generators</h3>
<p>Based of Phoenix Installer (phx_new 1.8.4) and Phoenix mix tasks, Corex generators adds new features to get you started in minutes with Phoenix and Corex.</p>
<p>The original Phoenix installer is great as it includes tests but also a separated Integration test suite.<br>
This makes sure that the generated app passes compilation, formatting and tests in a real usage.</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/8/0/80accec64a5752e42315e607de2a5aecaaeb9540.png" data-download-href="https://forum.elixirforum.com/uploads/default/80accec64a5752e42315e607de2a5aecaaeb9540" title="home_live" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/8/0/80accec64a5752e42315e607de2a5aecaaeb9540_2_690x541.png" alt="home_live" data-base62-sha1="imjm0KSJxF2PLMbM35PyTH3Bvm8" width="690" height="541" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/8/0/80accec64a5752e42315e607de2a5aecaaeb9540_2_690x541.png, https://forum.elixirforum.com/uploads/default/optimized/3X/8/0/80accec64a5752e42315e607de2a5aecaaeb9540_2_1035x811.png 1.5x, https://forum.elixirforum.com/uploads/default/original/3X/8/0/80accec64a5752e42315e607de2a5aecaaeb9540.png 2x" data-dominant-color="EEF0F4"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">home_live</span><span class="informations">1038×814 52.4 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p><strong>mix corex.new</strong></p>
<p>Accepts the same flag than <code>mix.phx.new</code> plus:</p>
<ul>
<li>
<p><code>--mode</code> enable light/dark mode switching. Adds a Mode  Switcher using Corex.ToggleGroup</p>
</li>
<li>
<p><code>--theme</code> enable theme switching. Adds a Theme Switcher using Corex.Select. (e.g. <code>--theme neo:uno:duo:leo</code>)</p>
</li>
<li>
<p><code>--lang</code> - enable language switching. Adds a Language Switcher using Corex.Select. (e.g. <code>--lang en:ar:fr</code>)</p>
</li>
<li>
<p><code>--rtl</code> - enable RTL support for slect languages (e.g. <code>--lang en:ar:fr --rtl ar</code>)</p>
</li>
<li>
<p><code>--design</code> - Include Corex design (tokens and component CSS). When no-design, it uses a prebuilt default.css instead (same as the original Phoenix installer with --no-tailwind).<br>
You can safely delete it to have a fully unstyled setup.</p>
</li>
<li>
<p><code>--designex</code> - use Designex to build your Corex tokens from Design Tokens using Style Dictionnary and Tokens Studio</p>
</li>
<li>
<p><code>--a11y</code> - Include accessibility testing (Wallaby, a11y_audit) for all generated pages</p>
</li>
<li>
<p><code>--tidewave</code> - Include Tidewave dev dependency and the Tidewave Plug in the endpoint</p>
</li>
</ul>
<p>Each generated app also include a custom Controller and a Live View page example to showcase the use of Client and Server events and API</p>
<p><strong>mix corex.gen.html<br>
mix corex.gen.live</strong></p>
<p>Based of Phoenix <code>mix phx.gen.*</code>, it accept the same flags and adds support for the use of Corex components.<br>
Using project generator config ( similar to Phoenix Scope)  it respects your Mode, Theme and Languages settings.<br>
The generated form inputs have been also updated to use Corex Component: Select, Checkbox, PasswordInput, DatePicker and Native Input for the other types</p>
<h3><a name="p-384947-new-components-2" class="anchor" href="#p-384947-new-components-2" aria-label="Heading link" rel="nofollow"></a>New Components</h3>
<p>New components have been:</p>
<ul>
<li>Data Table( adds supports for sorting and row selection with Corex.Checkbox)</li>
<li>Data List</li>
<li>Native Input (10+ types)</li>
<li>Layout Heading (used in the Corex generators)</li>
<li>Action</li>
<li>Navigate</li>
<li>Marquee</li>
<li>Code</li>
</ul>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/c/e/ceae7a8574661ef80e75420c5a45dcde3af1bfcb.png" data-download-href="https://forum.elixirforum.com/uploads/default/ceae7a8574661ef80e75420c5a45dcde3af1bfcb" title="data_table" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/c/e/ceae7a8574661ef80e75420c5a45dcde3af1bfcb_2_690x297.png" alt="data_table" data-base62-sha1="tuob0DQ7M2NL8xTeVPQ4aLJ9qKn" width="690" height="297" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/c/e/ceae7a8574661ef80e75420c5a45dcde3af1bfcb_2_690x297.png, https://forum.elixirforum.com/uploads/default/original/3X/c/e/ceae7a8574661ef80e75420c5a45dcde3af1bfcb.png 1.5x, https://forum.elixirforum.com/uploads/default/original/3X/c/e/ceae7a8574661ef80e75420c5a45dcde3af1bfcb.png 2x" data-dominant-color="EEEFF2"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">data_table</span><span class="informations">884×381 29.4 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<h3><a name="p-384947-unified-translations-3" class="anchor" href="#p-384947-unified-translations-3" aria-label="Heading link" rel="nofollow"></a>Unified Translations</h3>
<p>Some components require accessible text such are next or prev trigger on the data picker or toggle visiblity on the password input.<br>
Corex now uses a single attribute for all components called <code>translations</code> that use a default value in English.<br>
All the translation are also translation ready with Gettext<br>
This remove the burden to remember or to add the text manually while still offering full customization.</p>
<h3><a name="p-384947-phoenix-stream-support-4" class="anchor" href="#p-384947-phoenix-stream-support-4" aria-label="Heading link" rel="nofollow"></a>Phoenix Stream support</h3>
<p>We have seen above the classic use of the Phoenix stream with a Data Table.<br>
Phoenix Stream can also be implemented on any of the Corex components accepting a list of Items.<br>
The components accept a Phoenix Stream as a list of items and will update the listbox accordingly, while keeping all accessibility features and states.<br>
This means that if the user is focusing an item (with keyboard for example), the focus is preserved even after the list is updated</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/b/5/b58f909d14b20c68c741022118f84ea427e14505.png" data-download-href="https://forum.elixirforum.com/uploads/default/b58f909d14b20c68c741022118f84ea427e14505" title="listbox_stream" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/b/5/b58f909d14b20c68c741022118f84ea427e14505.png" alt="listbox_stream" data-base62-sha1="pUa0wLyXRu5susoXYQdOq8NYUmx" width="281" height="380"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">listbox_stream</span><span class="informations">375×507 12.8 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>This has been made possible by the ability for the Vanilla JS machine to update its props during runtime.<br>
In combinaison with Phoenix Live VIew, it opens new possibilities for client/server interactions<br>
More Stream examples with other components coming soon.</p>
<p>All form component have been also updated in order to fix an issue in controlled mode related to ZagJS Vanilla machine bindings. It has now being resolved with the help from the Zag team.<br>
Testing has also been expended to cover the use of Ecto Changeset on all form components.</p>
<h3><a name="p-384947-corex-design-5" class="anchor" href="#p-384947-corex-design-5" aria-label="Heading link" rel="nofollow"></a>Corex Design</h3>
<p>The default themes have been updated to show the ability to change any design tokens per theme, not only colors. Meaning you can specify different spacing, radius border and more per theme, it is even possible per mode also.</p>
<p>Did you know that Corex Design is totally optional?<br>
<strong>Every components is unstyled</strong>, meaning there is not a single attribute or styling in any of the Corex components.<br>
You can even use Corex Mode and Themes Plugs without Corex design. Yes they are also fully unstyled and not linked to Corex in any ways.<br>
This is an important approach that allows integrating the components into your existing design system</p>
<h3><a name="p-384947-upgrade-6" class="anchor" href="#p-384947-upgrade-6" aria-label="Heading link" rel="nofollow"></a>Upgrade</h3>
<p>While still in <strong>Alpha version</strong>, upgrading to the latest version comes with (undocumented) breaking changes such as renaming component attributes for consistency (for example: collection to items).<br>
If you encounter any issues while upgrading, drop me a message, I can help you out adapting the components to the latest version.</p>
<p>Happy coding</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://corex.gigalixirapp.com/en">
  <header class="source">
      <img src="https://corex.gigalixirapp.com/images/favicon-7e94605551aa8aa20243bed3756d9343.ico?vsn=d" class="site-icon" alt="" width="48" height="48">

      <a href="https://corex.gigalixirapp.com/en" target="_blank" rel="noopener nofollow ugc">corex.gigalixirapp.com</a>
  </header>

  <article class="onebox-body">
    <img width="" height="" src="https://corex.gigalixirapp.com/corex-ui-og.jpg" class="thumbnail" alt="">

<h3><a href="https://corex.gigalixirapp.com/en" target="_blank" rel="noopener nofollow ugc">Corex · Elixir Phoenix Framework UI Library</a></h3>

  <p>Unstyled, accessible Phoenix components with a full server-and-client API, powered by Zag.js state machines.</p>


  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="384947" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-384947" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="384947"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="388153" data-post-id="388153">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-388153-corex-beta-1-is-live-1" class="anchor" href="#p-388153-corex-beta-1-is-live-1" aria-label="Heading link" rel="nofollow"></a>Corex Beta 1 is live.</h1>
<h2><a name="p-388153-updates-2" class="anchor" href="#p-388153-updates-2" aria-label="Heading link" rel="nofollow"></a>Updates</h2>
<p>This version brings some significant changes to the library:</p>
<ul>
<li>
<p><strong>Removal of phx-update=“ignore”</strong> in favor of JS.ignore_attributes<br>
This was the biggest refactor, it allows composition and nesting with other Corex components, Phoenix components and Phoenix Streams</p>
</li>
<li>
<p><strong>New demo site</strong> with full code examples for each components. Playground, Anatomy, Pattern, API, Event and Forms</p>
</li>
<li>
<p><strong>Corex MCP:</strong> based of Tidewave Phoenix, it add 3 tools to fetch the components documentation and installation guides</p>
</li>
<li>
<p><strong>Api and Events</strong> alignment between all components ( structure, naming and format)</p>
</li>
<li>
<p><strong>Localization</strong> uses <a href="https://github.com/elixir-localize/localize_web" rel="noopener nofollow ugc">LocalizeWeb</a> and Phoenix verified routes instead of custom plug and locale assign.</p>
</li>
<li>
<p><strong>Animation:</strong> Added instant, JS and custom animation (for example “motion”) for Accordion, Dialog and Tree view.</p>
</li>
<li>
<p><strong>Navigation</strong>: Menu, Select and Tree View now accept the same Redirect options to use them as Navigation components</p>
</li>
<li>
<p><strong>Server Side Rendering</strong>. Optimized SSR to eliminate Cumulative Layout Shift (CLS), ensuring the initial HTML payload is fully hydrated before reaching the client.</p>
</li>
<li>
<p><strong>A11y testing</strong> on full pages, not only the components in order to cover Typo, Design and more.</p>
</li>
<li>
<p><strong>Corex Design system</strong> refactoring to use native Tailwind variables when possible and reduce the number of tokens</p>
</li>
</ul>
<h2><a name="p-388153-whats-next-3" class="anchor" href="#p-388153-whats-next-3" aria-label="Heading link" rel="nofollow"></a>What’s next ?</h2>
<ul>
<li>Improved Documentation</li>
<li>Adding documentation for Static Site generation with <a href="https://github.com/elixir-tools/tableau" rel="noopener nofollow ugc">Elixir Tableau</a>.<br>
Corex components are compatbile with Tableau and can be used without any changes to build Static Website (<a href="https://oranje-patrimoine.fr/" rel="noopener nofollow ugc">See example</a>)</li>
<li>Adding missing Zagjs components</li>
<li>Complete the whole Corex design pipeline in Elixir only from palette generation (<a href="https://hex.pm/packages/color" rel="nofollow">Color</a>) to Design Tokens (<a href="https://hex.pm/packages/designex" rel="nofollow">Designex</a>) to Tailwind v4 variables ( the pipeline is already in use in the Demo site)</li>
<li>Igniter installer to add Corex to existing projects</li>
</ul>
<p>Feedback, suggestions and questions are always welcome<br>
Happy coding</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://corex.gigalixirapp.com/">
  <header class="source">
      <img src="https://corex.gigalixirapp.com/images/favicon-7e94605551aa8aa20243bed3756d9343.ico?vsn=d" class="site-icon" alt="" width="48" height="48">

      <a href="https://corex.gigalixirapp.com/" target="_blank" rel="noopener nofollow ugc">corex.gigalixirapp.com</a>
  </header>

  <article class="onebox-body">
    <img width="" height="" src="https://corex.gigalixirapp.com/corex-ui-og.jpg" class="thumbnail" alt="">

<h3><a href="https://corex.gigalixirapp.com/" target="_blank" rel="noopener nofollow ugc">Corex · Elixir Phoenix Framework UI Library</a></h3>

  <p>Unstyled, accessible Phoenix components with a full server-and-client API, powered by Zag.js state machines.</p>


  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388153" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-388153" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388153"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="388569" data-post-id="388569">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Getting closer to a stable release every day <img src="https://forum.elixirforum.com/images/emoji/apple/grin.png?v=15" title=":grin:" class="emoji" alt=":grin:" loading="lazy" width="20" height="20"></p>
<p>Here are the latest Corex updates:</p>
<h2><a name="p-388569-new-templates-1" class="anchor" href="#p-388569-new-templates-1" aria-label="Heading link" rel="nofollow"></a>New Templates</h2>
<p><strong>Soonex</strong> and <strong>Soonex i18n</strong>, static coming soon pages built with <a href="https://github.com/elixir-tools/tableau" rel="noopener nofollow ugc">Elixir Tableau</a> and Corex, using the exact same Phoenix components.</p>
<p>Same HEEx, same hooks, same Corex components. The runtime changes, the codebase doesn’t.</p>
<p>And the <strong>asset pipeline</strong> never leaves Elixir: color palette to design tokens to Tailwind v4.</p>
<p>The <strong>i18n</strong> template uses <a href="https://github.com/elixir-localize/localize_web" rel="noopener nofollow ugc">Localize Web</a> to download language data at build time. One command pulls each language’s direction (ltr/rtl) and its label in its own native script:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">mix localize.download_locales
</code></pre>
<p>Full <strong>A11y</strong> testing on every page, GitHub Actions workflow out of the box, and Corex MCP integrated so your editor stays in sync with Corex documentation.</p>
<p>100% open source. MIT licensed.</p>
<p><a href="https://corex.gigalixirapp.com/templates" rel="noopener nofollow ugc">Soonex live demo &amp; GitHub</a></p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/f/f/ffaec6d9d048762570efb3a78d9517364a04816a.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/ffaec6d9d048762570efb3a78d9517364a04816a" title="screencapture-corex-ui-github-io-soonex-i18n-2026-05-10-22_22_36" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/f/f/ffaec6d9d048762570efb3a78d9517364a04816a_2_199x600.jpeg" alt="screencapture-corex-ui-github-io-soonex-i18n-2026-05-10-22_22_36" data-base62-sha1="AtSdaEkSVzWL3o8HnRbJTSbyH2y" width="199" height="600" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/f/f/ffaec6d9d048762570efb3a78d9517364a04816a_2_199x600.jpeg, https://forum.elixirforum.com/uploads/default/optimized/3X/f/f/ffaec6d9d048762570efb3a78d9517364a04816a_2_298x900.jpeg 1.5x, https://forum.elixirforum.com/uploads/default/optimized/3X/f/f/ffaec6d9d048762570efb3a78d9517364a04816a_2_398x1200.jpeg 2x" data-dominant-color="F1F1F1"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">screencapture-corex-ui-github-io-soonex-i18n-2026-05-10-22_22_36</span><span class="informations">1200×3605 140 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<h2><a name="p-388569-new-components-2" class="anchor" href="#p-388569-new-components-2" aria-label="Heading link" rel="nofollow"></a>New Components</h2>
<p>Two new additions with full support for Anatomy, API, Events, and Form integration.</p>
<p><strong>File Upload</strong></p>
<pre data-code-wrap="heex"><code class="lang-heex">&lt;.file_upload id="file-upload" name="document" class="file-upload"&gt;
  &lt;:close&gt;
    &lt;.heroicon name="hero-x-mark" /&gt;
  &lt;/:close&gt;
&lt;/.file_upload&gt;
</code></pre>
<p><strong>File Upload Live</strong></p>
<pre data-code-wrap="heex"><code class="lang-heex">&lt;.file_upload_live upload={@uploads.anatomy} field={:anatomy} id="file-upload-live"&gt;
  &lt;:close&gt;
    &lt;.heroicon name="hero-x-mark" /&gt;
  &lt;/:close&gt;
&lt;/.file_upload_live&gt;
</code></pre>
<p>Both components support custom slots:</p>
<pre data-code-wrap="heex"><code class="lang-heex">&lt;.file_upload_live upload={@uploads.anatomy_custom} field={:anatomy_custom} id="file-upload-live-anatomy-custom"&gt;
  &lt;:dropzone&gt;
    &lt;span&gt;Custom dropzone&lt;/span&gt;
  &lt;/:dropzone&gt;
  &lt;:open&gt;
    &lt;span&gt;Custom trigger&lt;/span&gt;
  &lt;/:open&gt;
  &lt;:close&gt;
    &lt;.heroicon name="hero-x-mark" /&gt;
  &lt;/:close&gt;
&lt;/.file_upload_live&gt;
</code></pre>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/c/b/cb772b9615791241ae7bcb0604478df537a7661b.png" data-download-href="https://forum.elixirforum.com/uploads/default/cb772b9615791241ae7bcb0604478df537a7661b" title="Screenshot from 2026-05-11 17-33-50" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/c/b/cb772b9615791241ae7bcb0604478df537a7661b.png" alt="Screenshot from 2026-05-11 17-33-50" data-base62-sha1="t1WflMMfEha8gzGIlHF9NdnoLaz" width="482" height="324"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Screenshot from 2026-05-11 17-33-50</span><span class="informations">482×324 14.6 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p><a href="https://corex.gigalixirapp.com/en/file-upload/playground" rel="noopener nofollow ugc">File Upload Demo</a></p>
<p>Happy coding and feedback is always welcome <img src="https://forum.elixirforum.com/images/emoji/apple/folded_hands.png?v=15" title=":folded_hands:" class="emoji" alt=":folded_hands:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388569" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-388569" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388569"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="389568" data-post-id="389568">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-389568-corex-010-is-out-1" class="anchor" href="#p-389568-corex-010-is-out-1" aria-label="Heading link" rel="nofollow"></a>Corex 0.1.0 is out</h2>
<p>After many alpha/beta versions and even more mistakes, the first stable release of Corex is on Hex today.</p>
<ul>
<li>
<p><strong>Demo:</strong> <a href="https://corex.gigalixirapp.com/en" class="inline-onebox" rel="noopener nofollow ugc">Corex · Elixir Phoenix Framework UI Library</a></p>
</li>
<li>
<p><strong>GitHub:</strong> <a href="https://github.com/corex-ui/corex" class="inline-onebox" rel="noopener nofollow ugc">GitHub - corex-ui/corex: Corex is an accessible and unstyled UI components library written in Elixir and TypeScript that integrates Zag.js state machines into the Phoenix Framework. · GitHub</a></p>
</li>
<li>
<p><strong>Hex:</strong> <a href="https://hex.pm/packages/corex" class="inline-onebox" rel="nofollow">corex | Hex</a></p>
</li>
<li>
<p><strong>Docs:</strong> <a href="https://hexdocs.pm/corex" class="inline-onebox" rel="noopener nofollow ugc">Corex v0.1.2 — Documentation</a></p>
</li>
</ul>
<hr>
<h3><a name="p-389568-h-010-is-a-promise-2" class="anchor" href="#p-389568-h-010-is-a-promise-2" aria-label="Heading link" rel="nofollow"></a>0.1.0 is a promise</h3>
<pre data-code-wrap="elixir"><code class="lang-elixir">
{:corex, "~&gt; 0.1.0"}

</code></pre>
<p>Patch releases (<code>0.1.1</code>, <code>0.1.2</code>, …) are safe to pull anytime.<br>
<code>mix deps.update corex</code> will not surprise you.<br>
If anything has to break, it goes in <code>0.2.0</code> or higher, never in a patch, with a full upgrade guide and a detailed changelog entry on the day.<br>
You choose when to bump. I do not choose for you.</p>
<hr>
<h3><a name="p-389568-what-sits-underneath-that-promise-3" class="anchor" href="#p-389568-what-sits-underneath-that-promise-3" aria-label="Heading link" rel="nofollow"></a>What sits underneath that promise</h3>
<p>Four separate test suites, all required for any PR:</p>
<ul>
<li>
<p><strong><code>mix test</code></strong> in the main library: unit tests for every component, doc parity check, registry completeness, translation coverage, hooks export contract, component spec snapshots. 90% coverage threshold enforced by ExCoveralls.</p>
</li>
<li>
<p><strong>E2E</strong> in the <code>e2e/</code> Phoenix app: every component rendered in a real LiveView, with axe-core a11y assertions on every documented route, plus form submission and controlled-mode tests.</p>
</li>
<li>
<p><strong>Installer</strong> in <code>installer/</code>: <code>corex_new</code> generates apps with and without <code>--design</code>, <code>--mode</code>, <code>--theme</code>, <code>--lang</code>, <code>--mcp</code>, <code>--designex</code>, and the generated apps are compiled and asserted on.</p>
</li>
<li>
<p><strong>Integration</strong> in <code>integration_test/</code>: a full <code>mix corex.new</code> run, on multiple combinations of options, including a database-backed scenario.</p>
</li>
</ul>
<p>All four matrices run on every PR, across three OTP and Elixir combinations:</p>
<div class="md-table">
<table>
<thead>
<tr>
<th>OTP</th>
<th>Elixir</th>
</tr>
</thead>
<tbody>
<tr>
<td>26.2.5</td>
<td>1.17.3</td>
</tr>
<tr>
<td>27.3</td>
<td>1.18.4</td>
</tr>
<tr>
<td>28.0.1</td>
<td>1.18.4</td>
</tr>
</tbody>
</table>
</div><hr>
<h3><a name="p-389568-how-fast-is-corex-4" class="anchor" href="#p-389568-how-fast-is-corex-4" aria-label="Heading link" rel="nofollow"></a>How fast is Corex ?</h3>
<p>I needed a stress test that did not feel like a benchmark. So I built a Tetris game.</p>
<p>The 10x18 board is real Corex checkboxes. 180 accessible checkbox hooks on screen, all running the same Zag machine as the single checkbox in your form. BEM modifiers pick the piece color. The engine drives cells through the Checkbox client API so each frame is not a LiveView round trip.</p>
<p>What still goes through the server: a GenServer session per game for score, Phoenix Presence for who is playing or watching, a persisted top-10 leaderboard, and a replay route for qualifying runs.</p>
<p>Play is instant. Records are server-owned.</p>
<p><strong>Play it</strong>: <a href="https://corex.gigalixirapp.com/en/showcases/tetrex" class="inline-onebox" rel="noopener nofollow ugc">Tetrex · Elixir Phoenix Framework UI Library</a></p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/7/a/7afb556ea8104c3466340a04f9d4d11c1408d9c9.png" data-download-href="https://forum.elixirforum.com/uploads/default/7afb556ea8104c3466340a04f9d4d11c1408d9c9" title="Screenshot from 2026-05-28 21-28-55" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/7/a/7afb556ea8104c3466340a04f9d4d11c1408d9c9.png" alt="Screenshot from 2026-05-28 21-28-55" data-base62-sha1="hxWJlwuUD4jyY6XiLazHGGuVJy1" width="690" height="398" data-dominant-color="ECEEEE"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Screenshot from 2026-05-28 21-28-55</span><span class="informations">865×500 11.3 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>If you ever wondered whether Corex hooks keep up when state changes fast and often, Tetrex is the answer at the tip of your fingers.</p>
<hr>
<p>A star on the <a href="https://github.com/corex-ui/corex" rel="noopener nofollow ugc">GitHub repo</a> helps more than you might think <img src="https://forum.elixirforum.com/images/emoji/apple/folded_hands.png?v=15" title=":folded_hands:" class="emoji" alt=":folded_hands:" loading="lazy" width="20" height="20"></p>
<p>Happy coding.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="389568" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-389568" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="389568"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="390121" data-post-id="390121">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-390121-changelog-in-style-1" class="anchor" href="#p-390121-changelog-in-style-1" aria-label="Heading link" rel="nofollow"></a>Changelog in Style</h2>
<p>It was a Tuesday, or perhaps a Thursday, when I pushed a commit, a fairly routine one if I remember correctly, and poured a coffee, the first of the day, or possibly the second. Was it coffee? I am not sure anymore.</p>
<p>The CI failed. I think it failed.  At least it was showing failure. A network issue, probably. I re-ran it.</p>
<p>It failed again. The error mentioned Phoenix, or LiveView, or both, and something about Corex being too restrictive, which surprised me, though perhaps it should not have.<br>
The conflict, I think so of versions colliding i guess. Corex and LiveView 1.2.0</p>
<p>I widened the constraint, I believe, and added a CI job for phx_new 1.8.4, for users who had not yet updated, assuming they exist, which they probably do.</p>
<p>mix local.phx is recommended, I think. And mix local.corex while you are at it. Colocated CSS and good things, as far as I can tell.<br>
mix deps.update corex should be the follow up, or is it the starting point, I don’t know anymore</p>
<p>The coffee was cold by the end. Or perhaps it was still warm. It is hard to say now.</p>
<hr>
<p>The morning smelled of fresh coffee and routine. A clean commit, the faint metallic scent of a CI pipeline warming up. Familiar. Safe.</p>
<p>Then something sour. A failed run. The sharp tang of a network error, or so it seemed. Another sip. The coffee still warm, still good.</p>
<p>The second failure had a different smell entirely. Acrid. The unmistakable odor of a dependency conflict, of versions colliding in the dark. Phoenix 1.8.8. LiveView 1.2.0. phx_new 1.8.8. Released the day before.</p>
<p>The fix was swift. The air cleared. The coffee, by then cold, still smelled wonderful.</p>
<hr>
<p>Did you guess one of my favorite book? Comment only the first letters, keep the secret alive.</p>
<p><a href="https://github.com/corex-ui/corex/blob/main/CHANGELOG.md" rel="noopener nofollow ugc">Corex v0.1.2 Changelog</a><br>
<a href="https://corex.gigalixirapp.com/" rel="noopener nofollow ugc">Corex Demo</a></p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/b/4/b44790c0c4d5524178b61077e35c657687346be4.png" data-download-href="https://forum.elixirforum.com/uploads/default/b44790c0c4d5524178b61077e35c657687346be4" title="Screenshot from 2026-06-12 09-21-07" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/b/4/b44790c0c4d5524178b61077e35c657687346be4.png" alt="Screenshot from 2026-06-12 09-21-07" data-base62-sha1="pIPgV9jSWd5SGRg0LsjjcegrjrC" width="412" height="325"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Screenshot from 2026-06-12 09-21-07</span><span class="informations">550×434 43.7 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390121" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-390121" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390121"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="392513" data-post-id="392513">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-392513-corex-020-design-as-an-elixir-pipeline-1" class="anchor" href="#p-392513-corex-020-design-as-an-elixir-pipeline-1" aria-label="Heading link" rel="nofollow"></a>Corex 0.2.0: Design as an Elixir pipeline</h1>
<p>Something I rarely talked about is the Corex Design System.</p>
<p>Not because I was not happy of it, but because it was built for the wrong audience.</p>
<h2><a name="p-392513-the-previous-design-pipeline-2" class="anchor" href="#p-392513-the-previous-design-pipeline-2" aria-label="Heading link" rel="nofollow"></a>The previous design pipeline</h2>
<ul>
<li>Palette generation with Adobe Leonardo (JS)</li>
<li>Design Tokens to Tailwind via Style Dictionary (JS)</li>
<li>Figma sync for a shared designer/developer system</li>
</ul>
<p>That is a great setup for a product team building their own design system.</p>
<p>For most Phoenix developers, the reality is a one-man job: Mix, deps, and <code>config.exs</code>.</p>
<h2><a name="p-392513-corex-design-around-that-reality-3" class="anchor" href="#p-392513-corex-design-around-that-reality-3" aria-label="Heading link" rel="nofollow"></a>Corex Design around that reality</h2>
<p>So I (and Cursor) rebuilt Corex Design for that workflow.</p>
<p><strong><a href="https://hex.pm/packages/corex_design" rel="nofollow"><code>corex_design</code></a></strong> is an optional Hex package.</p>
<ul>
<li>You configure it in Elixir, build with Mix, and import one CSS file.</li>
</ul>
<pre data-code-wrap="elixir"><code class="lang-elixir"># config/config.exs
config :corex_design,
  output: "assets/corex",
  default_theme: :neo,
  default_mode: :light,
  themes: [:neo],
  modes: [:light, :dark],
  scales: [],
  components: [:button, :dialog, :typo, :layout-heading],
  semantics: [:accent, :brand, :alert],
  accessibility: false
</code></pre>
<ul>
<li>Build manually:</li>
</ul>
<pre data-code-wrap="bash"><code class="lang-bash">mix corex.design.build
</code></pre>
<ul>
<li>Or wire it into Mix compilers:</li>
</ul>
<pre data-code-wrap="elixir"><code class="lang-elixir">compilers: Mix.compilers() ++ [:corex_design]
</code></pre>
<ul>
<li>Then import a single CSS file:</li>
</ul>
<pre data-code-wrap="css"><code class="lang-css">/* assets/css/app.css */
@import "../corex.css";
</code></pre>
<p>Palette generation and contrasts use Elixir config and <a href="https://hex.pm/packages/color" rel="nofollow"><code>color</code></a> (OKLCH scales, WCAG contrast). Docs: <a href="https://hexdocs.pm/color" rel="noopener nofollow ugc">hexdocs.pm/color</a>.</p>
<p>Modifiers moved the same way: shared host classes instead of per-component BEM.</p>
<pre data-code-wrap="heex"><code class="lang-heex">&lt;%!-- before --%&gt;
&lt;button class="button button--accent button--lg"&gt;Save&lt;/button&gt;

&lt;%!-- after --%&gt;
&lt;.action class="button ui-accent ui-size-lg"&gt;Save&lt;/.action&gt;
</code></pre>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/1/1/11da80dc7ae78b455987e9f895680ab59ac8b089.png" data-download-href="https://forum.elixirforum.com/uploads/default/11da80dc7ae78b455987e9f895680ab59ac8b089" title="Semantic and Variant Matrix" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/1/1/11da80dc7ae78b455987e9f895680ab59ac8b089_2_690x432.png" alt="Semantic and Variant Matrix" data-base62-sha1="2xWg0Ti5G5ee0kV0SVrKNsCQw2d" width="690" height="432" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/1/1/11da80dc7ae78b455987e9f895680ab59ac8b089_2_690x432.png, https://forum.elixirforum.com/uploads/default/original/3X/1/1/11da80dc7ae78b455987e9f895680ab59ac8b089.png 1.5x, https://forum.elixirforum.com/uploads/default/original/3X/1/1/11da80dc7ae78b455987e9f895680ab59ac8b089.png 2x" data-dominant-color="DFE0E1"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Semantic and Variant Matrix</span><span class="informations">733×459 28 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<h2><a name="p-392513-static-site-generation-with-tableau-4" class="anchor" href="#p-392513-static-site-generation-with-tableau-4" aria-label="Heading link" rel="nofollow"></a>Static site generation with Tableau</h2>
<p>Corex 0.2.0 also has full support for <strong>static site generation (SSG)</strong> with <a href="https://hex.pm/packages/tableau" rel="nofollow">Tableau</a>.</p>
<pre data-code-wrap="bash"><code class="lang-bash">mix archive.install hex tableau_new
mix archive.install hex corex_new

mix corex.tableau.new my_site
</code></pre>
<p>You can use the same components and markups when  building a Phoenix app or a Static site,</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/9/0/9067f48303e5e3b9375ab4efa7e168e4f7ae495e.png" data-download-href="https://forum.elixirforum.com/uploads/default/9067f48303e5e3b9375ab4efa7e168e4f7ae495e" title="Corex installer options" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/9/0/9067f48303e5e3b9375ab4efa7e168e4f7ae495e_2_690x381.png" alt="Corex installer options" data-base62-sha1="kBttFCQUyi4PXAB89OEyiMY1R5s" width="690" height="381" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/9/0/9067f48303e5e3b9375ab4efa7e168e4f7ae495e_2_690x381.png, https://forum.elixirforum.com/uploads/default/optimized/3X/9/0/9067f48303e5e3b9375ab4efa7e168e4f7ae495e_2_1035x571.png 1.5x, https://forum.elixirforum.com/uploads/default/original/3X/9/0/9067f48303e5e3b9375ab4efa7e168e4f7ae495e.png 2x" data-dominant-color="F0F0F0"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Corex installer options</span><span class="informations">1159×641 41.7 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<h3><a name="p-392513-bonus-optional-a11y-controllers-5" class="anchor" href="#p-392513-bonus-optional-a11y-controllers-5" aria-label="Heading link" rel="nofollow"></a>Bonus: Optional A11y controllers</h3>
<p>Optional flag in the installer for accessibility settings.</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/6/d/6d37ac068cc8eb4f2777642999efc2f90a5d2120.png" data-download-href="https://forum.elixirforum.com/uploads/default/6d37ac068cc8eb4f2777642999efc2f90a5d2120" title="A11y user options" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/6/d/6d37ac068cc8eb4f2777642999efc2f90a5d2120.png" alt="A11y user options" data-base62-sha1="fAbjTFPR43NyWtGubhaz86OwSyI" width="459" height="364"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">A11y user options</span><span class="informations">459×364 18.2 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<h2><a name="p-392513-why-split-packages-6" class="anchor" href="#p-392513-why-split-packages-6" aria-label="Heading link" rel="nofollow"></a>Why split packages</h2>
<p>I want Corex itself to stay a <strong>behavior library</strong>, with a clean separation of concerns:</p>
<ul>
<li><strong><a href="https://hex.pm/packages/corex" rel="nofollow"><code>corex</code></a></strong> : unstyled Phoenix components</li>
<li><strong><a href="https://hex.pm/packages/corex_design" rel="nofollow"><code>corex_design</code></a></strong> : optional Design System</li>
<li><strong><a href="https://hex.pm/packages/corex_mcp" rel="nofollow"><code>corex_mcp</code></a></strong> : optional MCP for component discovery.</li>
</ul>
<p>So you can use Corex as a pure accessible, unstyled UI library without Design or MCP.</p>
<h2><a name="p-392513-corex-020-is-now-on-hex-7" class="anchor" href="#p-392513-corex-020-is-now-on-hex-7" aria-label="Heading link" rel="nofollow"></a>Corex 0.2.0 is now on Hex</h2>
<ul>
<li>Demo: <a href="https://corex.gigalixirapp.com/" rel="noopener nofollow ugc">https://corex.gigalixirapp.com/</a></li>
<li>Docs: <a href="https://hexdocs.pm/corex" rel="noopener nofollow ugc">hexdocs.pm/corex</a></li>
</ul>
<p>Feedback and suggestions are always welcome.<br>
Happy coding</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="392513" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-392513" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="392513"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="392799" data-post-id="392799">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="netoum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/netoum/120/37559_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  netoum
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-392799-showcase-1" class="anchor" href="#p-392799-showcase-1" aria-label="Heading link" rel="nofollow"></a>Showcase</h2>
<p>The problematic was simple: <strong>Can I build and edit a static website with Elixir and Corex using only a shared hosting</strong></p>
<p>Shared hosting with cPanel in our case doesn’t support running Elixir; it only allows PHP, and more recently, Node.js and other apps. But what it does offer, is a secure SSH connection and it is all what we need.</p>
<p>Hosting the final build is not the issue, this can be done on virtually any server. The real challenge is running the Tableau build and managing the CMS.</p>
<p>The solution: <strong>GitHub Actions</strong> for running Mix tests and builds, paired with a <strong>Git-based CMS</strong> for content management.<br>
</p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/9/5/95e51d7f4d09482f178c3cae41133de498650b2a.png" data-download-href="https://forum.elixirforum.com/uploads/default/95e51d7f4d09482f178c3cae41133de498650b2a" title="CI test, build and deploy for Corex static site" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/9/5/95e51d7f4d09482f178c3cae41133de498650b2a.png" alt="CI test, build and deploy for Corex static site" data-base62-sha1="lo21fEb40qIwCrqXyWLHjxQDF9M" width="379" height="157"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">CI test, build and deploy for Corex static site</span><span class="informations">379×157 13.6 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/6/1/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab.png" data-download-href="https://forum.elixirforum.com/uploads/default/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab" title="Screenshot From 2026-08-15 00-03-36" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/6/1/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab_2_345x297.png" alt="Screenshot From 2026-08-15 00-03-36" data-base62-sha1="dQRYpMLS2m3GtJcnv8XwDt71Fer" width="345" height="297" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/6/1/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab_2_345x297.png, https://forum.elixirforum.com/uploads/default/optimized/3X/6/1/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab_2_517x445.png 1.5x, https://forum.elixirforum.com/uploads/default/optimized/3X/6/1/61163ebc1caa2b48845cc9c6fcca3a75cbea8fab_2_690x594.png 2x" data-dominant-color="F4F5F5"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Screenshot From 2026-08-15 00-03-36</span><span class="informations">799×690 42.2 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>This approach offers some key benefits:</p>
<ul>
<li>A self-hosted, Git-based CMS admin, no dependency on external services or database</li>
<li>Real ownership of the codebase and flexible repo visibility, with both private and public repo options</li>
<li>Deploy is only run when all tests are passed, meaning A11Y tests can be chained to improve accessibility</li>
<li>Upgrading to a full Phoenix app when time comes is easy, it is the exact same HEEX markup</li>
<li>You look cool by using Elixir</li>
</ul>
<p>You can see 2 Showcases:<br>
<a href="https://netoum.com/" rel="noopener nofollow ugc">https://netoum.com/</a><br>
<a href="https://oranje-patrimoine.fr/" rel="noopener nofollow ugc">https://oranje-patrimoine.fr/</a></p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/b/b/bb768495df412f191cda6ce15ec8bf69c8d45612.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/bb768495df412f191cda6ce15ec8bf69c8d45612" title="netoum" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/b/b/bb768495df412f191cda6ce15ec8bf69c8d45612.jpeg" alt="netoum" data-base62-sha1="qKnd2T8yUNxkYPdaLEOXVMlgu8q" width="690" height="431" data-dominant-color="EFEFEF"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">netoum</span><span class="informations">1200×750 39.6 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><br>
<div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/3/7/373ba449be1a8976ad99defff1e43206db0ade1c.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/373ba449be1a8976ad99defff1e43206db0ade1c" title="oranje-patrimoine" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/3/7/373ba449be1a8976ad99defff1e43206db0ade1c.jpeg" alt="oranje-patrimoine" data-base62-sha1="7SC2Eh03Wb8u8pWG7JX57NvKx88" width="690" height="431" data-dominant-color="D5D4D3"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">oranje-patrimoine</span><span class="informations">1200×750 64 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="392799" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/corex-accessible-and-unstyled-ui-phoenix-components/74141/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-392799" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="392799"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>