feat(rendering): add generate_heex clauses for 5 shell-primitive kinds#144
Draft
ty13r wants to merge 1 commit into
Draft
feat(rendering): add generate_heex clauses for 5 shell-primitive kinds#144ty13r wants to merge 1 commit into
ty13r wants to merge 1 commit into
Conversation
Adds IUR fallback rendering (force_fallback: true path) for five canonical kinds that previously rendered as empty <div> shells in operator_v2 Phase 2. Kinds added: - top_strip: <header class="ash-top-strip"> with brand, title, context spans, data-live-ui-shell-position="top", and children - sidebar_section: <section class="ash-sidebar-section"> with h3 label, optional action button (when action_intent prop is truthy), and children - sidebar_item: <li class="ash-sidebar-item"> with <button> containing label, aria-current="page" + ash-sidebar-item--selected class when selected? is true - tabs: <div class="ash-tabs"> with role=tablist and tab buttons; reads items list (each with id/label) and active_item_id for aria-selected - tree_view: <section class="ash-tree-view"> with recursive <ul>/<li> structure via existing render_tree_nodes/1 helper; reads nodes list and selection_mode prop IUR prop names for each kind documented in PR description; markup/class/aria decisions open for Pascal review as this is a Tier 2 substrate gap proposal. ariston-ui bridges these gaps today by substituting kinds with existing generate_heex coverage (e.g., sticky_frosted_header for top_strip); this PR enables the substitutions to be removed once Pascal approves the markup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Member
Author
|
Cross-linking the three operator_v2 substrate-gap items (per project-ariston Update 8):
|
This was referenced May 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds IUR fallback
generate_heexclauses for five canonical kinds that currently render as empty<div>shells inforce_fallback: truemode (operator_v2 Phase 2 + Wave C). This is documented as Substrate Gap #1 inariston-ui/docs/operator-v2-phase-2-deferred-findings.md.Tier 2 substrate gap proposal - opens as DRAFT for Pascal review. These are not new canonical primitives (all five already have
LiveUi.Rendererclauses on theforce_fallback: falsepath), but adding the IUR fallback path affects every consumer offorce_fallback: truemode. Markup, class, and aria decisions need Pascal sign-off before merge.Context
LiveUIAdapter.render(force_fallback: true)routes throughgenerate_heex/2clauses. The five kinds below hadLiveUi.Rendererclauses (the normal runtime path) but nogenerate_heexclauses, so they fell through to the default empty-shell catch-all. ariston-ui works around this today by substituting alternative kinds with coverage (e.g.,sticky_frosted_headerfortop_strip). Once Pascal approves this PR, those substitutions can be removed.Per-kind decision matrix
top_strip<header>ash-top-striptitle(h2),brand(span),context(span)generate_children/2sidebar_section<section>ash-sidebar-sectionlabel(h3),action_label/action_glyph(button text),action_intent(boolean to show action button)generate_children/2sidebar_item<li>ash-sidebar-itemlabel(button text),selected?/selected(aria-current="page" +--selectedmodifier class)<button>tabs<div>ash-tabsitems(list of%{"id" => ..., "label" => ...}),active_item_id(string matched against item id for aria-selected)tree_view<section>ash-tree-viewnodes(list),selection_mode(data attr)render_tree_nodes/1helperOpen questions for Pascal
top_strip: Isdata-live-ui-shell-position="top"the right data-attr to carry through the IUR fallback, or is it handled by the layout shell and unnecessary on the<header>directly?sidebar_item: LiveUi.Renderer wraps children inside the<button>element. Is that correct or should children be siblings of the button?tabs: The IUR fallback renders tab items as inline<button type="button" role="tab">(no patch/navigate targets, since IUR props don't carry routing info). Acceptable for the fallback path?tree_view: The fallback delegates to the existingrender_tree_nodes/1helper (which readslabel/title/name/valuebut notselected?/expanded?). Should I extend that helper to carry those props, or is the current behavior sufficient for fallback mode?ash-*prefix per existing convention (LiveUi.Renderer useslive-ui-*). Please confirmash-*is correct for the IUR fallback path.Test plan
Quality-gate commands run from
/tmp/ash-ui-gap-1(worktree of ash_ui atclaude/generate-heex-shell-primitives):mix format --check-formatted lib/... test/...- PASSMIX_ENV=test mix compile --warnings-as-errors- PASS (Generated ash_ui app)MIX_ENV=test mix test test/ash_ui/rendering/live_ui_adapter_test.exs- PASS (45 tests, 0 failures, 37 existing + 8 new)New tests verify: wrapper element + class present, key text props rendered, children propagated,
aria-current="page"on selected sidebar_item,--selectedmodifier class, action button conditional onaction_intent,aria-selected="true"on active tab item.🤖 Generated with Claude Code