KinoLiveViewNative
notebook_path = __ENV__.file |> String.split("#") |> hd()
Mix.install(
[
{:kino_live_view_native, git: "https://github.com/RyoWakabayashi/kino_live_view_native"}
],
config: [
kino_live_view_native: [
qr_enabled: true
],
server: [
{ServerWeb.Endpoint,
[
server: true,
url: [host: "localhost"],
adapter: Phoenix.Endpoint.Cowboy2Adapter,
render_errors: [
formats: [html: ServerWeb.ErrorHTML, json: ServerWeb.ErrorJSON],
layout: false
],
pubsub_server: Server.PubSub,
live_view: [signing_salt: "JSgdVVL6"],
http: [ip: {0, 0, 0, 0}, port: 4000],
secret_key_base: String.duplicate("a", 64),
live_reload: [
patterns: [
~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg|styles)$",
~r/#{notebook_path}$/
]
],
code_reloader: true
]}
],
kino: [
group_leader: Process.group_leader()
],
phoenix: [
template_engines: [neex: LiveViewNative.Engine]
],
phoenix_template: [format_encoders: [swiftui: Phoenix.HTML.Engine]],
mime: [
types: %{"text/swiftui" => ["swiftui"], "text/styles" => ["styles"]}
],
live_view_native: [plugins: [LiveViewNative.SwiftUI]],
live_view_native_stylesheet: [
content: [
swiftui: [
"lib/**/*swiftui*",
notebook_path
]
],
output: "priv/static/assets",
attribute_parsers: [
style: [
livemd: &Server.AttributeParsers.Style.parse/2
]
]
],
# Ensures that app.js compiles to avoid the switch to longpolling
# when a LiveView doesn't exist yet
esbuild: [
version: "0.17.11",
server_web: [
args:
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
]
]
],
force: true
)
Basic LiveView Native Example
require Server.Livebook
import Server.Livebook
import Kernel, except: [defmodule: 2]
defmodule ServerWeb.ExampleLive.SwiftUI do
use ServerNative, [:render_component, format: :swiftui]
def render(assigns) do
~LVN"""
Hello, world!
"""
end
end
defmodule ServerWeb.ExampleLive do
use ServerWeb, :live_view
use ServerNative, :live_view
@impl true
def render(assigns),
do: ~H"""
Hello, world!
"""
@impl true
def handle_event("clicked", _params, socket) do
IO.inspect("CLICKED")
{:noreply, socket}
end
end
|> Server.SmartCells.LiveViewNative.register("/")
import Server.Livebook, only: []
import Kernel
:ok
Render Components
require Server.Livebook
import Server.Livebook
import Kernel, except: [defmodule: 2]
defmodule ServerWeb.ExampleLive.SwiftUI do
use ServerNative, [:render_component, format: :swiftui]
def render(assigns) do
~LVN"""
Hello, from LiveView Native!
"""
end
end
|> Server.SmartCells.RenderComponent.register()
import Server.Livebook, only: []
import Kernel
:ok
Live Reloading
require Server.Livebook
import Server.Livebook
import Kernel, except: [defmodule: 2]
defmodule ServerWeb.HomeLive.SwiftUI do
use LiveViewNative.Component,
format: :swiftui
def render(assigns) do
~LVN"""
Hello, Live Reload!
"""
end
end
defmodule ServerWeb.HomeLive do
use ServerWeb, :live_view
use LiveViewNative.LiveView,
formats: [:swiftui],
layouts: [
swiftui: {ServerWeb.Layouts.SwiftUI, :app}
]
@impl true
def render(assigns) do
~H"""
Hello Live Reload!
"""
end
end
|> Server.SmartCells.LiveViewNative.register("/")
import Server.Livebook, only: []
import Kernel
:ok
Custom Colors
require Server.Livebook
import Server.Livebook
import Kernel, except: [defmodule: 2]
defmodule ServerWeb.ExampleLive.SwiftUI do
use ServerNative, [:render_component, format: :swiftui]
def render(assigns) do
~LVN"""
Hello
"""
end
end
defmodule ServerWeb.ExampleLive do
use ServerWeb, :live_view
use ServerNative, :live_view
@impl true
def render(assigns), do: ~H""
end
|> Server.SmartCells.LiveViewNative.register("/")
import Server.Livebook, only: []
import Kernel
:ok
Forms
require Server.Livebook
import Server.Livebook
import Kernel, except: [defmodule: 2]
defmodule ServerWeb.ExampleLive.SwiftUI do
use ServerNative, [:render_component, format: :swiftui]
import ServerWeb.CoreComponents.SwiftUI
def render(assigns) do
~LVN"""
<.simple_form for={@form} id="form" phx-submit="submit">
<.input field={@form[:email]} type="TextField" placeholder="Email" />
<:actions>
<.button type="submit">
Send password reset instructions
"""
end
end
defmodule ServerWeb.ExampleLive do
use ServerWeb, :live_view
use ServerNative, :live_view
@impl true
def render(assigns), do: ~H"""
<.simple_form for={@form} id="reset_password_form" phx-submit="submit">
<.input field={@form[:email]} placeholder="Email" />
<:actions>
<.button type="submit">
Send password reset instructions
"""
@impl true
def mount(_params, _session, socket) do
{:ok, assign(socket, form: to_form(%{}, as: "user"))}
end
@impl true
def handle_event("submit", params, socket) do
IO.inspect(params)
{:noreply, socket}
end
end
|> Server.SmartCells.LiveViewNative.register("/")
import Server.Livebook, only: []
import Kernel
:ok