<%= turbo_frame_tag "modal" %>
<%= turbo_frame_tag "modal" do %>
<div class="modal">
<h2>New label</h2>
<%= render "form", label: @label %>
<%= link_to "Close", "#", data: { action: "turbo:click->modal#close" }, class: "btn" %>
</div>
<% end %>
<%= turbo_stream.prepend "labels", partial: "labels/label", locals: { label: @label } %>
<%= turbo_stream.update "modal", "" %>
A modal is just a frame boundary. Load the modal content into a dedicated frame, then on submit broadcast/stream a close action plus a list update. You get “SPA modal UX” without a frontend router.