docspell/website/elm/Main.elm
2023-07-04 20:37:53 +02:00

333 lines
8.4 KiB
Elm

module Main exposing (..)
import Browser
import Demo
import ExtraAttr exposing (..)
import Feature exposing (Feature)
import GetStarted
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Icons
import Random
import Random.List
-- MAIN
main : Program Flags Model Msg
main =
Browser.element
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
--- Model
type alias Flags =
{ version : String
}
type alias Model =
{ navbarOpen : Bool
, features : List Feature
, flags : Flags
}
type Msg
= ToggleNavbarMenu
| ShuffleFeatures
| ListShuffled (List Feature)
--- Init
viewFeatureCount : Int
viewFeatureCount =
10
init : Flags -> ( Model, Cmd Msg )
init flags =
( { navbarOpen = False
, features = List.take viewFeatureCount Feature.features
, flags = flags
}
, Cmd.none
)
shuffleFeatures : Cmd Msg
shuffleFeatures =
Random.List.shuffle Feature.features
|> Random.map (List.take viewFeatureCount)
|> Random.generate ListShuffled
--- Update
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
ToggleNavbarMenu ->
( { model | navbarOpen = not model.navbarOpen }
, Cmd.none
)
ShuffleFeatures ->
( model, shuffleFeatures )
ListShuffled lf ->
( { model | features = lf }
, Cmd.none
)
subscriptions : Model -> Sub Msg
subscriptions _ =
Sub.none
--- View
view : Model -> Html Msg
view model =
node "body"
[ class "text-gray-700" ]
[ mainHero model
, demoHeader
, section [ class "container max-w-screen-xl mx-auto mb-2" ]
[ div [ class "mt-3 flex flex-col space-y-4" ]
[ Demo.demo Demo.processDemo
, Demo.demo Demo.navigateDemo
]
]
, featureHeader model
, section [ class "mx-auto max-w-screen-xl mb-2 mt-4" ]
(List.indexedMap Feature.featureBox model.features
++ [ div
[ class "flex px-8 py-8 border rounded mb-5 shadow-lg text-2xl"
, class "sm:flex-row sm:space-y-0 sm-space-x-4"
, class "mx-2 sm:mx-8"
]
[ div [ class "text-center w-full" ]
[ text "A more complete list can be found in "
, a [ href "/docs/features", class "link" ] [ text "here" ]
, text "."
]
]
]
)
, getStartedHeader model
, GetStarted.getStarted model.flags.version
, footHero model
]
footHero : Model -> Html Msg
footHero model =
footer
[ id "footer"
, class "footer"
]
[ div [ class "text-center" ]
[ span []
[ text ("Docspell, " ++ model.flags.version)
]
, span [ class "pr-1 pl-1" ]
[ text " "
]
, a
[ href "https://spdx.org/licenses/AGPL-3.0-or-later.html"
, target "_blank"
, class "link"
]
[ text "AGPLv3+"
]
, span [ class "pr-1 pl-1" ]
[ text " "
]
, a
[ href "https://github.com/eikek/docspell"
, target "_blank"
, class "link"
]
[ text "Source Code"
]
, span [ class "pr-1 pl-1" ]
[ text " "
]
, span []
[ a
[ href "https://gitter.im/eikek/docspell"
, target "_blank"
, class "link"
]
[ text "Chat on Gitter"
]
]
]
]
getStartedHeader : Model -> Html Msg
getStartedHeader _ =
section
[ id "get-started"
, class "hero-header"
]
[ text "Get Started"
]
demoHeader : Html msg
demoHeader =
h2
[ class "hero-header"
, id "demos"
]
[ text "Screencasts"
]
featureHeader : Model -> Html Msg
featureHeader _ =
h2
[ id "feature-selection"
, class "hero-header"
]
[ text "Feature Selection"
]
navBar : String -> Html Msg
navBar classes =
nav
[ id "top-nav"
, class "top-0 z-50 w-full flex flex-row justify-start shadow-sm h-14 antialiased "
, class classes
]
[ a
[ onClick ToggleNavbarMenu
, href "#"
, class "font-bold inline-flex items-center px-4 w-10 sm:hidden "
]
[ i [ class "fa fa-bars" ] []
]
, a
[ class "inline-flex px-4 items-center hover:bg-gray-50 hover:bg-opacity-20"
, href "/"
]
[ div [ class "" ]
[ Icons.logo
]
, span [ class "ml-1 text-2xl font-semibold font-serif" ]
[ text "Docspell" ]
]
, a
[ href "docs/"
, class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20"
, class " text-xl"
]
[ Icons.docs
, span [ class "ml-2 tracking-wide" ]
[ text "Documentation"
]
]
, a
[ href "blog/"
, class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20"
, class " text-xl"
]
[ Icons.blog
, span [ class "ml-2 tracking-wide" ]
[ text "Blog"
]
]
, a
[ target "_blank"
, href "https://github.com/eikek/docspell"
, class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20"
, class " text-xl"
]
[ Icons.github
, span [ class "ml-2 tracking-wide" ]
[ text "Github"
]
]
]
mainHero : Model -> Html Msg
mainHero _ =
section
[ id "hero-main"
, class "min-h-screen text-white flex flex-col items-center main-background"
]
[ navBar " text-white"
, div [ class "flex-grow flex flex-col items-center justify-center w-full" ]
[ Icons.logoWidth 112
, h1 [ class "text-6xl font-semibold shadow font-serif" ]
[ text "Docspell"
]
, h2 [ class "text-3xl font-madium tracking-wide mt-2 mb-4 " ]
[ text "Simple document organizer"
]
, p [ class "px-2 text-center text-xl font-light shadow max-w-prose font-sans" ]
[ text "Docspell assists in organizing your piles of "
, text "digital documents, resulting from scanners, e-mails "
, text "and other sources with minimal effort."
]
, div
[ class "mt-4 flex flex-col space-y-2 text-2xl"
, class "sm:items-center sm:flex-row sm:space-y-0 sm:space-x-4"
]
[ a
[ class "button info"
, href "#demos"
]
[ text "Screencasts"
]
, a
[ class "button info"
, href "#feature-selection"
]
[ text "Features"
]
, a
[ class "button primary"
, href "#get-started"
]
[ text "Get Started"
]
]
]
, div [ class "text-right w-full" ]
[ span [ class "opacity-40 text-xs" ]
[ i [ class "fab fa-unsplash mr-1" ] []
, text "Photo by "
, a
[ href "https://unsplash.com/@numericcitizen"
, target "_blank"
]
[ text "JF Martin"
]
]
]
]