π Seamlessly integrate Elm components into your Qwik applications!
Inspired by @mizchi/qwik-svelte and @mizchi/qwik-vue, but tailored for the Elm ecosystem.
- π Easy integration of Elm components in Qwik
- π§ Leverage Elm's robust type system and predictable state management
- β‘ Benefit from Qwik's partial hydration and lazy-loading
- π Simple API for bridging Qwik and Elm
npm install @esh2n/qwik-elm elm vite-plugin-elm -D
Update your vite.config.ts
:
import { defineConfig } from "vite";
import { qwikVite } from "@builder.io/qwik/optimizer";
import elmPlugin from "vite-plugin-elm";
export default defineConfig(() => {
return {
plugins: [
elmPlugin({
debug: process.env.NODE_ENV !== "production",
optimize: process.env.NODE_ENV === "production",
}),
qwikVite()
],
};
});
-- src/components/Counter.elm
module Counter exposing (main)
import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
type alias Model = Int
type Msg = Increment | Decrement
update : Msg -> Model -> Model
update msg model =
case msg of
Increment -> model + 1
Decrement -> model - 1
view : Model -> Html Msg
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (String.fromInt model) ]
, button [ onClick Increment ] [ text "+" ]
]
main : Program () Model Msg
main =
Browser.sandbox
{ init = 0
, update = update
, view = view
}
import { component$ } from "@builder.io/qwik";
import { qwikifyElm$ } from "qwik-elm";
import Counter from "./components/Counter.elm";
const QCounter = qwikifyElm$<{}>({
init: (node) => {
const app = Counter.Elm.Counter.init({ node });
return app;
}
});
export default component$(() => {
return <QCounter />;
});
We're currently developing robust patterns for bi-directional communication between Qwik and Elm. Stay tuned for updates!
qwikifyElm$<Props>(options: QwikifyElmOptions): Component<Props>
init
: (node: HTMLElement) => ElmApp Initialize your Elm application and return the Elm app instance.
We welcome contributions! Here's how you can help:
- π΄ Fork the repository
- πΏ Create your feature branch:
git checkout -b my-new-feature
- πΎ Commit your changes:
git commit -am 'Add some feature'
- π Push to the branch:
git push origin my-new-feature
- π Submit a pull request
- π§ͺ Comprehensive unit testing
- π© Support for Elm flags
- π Improve type safety for Elm-Qwik communication
- π Optimize re-rendering on props change
- π Expand documentation and examples
MIT