mirror of
https://gitlab.com/upRootNutrition/website.git
synced 2025-06-16 04:25:11 -05:00
refactor: map abuse
This commit is contained in:
parent
718a9ecaa7
commit
7c0577d3d9
7 changed files with 590 additions and 196 deletions
31
Dodgers.elm
Normal file
31
Dodgers.elm
Normal file
|
@ -0,0 +1,31 @@
|
|||
module Pages.Dodgers exposing (page)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Font as F
|
||||
import Element.Region exposing (description)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = servicesName
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
, element = dodgersContainer
|
||||
}
|
||||
|
||||
dodgersContainer : Element msg
|
||||
dodgersContainer = topLevelContainer dodgersList
|
||||
|
||||
dodgersList : Element msg
|
||||
dodgersList =
|
||||
column
|
||||
[ spacing 20
|
||||
, centerX
|
||||
, centerY
|
||||
]
|
||||
dodgers
|
||||
|
||||
dodgers = []
|
|
@ -3,11 +3,14 @@ module Config.Identity exposing (..)
|
|||
homeName : String
|
||||
homeName = "The Nutrivore"
|
||||
|
||||
platformName : String
|
||||
platformName = homeName ++ " | Platforms"
|
||||
platformsName : String
|
||||
platformsName = homeName ++ " | Platforms"
|
||||
|
||||
servicesName : String
|
||||
servicesName = homeName ++ " | Services"
|
||||
|
||||
supportName : String
|
||||
supportName = homeName ++ " | Support"
|
||||
|
||||
dodgersName : String
|
||||
dodgersName = homeName ++ " | Dodgers"
|
78
frontend/src/Layouts/Navbar.elm
Normal file
78
frontend/src/Layouts/Navbar.elm
Normal file
|
@ -0,0 +1,78 @@
|
|||
module Layouts.Navbar exposing (Model, Msg, Props, layout)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Effect exposing (Effect)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
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 =
|
||||
{}
|
||||
|
||||
|
||||
layout : Props -> Shared.Model -> Route () -> Layout () Model Msg contentMsg
|
||||
layout props shared route =
|
||||
Layout.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, view = view
|
||||
, 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
|
||||
|
||||
|
||||
view : { toContentMsg : Msg -> contentMsg, content : View contentMsg, model : Model } -> View contentMsg
|
||||
view { toContentMsg, model, content } =
|
||||
{ title = content.title
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
, element = column [width fill, height fill] [text "some bullshit", content.element]
|
||||
}
|
|
@ -1,31 +1,101 @@
|
|||
module Pages.Dodgers exposing (page)
|
||||
module Pages.Dodgers exposing (Model, Msg, page)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Effect exposing (Effect)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Font as F
|
||||
import Element.Region exposing (description)
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = servicesName
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= NoOp
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
NoOp ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view model =
|
||||
{ title = dodgersName
|
||||
, attributes = []
|
||||
, element = dodgersContainer
|
||||
}
|
||||
|
||||
|
||||
dodgersContainer : Element msg
|
||||
dodgersContainer = topLevelContainer dodgersList
|
||||
dodgersContainer =
|
||||
topLevelContainer dodgersList
|
||||
|
||||
|
||||
dodgersList : Element msg
|
||||
dodgersList =
|
||||
column
|
||||
[ spacing 20
|
||||
[ spacing 40
|
||||
, centerX
|
||||
, centerY
|
||||
]
|
||||
dodgers
|
||||
|
||||
dodgers = []
|
||||
|
||||
dodgers =
|
||||
[]
|
||||
|
|
106
frontend/src/Pages/Home_.elm
Executable file → Normal file
106
frontend/src/Pages/Home_.elm
Executable file → Normal file
|
@ -1,49 +1,81 @@
|
|||
module Pages.Home_ exposing (page)
|
||||
module Pages.Home_ exposing (Model, Msg, page)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Effect exposing (Effect)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Font as F
|
||||
import Element.Region exposing (description)
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
|
||||
-- Use this if you fuck something up
|
||||
-- Element.explain Debug.todo
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = homeName
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
, element = topLevelContainer
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|
||||
topLevelContainer : Element msg
|
||||
topLevelContainer =
|
||||
el
|
||||
[ width fill
|
||||
, height fill
|
||||
, B.color colourTheme.backgroundColour
|
||||
]
|
||||
linkList
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
linkList : Element msg
|
||||
linkList =
|
||||
column
|
||||
[ spacing 20
|
||||
, centerX
|
||||
, centerY
|
||||
, F.color (rgb255 67 67 67)
|
||||
]
|
||||
links
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
paragraphFontSize : Attr decorative msg
|
||||
paragraphFontSize =
|
||||
F.size 17
|
||||
|
||||
links : List (Element msg)
|
||||
links = []
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= NoOp
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
NoOp ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view model =
|
||||
{ title = homeName
|
||||
, attributes = []
|
||||
, element = none
|
||||
}
|
||||
|
|
|
@ -1,18 +1,83 @@
|
|||
module Pages.Platforms exposing (page)
|
||||
module Pages.Platforms exposing (Model, Msg, page)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Effect exposing (Effect)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Font as F
|
||||
import Element.Region exposing (description)
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
{ title = platformName
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= NoOp
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
NoOp ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view model =
|
||||
{ title = platformsName
|
||||
, attributes = []
|
||||
, element = platformsContainer
|
||||
}
|
||||
|
||||
|
@ -25,13 +90,36 @@ platformsContainer =
|
|||
platformsList : Element msg
|
||||
platformsList =
|
||||
column
|
||||
[ spacing 20
|
||||
[ spacing 40
|
||||
, centerX
|
||||
]
|
||||
platforms
|
||||
|
||||
platforms : List (Element msg)
|
||||
platforms =
|
||||
|
||||
type alias MakeRowInput msg =
|
||||
{ logoImage : String
|
||||
, logoDescription : String
|
||||
, platformsLink : String
|
||||
, platformsTitle : String
|
||||
, platformsParagraph1 : List (Element msg)
|
||||
, platformsParagraph2 : List (Element msg)
|
||||
, platformsRecommendedClientLink1 : String
|
||||
, platformsRecommendedClientLabel1 : String
|
||||
, platformsRecommendedClientText1 : String
|
||||
, platformsRecommendedClientLink2 : String
|
||||
, platformsRecommendedClientLabel2 : String
|
||||
, platformsRecommendedClientText2 : String
|
||||
, platformsRecommendedClientLink3 : String
|
||||
, platformsRecommendedClientLabel3 : String
|
||||
, platformsRecommendedClientText3 : String
|
||||
, platformsRecommendedClientLink4 : String
|
||||
, platformsRecommendedClientLabel4 : String
|
||||
, platformsRecommendedClientText4 : String
|
||||
}
|
||||
|
||||
|
||||
makeRow : MakeRowInput msg -> Element msg
|
||||
makeRow makeRowInput =
|
||||
let
|
||||
recommendedClients : Element msg
|
||||
recommendedClients =
|
||||
|
@ -43,68 +131,97 @@ platforms =
|
|||
, alignTop
|
||||
]
|
||||
in
|
||||
[ column
|
||||
[ spacing 40 ]
|
||||
[ row [ imageSpacer ]
|
||||
row [ imageSpacer ]
|
||||
[ image platformImageFormat
|
||||
{ src = "mastodon.png"
|
||||
, description = "mastodon logo"
|
||||
{ src = makeRowInput.logoImage
|
||||
, description = makeRowInput.logoDescription
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://the-nutrivore.social/"
|
||||
, label = text "MASTODON"
|
||||
{ url = makeRowInput.platformsLink
|
||||
, label = text makeRowInput.platformsTitle
|
||||
}
|
||||
, paragraph paragraphFormat [ text "Microblogging will now be posted to my own self-hosted Mastodon instance. I've kinda grown tired of microblogging on X, where political correctness and unclear ban policies force me to constantly self-censor. I considered and ultimately rejected several alternative platforms. Eventually, I realized the solution to this problem is to simply self-host my own space―somewhere where I can be myself and speak as I please. And I recently obtained the necessary infrastructure to do this." ]
|
||||
, paragraph paragraphFormat [ text "This instance is 100% mine, and I can't be censored or fucked with there. I invite everyone who values my content and interactions to follow me on this new platform (whether you agree with my views or not). My instance is a \"single-user\" instances, meaning I'm the only user. But you can still follow me! Just make an account on another instance, like ", paragraphLinkFormat { url = "https://mastodon.social", label = text "Mastodon.social" }, text " (alternatively, you can select whatever instance you wish from the ", paragraphLinkFormat { url = "https://instances.social/", label = text "official index" }, text "), follow me, and turn on notifications." ]
|
||||
, paragraph paragraphFormat makeRowInput.platformsParagraph1
|
||||
, paragraph paragraphFormat makeRowInput.platformsParagraph2
|
||||
, paragraph paragraphFormat
|
||||
[ recommendedClients
|
||||
, paragraphLinkFormat { url = "https://github.com/LucasGGamerM/moshidon", label = text "Moshidon" }
|
||||
, text " (android) "
|
||||
, paragraphLinkFormat { url = "https://github.com/mastodon/mastodon-android", label = text "Official" }
|
||||
, text " (android) "
|
||||
, paragraphLinkFormat { url = "https://github.com/tuskyapp/Tusky", label = text "Tusky" }
|
||||
, text " (android) "
|
||||
, paragraphLinkFormat { url = "https://apps.apple.com/us/app/mastodon/id1571998974", label = text "Official" }
|
||||
, text " (iOS)"
|
||||
, paragraphLinkFormat { url = makeRowInput.platformsRecommendedClientLink1, label = text makeRowInput.platformsRecommendedClientLabel1 }
|
||||
, text makeRowInput.platformsRecommendedClientText1
|
||||
, paragraphLinkFormat { url = makeRowInput.platformsRecommendedClientLink2, label = text makeRowInput.platformsRecommendedClientLabel2 }
|
||||
, text makeRowInput.platformsRecommendedClientText2
|
||||
, paragraphLinkFormat { url = makeRowInput.platformsRecommendedClientLink3, label = text makeRowInput.platformsRecommendedClientLabel3 }
|
||||
, text makeRowInput.platformsRecommendedClientText3
|
||||
, paragraphLinkFormat { url = makeRowInput.platformsRecommendedClientLink4, label = text makeRowInput.platformsRecommendedClientLabel4 }
|
||||
, text makeRowInput.platformsRecommendedClientText4
|
||||
]
|
||||
]
|
||||
]
|
||||
, row [ imageSpacer ]
|
||||
[ image platformImageFormat
|
||||
{ src = "peertube.png"
|
||||
, description = "peertube logo"
|
||||
|
||||
|
||||
platforms : List (Element msg)
|
||||
platforms =
|
||||
List.map makeRow
|
||||
[ { logoImage = "mastodon.png"
|
||||
, logoDescription = "mastodon logo"
|
||||
, platformsLink = "https://the-nutrivore.social/"
|
||||
, platformsTitle = "MASTODON"
|
||||
, platformsParagraph1 = [ text "Microblogging will now be posted to my own self-hosted Mastodon instance. I've kinda grown tired of microblogging on X, where political correctness and unclear ban policies force me to constantly self-censor. I considered and ultimately rejected several alternative platforms. Eventually, I realized the solution to this problem is to simply self-host my own space―somewhere where I can be myself and speak as I please. And I recently obtained the necessary infrastructure to do this." ]
|
||||
, platformsParagraph2 =
|
||||
[ text "This instance is 100% mine, and I can't be censored or fucked with there. I invite everyone who values my content and interactions to follow me on this new platform (whether you agree with my views or not). My instance is a \"single-user\" instances, meaning I'm the only user. But you can still follow me! Just make an account on another instance, like "
|
||||
, paragraphLinkFormat { url = "https://mastodon.social", label = text "Mastodon.social" }
|
||||
, text " (alternatively, you can select whatever instance you wish from the "
|
||||
, paragraphLinkFormat { url = "https://instances.social/", label = text "official index" }
|
||||
, text "), follow me, and turn on notifications."
|
||||
]
|
||||
, platformsRecommendedClientLink1 = "https://github.com/LucasGGamerM/moshidon"
|
||||
, platformsRecommendedClientLabel1 = "Moshidon"
|
||||
, platformsRecommendedClientText1 = " (android) "
|
||||
, platformsRecommendedClientLink2 = "https://github.com/mastodon/mastodon-android"
|
||||
, platformsRecommendedClientLabel2 = "Official"
|
||||
, platformsRecommendedClientText2 = " (android) "
|
||||
, platformsRecommendedClientLink3 = "https://github.com/tuskyapp/Tusky"
|
||||
, platformsRecommendedClientLabel3 = "Tusky"
|
||||
, platformsRecommendedClientText3 = " (android) "
|
||||
, platformsRecommendedClientLink4 = "https://apps.apple.com/us/app/mastodon/id1571998974"
|
||||
, platformsRecommendedClientLabel4 = "Official"
|
||||
, platformsRecommendedClientText4 = " (iOS)"
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://video.the-nutrivore.social/"
|
||||
, label = text "PEERTUBE"
|
||||
, { logoImage = "peertube.png"
|
||||
, logoDescription = "peertube logo"
|
||||
, platformsLink = "https://video.the-nutrivore.social/"
|
||||
, platformsTitle = "PEERTUBE"
|
||||
, platformsParagraph1 = [ text "I'm transitioning my video content from YouTube to my self-hosted PeerTube instance, because I strongly believe in freedom of speech, copyleft, and digital autonomy. YouTube has proven unreliable due to both censorship and copyright strikes levied against my channel. This shift allows me to better control my content and avoid these silly pitfalls." ]
|
||||
, platformsParagraph2 = [ text "Full-length videos are now exclusively available on PeerTube, while YouTube will only host clips. By registering on PeerTube and subscribing to my channels, you'll have access to all content. Just be sure to enable email notifications to be alerted of new uploads. I believe that those who are truly fans of my work and want the best experience possible will see this as a positive change." ]
|
||||
, platformsRecommendedClientLink1 = ""
|
||||
, platformsRecommendedClientLabel1 = ""
|
||||
, platformsRecommendedClientText1 = "Unfortunately, I can't recommend any mobile clients for PeerTube at this time. They're all trash. Please use your browser, either on your mobile device or personal computer. Just be use to enable email notifications in your account settings."
|
||||
, platformsRecommendedClientLink2 = ""
|
||||
, platformsRecommendedClientLabel2 = ""
|
||||
, platformsRecommendedClientText2 = ""
|
||||
, platformsRecommendedClientLink3 = ""
|
||||
, platformsRecommendedClientLabel3 = ""
|
||||
, platformsRecommendedClientText3 = ""
|
||||
, platformsRecommendedClientLink4 = ""
|
||||
, platformsRecommendedClientLabel4 = ""
|
||||
, platformsRecommendedClientText4 = ""
|
||||
}
|
||||
, paragraph paragraphFormat [ text "I'm transitioning my video content from YouTube to my self-hosted PeerTube instance, because I strongly believe in freedom of speech, copyleft, and digital autonomy. YouTube has proven unreliable due to both censorship and copyright strikes levied against my channel. This shift allows me to better control my content and avoid these silly pitfalls." ]
|
||||
, paragraph paragraphFormat [ text "Full-length videos are now exclusively available on PeerTube, while YouTube will only host clips. By registering on PeerTube and subscribing to my channels, you'll have access to all content. Just be sure to enable email notifications to be alerted of new uploads. I believe that those who are truly fans of my work and want the best experience possible will see this as a positive change." ]
|
||||
, paragraph paragraphFormat [ recommendedClients, text "Unfortunately, I can't recommend any mobile clients for PeerTube at this time. They're all trash. Please use your browser, either on your mobile device or personal computer. Just be use to enable email notifications in your account settings." ]
|
||||
]
|
||||
]
|
||||
, row [ imageSpacer ]
|
||||
[ image platformImageFormat
|
||||
{ src = "discord.png"
|
||||
, description = "discord logo"
|
||||
, { logoImage = "discord.png"
|
||||
, logoDescription = "discord logo"
|
||||
, platformsLink = "https://discord.gg/eeYQ2wJknS"
|
||||
, platformsTitle = "DISCORD"
|
||||
, platformsParagraph1 = [ text "The Nutrivore Discord server is an evidence-based community dedicated to debunking pseudoscience, especially in the fields of nutrition, health and fitness. Casual discourse is welcome, and includes topics such as cooking, gaming, technology, and more. Current members span many disciplines and include both students and professionals, all levels of interest and expertise are welcome." ]
|
||||
, platformsParagraph2 = [ text "The Discord server is not explicitly a debate server. However, we strongly encourage that disagreements be resolved using debate (preferably verbal), as long as it is conducted respectfully and in good faith. Though we also firmly believe that shaming sophistry and bad faith behaviour is a net good overall. The Discord server is planned to be replaced with a Matrix server in future." ]
|
||||
, platformsRecommendedClientLink1 = "https://github.com/Vendicated/Vencord"
|
||||
, platformsRecommendedClientLabel1 = "Vencord"
|
||||
, platformsRecommendedClientText1 = " (desktop) "
|
||||
, platformsRecommendedClientLink2 = "https://discord.com/download"
|
||||
, platformsRecommendedClientLabel2 = "Official"
|
||||
, platformsRecommendedClientText2 = " (multi-platform)"
|
||||
, platformsRecommendedClientLink3 = ""
|
||||
, platformsRecommendedClientLabel3 = ""
|
||||
, platformsRecommendedClientText3 = ""
|
||||
, platformsRecommendedClientLink4 = ""
|
||||
, platformsRecommendedClientLabel4 = ""
|
||||
, platformsRecommendedClientText4 = ""
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://discord.gg/eeYQ2wJknS"
|
||||
, label = text "DISCORD"
|
||||
}
|
||||
, paragraph paragraphFormat [ text "The Nutrivore Discord server is an evidence-based community dedicated to debunking pseudoscience, especially in the fields of nutrition, health and fitness. Casual discourse is welcome, and includes topics such as cooking, gaming, technology, and more. Current members span many disciplines and include both students and professionals, all levels of interest and expertise are welcome." ]
|
||||
, paragraph paragraphFormat [ text "The Discord server is not explicitly a debate server. However, we strongly encourage that disagreements be resolved using debate (preferably verbal), as long as it is conducted respectfully and in good faith. Though we also firmly believe that shaming sophistry and bad faith behaviour is a net good overall. The Discord server is planned to be replaced with a Matrix server in future." ]
|
||||
, paragraph paragraphFormat
|
||||
[ recommendedClients
|
||||
, paragraphLinkFormat { url = "https://github.com/Vendicated/Vencord", label = text "Vencord" }
|
||||
, text " (desktop) "
|
||||
, paragraphLinkFormat { url = "https://discord.com/download", label = text "Official" }
|
||||
, text " (multi-platform) "
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
|
|
@ -1,18 +1,83 @@
|
|||
module Pages.Services exposing (page)
|
||||
module Pages.Services exposing (Model, Msg, page)
|
||||
|
||||
import Config.Identity as ID exposing (..)
|
||||
import Config.Theme as T exposing (..)
|
||||
import Effect exposing (Effect)
|
||||
import Element exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Font as F
|
||||
import Element.Region exposing (description)
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : View msg
|
||||
page =
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view
|
||||
}
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- UPDATE
|
||||
|
||||
|
||||
type Msg
|
||||
= NoOp
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Effect Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
NoOp ->
|
||||
( model
|
||||
, Effect.none
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- SUBSCRIPTIONS
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
|
||||
-- VIEW
|
||||
|
||||
|
||||
view : Model -> View Msg
|
||||
view model =
|
||||
{ title = servicesName
|
||||
, attributes = [ F.family [ spartanFont ] ]
|
||||
, attributes = []
|
||||
, element = servicesContainer
|
||||
}
|
||||
|
||||
|
@ -25,15 +90,25 @@ servicesContainer =
|
|||
servicesList : Element msg
|
||||
servicesList =
|
||||
column
|
||||
[ spacing 20
|
||||
[ spacing 40
|
||||
, centerX
|
||||
, centerY
|
||||
]
|
||||
services
|
||||
|
||||
|
||||
services : List (Element msg)
|
||||
services =
|
||||
type alias MakeRowInput =
|
||||
{ logoImage : String
|
||||
, logoDescription : String
|
||||
, servicesLink : String
|
||||
, servicesTitle : String
|
||||
, servicesRate : String
|
||||
, servicesDescription : String
|
||||
}
|
||||
|
||||
|
||||
makeRow : MakeRowInput -> Element msg
|
||||
makeRow makeRowInput =
|
||||
let
|
||||
servicesImageFormat : List (Attribute msg)
|
||||
servicesImageFormat =
|
||||
|
@ -41,71 +116,59 @@ services =
|
|||
, alignTop
|
||||
]
|
||||
in
|
||||
[ column
|
||||
[ spacing 40 ]
|
||||
[ row [ imageSpacer ]
|
||||
row [ imageSpacer ]
|
||||
[ image servicesImageFormat
|
||||
{ src = "debate.png"
|
||||
, description = "debate logo"
|
||||
{ src = makeRowInput.logoImage
|
||||
, description = makeRowInput.logoDescription
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ row [ spacing 8 ]
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://the-nutrivore.social/"
|
||||
, label = text "DEBATE COACHING"
|
||||
{ url = makeRowInput.servicesLink
|
||||
, label =
|
||||
el
|
||||
[ mouseOver [ F.color (rgb255 255 50 0) ]
|
||||
, htmlAttribute <| style "transition" "all .2s"
|
||||
]
|
||||
<|
|
||||
text makeRowInput.servicesTitle
|
||||
}
|
||||
, paragraph [ F.color colourTheme.nonHighlightedText ] [ text "$60/hr" ]
|
||||
, paragraph [ F.color colourTheme.nonHighlightedText ] [ text makeRowInput.servicesRate ]
|
||||
]
|
||||
, paragraph paragraphFormat [ text "Participate in a structured course consisting of five one-hour modules, covering critical thinking, debate strategy, propositional logic, and more. Throughout the course you will receive both personalized and generalizable advice on how to improve your debate performance." ]
|
||||
, paragraph paragraphFormat [ text makeRowInput.servicesDescription ]
|
||||
]
|
||||
]
|
||||
, row [ imageSpacer ]
|
||||
[ image servicesImageFormat
|
||||
{ src = "analysis.png"
|
||||
, description = "analysis logo"
|
||||
|
||||
|
||||
services : List (Element msg)
|
||||
services =
|
||||
List.map makeRow
|
||||
[ { logoImage = "debate.png"
|
||||
, logoDescription = "debate logo"
|
||||
, servicesLink = "https://the-nutrivore.social/"
|
||||
, servicesTitle = "DEBATE COACHING"
|
||||
, servicesRate = "$60/hr"
|
||||
, servicesDescription = "Participate in a structured course consisting of five one-hour modules, covering critical thinking, debate strategy, propositional logic, and more. Throughout the course you will receive both personalized and generalizable advice on how to improve your debate performance."
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ row [ spacing 8 ]
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://the-nutrivore.social/"
|
||||
, label = text "DEBATE ANALYSIS"
|
||||
, { logoImage = "analysis.png"
|
||||
, logoDescription = "analysis logo"
|
||||
, servicesLink = "https://the-nutrivore.social/"
|
||||
, servicesTitle = "DEBATE ANALYSIS"
|
||||
, servicesRate = "$80/hr"
|
||||
, servicesDescription = "Participate in focused one-hour sessions wherein your own recorded debates are analyzed for constructive feedback and advice to help you improve as a debater. You may also participate in mock debates, staged debates, and other exercises to help you get more comfortable with debate and verbal confrontation."
|
||||
}
|
||||
, paragraph [ F.color colourTheme.nonHighlightedText ] [ text "$80/hr" ]
|
||||
]
|
||||
, paragraph paragraphFormat [ text "Participate in focused one-hour sessions wherein your own recorded debates are analyzed for constructive feedback and advice to help you improve as a debater. You may also participate in mock debates, staged debates, and other exercises to help you get more comfortable with debate and verbal confrontation." ]
|
||||
]
|
||||
]
|
||||
, row [ imageSpacer ]
|
||||
[ image servicesImageFormat
|
||||
{ src = "nutrition.png"
|
||||
, description = "analysis logo"
|
||||
, { logoImage = "nutrition.png"
|
||||
, logoDescription = "nutrition logo"
|
||||
, servicesLink = "https://the-nutrivore.social/"
|
||||
, servicesTitle = "NUTRITION SCIENCE"
|
||||
, servicesRate = "$40/hr"
|
||||
, servicesDescription = "Participate in a one-hour Q&A session specifically to inquire about nutrition science. Ask questions about research design, methodology, epistemology, and study interpretation. Also, by participating you will also gain access to nutrition science interpretation cheat-sheets that will streamline and simply the research appraisal process."
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ row [ spacing 8 ]
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://the-nutrivore.social/"
|
||||
, label = text "NUTRITION SCIENCE"
|
||||
, { logoImage = "nixos.png"
|
||||
, logoDescription = "debate logo"
|
||||
, servicesLink = "https://the-nutrivore.social/"
|
||||
, servicesTitle = "CUSTOM NIX BUILDS"
|
||||
, servicesRate = "$40/hr"
|
||||
, servicesDescription = "NixOS has become popular in my community, with many people choosing to explore it over Windows, MacOS, and other Linux distributions. Naturally, as a consequence of this, I receive numerous requests for help regarding the Nix programming language and NixOS system configuration. So, to fast-track newcomers and to make my life a little bit easier for both of us, I'm offering to build custom NixOS configurations for interested clients."
|
||||
}
|
||||
, paragraph [ F.color colourTheme.nonHighlightedText ] [ text "$40/hr" ]
|
||||
]
|
||||
, paragraph paragraphFormat [ text "Participate in a one-hour Q&A session specifically to inquire about nutrition science. Ask questions about research design, methodology, epistemology, and study interpretation. Also, by participating you will also gain access to nutrition science interpretation cheat-sheets that will streamline and simply the research appraisal process." ]
|
||||
]
|
||||
]
|
||||
, row [ imageSpacer ]
|
||||
[ image servicesImageFormat
|
||||
{ src = "nixos.png"
|
||||
, description = "debate logo"
|
||||
}
|
||||
, column paragraphColumnFormat
|
||||
[ row [ spacing 8 ]
|
||||
[ newTabLink titleFormat
|
||||
{ url = "https://the-nutrivore.social/"
|
||||
, label = text "CUSTOM NIX BUILDS"
|
||||
}
|
||||
, paragraph [ F.color colourTheme.nonHighlightedText ] [ text "$40/hr" ]
|
||||
]
|
||||
, paragraph paragraphFormat [ text "NixOS has become popular in my community, with many people choosing to explore it over Windows, MacOS, and other Linux distributions. Naturally, as a consequence of this, I receive numerous requests for help regarding the Nix programming language and NixOS system configuration. So, to fast-track newcomers and to make my life a little bit easier for both of us, I'm offering to build custom NixOS configurations for interested clients." ]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue