defmodule KinoLiveComponent do @moduledoc """ """ use Kino.JS import Phoenix.LiveViewTest @endpoint Application.compile_env(:kino_live_component, :endpoint, "http://localhost:4000/kino-live-component") def component(heex) do Kino.JS.new(__MODULE__, html(heex)) end def component(component, assigns) do Kino.JS.new(__MODULE__, render_component(component, assigns, router: KinoLiveComponent.Router)) end defp html(heex) do heex |> Phoenix.HTML.html_escape() |> Phoenix.HTML.safe_to_string() end asset "main.js" do """ export function init(ctx, html) { const liveView = "#{@endpoint}"; const ifrm = document.createElement("iframe"); ifrm.setAttribute("id", "kino-live-view"); ifrm.setAttribute("src", liveView); ifrm.style.border = "0"; ifrm.style.maxHeight = "500px"; ifrm.style.overflow = "scroll"; ifrm.style.width = "100%"; ctx.root.appendChild(ifrm); ifrm.onload = () => { ifrm.contentWindow.postMessage(html, liveView); }; window.addEventListener("message", event => { ifrm.style.height = event.data.height + 30 + "px"; }); } """ end end