# LiveSvelte
LiveSvelte renders Svelte directly into your Phoenix LiveView and enables E2E reactivity.
## Features
- Server-Side Rendered (SSR) Svelte
- End-To-End Reactivity
- Svelte Preprocessing support with [svelte-preprocess](https://github.com/sveltejs/svelte-preprocess)
- Tailwind support
## Docs
<https://hexdocs.pm/live_svelte>
## Installation
Add `live_svelte` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:live_svelte, "~> 0.1.0-rc0"}
]
end
```
Run the following in your terminal
```bash
mix deps.get
mix live_svelte.setup
```
Make sure you have Node installed, you can verify this by running `node --version` in your project directory.
## Usage
### Basic Example
#### Create a Svelte component
```svelte
<script>
export let number = 1
export let pushEvent
function increase() {
pushEvent('set_number', { number: number + 1 }, () => {})
}
function decrease() {
pushEvent('set_number', { number: number - 1 }, () => {})
}
</script>
<p>The number is {number}</p>
<button on:click={increase}>+</button>
<button on:click={decrease}>-</button>
```
#### Create a LiveView
```elixir
# `/lib/app_web/live/live_svelte.ex`
defmodule AppWeb.SvelteLive do
use AppWeb, :live_view
def render(assigns) do
~H"""
<.live_component
module={LiveSvelte}
id="Example"
name="Example"
props={%{number: @number}}
/>
"""
end
def handle_event("set_number", %{"number" => number}, socket) do
{:noreply, assign(socket, :number, number)}
end
def mount(_params, _session, socket) do
{:ok, assign(socket, :number, 5)}
end
end
```
```elixir
# `/lib/app_web/router.ex`
import Phoenix.LiveView.Router
scope "/", AppWeb do
...
live "/svelte", SvelteLive
...
end
```
###
To use the preprocessor, install the desired preprocessor.
e.g. Typescript
```
cd assets && npm install --save-dev typescript
```
## Credits
- [Ryan Cooke](https://dev.to/debussyman) - [E2E Reactivity using Svelte with Phoenix LiveView](https://dev.to/debussyman/e2e-reactivity-using-svelte-with-phoenix-liveview-38mf)
- [Svonix](https://github.com/nikokozak/svonix)