single page apps made easy
Go to file
2019-10-29 19:22:29 -05:00
cli check point 2019-10-28 18:50:56 -05:00
example live my life without transitions 😔 2019-10-29 19:22:29 -05:00
src live my life without transitions 😔 2019-10-29 19:22:29 -05:00
.gitignore keep these until generator is stable 2019-10-28 19:04:04 -05:00
elm-analyse.json a fresh start :) 2019-10-15 23:52:54 -05:00
elm.json generate routes to make life ez pz 2019-10-23 17:56:08 -05:00
netlify.toml a fresh start :) 2019-10-15 23:52:54 -05:00
package-lock.json generate pages from cli tool 2019-10-24 00:41:17 -05:00
package.json write generator in elm because hehehe 2019-10-26 15:51:06 -05:00
README.md Update README.md 2019-10-26 17:53:14 -05:00

ryannhg/elm-spa

an experiment for creating single page apps with Elm!

try it out

  1. npm install

  2. npm run dev

overview

a wrapper around Browser.application (that handles routing and page transitions!)

module Main exposing (main)

import Application exposing (Application)
import Generated.Pages as Pages
import Generated.Route as Route
import Global
import Layouts.Main


main : Application Global.Flags Global.Model Global.Msg Pages.Model Pages.Msg
main =
    Application.create
        { routing =
            { routes = Route.routes
            , toPath = Route.toPath
            , notFound = Route.NotFound ()
            }
        , global =
            { init = Global.init
            , update = Global.update
            , subscriptions = Global.subscriptions
            }
        , layout =
            { view = Layouts.Main.view
            , transition = Application.fade 200
            }
        , pages =
            { init = Pages.init
            , update = Pages.update
            , bundle = Pages.bundle
            }
        }

keep your pages simple

(Instead of making everything an elm-fork-knife!)

page =
    Page.static
        { view = view
        }
page =
    Page.sandbox
        { init = init
        , update = update
        , view = view
        }
page =
    Page.element
        { init = init
        , update = update
        , subscriptions = subscriptions
        , view = view
        }
page =
    Page.component
        { init = init
        , update = update
        , subscriptions = subscriptions
        , view = view
        }

and your top level easy to read!

init appRoute =
    case appRoute of
        Route.Index route ->
            index.init route

        Route.Counter route ->
            counter.init route

        Route.Random route ->
            random.init route

( It's like magic, but actually it's just functions. )

the folder structure

src/
  Api/        -- for backend things
  Components/ -- reusable ui
  Data/       -- types used everywhere
  Layouts/    -- shared views
  Pages/      -- all your pages
  Utils/      -- helpers
  Global.elm  -- shared app state
  Main.elm    -- the entrypoint