[{"name":"Spa","comment":"\n\n\n## Let's build some single page applications!\n\n`Spa.create` replaces [Browser.application](https://package.elm-lang.org/packages/elm/browser/latest/Browser#application)\nas the entrypoint to your app.\n\n    import Global\n    import Pages\n    import Routes exposing (routes)\n    import Spa\n    import Transitions\n    import Utils.Spa\n\n    main : Utils.Spa.Program Pages.Model Pages.Msg\n    main =\n        Spa.create\n            { global =\n                { init = Global.init\n                , update = Global.update\n                , subscriptions = Global.subscriptions\n                }\n            , page = Pages.page\n            , routing =\n                { routes = Routes.parsers\n                , toPath = Routes.toPath\n                , notFound = routes.notFound\n                }\n            , transitions = Transitions.transitions\n            , ui = Spa.usingElmUi   \n            }\n\n@docs create, Program\n\n\n# using elm-ui?\n\nIf you're a big fan of [mdgriffith/elm-ui](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/) (or a \"not-so-big-fan of CSS\"),\nthis package supports using `Element msg` instead of `Html msg` for your pages and components.\n\n@docs usingElmUi\n\n\n## using html?\n\n@docs usingHtml\n\n","unions":[],"aliases":[{"name":"Program","comment":" An alias for `Platform.Program` to make annotations a little more clear.\n","args":["flags","globalModel","globalMsg","layoutModel","layoutMsg"],"type":"Platform.Program flags (Spa.Model flags globalModel layoutModel) (Spa.Msg globalMsg layoutMsg)"}],"values":[{"name":"create","comment":" Creates a new `Program` given some one-time configuration:\n\n  - `ui` - How do we convert our views into `Html msg`?\n  - `routing` - What are the app's routes?\n  - `transitions` - How should we transition between routes?\n  - `global` - How do we share state between pages?\n  - `page` - What page should we render?\n\n","type":"{ global : { init : { navigate : route -> Platform.Cmd.Cmd (Spa.Msg globalMsg layoutMsg) } -> flags -> ( globalModel, Platform.Cmd.Cmd globalMsg, Platform.Cmd.Cmd (Spa.Msg globalMsg layoutMsg) ), update : { navigate : route -> Platform.Cmd.Cmd (Spa.Msg globalMsg layoutMsg) } -> globalMsg -> globalModel -> ( globalModel, Platform.Cmd.Cmd globalMsg, Platform.Cmd.Cmd (Spa.Msg globalMsg layoutMsg) ), subscriptions : globalModel -> Platform.Sub.Sub globalMsg }, page : Internals.Page.Page route route layoutModel layoutMsg ui_layoutMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg (Spa.Msg globalMsg layoutMsg) ui_msg, routing : { routes : List.List (Url.Parser.Parser (route -> route) route), toPath : route -> String.String, notFound : route }, transitions : { layout : Internals.Transition.Transition ui_msg, page : Internals.Transition.Transition ui_msg, pages : List.List { path : Internals.Path.Path, transition : Internals.Transition.Transition ui_msg } }, ui : { toHtml : ui_msg -> Html.Html (Spa.Msg globalMsg layoutMsg), map : (layoutMsg -> Spa.Msg globalMsg layoutMsg) -> ui_layoutMsg -> ui_msg } } -> Spa.Program flags globalModel globalMsg layoutModel layoutMsg"},{"name":"usingElmUi","comment":" If you're just using `mdgriffith/elm-ui`, you can pass this into `Spa.create`\n\n    main =\n        Spa.create\n            { ui = Spa.usingElmUi\n            , -- ...\n            }\n\n","type":"{ map : (layoutMsg -> Spa.Msg globalMsg layoutMsg) -> Element.Element layoutMsg -> Element.Element (Spa.Msg globalMsg layoutMsg), toHtml : Element.Element msg -> Html.Html msg }"},{"name":"usingHtml","comment":" If you're just using `elm/html`, you can pass this into `Spa.create`\n\n    main =\n        Spa.create\n            { ui = Spa.usingHtml\n            , -- ...\n            }\n\n","type":"{ map : (layoutMsg -> Spa.Msg globalMsg layoutMsg) -> Html.Html layoutMsg -> Html.Html (Spa.Msg globalMsg layoutMsg), toHtml : ui_msg -> ui_msg }"}],"binops":[]},{"name":"Spa.Page","comment":"\n\n\n## Pick the simplest page for the job!\n\n1.  [`static`](#static) - a page without state\n\n2.  [`sandbox`](#sandbox) - a page without side-effects\n\n3.  [`element`](#element) - a page _with_ side-effects\n\n4.  [`component`](#component) - a page that can change the global state\n\n\n### **heads up:** `always` incoming!\n\nYou may notice the examples below use the function `always`.\n\n    Page.static\n        { title = always \"Hello\"\n        , view = always view\n        }\n\nThis is to **opt-out** each function from accessing data like [`PageContext`](./Spa-Types#PageContext)\n\nIf you decide you need access to the `Route`, query parameters, or `Global.Model`:\nRemove the `always` from `title`, `init`, `update`, `view`, or\n`subscriptions` functions.\n\n\n# static\n\n@docs static\n\n\n# sandbox\n\n@docs sandbox\n\n\n# element\n\n@docs element\n\n\n# component\n\n@docs component, send\n\n\n# manually composing pages?\n\nThe rest of this module contains types and functions that\nare automatically generated with the [CLI companion tool](https://github.com/ryannhg/elm-spa/tree/master/cli)!\n\nIf you'd rather type this stuff manually, these docs are for you!\n\n\n## layout\n\n@docs layout\n\n\n## recipe\n\n@docs recipe\n\n\n## wait... what's a \"bundle\"?\n\nWe can \"bundle\" the `title`,`view`, and `subscriptions` functions together,\nbecause they only need access to the current `model`.\n\nSo _instead_ of typing out all this:\n\n    title bigModel =\n        case bigModel of\n            FooModel model ->\n                foo.title model\n\n            BarModel model ->\n                bar.title model\n\n            BazModel model ->\n                baz.title model\n\n    view bigModel =\n        case bigModel of\n            FooModel model ->\n                foo.view model\n\n            BarModel model ->\n                bar.view model\n\n            BazModel model ->\n                baz.view model\n\n    subscriptions bigModel =\n        case bigModel of\n            FooModel model ->\n                foo.subscriptions model\n\n            BarModel model ->\n                bar.subscriptions model\n\n            BazModel model ->\n                baz.subscriptions model\n\nYou only create **one** case expression: (woohoo, less typing!)\n\n    bundle bigModel =\n        case bigModel of\n            FooModel model ->\n                foo.bundle model\n\n            BarModel model ->\n                bar.bundle model\n\n            BazModel model ->\n                baz.bundle model\n\n\n## update helpers\n\n@docs keep\n\n","unions":[],"aliases":[],"values":[{"name":"component","comment":"\n\n\n## an example\n\n    page =\n        Page.component\n            { title = always title\n            , init = always init\n            , update = always update\n            , subscriptions = always subscriptions\n            , view = view -- no always used here, so view\n                          -- has access to `PageContext`\n            }\n\n    title : String\n    title =\n        \"Sign in\"\n\n    init : Params.SignIn -> ( Model, Cmd Msg, Cmd Global.Msg )\n    init params =\n        -- ...\n\n    update : Msg -> Model -> ( Model, Cmd Msg, Cmd Global.Msg )\n    update msg model =\n        -- ...\n\n    subscriptions : Model -> Sub Msg\n    subscriptions model =\n        -- ...\n\n    view : Spa.PageContext -> Model -> Html Msg\n    view { global } model =\n        case global.user of\n            SignedIn user ->\n                viewSignOutForm user model\n\n            SignedOut ->\n                viewSignInForm model\n\n","type":"{ title : { global : globalModel, model : pageModel } -> String.String, init : Spa.Page.PageContext route globalModel -> pageParams -> ( pageModel, Platform.Cmd.Cmd pageMsg, Platform.Cmd.Cmd globalMsg ), update : Spa.Page.PageContext route globalModel -> pageMsg -> pageModel -> ( pageModel, Platform.Cmd.Cmd pageMsg, Platform.Cmd.Cmd globalMsg ), view : Spa.Page.PageContext route globalModel -> pageModel -> ui_pageMsg, subscriptions : Spa.Page.PageContext route globalModel -> pageModel -> Platform.Sub.Sub pageMsg } -> Spa.Page.Page route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"element","comment":"\n\n\n## an example\n\n    page =\n        Page.element\n            { title = always title\n            , init = always init\n            , update = always update\n            , subscriptions = always subscriptions\n            , view = always view\n            }\n\n    title : String\n    title =\n        \"Cat Gifs\"\n\n    init : ( Model, Cmd.none )\n    init =\n        -- ...\n\n    update : Msg -> Model -> ( Model, Cmd Msg )\n    update msg model =\n        -- ...\n\n    subscriptions : Model -> Sub Msg\n    subscriptions model =\n        -- ...\n\n    view : Model -> Html Msg\n    view model =\n        -- ...\n\n","type":"{ title : { global : globalModel, model : pageModel } -> String.String, init : Spa.Page.PageContext route globalModel -> pageParams -> ( pageModel, Platform.Cmd.Cmd pageMsg ), update : Spa.Page.PageContext route globalModel -> pageMsg -> pageModel -> ( pageModel, Platform.Cmd.Cmd pageMsg ), view : Spa.Page.PageContext route globalModel -> pageModel -> ui_pageMsg, subscriptions : Spa.Page.PageContext route globalModel -> pageModel -> Platform.Sub.Sub pageMsg } -> Spa.Page.Page route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"keep","comment":" If the `update` function receives a `msg` that doesn't\nmatch up its `model`, we use `keep` to leave the page as-is.\n\n    update : Msg -> Model -> Spa.Update Model Msg\n    update bigMsg bigModel =\n        case ( bigMsg, bigModel ) of\n            ( TopMsg msg, TopModel model ) ->\n                top.update msg model\n\n            ( CounterMsg msg, CounterModel model ) ->\n                counter.update msg model\n\n            ( NotFoundMsg msg, NotFoundModel model ) ->\n                notFound.update msg model\n\n            _ ->\n                Page.keep bigModel\n\n","type":"layoutModel -> Internals.Page.Update route layoutModel layoutMsg globalModel globalMsg"},{"name":"layout","comment":" In practice, we wrap `layout` in `Utils/Spa.elm` so we only have to provide `Html.map` or `Element.map` once)\n\n    import Utils.Spa as Spa\n\n    page =\n        Spa.layout\n            { layout = Layout.view\n            , pages =\n                { init = init\n                , update = update\n                , bundle = bundle\n                }\n            }\n\n","type":"((pageMsg -> msg) -> ui_pageMsg -> ui_msg) -> Internals.Page.Layout route pageParams pageModel pageMsg ui_pageMsg globalModel globalMsg msg ui_msg -> Spa.Page.Page route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"recipe","comment":" Implementing the `init`, `update` and `bundle` functions is much easier\nwhen you turn a `Page` type into a `Recipe`.\n\nA `Recipe` is just an Elm record waiting for its page specific data.\n\n  - `init`: just needs a `route`\n\n  - `upgrade` : just needs a `msg` and `model`\n\n  - `bundle` (`view`/`subscriptions`) : just needs a `model`\n\n        import Utils.Spa as Spa\n\n        recipes : Recipes msg\n        recipes =\n            { top =\n                Spa.recipe\n                    { page = Top.page\n                    , toModel = TopModel\n                    , toMsg = TopMsg\n                    }\n            , counter =\n                Spa.recipe\n                    { page = Counter.page\n                    , toModel = CounterModel\n                    , toMsg = CounterMsg\n                    }\n\n            -- ...\n            }\n\n","type":"((pageMsg -> layoutMsg) -> ui_pageMsg -> ui_layoutMsg) -> Internals.Page.Upgrade route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg -> Internals.Page.Recipe route pageParams pageModel pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"sandbox","comment":"\n\n\n## an example\n\n    page =\n        Page.sandbox\n            { title = always title\n            , init = always init\n            , update = always update\n            , view = always view\n            }\n\n    title : String\n    title =\n        \"Counter\"\n\n    type alias Model =\n        Int\n\n    init : Model\n    init =\n        0\n\n    type Msg\n        = Increment\n        | Decrement\n\n    update : Msg -> Model -> Model\n    update msg model =\n        case msg of\n            Increment ->\n                model + 1\n\n            Decrement ->\n                model - 1\n\n    view : Model -> Html Msg\n    view model =\n        div []\n            [ button [ Events.onClick Increment ] [ text \"+\" ]\n            , text (String.fromInt model)\n            , button [ Events.onClick Decrement ] [ text \"-\" ]\n            ]\n\n","type":"{ title : { global : globalModel, model : pageModel } -> String.String, init : Spa.Page.PageContext route globalModel -> pageParams -> pageModel, update : Spa.Page.PageContext route globalModel -> pageMsg -> pageModel -> pageModel, view : Spa.Page.PageContext route globalModel -> pageModel -> ui_pageMsg } -> Spa.Page.Page route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"send","comment":" A utility for sending `Global.Msg` commands from your `Page.component`\n\n    init : Params.SignIn -> ( Model, Cmd Msg, Cmd Global.Msg )\n    init params =\n        ( model\n        , Cmd.none\n        , Page.send (Global.NavigateTo routes.dashboard)\n        )\n\n","type":"msg -> Platform.Cmd.Cmd msg"},{"name":"static","comment":"\n\n\n## an example\n\n    page =\n        Page.static\n            { title = always title\n            , view = always view\n            }\n\n    title : String\n    title =\n        \"Example\"\n\n    view : Html Never\n    view =\n        h1 [ class \"title\" ] [ text \"Example\" ]\n\n","type":"{ title : { global : globalModel } -> String.String, view : Spa.Page.PageContext route globalModel -> ui_pageMsg } -> Spa.Page.Page route pageParams () Basics.Never ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"}],"binops":[]},{"name":"Spa.Path","comment":"\n\n\n## Modify transitions at different routes!\n\nIf you're using the [CLI companion tool](https://github.com/ryannhg/elm-spa/tree/master/cli),\nthese are **automatically generated**.\n\n(So feel free to ignore these docs!)\n\nIf you're doing things by hand, this documentation might be helpful!\n\n@docs Path\n\n@docs static, dynamic\n\n","unions":[],"aliases":[{"name":"Path","comment":" a `List` of path segments that you use with `Spa.Transition`\n\n    transitions : Spa.Transitions (Element msg)\n    transitions =\n        { layout = Transition.none\n        , page = Transition.none\n        , pages =\n            [ -- applies fade to all pages under `/guide/*`\n              { path = [ static \"guide\" ]\n              , transition = Transition.fadeElmUi 300\n              }\n            ]\n        }\n\n","args":[],"type":"List.List Internals.Path.Piece"}],"values":[{"name":"dynamic","comment":" A dynamic segment of a path.\n\n    [ static \"docs\", dynamic ]\n    -- /docs/welcome\n    -- /docs/hello\n    -- /docs/hooray\n\n    [ static \"docs\", dynamic, static \"intro\" ]\n    -- /docs/welcome/intro\n    -- /docs/hello/intro\n    -- /docs/hooray/intro\n\n","type":"Internals.Path.Piece"},{"name":"static","comment":" A static segment of a path.\n\n    [ static \"docs\" ]\n    -- /docs\n\n    [ static \"docs\", static \"intro\" ]\n    -- /docs/intro\n\n","type":"String.String -> Internals.Path.Piece"}],"binops":[]},{"name":"Spa.Transition","comment":"\n\n\n## Create transitions from page to page!\n\nA huge benefit to doing client-side rendering is the ability to\nseamlessly navigate from one page to another!\n\nThis package is designed to make creating page transitions a breeze!\n\n@docs Transition\n\n\n## Use one of these transitions\n\n@docs none, fadeElmUi, fadeHtml\n\n\n## Or create your own\n\n@docs custom\n\n","unions":[],"aliases":[{"name":"Transition","comment":" Describes how to move from one page to another.\n\n    transition : Transition (Html msg)\n    transition =\n        Transition.none\n\n    otherTransition : Transition (Element msg)\n    otherTransition =\n        Transition.fadeElmUi 300\n\n","args":["ui_msg"],"type":"Internals.Transition.Transition ui_msg"}],"values":[{"name":"custom","comment":" Create your own custom transition!\n\nJust provide three things:\n\n  - `duration` – how long (in milliseconds) the transition should last.\n\n  - `invisible` – what the page looks like when **invisible**.\n\n  - `visible` – what the page looks like when **visible**.\n\n```\nbatmanNewspaper : Int -> Transition (Element msg)\nbatmanNewspaper duration =\n    Transition.custom\n        { duration = duration\n        , invisible =\n            \\page ->\n                el\n                    [ alpha 0\n                    , width fill\n                    , rotate (4 * pi)\n                    , scale 0\n                    , Styles.transition\n                        { property = \"all\"\n                        , duration = duration\n                        }\n                    ]\n                    page\n        , visible =\n            \\page ->\n                el\n                    [ alpha 1\n                    , width fill\n                    , Styles.transition\n                        { property = \"all\"\n                        , duration = duration\n                        }\n                    ]\n                    page\n        }\n\n--\n-- using it later on\n--\ntransitions : Spa.Types.Transitions (Element msg)\ntransitions =\n    { layout = batmanNewspaper 500 -- 🦇\n    , page = Transition.none\n    , pages = []\n    }\n```\n\n","type":"{ duration : Basics.Int, invisible : ui_msg -> ui_msg, visible : ui_msg -> ui_msg } -> Spa.Transition.Transition ui_msg"},{"name":"fadeElmUi","comment":" Fade one page out and another one in. (For use with `mdgriffith/elm-ui`)\n\nAnimation duration is represented in **milliseconds**\n\n    transitions : Spa.Types.Transitions (Element msg)\n    transitions =\n        { layout = Transition.none\n        , page = Transition.fadeElmUi 300 -- 300 milliseconds\n        , pages = []\n        }\n\n","type":"Basics.Int -> Spa.Transition.Transition (Element.Element msg)"},{"name":"fadeHtml","comment":" Fade one page out and another one in. (For use with `elm/html`)\n\nAnimation duration is represented in **milliseconds**\n\n    transitions : Spa.Types.Transitions (Html msg)\n    transitions =\n        { layout = Transition.none\n        , page = Transition.fadeHtml 300 -- 300 milliseconds\n        , pages = []\n        }\n\n","type":"Basics.Int -> Spa.Transition.Transition (Html.Html msg)"},{"name":"none","comment":" Don't transition from one page to another.\n\nCan be used with `Html msg` or `Element msg` (or another view library)\n\n    transitions : Transitions (Html msg)\n    transitions =\n        { layout = Transition.none -- page loads instantly\n        , page = Transition.fadeHtml 300\n        , pages = []\n        }\n\n    otherTransitions : Transitions (Element msg)\n    otherTransitions =\n        { layout = Transition.none -- page loads instantly\n        , page = Transition.fadeElmUi 300\n        , pages = []\n        }\n\n","type":"Spa.Transition.Transition ui_msg"}],"binops":[]},{"name":"Spa.Types","comment":"\n\n\n## Types so spooky, they got their own module!\n\nThis module is all about exposing the types that `ryannhg/elm-spa` uses\nunder the hood.\n\nYou might notice that there are a **lot of generic types**.\n\nIn practice, we can avoid the messy types with a single\n[`Utils/Spa.elm`](https://github.com/ryannhg/elm-spa/blob/master/example/src/Utils/Spa.elm) file that\nmakes your types easier to understand!\n\n`elm-spa init` will generate that file for you, but I've added examples below if you're\ndoing things by hand.\n\n\n# page\n\n@docs Page\n\n\n# recipe\n\n@docs Recipe\n\n\n# init\n\n@docs Init\n\n\n# update\n\n@docs Update\n\n\n# bundle\n\n@docs Bundle\n\n\n# layouts and recipes\n\n@docs Layout, Upgrade\n\n\n# transitions\n\n@docs Transitions\n\n\n# context\n\n@docs LayoutContext, PageContext\n\n","unions":[],"aliases":[{"name":"Bundle","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    -- if using mdgriffith/elm-ui\n\n    import Spa.Types\n    import Element exposing (Element)\n\n    type alias Bundle msg appMsg =\n        Spa.Types.Bundle Route msg (Element msg) Global.Model Global.Msg appMsg (Element appMsg)\n\n    -- if using elm/html\n\n    import Spa.Types\n    import Html exposing (Html)\n\n    type alias Bundle msg appMsg =\n        Spa.Types.Bundle Route msg (Html msg) Global.Model Global.Msg appMsg (Html appMsg)\n\n\n## using your alias\n\n**`.elm-spa/Generated/Pages.elm`**\n\n    import Utils.Spa as Spa\n\n    bundle : Model -> Spa.Bundle Msg msg\n    bundle model_ =\n        case model_ of\n            -- ...\n\n","args":["route","layoutMsg","ui_layoutMsg","globalModel","globalMsg","msg","ui_msg"],"type":"Internals.Page.Bundle route layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"Init","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    type alias Init model msg =\n        Spa.Types.Init Route model msg Global.Model Global.Msg\n\n\n## using your alias\n\n**`.elm-spa/Generated/Pages.elm`**\n\n    import Utils.Spa as Spa\n\n    init : Route -> Spa.Init Model Msg\n    init route_ =\n        case route_ of\n            -- ...\n\n","args":["route","layoutModel","layoutMsg","globalModel","globalMsg"],"type":"Internals.Page.Init route layoutModel layoutMsg globalModel globalMsg"},{"name":"Layout","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    -- if using mdgriffith/elm-ui\n\n    import Spa.Types\n    import Element exposing (Element)\n\n    type alias Layout params model msg appMsg =\n        Spa.Types.Layout Route params model msg (Element msg) Global.Model Global.Msg appMsg (Element appMsg)\n\n\n    -- if using elm/html\n\n    import Spa.Types\n    import Html exposing (Html)\n\n    type alias Layout params model msg appMsg =\n        Spa.Types.Layout Route params model msg (Html msg) Global.Model Global.Msg appMsg (Html appMsg)\n\n\n## using your alias\n\n**`src/Utils/Spa.elm`**\n\n    layout :\n        Layout params model msg appMsg\n        -> Page params model msg layoutModel layoutMsg appMsg\n    layout =\n        Spa.Page.layout Element.map\n\n","args":["route","pageParams","pageModel","pageMsg","ui_pageMsg","globalModel","globalMsg","msg","ui_msg"],"type":"Internals.Page.Layout route pageParams pageModel pageMsg ui_pageMsg globalModel globalMsg msg ui_msg"},{"name":"LayoutContext","comment":" This is what your `src/Layouts/*.elm` files can access!\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    type alias LayoutContext msg =\n        Spa.Types.LayoutContext Route msg (Element msg) Global.Model Global.Msg\n\n\n## using your alias\n\n**`src/Layout.elm`**\n\n    import Utils.Spa as Spa\n\n    view : Spa.LayoutContext msg -> Html msg\n    view { page, fromGlobalMsg, global } =\n        div [ class \"app\" ]\n            [ Html.map fromGlobalMsg (viewNavbar global)\n            , page\n            , viewFooter\n            ]\n\n    viewNavbar : Global.Model -> Html Global.Msg\n    viewNavbar =\n        -- ...\n\n    viewFooter : Html msg\n    viewFooter =\n        -- ...\n\n","args":["route","msg","ui_msg","globalModel","globalMsg"],"type":"{ page : ui_msg, route : route, global : globalModel, fromGlobalMsg : globalMsg -> msg }"},{"name":"Page","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    -- if using mdgriffith/elm-ui\n\n    import Spa.Types\n    import Element exposing (Element)\n\n    type alias Page params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Page Route params model msg (Element msg) layoutModel layoutMsg (Element layoutMsg) Global.Model Global.Msg appMsg (Element appMsg)\n\n    -- if using elm/html\n\n    import Spa.Types\n    import Html exposing (Html)\n\n    type alias Page params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Page Route params model msg (Html msg) layoutModel layoutMsg (Html layoutMsg) Global.Model Global.Msg appMsg (Html appMsg)\n\n\n## using your alias\n\n**`src/Pages/Example.elm`**\n\n    import Utils.Spa as Spa\n\n    page : Spa.Page Params.Example Model Msg model msg appMsg\n    page =\n        Spa.Page.static { ... }\n\n","args":["route","params","pageModel","pageMsg","ui_pageMsg","layoutModel","layoutMsg","ui_layoutMsg","globalModel","globalMsg","msg","ui_msg"],"type":"Internals.Page.Page route params pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"PageContext","comment":" This is what your `src/Pages/*.elm` files can access!\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    type alias PageContext =\n        Spa.Types.PageContext Route Global.Model\n\n\n## using your alias\n\n**`src/Pages/Top.elm`**\n\n    import Utils.Spa as Spa\n\n    page =\n        Page.static\n            { title = always \"Homepage\"\n            , view = view -- leaving off always here!\n            }\n\n    view : PageContext -> Html Msg\n    view context =\n        case context.global.user of\n            SignedIn user ->\n                viewUser user\n\n            SignedOut ->\n                text \"Who dis?\"\n\n","args":["route","globalModel"],"type":"{ global : globalModel, route : route, queryParameters : Dict.Dict String.String String.String }"},{"name":"Recipe","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    -- if using mdgriffith/elm-ui\n\n    import Spa.Types\n    import Element exposing (Element)\n\n    type alias Recipe params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Recipe Route params model msg layoutModel layoutMsg (Element layoutMsg) Global.Model Global.Msg appMsg (Element appMsg)\n\n    -- if using elm/html\n\n    import Spa.Types\n    import Html exposing (Html)\n\n    type alias Recipe params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Recipe Route params model msg layoutModel layoutMsg (Html layoutMsg) Global.Model Global.Msg appMsg (Html appMsg)\n\n\n## using your alias\n\n**`.elm-spa/Generated/Pages.elm`**\n\n    import Utils.Spa as Spa\n\n    type alias Recipes appMsg =\n        { top : Spa.Recipe Params.Top Top.Model Top.Msg Model Msg appMsg\n        , example : Spa.Recipe Params.Example Example.Model Example.Msg Model Msg appMsg\n        , notFound : Spa.Recipe Params.NotFound NotFound.Model NotFound.Msg Model Msg appMsg\n        }\n\n","args":["route","params","pageModel","pageMsg","layoutModel","layoutMsg","ui_layoutMsg","globalModel","globalMsg","msg","ui_msg"],"type":"Internals.Page.Recipe route params pageModel pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"},{"name":"Transitions","comment":" Describes how to transition between layouts and pages.\n\n    transitions : Transitions (Html msg)\n    transitions =\n        { layout = Transition.none -- page loads instantly\n        , page = Transition.fadeHtml 300\n        , pages = []\n        }\n\n","args":["ui_msg"],"type":"{ layout : Internals.Transition.Transition ui_msg, page : Internals.Transition.Transition ui_msg, pages : List.List { path : Internals.Path.Path, transition : Internals.Transition.Transition ui_msg } }"},{"name":"Update","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    type alias Update model msg =\n        Spa.Types.Update Route model msg Global.Model Global.Msg\n\n\n## using your alias\n\n**`.elm-spa/Generated/Pages.elm`**\n\n    import Utils.Spa as Spa\n\n    update : Msg -> Model -> Spa.Update Model Msg\n    update msg_ model_ =\n        case ( msg_, model_ ) of\n            -- ...\n\n","args":["route","layoutModel","layoutMsg","globalModel","globalMsg"],"type":"Internals.Page.Update route layoutModel layoutMsg globalModel globalMsg"},{"name":"Upgrade","comment":"\n\n\n## creating your alias\n\n**`src/Utils/Spa.elm`**\n\n    -- if using mdgriffith/elm-ui\n\n    import Spa.Types\n    import Element exposing (Element)\n\n    type alias Upgrade params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Upgrade Route params model msg (Element msg) layoutModel layoutMsg (Element layoutMsg) Global.Model Global.Msg appMsg (Element appMsg)\n\n    -- if using elm/html\n\n    import Spa.Types\n    import Html exposing (Html)\n\n    type alias Upgrade params model msg layoutModel layoutMsg appMsg =\n        Spa.Types.Upgrade Route params model msg (Html msg) layoutModel layoutMsg (Html layoutMsg) Global.Model Global.Msg appMsg (Html appMsg)\n\n\n## using your alias\n\n**`src/Utils/Spa.elm`**\n\n    recipe :\n        Upgrade params model msg layoutModel layoutMsg appMsg\n        -> Recipe params model msg layoutModel layoutMsg appMsg\n    recipe =\n        Spa.Page.recipe Element.map\n\n","args":["route","pageParams","pageModel","pageMsg","ui_pageMsg","layoutModel","layoutMsg","ui_layoutMsg","globalModel","globalMsg","msg","ui_msg"],"type":"Internals.Page.Upgrade route pageParams pageModel pageMsg ui_pageMsg layoutModel layoutMsg ui_layoutMsg globalModel globalMsg msg ui_msg"}],"values":[],"binops":[]}]