2024-11-11 03:57:54 -06:00
|
|
|
module Layouts.Navbar exposing (Model, Msg, Props, layout)
|
|
|
|
|
2024-11-11 21:57:27 -06:00
|
|
|
import Config.Colour as T exposing (..)
|
|
|
|
import Config.Format as O exposing (..)
|
|
|
|
import Config.Identity as I exposing (..)
|
2024-11-11 03:57:54 -06:00
|
|
|
import Effect exposing (Effect)
|
2024-11-26 21:17:31 -06:00
|
|
|
import Element as E exposing (..)
|
|
|
|
import Element.Background as B exposing (..)
|
|
|
|
import Element.Border as D exposing (..)
|
2024-11-11 03:57:54 -06:00
|
|
|
import Element.Font as F
|
|
|
|
import Element.Region exposing (description)
|
|
|
|
import Html exposing (Html)
|
|
|
|
import Html.Attributes as H exposing (class, style)
|
|
|
|
import Layout exposing (Layout)
|
|
|
|
import Route exposing (Route)
|
|
|
|
import Shared
|
|
|
|
import View exposing (View)
|
|
|
|
|
|
|
|
|
|
|
|
type alias Props =
|
2024-12-06 22:03:24 -06:00
|
|
|
{}
|
2024-11-11 03:57:54 -06:00
|
|
|
|
|
|
|
|
|
|
|
layout : Props -> Shared.Model -> Route () -> Layout () Model Msg contentMsg
|
|
|
|
layout props shared route =
|
|
|
|
Layout.new
|
|
|
|
{ init = init
|
|
|
|
, update = update
|
2024-12-06 00:43:00 -06:00
|
|
|
, view =
|
|
|
|
\layoutArgs ->
|
2024-12-08 02:18:36 -06:00
|
|
|
view shared
|
2024-12-06 00:43:00 -06:00
|
|
|
{ props = props
|
|
|
|
, content = layoutArgs.content
|
|
|
|
, model = layoutArgs.model
|
|
|
|
, toContentMsg = layoutArgs.toContentMsg
|
|
|
|
}
|
2024-11-11 03:57:54 -06:00
|
|
|
, subscriptions = subscriptions
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- MODEL
|
|
|
|
|
|
|
|
|
|
|
|
type alias Model =
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
init : () -> ( Model, Effect Msg )
|
|
|
|
init _ =
|
|
|
|
( {}
|
|
|
|
, Effect.none
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- UPDATE
|
|
|
|
|
|
|
|
|
|
|
|
type Msg
|
|
|
|
= ReplaceMe
|
|
|
|
|
|
|
|
|
|
|
|
update : Msg -> Model -> ( Model, Effect Msg )
|
|
|
|
update msg model =
|
|
|
|
case msg of
|
|
|
|
ReplaceMe ->
|
|
|
|
( model
|
|
|
|
, Effect.none
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
subscriptions : Model -> Sub Msg
|
|
|
|
subscriptions model =
|
|
|
|
Sub.none
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- VIEW
|
|
|
|
|
|
|
|
|
2024-12-03 21:17:17 -06:00
|
|
|
view :
|
2024-12-08 02:18:36 -06:00
|
|
|
Shared.Model
|
|
|
|
->
|
|
|
|
{ content : View contentMsg
|
|
|
|
, model : Model
|
|
|
|
, toContentMsg : Msg -> contentMsg
|
|
|
|
, props : Props
|
|
|
|
}
|
2024-12-03 21:17:17 -06:00
|
|
|
-> View contentMsg
|
2024-12-08 02:18:36 -06:00
|
|
|
view shared { content, model, toContentMsg, props } =
|
2024-12-07 15:43:26 -06:00
|
|
|
{ title = "uRN :: " ++ content.title
|
2024-11-11 03:57:54 -06:00
|
|
|
, attributes = [ F.family [ spartanFont ] ]
|
2024-12-08 02:18:36 -06:00
|
|
|
, element = navbarContainer shared.device content.element
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
navbarContainer : Device -> Element msg -> Element msg
|
|
|
|
navbarContainer device content =
|
|
|
|
row
|
|
|
|
[ E.width fill
|
|
|
|
, height fill
|
|
|
|
, B.color colourTheme.backgroundDarkGrey
|
|
|
|
, E.height E.fill
|
|
|
|
]
|
|
|
|
[ column
|
|
|
|
[ htmlAttribute (H.style "position" "fixed")
|
|
|
|
, htmlAttribute (H.style "left" "0")
|
|
|
|
, htmlAttribute (H.style "top" "0")
|
|
|
|
, htmlAttribute (H.style "height" "100vh")
|
|
|
|
, htmlAttribute (H.style "z-index" "10")
|
|
|
|
, htmlAttribute (H.style "transform-style" "preserve-3d")
|
|
|
|
, D.widthEach { top = 0, bottom = 0, left = 0, right = 3 }
|
|
|
|
, D.color colourTheme.textDarkOrange
|
|
|
|
, B.color colourTheme.backgroundDarkGrey
|
|
|
|
]
|
|
|
|
(case ( device.class, device.orientation ) of
|
|
|
|
( Phone, Portrait ) ->
|
|
|
|
[ mobileNavbar, mobileFooterIcons ]
|
|
|
|
|
|
|
|
( Phone, Landscape ) ->
|
|
|
|
[ mobileNavbar, mobileFooterIcons ]
|
|
|
|
|
|
|
|
( Tablet, Portrait ) ->
|
|
|
|
[ mobileNavbar, mobileFooterIcons ]
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
[ desktopNavbar, desktopFooterIcons ]
|
|
|
|
)
|
|
|
|
, el
|
2024-11-26 21:17:31 -06:00
|
|
|
[ E.width fill
|
2024-11-11 18:57:51 -06:00
|
|
|
, height fill
|
2024-12-08 02:18:36 -06:00
|
|
|
, paddingEach
|
|
|
|
{ top = 0
|
|
|
|
, right = 0
|
|
|
|
, bottom = 0
|
|
|
|
, left =
|
|
|
|
case ( device.class, device.orientation ) of
|
|
|
|
( Phone, _ ) ->
|
|
|
|
mobileBarWidth
|
|
|
|
|
|
|
|
( Tablet, Portrait ) ->
|
|
|
|
mobileBarWidth
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
desktopBarWidth
|
|
|
|
}
|
2024-11-11 18:57:51 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
content
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
desktopBarWidth : Int
|
|
|
|
desktopBarWidth =
|
|
|
|
200
|
|
|
|
|
|
|
|
|
|
|
|
mobileBarWidth : Int
|
|
|
|
mobileBarWidth =
|
|
|
|
50
|
|
|
|
|
|
|
|
|
|
|
|
localhostUrl : String
|
|
|
|
localhostUrl =
|
|
|
|
url
|
|
|
|
|
|
|
|
|
|
|
|
desktopNavbar : Element msg
|
|
|
|
desktopNavbar =
|
|
|
|
column
|
|
|
|
[ alignLeft
|
|
|
|
, height fill
|
|
|
|
, F.color colourTheme.textLightGrey
|
|
|
|
]
|
|
|
|
[ column
|
|
|
|
[ centerX
|
|
|
|
, E.width <| px desktopBarWidth
|
|
|
|
]
|
|
|
|
[ row
|
|
|
|
(nonHighlightedTitleFormat
|
|
|
|
++ [ centerX
|
|
|
|
]
|
|
|
|
)
|
|
|
|
[ E.image
|
|
|
|
[ spacing 2
|
|
|
|
, E.width <| px 140
|
|
|
|
, centerX
|
|
|
|
, paddingEach
|
|
|
|
{ top = 20
|
|
|
|
, right = 0
|
|
|
|
, bottom = 20
|
|
|
|
, left = 0
|
|
|
|
}
|
|
|
|
]
|
|
|
|
{ src = "assets/logo.png"
|
|
|
|
, description = ""
|
|
|
|
}
|
|
|
|
]
|
|
|
|
, el
|
|
|
|
[ E.width <| px 140
|
|
|
|
, alignTop
|
|
|
|
, centerX
|
|
|
|
, D.widthEach
|
|
|
|
{ bottom = 1
|
|
|
|
, top = 0
|
|
|
|
, left = 0
|
|
|
|
, right = 0
|
|
|
|
}
|
|
|
|
, D.color colourTheme.textDarkGrey
|
|
|
|
]
|
|
|
|
none
|
|
|
|
]
|
|
|
|
, column
|
|
|
|
[ padding 20, alignTop, alignLeft ]
|
2024-11-11 18:57:51 -06:00
|
|
|
[ column
|
2024-12-08 02:18:36 -06:00
|
|
|
[ F.bold
|
|
|
|
, F.color colourTheme.textLightGrey
|
|
|
|
, F.size 17
|
|
|
|
, spacing 8
|
2024-11-11 18:57:51 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
(desktopHomeButtonMaker
|
|
|
|
:: List.map desktopPagesButtonMaker
|
|
|
|
[ pageNames.pageServices
|
|
|
|
, pageNames.pageHyperBlog
|
|
|
|
, pageNames.pageDebate
|
|
|
|
, pageNames.pageNutriDex
|
|
|
|
, pageNames.pageInterviews
|
|
|
|
, pageNames.pageDonate
|
|
|
|
, pageNames.pageContact
|
2024-11-26 21:17:31 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
)
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
mobileNavbar : Element msg
|
|
|
|
mobileNavbar =
|
|
|
|
column
|
|
|
|
[ height fill
|
|
|
|
, E.width fill
|
|
|
|
, F.color colourTheme.textLightGrey
|
|
|
|
, scrollbarY
|
|
|
|
]
|
|
|
|
[ column
|
|
|
|
[ centerX
|
|
|
|
, E.width <| px mobileBarWidth
|
|
|
|
]
|
|
|
|
[ row
|
|
|
|
(nonHighlightedTitleFormat
|
|
|
|
++ [ centerX
|
|
|
|
]
|
|
|
|
)
|
|
|
|
[ E.image
|
|
|
|
[ spacing 2
|
|
|
|
, E.width <| px 35
|
|
|
|
, centerX
|
|
|
|
, paddingEach
|
|
|
|
{ top = 10
|
|
|
|
, right = 0
|
|
|
|
, bottom = 10
|
|
|
|
, left = 0
|
|
|
|
}
|
2024-11-26 21:17:31 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
{ src = "assets/logo_lambda.png"
|
|
|
|
, description = ""
|
|
|
|
}
|
2024-11-11 18:57:51 -06:00
|
|
|
]
|
2024-11-14 21:10:41 -06:00
|
|
|
, el
|
2024-12-08 02:18:36 -06:00
|
|
|
[ E.width <| px 20
|
|
|
|
, alignTop
|
|
|
|
, centerX
|
|
|
|
, D.widthEach
|
|
|
|
{ bottom = 1
|
|
|
|
, top = 0
|
|
|
|
, left = 0
|
2024-11-26 21:17:31 -06:00
|
|
|
, right = 0
|
|
|
|
}
|
2024-12-08 02:18:36 -06:00
|
|
|
, D.color colourTheme.textDarkGrey
|
2024-11-14 21:10:41 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
none
|
2024-11-11 18:57:51 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
, column
|
|
|
|
[ padding 5
|
|
|
|
, centerY
|
|
|
|
, centerX
|
|
|
|
]
|
|
|
|
[ column
|
|
|
|
[ spacing 8
|
|
|
|
, centerX
|
|
|
|
]
|
|
|
|
(mobileHomeButtonMaker
|
|
|
|
:: List.map mobilePagesButtonMaker
|
|
|
|
[ pageNames.pageServices
|
|
|
|
, pageNames.pageHyperBlog
|
|
|
|
, pageNames.pageDebate
|
|
|
|
, pageNames.pageNutriDex
|
|
|
|
, pageNames.pageInterviews
|
|
|
|
, pageNames.pageDonate
|
|
|
|
, pageNames.pageContact
|
|
|
|
]
|
|
|
|
)
|
|
|
|
]
|
|
|
|
]
|
2024-11-26 21:17:31 -06:00
|
|
|
|
|
|
|
|
2024-12-08 02:18:36 -06:00
|
|
|
desktopBackground : Element msg -> Element msg
|
|
|
|
desktopBackground =
|
|
|
|
el
|
|
|
|
[ E.width fill
|
|
|
|
, height fill
|
|
|
|
, paddingEach
|
|
|
|
{ top = 0
|
|
|
|
, right = 0
|
|
|
|
, bottom = 0
|
|
|
|
, left = desktopBarWidth
|
|
|
|
}
|
|
|
|
]
|
2024-11-26 21:17:31 -06:00
|
|
|
|
|
|
|
|
2024-12-08 02:18:36 -06:00
|
|
|
mobileBackground : Element msg -> Element msg
|
|
|
|
mobileBackground =
|
|
|
|
el
|
|
|
|
[ E.width fill
|
|
|
|
, height fill
|
|
|
|
, paddingEach
|
|
|
|
{ top = 0
|
|
|
|
, right = 0
|
|
|
|
, bottom = 0
|
|
|
|
, left = mobileBarWidth
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
desktopButtonMaker : String -> String -> Element msg
|
|
|
|
desktopButtonMaker name url =
|
|
|
|
link
|
|
|
|
[ E.width fill ]
|
|
|
|
{ url = url
|
|
|
|
, label =
|
|
|
|
row
|
|
|
|
[ spacing 0 ]
|
|
|
|
[ column [ E.width <| px 36 ]
|
|
|
|
[ E.image
|
|
|
|
[ alignLeft
|
|
|
|
, alignBottom
|
|
|
|
, E.width <| px 30
|
|
|
|
]
|
|
|
|
{ src = "navbar/" ++ String.toLower name ++ ".png"
|
|
|
|
, description = name ++ " icon"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
, column
|
|
|
|
[ alignBottom ]
|
|
|
|
[ el
|
|
|
|
[ mouseOver [ F.color colourTheme.textLightOrange ]
|
|
|
|
, F.color colourTheme.textLightGrey
|
|
|
|
, htmlAttribute <| style "transition" "all 0.1s ease-in-out"
|
|
|
|
]
|
|
|
|
<|
|
|
|
|
text (String.toUpper name)
|
|
|
|
]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
desktopHomeButtonMaker : Element msg
|
|
|
|
desktopHomeButtonMaker =
|
|
|
|
desktopButtonMaker "home" localhostUrl
|
|
|
|
|
|
|
|
|
|
|
|
desktopPagesButtonMaker : String -> Element msg
|
|
|
|
desktopPagesButtonMaker name =
|
|
|
|
desktopButtonMaker name (localhostUrl ++ String.toLower name)
|
|
|
|
|
|
|
|
|
|
|
|
mobileButtonMaker : String -> Element msg
|
|
|
|
mobileButtonMaker name =
|
|
|
|
link
|
|
|
|
[]
|
|
|
|
{ url = localhostUrl ++ String.toLower name
|
|
|
|
, label =
|
|
|
|
row
|
|
|
|
[ spacing 10 ]
|
|
|
|
[ column [ E.width <| px 36 ]
|
|
|
|
[ E.image
|
|
|
|
[ E.width <| px 25
|
|
|
|
, centerX
|
|
|
|
]
|
|
|
|
{ src = "navbar/" ++ String.toLower name ++ ".png"
|
|
|
|
, description = name ++ " icon"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mobileHomeButtonMaker : Element msg
|
|
|
|
mobileHomeButtonMaker =
|
|
|
|
mobileButtonMaker "home"
|
|
|
|
|
|
|
|
|
|
|
|
mobilePagesButtonMaker : String -> Element msg
|
|
|
|
mobilePagesButtonMaker name =
|
|
|
|
mobileButtonMaker name
|
|
|
|
|
|
|
|
|
|
|
|
desktopFooterIcons : Element msg
|
|
|
|
desktopFooterIcons =
|
2024-11-27 22:36:35 -06:00
|
|
|
row
|
|
|
|
[ alignBottom
|
|
|
|
, E.width fill
|
|
|
|
]
|
|
|
|
[ row
|
|
|
|
[ centerX
|
|
|
|
, centerY
|
|
|
|
, E.width fill
|
|
|
|
, E.height fill
|
|
|
|
, spacing 20
|
2024-11-30 04:32:00 -06:00
|
|
|
, paddingEach
|
2024-12-08 02:18:36 -06:00
|
|
|
{ top = 10
|
|
|
|
, bottom = 10
|
|
|
|
, left = 0
|
|
|
|
, right = 0
|
2024-11-30 04:32:00 -06:00
|
|
|
}
|
2024-11-27 22:36:35 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
-- Use the list of social media details here
|
|
|
|
(List.map
|
2024-11-27 22:36:35 -06:00
|
|
|
footerImageMaker
|
2024-12-08 02:18:36 -06:00
|
|
|
[ gitlabDetails
|
|
|
|
, twitterDetails
|
|
|
|
, mastodonDetails
|
|
|
|
, discordDetails
|
|
|
|
]
|
|
|
|
)
|
2024-11-27 22:36:35 -06:00
|
|
|
]
|
|
|
|
|
|
|
|
|
2024-12-08 02:18:36 -06:00
|
|
|
mobileFooterIcons : Element msg
|
|
|
|
mobileFooterIcons =
|
|
|
|
column
|
|
|
|
[ alignBottom
|
|
|
|
, E.width fill
|
2024-11-27 22:36:35 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
[ column
|
|
|
|
[ centerX
|
|
|
|
, centerY
|
|
|
|
, E.width fill
|
|
|
|
, E.height fill
|
|
|
|
, spacing 10
|
|
|
|
, paddingEach
|
|
|
|
{ top = 10
|
|
|
|
, bottom = 10
|
|
|
|
, left = 0
|
|
|
|
, right = 0
|
2024-11-26 21:17:31 -06:00
|
|
|
}
|
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
(List.map
|
|
|
|
footerImageMaker
|
|
|
|
[ gitlabDetails
|
|
|
|
, twitterDetails
|
|
|
|
, mastodonDetails
|
|
|
|
, discordDetails
|
|
|
|
]
|
|
|
|
)
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
footerImageMaker :
|
|
|
|
{ name : String
|
|
|
|
, url : String
|
|
|
|
}
|
|
|
|
-> Element msg
|
|
|
|
footerImageMaker config =
|
|
|
|
column [ centerX ]
|
|
|
|
[ link []
|
|
|
|
{ url = config.url
|
|
|
|
, label =
|
|
|
|
row []
|
|
|
|
[ E.image
|
|
|
|
[ E.width <| px 20
|
|
|
|
, alignBottom
|
|
|
|
, centerX
|
2024-11-27 15:11:21 -06:00
|
|
|
]
|
2024-12-08 02:18:36 -06:00
|
|
|
{ src = "navbar/" ++ config.name ++ "-light.png"
|
|
|
|
, description = ""
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2024-11-26 21:17:31 -06:00
|
|
|
]
|
2024-12-07 15:43:26 -06:00
|
|
|
|
|
|
|
|
2024-12-08 02:18:36 -06:00
|
|
|
gitlabDetails : { name : String, url : String }
|
|
|
|
gitlabDetails =
|
|
|
|
{ name = "gitlab"
|
|
|
|
, url = "https://gitlab.com/BRBWaffles/website"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
twitterDetails : { name : String, url : String }
|
|
|
|
twitterDetails =
|
|
|
|
{ name = "twitter"
|
|
|
|
, url = "https://x.com/upRootNutrition"
|
|
|
|
}
|
2024-12-07 15:43:26 -06:00
|
|
|
|
|
|
|
|
2024-12-08 02:18:36 -06:00
|
|
|
mastodonDetails : { name : String, url : String }
|
|
|
|
mastodonDetails =
|
|
|
|
{ name = "mastodon"
|
|
|
|
, url = "https://social.uprootnutrition.com/@nick"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
discordDetails : { name : String, url : String }
|
|
|
|
discordDetails =
|
|
|
|
{ name = "discord"
|
|
|
|
, url = "https://discord.com/invite/YrcEvgRTqy"
|
|
|
|
}
|