mirror of
https://gitlab.com/upRootNutrition/website.git
synced 2025-06-15 12:05:12 -05:00
feat: so very close
This commit is contained in:
parent
131dbfe8a3
commit
f9b8f59df9
30 changed files with 1500 additions and 1272 deletions
|
@ -2,6 +2,7 @@ module Config.Helpers.Articles.Article exposing (..)
|
|||
|
||||
import Config.Data.Identity exposing (pageNames)
|
||||
import Config.Helpers.Articles.Types exposing (References)
|
||||
import Config.Helpers.Cards.Inner.Helpers exposing (detailFormat)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -45,34 +46,44 @@ import Shared exposing (..)
|
|||
import View exposing (View)
|
||||
|
||||
|
||||
contentList : BlogArticle -> List (Element msg)
|
||||
contentList article =
|
||||
[ articleImage article.articleImage
|
||||
, renderDeviceMarkdown article.articleBody
|
||||
contentList : BlogArticle -> List (Element msg) -> List (Element msg)
|
||||
contentList article extraElements =
|
||||
[ case article.articleImage of
|
||||
"" ->
|
||||
none
|
||||
|
||||
_ ->
|
||||
articleImage article.articleImage
|
||||
, case article.hasTableOfContents of
|
||||
True ->
|
||||
renderDeviceMarkdown article.articleBody
|
||||
|
||||
False ->
|
||||
renderDeviceMarkdownNoToc article.articleBody
|
||||
, case article.hasReferences of
|
||||
True ->
|
||||
articleReferences article
|
||||
|
||||
False ->
|
||||
none
|
||||
, detailFormat column extraElements
|
||||
]
|
||||
|
||||
|
||||
articleReferences : BlogArticle -> Element msg
|
||||
articleReferences article =
|
||||
el
|
||||
[ width fill
|
||||
, height fill
|
||||
]
|
||||
<|
|
||||
column [ width fill, F.size 15, spacing 10 ] <|
|
||||
List.map2 (\x y -> makeReference x y)
|
||||
article.articleReferences
|
||||
(List.range 1 (List.length article.articleReferences))
|
||||
column [ width fill, F.size 15, spacing 10 ] <|
|
||||
List.map2 (\x y -> makeReference x y)
|
||||
article.articleReferences
|
||||
(List.range 1 (List.length article.articleReferences))
|
||||
|
||||
|
||||
makeReference : References -> Int -> Element msg
|
||||
makeReference references index =
|
||||
let
|
||||
comma =
|
||||
", "
|
||||
in
|
||||
el
|
||||
[ F.regular
|
||||
, F.alignLeft
|
||||
|
@ -86,9 +97,9 @@ makeReference references index =
|
|||
, transitionStyleFast
|
||||
]
|
||||
{ url = references.link, label = text (String.fromInt index ++ ". ") }
|
||||
, text (references.author ++ ", ")
|
||||
, text (references.title ++ ", ")
|
||||
, text (references.journal ++ ", ")
|
||||
, text (references.author ++ comma)
|
||||
, text (references.title ++ comma)
|
||||
, text (references.journal ++ comma)
|
||||
, text references.year
|
||||
]
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ cardMaker device cardable contents =
|
|||
hasLink =
|
||||
case cardable of
|
||||
C.Contact _ ->
|
||||
False
|
||||
True
|
||||
|
||||
C.Cuck c ->
|
||||
False
|
||||
|
@ -81,6 +81,9 @@ cardMaker device cardable contents =
|
|||
C.ServicePage _ ->
|
||||
False
|
||||
|
||||
C.ContactPage _ ->
|
||||
False
|
||||
|
||||
cardTitleMaker : String -> Maybe String -> Element msg
|
||||
cardTitleMaker title maybeUrl =
|
||||
el
|
||||
|
@ -397,8 +400,11 @@ cardMaker device cardable contents =
|
|||
in
|
||||
case cardable of
|
||||
C.Contact contact ->
|
||||
cardWithNoImage
|
||||
(String.toUpper contact.contactName)
|
||||
cardWithImageWithLink
|
||||
contact.isNewTabLink
|
||||
contact.contactName
|
||||
(imagePathMaker M.Contact contact.contactImage)
|
||||
contact.contactLink
|
||||
contents
|
||||
|
||||
C.Cuck cuck ->
|
||||
|
@ -473,6 +479,11 @@ cardMaker device cardable contents =
|
|||
(String.toUpper service.serviceName)
|
||||
contents
|
||||
|
||||
C.ContactPage contact ->
|
||||
cardWithNoImage
|
||||
(String.toUpper contact.contactName)
|
||||
contents
|
||||
|
||||
|
||||
cardContentMaker : List (Element msg) -> Element msg
|
||||
cardContentMaker content =
|
||||
|
|
|
@ -14,6 +14,7 @@ import Config.Pages.Services.Types exposing (Service, ServicePage)
|
|||
|
||||
type Cardable msg
|
||||
= Contact Contact
|
||||
| ContactPage Contact
|
||||
| Cuck Cuck
|
||||
| BlogArticle BlogArticle
|
||||
| BlogCard BlogArticle
|
||||
|
|
|
@ -47,9 +47,13 @@ getImageFolderString imageFolder =
|
|||
ServicePage ->
|
||||
"services"
|
||||
|
||||
Contact ->
|
||||
"contact"
|
||||
|
||||
|
||||
type ImageFolder
|
||||
= Interviews
|
||||
| Contact
|
||||
| Gibberish
|
||||
| Cuck
|
||||
| BlogArticle
|
||||
|
|
|
@ -96,13 +96,14 @@ renderDeviceMarkdownNoToc : String -> Element msg
|
|||
renderDeviceMarkdownNoToc markdown =
|
||||
case renderMarkdownNoToc markdown of
|
||||
Ok ( _, renderedMarkdown ) ->
|
||||
-- Pattern match to get just the List (Element msg)
|
||||
column
|
||||
[ width fill
|
||||
, centerX
|
||||
, spacing 10
|
||||
paragraph []
|
||||
[ column
|
||||
[ width fill
|
||||
, centerX
|
||||
, spacing 10
|
||||
]
|
||||
renderedMarkdown
|
||||
]
|
||||
renderedMarkdown
|
||||
|
||||
Err error ->
|
||||
E.text error
|
||||
|
@ -365,7 +366,7 @@ elmUiRenderer =
|
|||
, unorderedList =
|
||||
\items ->
|
||||
E.column
|
||||
[ E.spacing 3
|
||||
[ E.spacing 10
|
||||
, paragraphFontSize
|
||||
]
|
||||
(items
|
||||
|
@ -398,8 +399,7 @@ elmUiRenderer =
|
|||
, orderedList =
|
||||
\startingIndex items ->
|
||||
E.column
|
||||
[ E.spacing 3
|
||||
, paragraphFontSize
|
||||
[ E.spacing 10
|
||||
, E.width fill
|
||||
]
|
||||
(items
|
||||
|
@ -413,10 +413,12 @@ elmUiRenderer =
|
|||
, width <| px 25
|
||||
, F.bold
|
||||
, alignRight
|
||||
, headerFontSizeMedium
|
||||
]
|
||||
(E.text (String.fromInt (index + startingIndex) ++ "."))
|
||||
, E.column
|
||||
[ alignLeft
|
||||
, paragraphFontSize
|
||||
, E.width fill
|
||||
]
|
||||
itemBlocks
|
||||
|
@ -481,7 +483,12 @@ codeBlock details =
|
|||
heading : { level : Block.HeadingLevel, rawText : String, children : List (Element msg) } -> Element msg
|
||||
heading { level, rawText, children } =
|
||||
column [ width fill, spacing 20 ]
|
||||
[ divider
|
||||
[ case level of
|
||||
Block.H1 ->
|
||||
divider
|
||||
|
||||
_ ->
|
||||
none
|
||||
, E.paragraph
|
||||
[ case level of
|
||||
Block.H1 ->
|
||||
|
@ -493,7 +500,12 @@ heading { level, rawText, children } =
|
|||
_ ->
|
||||
headerFontSizeSmall
|
||||
, F.bold
|
||||
, F.center
|
||||
, case level of
|
||||
Block.H1 ->
|
||||
F.center
|
||||
|
||||
_ ->
|
||||
F.alignLeft
|
||||
, width fill
|
||||
, F.color colourTheme.textLightOrange
|
||||
, Region.heading (Block.headingLevelToInt level)
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
module Config.Pages.Contact.Types exposing (..)
|
||||
|
||||
import Route.Path as Path
|
||||
|
||||
|
||||
type alias Contact =
|
||||
{ contactName : String
|
||||
, contactImage : String
|
||||
, contactLink : String
|
||||
, contactDescription : String
|
||||
, isNewTabLink : Bool
|
||||
}
|
||||
|
||||
|
||||
|
@ -11,7 +17,31 @@ type alias Method =
|
|||
}
|
||||
|
||||
|
||||
contactTitle : Contact
|
||||
contactTitle =
|
||||
{ contactName = "Contact"
|
||||
contactInquiry : Contact
|
||||
contactInquiry =
|
||||
{ contactName = "General Inquiry"
|
||||
, contactImage = "email"
|
||||
, contactDescription = ""
|
||||
, contactLink = Path.toString Path.Contact_Inquiry
|
||||
, isNewTabLink = True
|
||||
}
|
||||
|
||||
|
||||
contactCriticism : Contact
|
||||
contactCriticism =
|
||||
{ contactName = "Criticism"
|
||||
, contactImage = "discord"
|
||||
, contactDescription = ""
|
||||
, contactLink = Path.toString Path.Contact_Criticism
|
||||
, isNewTabLink = True
|
||||
}
|
||||
|
||||
|
||||
contactMain : Contact
|
||||
contactMain =
|
||||
{ contactName = "Contact"
|
||||
, contactImage = ""
|
||||
, contactDescription = ""
|
||||
, contactLink = ""
|
||||
, isNewTabLink = False
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import Config.Pages.Debate.Arguments.Types exposing (..)
|
|||
|
||||
argumentAgriculturalPredation : Argument
|
||||
argumentAgriculturalPredation =
|
||||
{ argumentTitle = toTitleCase "Argument for Animal Agirculture as Predation"
|
||||
{ argumentTitle = toTitleCase "Argument for Animal Agrirculture as Predation"
|
||||
, propositionTitle = "Animal agriculture counts as predation."
|
||||
, propositionReductio = ""
|
||||
, propositionSummary = "Some vegans suggest that killing odd order predators is wrong because predation is permissible. However, if animal agriculture also counts as predation, it's analytically entailed that animal agriculture is permissible as well."
|
||||
|
|
|
@ -108,7 +108,7 @@ articleList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleBigFatSurprise ]
|
||||
]
|
||||
|
|
|
@ -111,7 +111,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleEverettVegans ]
|
||||
]
|
||||
|
|
|
@ -112,7 +112,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleHunterGatherers ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleMeatApologetics ]
|
||||
]
|
||||
|
|
|
@ -112,7 +112,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleNagraGoodrich ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articlePlantBasedMeta ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleQuackSmashing ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleSapienDiet ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleSeedOils ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleShenanigans ]
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ articleList device =
|
|||
-- ,
|
||||
List.map
|
||||
(\article ->
|
||||
cardMaker device (C.BlogArticle article) (contentList article)
|
||||
cardMaker device (C.BlogArticle article) (contentList article [])
|
||||
)
|
||||
[ articleSweetDeception ]
|
||||
]
|
||||
|
|
|
@ -1,13 +1,23 @@
|
|||
module Pages.Contact exposing (Model, Msg, page)
|
||||
|
||||
import Config.Data.Identity exposing (pageNames)
|
||||
import Config.Helpers.Cards.Inner.Helpers exposing (numberedListItem)
|
||||
import Config.Helpers.Cards.Inner.Helpers
|
||||
exposing
|
||||
( detailBodyMaker
|
||||
, detailFormat
|
||||
, numberedListItem
|
||||
)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
import Config.Helpers.Headers.Helpers exposing (..)
|
||||
import Config.Helpers.Headers.Records exposing (contactHeader, nutriDexHeader)
|
||||
import Config.Helpers.Headers.Records
|
||||
exposing
|
||||
( contactHeader
|
||||
, nutriDexHeader
|
||||
)
|
||||
import Config.Helpers.Headers.Types as R exposing (..)
|
||||
import Config.Helpers.ImageFolders as M exposing (..)
|
||||
import Config.Helpers.Response
|
||||
exposing
|
||||
( pageList
|
||||
|
@ -23,6 +33,7 @@ import Config.Helpers.ToolTip exposing (..)
|
|||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Contact.Types exposing (..)
|
||||
import Config.Style.Colour.Helpers exposing (ThemeColor(..), colourTheme)
|
||||
import Config.Style.Images exposing (imageSquareMaker)
|
||||
import Config.Style.Transitions
|
||||
exposing
|
||||
( hoverFontDarkOrange
|
||||
|
@ -127,295 +138,51 @@ contactList device =
|
|||
)
|
||||
<|
|
||||
List.concat
|
||||
[ case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
_ ->
|
||||
[ none ]
|
||||
[ [ headerMaker (R.Debate contactHeader) ]
|
||||
, List.map
|
||||
(\contact ->
|
||||
cardMaker device (C.Contact contact) (contentList device contact)
|
||||
)
|
||||
[ contactTitle ]
|
||||
[ contactInquiry
|
||||
, contactCriticism
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
contentList : Device -> Contact -> List (Element msg)
|
||||
contentList device contact =
|
||||
[ instructionBody device ]
|
||||
[ descriptionMaker device contact ]
|
||||
|
||||
|
||||
instructionBody : Device -> Element msg
|
||||
instructionBody device =
|
||||
column
|
||||
[ spacing 10
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
]
|
||||
[ chunkMaker
|
||||
[ text "The following terms may seem unreasonable to some, but after years on a large platform, I've learned the importance of filtering the criticisms I receive. Most feedback I receive is just vague gesturing and lacks substance, making some sort of quality filter essential. Thank you for your patience and understanding." ]
|
||||
, chunkMaker
|
||||
[ text "Please keep in mind that any failure to comply with the following terms and conditions will forfeit your access to my time and attention. I ask that you respect my time and read these terms carefully. You are the one requesting an audience with me, and my time is mine to donate as I see fit. If you wish to submit your criticisms, you must do so on my terms, following the rules and conditions that streamline the process for me." ]
|
||||
, column
|
||||
[ centerX
|
||||
, width fill
|
||||
]
|
||||
[ divider
|
||||
, titleMaker (String.toUpper "Terms and Conditions")
|
||||
]
|
||||
, column [ spacing 10 ] <|
|
||||
List.indexedMap
|
||||
(\index term ->
|
||||
row
|
||||
[ spacing 10
|
||||
, width fill
|
||||
]
|
||||
[ column
|
||||
[ width <| px 15
|
||||
, alignTop
|
||||
]
|
||||
[ numberedListItem TextLightGrey (index + 1) ]
|
||||
, column
|
||||
[ spacing 10
|
||||
, width fill
|
||||
, alignRight
|
||||
]
|
||||
[ paragraph
|
||||
[ width fill
|
||||
, paragraphFontSize
|
||||
, F.alignLeft
|
||||
]
|
||||
term
|
||||
]
|
||||
]
|
||||
)
|
||||
(termsAndConditions device)
|
||||
, column [ centerX, width fill ]
|
||||
[ divider
|
||||
, titleMaker (String.toUpper "Additional Clarifications")
|
||||
]
|
||||
, chunkMaker
|
||||
[ text "• "
|
||||
, text "You are only allowed to post one criticism at a time in the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| text "🔎┃criticism"
|
||||
}
|
||||
, text " channel. You may post an additional criticism only after the previous one has been addressed and resolved to my satisfaction. This policy aims to reduce spamming, rambling, and Gish galloping, and to encourage linear discourse."
|
||||
]
|
||||
, chunkMaker
|
||||
[ text "• ", text "You may or may not be asked to voice chat about your criticism. While your willingness to engage in voice chat is a necessary condition for submitting your criticism, it does not guarantee that a voice chat will be requested. If your initial criticism is clear and I agree with it, then no voice chat will be required." ]
|
||||
, chunkMaker
|
||||
[ text "• ", text "You may or may not be asked to have your criticism formalized. While your willingness to have your criticism formalized is a necessary condition for submitting your criticism, it does not guarantee that a formalization will be requested. If your initial criticism is clear and I agree with it, then no formalization will be required." ]
|
||||
, chunkMaker
|
||||
[ text "• "
|
||||
, text "If I find it necessary to access a text-based channel (for simple clarifying questions, for example), then either I or a moderator will open a new thread in the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| text "🔎┃criticism"
|
||||
}
|
||||
, text " channel. There we can then engage in a text-based discussion and/or ping other users if needed."
|
||||
]
|
||||
, chunkMaker
|
||||
[ text "• ", text "I will only request that your criticism be formalized if I do not understand it and we have exhausted all other reasonable means of clarification. If formalization is requested, you will not need to do it yourself, as I recognize that not everyone understands formal logic. If formalization is requested and I am unavailable to assist you, you may ping the @Logic role, and another user may help you." ]
|
||||
]
|
||||
|
||||
|
||||
darkFormat : Attr decorative msg
|
||||
darkFormat =
|
||||
F.color colourTheme.textDarkGrey
|
||||
|
||||
|
||||
orangeFormat : List (Attr () msg)
|
||||
orangeFormat =
|
||||
[ F.color colourTheme.textLightOrange
|
||||
, hoverFontDarkOrange
|
||||
, transitionStyleFast
|
||||
]
|
||||
|
||||
|
||||
rounding : Attribute msg
|
||||
rounding =
|
||||
D.rounded 10
|
||||
|
||||
|
||||
termsAndConditions : Device -> List (List (Element msg))
|
||||
termsAndConditions device =
|
||||
descriptionMaker : Device -> Contact -> Element msg
|
||||
descriptionMaker device contact =
|
||||
let
|
||||
backGroundCase : Attr decorative msg
|
||||
backGroundCase =
|
||||
case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
B.color colourTheme.backgroundDarkGrey
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
B.color colourTheme.backgroundDarkGrey
|
||||
|
||||
_ ->
|
||||
B.color colourTheme.backgroundLightGrey
|
||||
in
|
||||
[ [ row []
|
||||
[ paragraph [ alignLeft ]
|
||||
[ text "You will register an account with "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/login"
|
||||
, label = el orangeFormat <| text "Discord"
|
||||
}
|
||||
, text " (if you haven't already)."
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row [ alignLeft ]
|
||||
[ text "You will join the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/invite/VzU8yCvYX8"
|
||||
, label = el orangeFormat <| text "upRootNutrition"
|
||||
}
|
||||
, text " Discord Server (if you haven't already)."
|
||||
]
|
||||
]
|
||||
, [ row [ alignLeft ]
|
||||
[ text "You will click the \"😃\" emoji to enter the server (if you haven't already)."
|
||||
]
|
||||
]
|
||||
, [ paragraph [ alignLeft ]
|
||||
[ text "You will locate the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/826225570219687956"
|
||||
, label = el orangeFormat <| text "💻┃general"
|
||||
}
|
||||
, text " channel in General category."
|
||||
]
|
||||
]
|
||||
, [ row [ F.alignLeft, alignLeft ]
|
||||
[ paragraph [ alignLeft ]
|
||||
[ text "You will post exactly this in the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/826225570219687956"
|
||||
, label = el orangeFormat <| text "💻┃general"
|
||||
}
|
||||
, text " channel:"
|
||||
]
|
||||
, column
|
||||
[ paddingEach
|
||||
{ top = 10
|
||||
, bottom = 10
|
||||
image : String -> Element msg
|
||||
image size =
|
||||
el
|
||||
[ alignLeft
|
||||
, paddingEach
|
||||
{ top = 0
|
||||
, right = 10
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
, alignLeft
|
||||
]
|
||||
[ paragraph
|
||||
[ paddingEach
|
||||
{ top = 15
|
||||
, bottom = 15
|
||||
, left = 20
|
||||
, right = 20
|
||||
}
|
||||
, backGroundCase
|
||||
, rounding
|
||||
, width fill
|
||||
, spacing 8
|
||||
]
|
||||
[ text "\"@Moderators I have a criticism for Nick.\""
|
||||
]
|
||||
]
|
||||
<|
|
||||
imageSquareMaker device (imagePathMaker M.Contact contact.contactImage) True size
|
||||
in
|
||||
detailFormat row
|
||||
[ case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
none
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
none
|
||||
|
||||
_ ->
|
||||
image "Fatty"
|
||||
, detailFormat column
|
||||
[ detailBodyMaker TextLightGrey
|
||||
(text contact.contactDescription)
|
||||
]
|
||||
]
|
||||
, [ el [ alignLeft ] <| text "You will then receive the @Critic role." ]
|
||||
, [ paragraph [ alignLeft ]
|
||||
[ text "You will locate the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| text "🔎┃criticism"
|
||||
}
|
||||
, text " channel in the General category."
|
||||
]
|
||||
]
|
||||
, [ paragraph [ alignLeft ]
|
||||
[ paragraph [ F.alignLeft ]
|
||||
[ text "You will post your criticism in the "
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| text "🔎┃criticism"
|
||||
}
|
||||
, text " channel with this exact format:"
|
||||
]
|
||||
]
|
||||
, column
|
||||
[ paddingEach
|
||||
{ top = 10
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
, alignLeft
|
||||
]
|
||||
[ column
|
||||
[ paddingEach
|
||||
{ top = 15
|
||||
, bottom = 15
|
||||
, left = 20
|
||||
, right = 20
|
||||
}
|
||||
, backGroundCase
|
||||
, rounding
|
||||
, width fill
|
||||
, spacing 8
|
||||
]
|
||||
[ text "\"Hello, <@191027366640877568>. I have a criticism for you."
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ text "Proposition: "
|
||||
, el [ darkFormat ] <| text "specify the exact proposition you are addressing."
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ text "Link: "
|
||||
, el [ darkFormat ] <| text "provide a url to the claim, with a timestamp if applicable."
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ text "Reason for Error: "
|
||||
, el [ darkFormat ] <| text "explain exactly why you believe this claim is in error."
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ text "Suggested Correction (if any): "
|
||||
, el [ darkFormat ] <| text "provide the corrected information or perspective."
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ text "Additional Comments: "
|
||||
, el [ darkFormat ] <| text "any other relevant thoughts or context."
|
||||
, text "\""
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ el [ alignLeft ] <| text "You will not post additional criticisms until the last one has been resolved." ]
|
||||
, [ paragraph [ alignLeft ]
|
||||
[ text "You will not post anything other than criticisms in the "
|
||||
, newTabLink [ alignLeft ]
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| text "🔎┃criticism"
|
||||
}
|
||||
, text " channel."
|
||||
]
|
||||
]
|
||||
, [ el [ alignLeft ] <| text "You must be willing to converse over voice chat." ]
|
||||
, [ el [ alignLeft ] <| text "You must be willing to have your criticism formalized." ]
|
||||
]
|
||||
]
|
||||
|
|
460
frontend/src/Pages/Contact/Criticism.elm
Normal file
460
frontend/src/Pages/Contact/Criticism.elm
Normal file
|
@ -0,0 +1,460 @@
|
|||
module Pages.Contact.Criticism exposing (Model, Msg, page)
|
||||
|
||||
import Config.Data.Identity exposing (pageNames)
|
||||
import Config.Helpers.Cards.Inner.Helpers exposing (detailBodyMaker, detailFormat, numberedListItem)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
import Config.Helpers.Headers.Helpers exposing (..)
|
||||
import Config.Helpers.Headers.Records exposing (contactHeader, nutriDexHeader)
|
||||
import Config.Helpers.Headers.Types as R exposing (..)
|
||||
import Config.Helpers.Response
|
||||
exposing
|
||||
( pageList
|
||||
, topLevelContainer
|
||||
)
|
||||
import Config.Helpers.ServiceFormat
|
||||
exposing
|
||||
( divider
|
||||
, titleMaker
|
||||
)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Contact.Types exposing (..)
|
||||
import Config.Style.Colour.Helpers exposing (ThemeColor(..), colourTheme)
|
||||
import Config.Style.Transitions
|
||||
exposing
|
||||
( hoverFontDarkOrange
|
||||
, transitionStyleFast
|
||||
, transitionStyleSlow
|
||||
)
|
||||
import Effect exposing (Effect)
|
||||
import Element as E exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Border as D
|
||||
import Element.Font as F
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared exposing (..)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view shared
|
||||
}
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.map
|
||||
(\_ -> NoOp)
|
||||
(Effect.sendCmd resetViewport)
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- 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 : Shared.Model -> Model -> View Msg
|
||||
view shared model =
|
||||
{ title = pageNames.pageContact ++ " (criticism)"
|
||||
, attributes = []
|
||||
, element = contactContainer shared.device
|
||||
}
|
||||
|
||||
|
||||
contactContainer : Device -> Element msg
|
||||
contactContainer device =
|
||||
topLevelContainer (contactList device)
|
||||
|
||||
|
||||
contactList : Device -> Element msg
|
||||
contactList device =
|
||||
column
|
||||
(case ( device.class, device.orientation ) of
|
||||
_ ->
|
||||
pageList device
|
||||
)
|
||||
<|
|
||||
List.concat
|
||||
[ case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
_ ->
|
||||
[ none ]
|
||||
, List.map
|
||||
(\contact ->
|
||||
cardMaker device (C.Contact contact) (contentList device contact)
|
||||
)
|
||||
[ contactCriticism ]
|
||||
]
|
||||
|
||||
|
||||
contentList : Device -> Contact -> List (Element msg)
|
||||
contentList device contact =
|
||||
[ instructionBody device ]
|
||||
|
||||
|
||||
instructionBody : Device -> Element msg
|
||||
instructionBody device =
|
||||
column
|
||||
[ spacing 20
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
]
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "The following terms may seem unreasonable to some, but after years on a large platform, I've learned the importance of filtering the criticisms I receive. Most feedback I receive is just vague gesturing and lacks substance, making some sort of quality filter essential. Thank you for your patience and understanding.") ]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "Please keep in mind that any failure to comply with the following terms and conditions will forfeit your access to my time and attention. I ask that you respect my time and read these terms carefully. You are the one requesting an audience with me, and my time is mine to donate as I see fit. If you wish to submit your criticisms, you must do so on my terms, following the rules and conditions that streamline the process for me.") ]
|
||||
, column
|
||||
[ centerX
|
||||
, width fill
|
||||
]
|
||||
[ divider
|
||||
, titleMaker (String.toUpper "Terms and Conditions")
|
||||
]
|
||||
, column [ spacing 10 ] <|
|
||||
List.indexedMap
|
||||
(\index term ->
|
||||
row
|
||||
[ spacing 10
|
||||
, width fill
|
||||
]
|
||||
[ column
|
||||
[ width <| px 15
|
||||
, alignTop
|
||||
]
|
||||
[ numberedListItem TextLightGrey (index + 1) ]
|
||||
, column
|
||||
[ spacing 10
|
||||
, width fill
|
||||
, alignRight
|
||||
]
|
||||
[ paragraph
|
||||
[ width fill
|
||||
, paragraphFontSize
|
||||
, F.alignLeft
|
||||
]
|
||||
term
|
||||
]
|
||||
]
|
||||
)
|
||||
(termsAndConditions device)
|
||||
, column [ centerX, width fill ]
|
||||
[ divider
|
||||
, titleMaker (String.toUpper "Additional Clarifications")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "You are only allowed to post one criticism at a time in the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "🔎┃criticism")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel. You may post an additional criticism only after the previous one has been addressed and resolved to my satisfaction. This policy aims to reduce spamming, rambling, and Gish galloping, and to encourage linear discourse.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey
|
||||
(text "• ")
|
||||
, detailBodyMaker TextLightGrey
|
||||
(text "You may or may not be asked to voice chat about your criticism. While your willingness to engage in voice chat is a necessary condition for submitting your criticism, it does not guarantee that a voice chat will be requested. If your initial criticism is clear and I agree with it, then no voice chat will be required.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "You may or may not be asked to have your criticism formalized. While your willingness to have your criticism formalized is a necessary condition for submitting your criticism, it does not guarantee that a formalization will be requested. If your initial criticism is clear and I agree with it, then no formalization will be required.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "If I find it necessary to access a text-based channel (for simple clarifying questions, for example), then either I or a moderator will open a new thread in the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "🔎┃criticism")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel. There we can then engage in a text-based discussion and/or ping other users if needed.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "I will only request that your criticism be formalized if I do not understand it and we have exhausted all other reasonable means of clarification. If formalization is requested, you will not need to do it yourself, as I recognize that not everyone understands formal logic. If formalization is requested and I am unavailable to assist you, you may ping the @Logic role, and another user may help you.")
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
darkFormat : Attr decorative msg
|
||||
darkFormat =
|
||||
F.color colourTheme.textDarkGrey
|
||||
|
||||
|
||||
orangeFormat : List (Attr () msg)
|
||||
orangeFormat =
|
||||
[ F.color colourTheme.textLightOrange
|
||||
, hoverFontDarkOrange
|
||||
, transitionStyleFast
|
||||
]
|
||||
|
||||
|
||||
rounding : Attribute msg
|
||||
rounding =
|
||||
D.rounded 10
|
||||
|
||||
|
||||
termsAndConditions : Device -> List (List (Element msg))
|
||||
termsAndConditions device =
|
||||
let
|
||||
backGroundCase : Attr decorative msg
|
||||
backGroundCase =
|
||||
case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
B.color colourTheme.backgroundDarkGrey
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
B.color colourTheme.backgroundDarkGrey
|
||||
|
||||
_ ->
|
||||
B.color colourTheme.backgroundLightGrey
|
||||
in
|
||||
[ [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will register an account with ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/login"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "Discord")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " (if you haven't already).")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will join the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/invite/VzU8yCvYX8"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "upRootNutrition")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " Discord Server (if you haven't already).")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will click the \"😃\" emoji to enter the server (if you haven't already).")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will locate the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/826225570219687956"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "💻┃general")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel in General category.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will post exactly this in the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/826225570219687956"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "💻┃general")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel:")
|
||||
]
|
||||
, column
|
||||
[ paddingEach
|
||||
{ top = 10
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
, alignLeft
|
||||
]
|
||||
[ paragraph
|
||||
[ paddingEach
|
||||
{ top = 15
|
||||
, bottom = 15
|
||||
, left = 20
|
||||
, right = 20
|
||||
}
|
||||
, backGroundCase
|
||||
, rounding
|
||||
, width fill
|
||||
, spacing 8
|
||||
]
|
||||
[ detailBodyMaker TextLightGrey (text "\"@Moderators I have a criticism for Nick.\"")
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will then receive the @Critic role.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will locate the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "🔎┃criticism")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel in the General category.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ paragraph [ F.alignLeft ]
|
||||
[ detailBodyMaker TextLightGrey (text "You will post your criticism in the ")
|
||||
, newTabLink []
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "🔎┃criticism")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel with this exact format:")
|
||||
]
|
||||
]
|
||||
]
|
||||
, column
|
||||
[ paddingEach
|
||||
{ top = 10
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
, alignLeft
|
||||
]
|
||||
[ column
|
||||
[ paddingEach
|
||||
{ top = 15
|
||||
, bottom = 15
|
||||
, left = 20
|
||||
, right = 20
|
||||
}
|
||||
, backGroundCase
|
||||
, rounding
|
||||
, width fill
|
||||
, spacing 8
|
||||
]
|
||||
[ detailBodyMaker TextLightGrey (text "\"Hello, <@191027366640877568>. I have a criticism for you.")
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ detailBodyMaker TextLightGrey (text "Proposition: ")
|
||||
, el [ darkFormat ] <| detailBodyMaker TextDarkGrey (text "specify the exact proposition you are addressing.")
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ detailBodyMaker TextLightGrey (text "Link: ")
|
||||
, el [ darkFormat ] <| detailBodyMaker TextDarkGrey (text "provide a url to the claim, with a timestamp if applicable.")
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ detailBodyMaker TextLightGrey (text "Reason for Error: ")
|
||||
, el [ darkFormat ] <| detailBodyMaker TextDarkGrey (text "explain exactly why you believe this claim is in error.")
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ detailBodyMaker TextLightGrey (text "Suggested Correction (if any): ")
|
||||
, el [ darkFormat ] <| detailBodyMaker TextDarkGrey (text "provide the corrected information or perspective.")
|
||||
]
|
||||
]
|
||||
, row [ alignLeft ]
|
||||
[ paragraph []
|
||||
[ detailBodyMaker TextLightGrey (text "Additional Comments: ")
|
||||
, el [ darkFormat ] <| detailBodyMaker TextDarkGrey (text "any other relevant thoughts or context.")
|
||||
, detailBodyMaker TextLightGrey (text "\"")
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph <|
|
||||
[ detailBodyMaker TextLightGrey (text "You will not post additional criticisms until the last one has been resolved.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You will not post anything other than criticisms in the ")
|
||||
, newTabLink [ alignLeft ]
|
||||
{ url = "https://discord.com/channels/692563032546476062/1301247050796634182"
|
||||
, label = el orangeFormat <| detailBodyMaker TextLightGrey (text "🔎┃criticism")
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " channel.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You must be willing to converse over voice chat.")
|
||||
]
|
||||
]
|
||||
]
|
||||
, [ row []
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "You must be willing to have your criticism formalized.")
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
166
frontend/src/Pages/Contact/Inquiry.elm
Normal file
166
frontend/src/Pages/Contact/Inquiry.elm
Normal file
|
@ -0,0 +1,166 @@
|
|||
module Pages.Contact.Inquiry exposing (Model, Msg, page)
|
||||
|
||||
import Config.Data.Identity exposing (pageNames)
|
||||
import Config.Helpers.Cards.Inner.Helpers exposing (detailBodyMaker, detailFormat, numberedListItem)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
import Config.Helpers.Headers.Helpers exposing (..)
|
||||
import Config.Helpers.Headers.Records exposing (contactHeader, nutriDexHeader)
|
||||
import Config.Helpers.Headers.Types as R exposing (..)
|
||||
import Config.Helpers.Response
|
||||
exposing
|
||||
( pageList
|
||||
, topLevelContainer
|
||||
)
|
||||
import Config.Helpers.ServiceFormat
|
||||
exposing
|
||||
( divider
|
||||
, titleMaker
|
||||
)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Contact.Types exposing (..)
|
||||
import Config.Style.Colour.Helpers exposing (ThemeColor(..), colourTheme)
|
||||
import Config.Style.Transitions
|
||||
exposing
|
||||
( hoverFontDarkOrange
|
||||
, transitionStyleFast
|
||||
, transitionStyleSlow
|
||||
)
|
||||
import Effect exposing (Effect)
|
||||
import Element as E exposing (..)
|
||||
import Element.Background as B
|
||||
import Element.Border as D
|
||||
import Element.Font as F
|
||||
import Html.Attributes as H exposing (style)
|
||||
import Layouts
|
||||
import Page exposing (Page)
|
||||
import Route exposing (Route)
|
||||
import Shared exposing (..)
|
||||
import View exposing (View)
|
||||
|
||||
|
||||
page : Shared.Model -> Route () -> Page Model Msg
|
||||
page shared route =
|
||||
Page.new
|
||||
{ init = init
|
||||
, update = update
|
||||
, subscriptions = subscriptions
|
||||
, view = view shared
|
||||
}
|
||||
|> Page.withLayout toLayout
|
||||
|
||||
|
||||
toLayout : Model -> Layouts.Layout Msg
|
||||
toLayout model =
|
||||
Layouts.Navbar {}
|
||||
|
||||
|
||||
|
||||
-- INIT
|
||||
|
||||
|
||||
type alias Model =
|
||||
{}
|
||||
|
||||
|
||||
init : () -> ( Model, Effect Msg )
|
||||
init () =
|
||||
( {}
|
||||
, Effect.map
|
||||
(\_ -> NoOp)
|
||||
(Effect.sendCmd resetViewport)
|
||||
)
|
||||
|
||||
|
||||
|
||||
-- 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 : Shared.Model -> Model -> View Msg
|
||||
view shared model =
|
||||
{ title = pageNames.pageContact ++ " (inquiry)"
|
||||
, attributes = []
|
||||
, element = contactContainer shared.device
|
||||
}
|
||||
|
||||
|
||||
contactContainer : Device -> Element msg
|
||||
contactContainer device =
|
||||
topLevelContainer (contactList device)
|
||||
|
||||
|
||||
contactList : Device -> Element msg
|
||||
contactList device =
|
||||
column
|
||||
(case ( device.class, device.orientation ) of
|
||||
_ ->
|
||||
pageList device
|
||||
)
|
||||
<|
|
||||
List.concat
|
||||
[ case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
[ headerMaker (R.Contact contactHeader) ]
|
||||
|
||||
_ ->
|
||||
[ none ]
|
||||
, List.map
|
||||
(\contact ->
|
||||
cardMaker device (C.Contact contact) (contentList device contact)
|
||||
)
|
||||
[ contactInquiry ]
|
||||
]
|
||||
|
||||
|
||||
contentList : Device -> Contact -> List (Element msg)
|
||||
contentList device contact =
|
||||
[ instructionBody device ]
|
||||
|
||||
|
||||
instructionBody : Device -> Element msg
|
||||
instructionBody device =
|
||||
column
|
||||
[ spacing 20
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
, right = 0
|
||||
}
|
||||
]
|
||||
[ detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "") ]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "") ]
|
||||
]
|
|
@ -219,7 +219,7 @@ contentList device argument =
|
|||
]
|
||||
]
|
||||
, tableMaker device argument
|
||||
, formalizationMaker argument
|
||||
, formalizationMaker device argument
|
||||
, proofTreeButton argument.proofLink "Proof Tree"
|
||||
]
|
||||
|
||||
|
@ -385,8 +385,8 @@ tableMaker device argument =
|
|||
]
|
||||
|
||||
|
||||
formalizationMaker : Argument -> Element msg
|
||||
formalizationMaker argument =
|
||||
formalizationMaker : Device -> Argument -> Element msg
|
||||
formalizationMaker device argument =
|
||||
column
|
||||
[ centerX
|
||||
, E.width fill
|
||||
|
@ -395,7 +395,18 @@ formalizationMaker argument =
|
|||
(List.indexedMap
|
||||
(\index argumentEntry ->
|
||||
column
|
||||
[ paddingXY 40 3
|
||||
[ paddingXY
|
||||
(case ( device.class, device.orientation ) of
|
||||
( Phone, Portrait ) ->
|
||||
0
|
||||
|
||||
( Tablet, Portrait ) ->
|
||||
0
|
||||
|
||||
_ ->
|
||||
0
|
||||
)
|
||||
3
|
||||
]
|
||||
(List.indexedMap
|
||||
(\entryIndex entryWithNotation ->
|
||||
|
|
|
@ -299,9 +299,9 @@ nutriDexTitleMaker title =
|
|||
, headerFontSizeBig
|
||||
, F.color colourTheme.textLightOrange
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
{ top = 20
|
||||
, right = 0
|
||||
, bottom = 10
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
}
|
||||
]
|
||||
|
@ -324,79 +324,46 @@ linkFormat =
|
|||
|
||||
nutriDexBodyMaker : Device -> Element msg
|
||||
nutriDexBodyMaker device =
|
||||
column
|
||||
[ width fill
|
||||
, height fill
|
||||
]
|
||||
[ column [ spacing 10 ]
|
||||
[ nutriDexTitleMaker "Backstory"
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft
|
||||
, width fill
|
||||
]
|
||||
)
|
||||
[ text "In May 2019, after losing my job, I sought a way to optimize my diet for nutrient density (ND) while keeping costs low. I initially found a resource called "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://efficiencyiseverything.com/food/"
|
||||
, label = text "Efficiency Is Everything"
|
||||
}
|
||||
, text ", which ranked foods by nutrition per cost, but I found it too simplistic and lacking nuance, especially since it ranked processed foods like white bread highly, despite their limited health benefits. I wanted a more personalized approach—one that took into account both ND and the cost of foods specific to my region. Inspired by Mat Lalonde's AHS12 talk "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.youtube.com/watch?v=HwbY12qZcF4"
|
||||
, label = text "Nutrient Density: Sticking to the Essentials"
|
||||
}
|
||||
, text " on nutrient density, I created a rudimentary list of 75 foods and manually assigned them scores based on nutritional content from "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://cronometer.com/"
|
||||
, label = text "Cronometer"
|
||||
}
|
||||
, text ", paired with local grocery prices."
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "As I refined the list, I found a community on Reddit called "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.reddit.com/r/EatCheapAndHealthy/"
|
||||
, label = text "EatCheapAndHealthy"
|
||||
}
|
||||
, text " where I shared my "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.reddit.com/r/EatCheapAndHealthy/comments/cbmxre/had_no_idea_this_sub_existed_heres_a_nutrient/"
|
||||
, label = text "spreadsheet"
|
||||
}
|
||||
, text ". The overwhelming response encouraged me to expand it further, incorporating more foods, detailed nutritional data, and more accurate ND scores. To improve accuracy, I turned to the USDA’s "
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.ars.usda.gov/northeast-area/beltsville-md-bhnrc/beltsville-human-nutrition-research-center/nutrient-data-laboratory/docs/sr28-download-files/"
|
||||
, label = text "SR28 database"
|
||||
}
|
||||
, text ", which provided granular data for over 700 common foods. I developed a more sophisticated scoring system, assigning points based on how well each food met the daily recommended intake for essential nutrients, then normalizing these scores from 0 to 100."
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft
|
||||
, width fill
|
||||
]
|
||||
)
|
||||
[ text "The final ND scores were calculated non-linearly, allowing for a more balanced representation of a food’s nutrient profile rather than allowing one nutrient to dominate the score. For instance, while Brazil nuts are high in selenium, the non-linear formula prevents their score from being artificially inflated by this one nutrient. Ultimately, the system I created allows for a more objective and personalized way to rank foods by both nutrient density and cost, making it a valuable resource for anyone looking to optimize their diet." ]
|
||||
]
|
||||
column [ spacing 20 ]
|
||||
[ nutriDexTitleMaker "Backstory"
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "In May 2019, after losing my job, I sought a way to optimize my diet for nutrient density (ND) while keeping costs low. I initially found a resource called ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://efficiencyiseverything.com/food/"
|
||||
, label = text "Efficiency Is Everything"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text ", which ranked foods by nutrition per cost, but I found it too simplistic and lacking nuance, especially since it ranked processed foods like white bread highly, despite their limited health benefits. I wanted a more personalized approach—one that took into account both ND and the cost of foods specific to my region. Inspired by Mat Lalonde's AHS12 talk ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.youtube.com/watch?v=HwbY12qZcF4"
|
||||
, label = text "Nutrient Density: Sticking to the Essentials"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " on nutrient density, I created a rudimentary list of 75 foods and manually assigned them scores based on nutritional content from ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://cronometer.com/"
|
||||
, label = text "Cronometer"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text ", paired with local grocery prices.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "As I refined the list, I found a community on Reddit called ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.reddit.com/r/EatCheapAndHealthy/"
|
||||
, label = text "EatCheapAndHealthy"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text " where I shared my ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.reddit.com/r/EatCheapAndHealthy/comments/cbmxre/had_no_idea_this_sub_existed_heres_a_nutrient/"
|
||||
, label = text "spreadsheet"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text ". The overwhelming response encouraged me to expand it further, incorporating more foods, detailed nutritional data, and more accurate ND scores. To improve accuracy, I turned to the USDA’s ")
|
||||
, newTabLink linkFormat
|
||||
{ url = "https://www.ars.usda.gov/northeast-area/beltsville-md-bhnrc/beltsville-human-nutrition-research-center/nutrient-data-laboratory/docs/sr28-download-files/"
|
||||
, label = text "SR28 database"
|
||||
}
|
||||
, detailBodyMaker TextLightGrey (text ", which provided granular data for over 700 common foods. I developed a more sophisticated scoring system, assigning points based on how well each food met the daily recommended intake for essential nutrients, then normalizing these scores from 0 to 100.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "The final ND scores were calculated non-linearly, allowing for a more balanced representation of a food’s nutrient profile rather than allowing one nutrient to dominate the score. For instance, while Brazil nuts are high in selenium, the non-linear formula prevents their score from being artificially inflated by this one nutrient. Ultimately, the system I created allows for a more objective and personalized way to rank foods by both nutrient density and cost, making it a valuable resource for anyone looking to optimize their diet.") ]
|
||||
]
|
||||
|
||||
|
||||
|
@ -418,248 +385,155 @@ nutriDexAdjustments device =
|
|||
, spacing 20
|
||||
]
|
||||
[ nutriDexTitleMaker "Nutrient Density Score Adjustments"
|
||||
, el [] <|
|
||||
paragraph
|
||||
[ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
, F.alignLeft
|
||||
]
|
||||
[ text "• "
|
||||
, text "No adjustments are made to vitamin B1, vitamin B2, vitamin B3, manganese, phosphorus, and potassium, due to their DRIs only representing total daily intake, or due to the nutrient having close to 100% bioavailability. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114331/"
|
||||
, label = text "1"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114322/"
|
||||
, label = text "2"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114304/"
|
||||
, label = text "3"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK56056/"
|
||||
, label = text "4"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/39"
|
||||
, label = text "5"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/41"
|
||||
, label = text "6"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/42"
|
||||
, label = text "7"
|
||||
}
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "No adjustments are made to vitamin B1, vitamin B2, vitamin B3, manganese, phosphorus, and potassium, due to their DRIs only representing total daily intake, or due to the nutrient having close to 100% bioavailability. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114331/"
|
||||
, label = text "1"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114322/"
|
||||
, label = text "2"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114304/"
|
||||
, label = text "3"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK56056/"
|
||||
, label = text "4"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/39"
|
||||
, label = text "5"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/41"
|
||||
, label = text "6"
|
||||
}
|
||||
, text ", "
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.nap.edu/read/11537/chapter/42"
|
||||
, label = text "7"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
nutridexSubTitleMaker : String -> Element msg
|
||||
nutridexSubTitleMaker title =
|
||||
el
|
||||
[ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, F.bold
|
||||
, width fill
|
||||
, headerFontSizeSmall
|
||||
, F.color colourTheme.textLightOrange
|
||||
[ centerX
|
||||
, paddingXY 0 10
|
||||
]
|
||||
<|
|
||||
text title
|
||||
detailTitleMaker TextLightOrange title
|
||||
|
||||
|
||||
nutriDexVitamins : Element msg
|
||||
nutriDexVitamins =
|
||||
column
|
||||
[ width fill
|
||||
[ spacing 20
|
||||
, width fill
|
||||
, height fill
|
||||
]
|
||||
[ column [ spacing 10 ]
|
||||
[ row
|
||||
[ centerX
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, right = 0
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
[ nutridexSubTitleMaker "Vitamins"
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for vitamin B5 is multiplied by 2 in order to accommodate its average 50% bioavailability from food. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114311/"
|
||||
, label = text "8"
|
||||
}
|
||||
]
|
||||
[ nutridexSubTitleMaker "Vitamins"
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for plant-derived vitamin B6 is multiplied by 1.74 in order to accommodate the average ~42.5% reduction in bioavailability of pyridoxine glucoside. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/2843032"
|
||||
, label = text "9"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for vitamin B5 is multiplied by 2 in order to accommodate its average 50% bioavailability from food. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/books/NBK114311/"
|
||||
, label = text "8"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for animal-derived vitamin B6 is multiplied by 1.33 in order to accommodate the average ~25% reduction in bioavailability of as a result of cooking. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://pdfs.semanticscholar.org/b844/5e60d87753144ef856e0ae207b551aa75b9c.pdf"
|
||||
, label = text "10"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for plant-derived vitamin B6 is multiplied by 1.74 in order to accommodate the average ~42.5% reduction in bioavailability of pyridoxine glucoside. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/2843032"
|
||||
, label = text "9"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The contribution of vitamin B12 is capped at 1.5mcg in order to account for the average absorption cap of ~1.5mcg per serving in healthy people. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/18606874"
|
||||
, label = text "11"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for animal-derived vitamin B6 is multiplied by 1.33 in order to accommodate the average ~25% reduction in bioavailability of as a result of cooking. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://pdfs.semanticscholar.org/b844/5e60d87753144ef856e0ae207b551aa75b9c.pdf"
|
||||
, label = text "10"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for folate has been multiplied by 2 in order to accommodate its average 50% bioavailbility from food. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3257685/"
|
||||
, label = text "12"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The contribution of vitamin B12 is capped at 1.5mcg in order to account for the average absorption cap of ~1.5mcg per serving in healthy people. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/18606874"
|
||||
, label = text "11"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The contribution of plant-derived vitamin A (as retinol activity equivalents) is capped at 900mcg. This is to accommodate the fact that it is unlikely that the body can convert more than the DRI of vitamin A from carotenoids. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2855261/"
|
||||
, label = text "13"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for folate has been multiplied by 2 in order to accommodate its average 50% bioavailbility from food. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3257685/"
|
||||
, label = text "12"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for plant-derived vitamin K, phylloquinone, is multiplied by 10 in order to accommodate its 10% bioavailability from plant foods. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8813897"
|
||||
, label = text "14"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The contribution of plant-derived vitamin A (as retinol activity equivalents) is capped at 900mcg. This is to accommodate the fact that it is unlikely that the body can convert more than the DRI of vitamin A from carotenoids. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2855261/"
|
||||
, label = text "13"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for vitamin C has been multiplied by 1.25 in order to accommodate its average ~80% bioavailability. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/12134712"
|
||||
, label = text "15"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for plant-derived vitamin K, phylloquinone, is multiplied by 10 in order to accommodate its 10% bioavailability from plant foods. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8813897"
|
||||
, label = text "14"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for vitamin C has been multiplied by 1.25 in order to accommodate its average ~80% bioavailability. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/12134712"
|
||||
, label = text "15"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for vitamin E has been multiplied by 4.65 in order to accommodate its average 21.5% bioavailability. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5745505/"
|
||||
, label = text "16"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for vitamin E has been multiplied by 4.65 in order to accommodate its average 21.5% bioavailability. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5745505/"
|
||||
, label = text "16"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
|
@ -668,78 +542,43 @@ nutriDexVitamins =
|
|||
nutriDexFattyAcids : Element msg
|
||||
nutriDexFattyAcids =
|
||||
column
|
||||
[ width fill
|
||||
[ spacing 20
|
||||
, width fill
|
||||
, height fill
|
||||
]
|
||||
[ column [ spacing 10 ]
|
||||
[ row
|
||||
[ centerX
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, right = 0
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
[ nutridexSubTitleMaker "Fatty Acids"
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRIs for omega-3 and omega-6 have been recalculated to 250mg/day and 500mg/day, respectively. This better reflects our actual physiological requirements for these fatty acids as provided by their pre-elongated, animal-derived varieties. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5946201/"
|
||||
, label = text "17"
|
||||
}
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5452278/"
|
||||
, label = text "18"
|
||||
}
|
||||
]
|
||||
[ nutridexSubTitleMaker "Fatty Acids"
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRIs for plant-derived omega-3 and omega-6 have been multiplied by 6.66 in order to reflect their maximal ~15% conversion rate. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/12323090"
|
||||
, label = text "19"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRIs for omega-3 and omega-6 have been recalculated to 250mg/day and 500mg/day, respectively. This better reflects our actual physiological requirements for these fatty acids as provided by their pre-elongated, animal-derived varieties. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5946201/"
|
||||
, label = text "17"
|
||||
}
|
||||
, newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5452278/"
|
||||
, label = text "18"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRIs for plant-derived omega-3 and omega-6 have been multiplied by 6.66 in order to reflect their maximal ~15% conversion rate. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/12323090"
|
||||
, label = text "19"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The contributions of plant-derived omega-3 and omega-6 are capped at 4.4444g before conversion rates are factored, in order to accommodate their conversion rate cap of 2% of calories per day. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3132704/"
|
||||
, label = text "20"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The contributions of plant-derived omega-3 and omega-6 are capped at 4.4444g before conversion rates are factored, in order to accommodate their conversion rate cap of 2% of calories per day. ")
|
||||
, detailFormat row
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3132704/"
|
||||
, label = text "20"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
|
@ -747,205 +586,95 @@ nutriDexFattyAcids =
|
|||
|
||||
nutriDexMinerals : Element msg
|
||||
nutriDexMinerals =
|
||||
column
|
||||
[ width fill
|
||||
, height fill
|
||||
]
|
||||
[ column [ spacing 10 ]
|
||||
[ row
|
||||
[ centerX
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, right = 0
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
column [ spacing 10 ]
|
||||
[ nutridexSubTitleMaker "Minerals"
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for calcium has been adjusted dynamically based on the oxalate-to-calcium ratio of each food. ")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for plant-derived copper has been multiplied by 2.94 in order to accommodate its average ~34% bioavailability from plant foods. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8615369"
|
||||
, label = text "21"
|
||||
}
|
||||
]
|
||||
[ nutridexSubTitleMaker "Minerals"
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for animal-derived copper has been multiplied by 2.43 in order to accommodate its average ~41% bioavailability from animal foods. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8615369"
|
||||
, label = text "21"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for calcium has been adjusted dynamically based on the oxalate-to-calcium ratio of each food. "
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for magnesium has been multiplied by 2.85 in order to accommodate its 35% bioavailability. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/1864954"
|
||||
, label = text "22"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for plant-derived copper has been multiplied by 2.94 in order to accommodate its average ~34% bioavailability from plant foods. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8615369"
|
||||
, label = text "21"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for iron has been adjusted dynamically based on the phytate-to-iron ratio of each food.")
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for selenium has been multiplied by 1.11 in order to accommodate its 90% bioavailability. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/20200264"
|
||||
, label = text "23"
|
||||
}
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for animal-derived copper has been multiplied by 2.43 in order to accommodate its average ~41% bioavailability from animal foods. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/8615369"
|
||||
, label = text "21"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for magnesium has been multiplied by 2.85 in order to accommodate its 35% bioavailability. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/1864954"
|
||||
, label = text "22"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for iron has been adjusted dynamically based on the phytate-to-iron ratio of each food."
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for selenium has been multiplied by 1.11 in order to accommodate its 90% bioavailability. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/20200264"
|
||||
, label = text "23"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The contribution of zinc is capped at 7mg in order to account for the average absorption cap of 7mg per serving in healthy people. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/10801947"
|
||||
, label = text "24"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRI for zinc has been adjusted dynamically based on the phytate-to-zinc ratio of each food. "
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The contribution of zinc is capped at 7mg in order to account for the average absorption cap of 7mg per serving in healthy people. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://www.ncbi.nlm.nih.gov/pubmed/10801947"
|
||||
, label = text "24"
|
||||
}
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRI for zinc has been adjusted dynamically based on the phytate-to-zinc ratio of each food. ")
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
nutriDexAminoAcids : Element msg
|
||||
nutriDexAminoAcids =
|
||||
column
|
||||
[ width fill
|
||||
, height fill
|
||||
]
|
||||
[ column [ spacing 10 ]
|
||||
[ row
|
||||
[ centerX
|
||||
, paddingEach
|
||||
{ top = 10
|
||||
, right = 0
|
||||
, bottom = 10
|
||||
, left = 0
|
||||
column [ spacing 20 ]
|
||||
[ nutridexSubTitleMaker (String.toUpper "Amino Acids")
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "The DRIs for all essential amino acids from non-animal sources have been multiplied by 1.492 in order to accommodate their average PDCAAS score of .67. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://en.wikipedia.org/wiki/Protein_Digestibility_Corrected_Amino_Acid_Score"
|
||||
, label = text "25"
|
||||
}
|
||||
]
|
||||
[ nutridexSubTitleMaker (String.toUpper "Amino Acids")
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "The DRIs for all essential amino acids from non-animal sources have been multiplied by 1.492 in order to accommodate their average PDCAAS score of .67. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://en.wikipedia.org/wiki/Protein_Digestibility_Corrected_Amino_Acid_Score"
|
||||
, label = text "25"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, row []
|
||||
[ paragraph
|
||||
([ F.color colourTheme.textLightGrey
|
||||
, paragraphSpacing
|
||||
, paragraphFontSize
|
||||
]
|
||||
++ [ F.alignLeft, width fill ]
|
||||
)
|
||||
[ text "• "
|
||||
, text "All scores reflecting total protein yield of non-animal foods have been multiplied by .67 in order to accommodate the average 67% bioavailability of protein from non-animal sources. "
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://en.wikipedia.org/wiki/Protein_Digestibility_Corrected_Amino_Acid_Score"
|
||||
, label = text "25"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
, detailFormat paragraph
|
||||
[ detailBodyMaker TextLightGrey (text "• ")
|
||||
, detailBodyMaker TextLightGrey (text "All scores reflecting total protein yield of non-animal foods have been multiplied by .67 in order to accommodate the average 67% bioavailability of protein from non-animal sources. ")
|
||||
, row [ F.regular, smallTextFontSize ]
|
||||
[ newTabLink referenceFormat
|
||||
{ url = "https://en.wikipedia.org/wiki/Protein_Digestibility_Corrected_Amino_Acid_Score"
|
||||
, label = text "25"
|
||||
}
|
||||
]
|
||||
]
|
||||
]
|
||||
|
@ -958,7 +687,18 @@ nutriDexReferences nutridex device =
|
|||
, height fill
|
||||
]
|
||||
[ nutriDexTitleMaker "BIBLIOGRAPHY"
|
||||
, column [ width fill, F.size 15, spacing 10 ] <|
|
||||
, column
|
||||
[ width fill
|
||||
, F.size 15
|
||||
, spacing 10
|
||||
, paddingEach
|
||||
{ top = 20
|
||||
, right = 0
|
||||
, bottom = 0
|
||||
, left = 0
|
||||
}
|
||||
]
|
||||
<|
|
||||
List.map2 (\x y -> makeReference x y)
|
||||
nutridex.nutriDexReference
|
||||
(List.range 1 (List.length nutridex.nutriDexReference))
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module Pages.Services.Analysis exposing (Model, Msg, page)
|
||||
|
||||
import Config.Helpers.Articles.Article exposing (contentList)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C exposing (..)
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -9,6 +10,7 @@ import Config.Helpers.Response exposing (pageList, topLevelContainer)
|
|||
import Config.Helpers.ServiceFormat exposing (..)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Blog.Types exposing (BlogArticle)
|
||||
import Config.Pages.Services.Records.DebateAnalysis exposing (..)
|
||||
import Config.Style.Colour.Helpers exposing (colourTheme)
|
||||
import Config.Style.Transitions
|
||||
|
@ -119,23 +121,59 @@ analysisList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\service ->
|
||||
cardMaker device (C.ServicePage service) contentList
|
||||
cardMaker device
|
||||
(C.BlogArticle service)
|
||||
(contentList service
|
||||
[ el
|
||||
[ paddingXY 0 10
|
||||
, centerX
|
||||
]
|
||||
<|
|
||||
buyButton "Book!" "https://buy.stripe.com/14k3dr4Zh8p6c3mbIJ"
|
||||
]
|
||||
)
|
||||
)
|
||||
[ servicesDebateAnalysis ]
|
||||
[ debateAnalysis ]
|
||||
]
|
||||
|
||||
|
||||
contentList : List (Element msg)
|
||||
contentList =
|
||||
[ column
|
||||
bodyFormat
|
||||
[ chunkMaker servicesDebateAnalysis.serviceArticle.articleParagraph.paragraph1
|
||||
, chunkMaker
|
||||
servicesDebateAnalysis.serviceArticle.articleParagraph.paragraph2
|
||||
, titleMaker servicesDebateAnalysis.serviceArticle.articleTitles.title1
|
||||
, numberMaker servicesDebateAnalysis.serviceArticle.articleListEntries.list1
|
||||
, titleMaker servicesDebateAnalysis.serviceArticle.articleTitles.title2
|
||||
, bulletPointMaker servicesDebateAnalysis.serviceArticle.articleListEntries.list2
|
||||
, buyButton "Book!" "https://buy.stripe.com/14k3dr4Zh8p6c3mbIJ"
|
||||
|
||||
debateAnalysis : BlogArticle
|
||||
debateAnalysis =
|
||||
{ articleName = String.toUpper "Debate Analysis"
|
||||
, articleLink = ""
|
||||
, articleAuthor = ""
|
||||
, isNewTabLink = False
|
||||
, hasReferences = False
|
||||
, hasTableOfContents = False
|
||||
, articleImage = ""
|
||||
, articlePublished = ""
|
||||
, articleBody = """
|
||||
The Debate Analysis services offers personalized feedback to help you improve your debate skills. I work with clients by reviewing their pre-recorded debates, providing detailed critiques, and offering practical advice tailored to their style. Through this process, you'll gain valuable insights into areas of improvement, from your argument structure to your delivery and confidence.
|
||||
|
||||
# BENEFITS
|
||||
|
||||
1. Have your own debates analyzed for constructive feedback. This allows you to receive targeted guidance on how to improve your debating technique and strategy.
|
||||
|
||||
2. Receive advice to improve as a debater. This service provides personalized recommendations to help you develop and refine your debating abilities.
|
||||
|
||||
3. Gain comfort with debate and verbal confrontation. The service aims to help you become more confident and adept at handling the challenges of public debate.
|
||||
|
||||
# REQUIREMENTS
|
||||
|
||||
• Your debate recording must be submitted at least three days prior to the session.
|
||||
|
||||
• Your debate recording must not exceed one hour in length unless otherwise agreed to.
|
||||
|
||||
• Your debate recording must be in either video or audio format, as text debates are ineligible.
|
||||
|
||||
"""
|
||||
, articleReferences =
|
||||
[ { author = ""
|
||||
, title = ""
|
||||
, journal = ""
|
||||
, year = ""
|
||||
, link = ""
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module Pages.Services.Coaching exposing (Model, Msg, page)
|
||||
|
||||
import Config.Helpers.Articles.Article exposing (contentList)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -14,6 +15,7 @@ import Config.Helpers.Response
|
|||
import Config.Helpers.ServiceFormat exposing (..)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Blog.Types exposing (BlogArticle)
|
||||
import Config.Pages.Services.Records.DebateCoaching exposing (servicesDebateCoaching)
|
||||
import Config.Style.Colour.Helpers exposing (colourTheme)
|
||||
import Config.Style.Transitions
|
||||
|
@ -124,29 +126,108 @@ coachingList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\service ->
|
||||
cardMaker device (C.ServicePage service) contentList
|
||||
cardMaker device
|
||||
(C.BlogArticle service)
|
||||
(contentList service
|
||||
[ el
|
||||
[ paddingXY 0 10
|
||||
, centerX
|
||||
]
|
||||
<|
|
||||
buyButton "Book!" "https://buy.stripe.com/14k01f3Vd6gY6J2146"
|
||||
]
|
||||
)
|
||||
)
|
||||
[ servicesDebateCoaching ]
|
||||
[ debateCoaching ]
|
||||
]
|
||||
|
||||
debateCoaching : BlogArticle
|
||||
debateCoaching =
|
||||
{ articleName = String.toUpper "Debate Tutoring"
|
||||
, articleLink = ""
|
||||
, articleAuthor = ""
|
||||
, isNewTabLink = False
|
||||
, hasReferences = False
|
||||
, hasTableOfContents = False
|
||||
, articleImage = ""
|
||||
, articlePublished = ""
|
||||
, articleBody = """
|
||||
This service is designed to help you gain an understanding of the fundamentals of debate, and the tools used in debate. The service spans five modules, covering fallacious reasoning, epistemology, and propositional logic. You're free to choose which modules you want to cover, based on your current knowledge and interests.
|
||||
If interested clients choose to text their knowledge and sharpen their skills with mock debates, they may be subject to additional fees, as mock debates often involve the inclusion of skillful third parties against whom clients can spar.
|
||||
|
||||
contentList : List (Element msg)
|
||||
contentList =
|
||||
[ column
|
||||
bodyFormat
|
||||
[ chunkMaker servicesDebateCoaching.serviceArticle.articleParagraph.paragraph1
|
||||
, chunkMaker servicesDebateCoaching.serviceArticle.articleParagraph.paragraph2
|
||||
, titleMaker servicesDebateCoaching.serviceArticle.articleTitles.title1
|
||||
, numberMaker servicesDebateCoaching.serviceArticle.articleListEntries.list1
|
||||
, titleMaker servicesDebateCoaching.serviceArticle.articleTitles.title2
|
||||
# WHAT YOU GET
|
||||
|
||||
-- modules
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title3 servicesDebateCoaching.serviceArticle.articleListEntries.list3
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title4 servicesDebateCoaching.serviceArticle.articleListEntries.list4
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title5 servicesDebateCoaching.serviceArticle.articleListEntries.list5
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title6 servicesDebateCoaching.serviceArticle.articleListEntries.list6
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title7 servicesDebateCoaching.serviceArticle.articleListEntries.list7
|
||||
, highlightedBlockMaker servicesDebateCoaching.serviceArticle.articleTitles.title8 servicesDebateCoaching.serviceArticle.articleListEntries.list8
|
||||
, buyButton "Book!" "https://buy.stripe.com/14k01f3Vd6gY6J2146"
|
||||
1. A five-module course covering critical thinking, debate strategy, and propositional logic, designed to strengthen your debating skills.
|
||||
|
||||
2. Personalized feedback and guidance to boost your strategic thinking, verbal comfort, and overall debate effectiveness.
|
||||
|
||||
3. Optional mock debates and staged confrontations, helping you gain experience and confidence in real-world debates.
|
||||
|
||||
# SYLLABUS
|
||||
|
||||
>## MODULE 1
|
||||
>
|
||||
>• Study both common and obscure logical fallacies.
|
||||
>
|
||||
>• Learn to identify and rebut fallacious reasoning.
|
||||
>
|
||||
>• Test your knowledge of logical fallacies.
|
||||
|
||||
>## MODULE 2
|
||||
>
|
||||
>• Assignment review.
|
||||
>
|
||||
>• Study concepts related to formal logic and argumentation.
|
||||
>
|
||||
>• Learn the lexicon of debate and formal reasoning.
|
||||
>
|
||||
>• Test your knowledge of debate-related terminology.
|
||||
|
||||
>## MODULE 3
|
||||
>
|
||||
>• Assignment review.
|
||||
>
|
||||
>• Study philosophical concepts relevant to debate.
|
||||
>
|
||||
>• Learn about epistemology and the philosophy of science.
|
||||
>
|
||||
>• Test your knowledge of debate-related philosophical concepts.
|
||||
|
||||
>## MODULE 4
|
||||
>
|
||||
>• Assignment review.
|
||||
>
|
||||
>• Study the different modes of argumentation.
|
||||
>
|
||||
>• Learn the principles and axioms of propositional logic.
|
||||
>
|
||||
>• Test your knowledge of propositional logic fundamentals.
|
||||
|
||||
>## MODULE 5
|
||||
>
|
||||
>• Assignment review.
|
||||
>
|
||||
>• Study the inference rules of propositional logic.
|
||||
>
|
||||
>• Learn how to form valid formal arguments.
|
||||
>
|
||||
>• Test your knowledge of formal logic.
|
||||
|
||||
>## OPTIONAL
|
||||
>
|
||||
>• Test your knowledge in an optional mock debate.
|
||||
>
|
||||
>• Choose between general, empirical, and NTT-style debate.
|
||||
>
|
||||
>• Have your performance analyzed in realtime.
|
||||
|
||||
"""
|
||||
, articleReferences =
|
||||
[ { author = ""
|
||||
, title = ""
|
||||
, journal = ""
|
||||
, year = ""
|
||||
, link = ""
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module Pages.Services.Elm exposing (Model, Msg, page)
|
||||
|
||||
import Config.Helpers.Articles.Article exposing (contentList)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -13,6 +14,7 @@ import Config.Helpers.Response
|
|||
import Config.Helpers.ServiceFormat exposing (..)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Blog.Types exposing (BlogArticle)
|
||||
import Config.Pages.Services.Records.ElmBuilds exposing (servicesElmBuilds)
|
||||
import Config.Style.Colour.Helpers exposing (..)
|
||||
import Config.Style.Transitions
|
||||
|
@ -123,27 +125,62 @@ elmBuildsList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\service ->
|
||||
cardMaker device (C.ServicePage service) contentList
|
||||
cardMaker device
|
||||
(C.BlogArticle service)
|
||||
(contentList service
|
||||
[ elmCodeRenderer ]
|
||||
)
|
||||
)
|
||||
[ servicesElmBuilds ]
|
||||
[ elmBuilds ]
|
||||
]
|
||||
|
||||
|
||||
contentList : List (Element msg)
|
||||
contentList =
|
||||
[ column
|
||||
bodyFormat
|
||||
[ chunkMaker servicesElmBuilds.serviceArticle.articleParagraph.paragraph1
|
||||
, chunkMaker servicesElmBuilds.serviceArticle.articleParagraph.paragraph2
|
||||
, chunkMaker servicesElmBuilds.serviceArticle.articleParagraph.paragraph3
|
||||
, titleMaker servicesElmBuilds.serviceArticle.articleTitles.title1
|
||||
, numberMaker servicesElmBuilds.serviceArticle.articleListEntries.list1
|
||||
, titleMaker servicesElmBuilds.serviceArticle.articleTitles.title2
|
||||
, bulletPointMaker servicesElmBuilds.serviceArticle.articleListEntries.list2
|
||||
, titleMaker servicesElmBuilds.serviceArticle.articleTitles.title3
|
||||
, elmCodeRenderer
|
||||
elmBuilds : BlogArticle
|
||||
elmBuilds =
|
||||
{ articleName = String.toUpper "Elm Builds"
|
||||
, articleLink = ""
|
||||
, articleAuthor = ""
|
||||
, isNewTabLink = False
|
||||
, hasReferences = False
|
||||
, hasTableOfContents = False
|
||||
, articleImage = ""
|
||||
, articlePublished = ""
|
||||
, articleBody = """
|
||||
The site that you're currently viewing this on was written by me in the Elm programming language. In the process of programming this website, I realized that I could create reasonably high quality work with Elm, so I'm offering it as a service at a fee that reflects my skill level.
|
||||
If you're in the market for a new frontend for your website, please inquire at nick@upRootNutrition.com.
|
||||
|
||||
Below is an example of a helper function that I wrote for this site. This particular function extracts the first 80 words from all of my articles' markdown strings, and displays them as blurbs, followed by an ellipsis, in my article cards using my markdown parser.
|
||||
|
||||
The source code for this website is viewable on [Gitlab](https://gitlab.com/upRootNutrition/website).
|
||||
|
||||
# WHAT YOU GET
|
||||
|
||||
1. An Elm-based website written to your specifications.
|
||||
|
||||
2. Two revisions to better meet your needs and vision.
|
||||
|
||||
3. Six months of free support to correct mistakes.
|
||||
|
||||
# REQUIREMENTS
|
||||
|
||||
• A clear vision of what you want your site to look like.
|
||||
|
||||
• A clear description of your site's pages and structure.
|
||||
|
||||
• Any bespoke frontend functionality you want included.
|
||||
|
||||
# EXAMPLE
|
||||
|
||||
"""
|
||||
, articleReferences =
|
||||
[ { author = ""
|
||||
, title = ""
|
||||
, journal = ""
|
||||
, year = ""
|
||||
, link = ""
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
elmCodeRenderer : Element msg
|
||||
|
@ -169,7 +206,7 @@ elmCodeRenderer =
|
|||
[ renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 0 0 ]
|
||||
, text "cardImageMaker"
|
||||
, text "extractFirstWords"
|
||||
|> el [ F.color syntaxTheme.key ]
|
||||
, text " : "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
|
@ -179,18 +216,13 @@ elmCodeRenderer =
|
|||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "String"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
, text " -> "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "Element"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
, text " msg"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 0 0 ]
|
||||
, text "cardImageMaker"
|
||||
, text "extractFirstWords"
|
||||
|> el [ F.color syntaxTheme.key ]
|
||||
, text " image blurb"
|
||||
, text " text"
|
||||
, text " ="
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
|
@ -203,45 +235,115 @@ elmCodeRenderer =
|
|||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "mobileImageSize"
|
||||
, text "words"
|
||||
, text " ="
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "["
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " E"
|
||||
, text "text"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "|>"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text " String"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "width"
|
||||
, text " <| "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "px"
|
||||
, text " 45"
|
||||
, text "split"
|
||||
, text " "
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text " "
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " E"
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "|>"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text " List"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "height"
|
||||
, text " <| "
|
||||
, text "filter"
|
||||
, text " ("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "not"
|
||||
, text " << "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "String"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "isEmpty"
|
||||
, text ")"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "truncatedWords"
|
||||
, text " ="
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "px"
|
||||
, text " 45"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "]"
|
||||
, text "List"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "take"
|
||||
, text " 80"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text " words"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "wasTextTruncated"
|
||||
, text " ="
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "List"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "length"
|
||||
, text " words"
|
||||
, text " > "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "80"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "result"
|
||||
, text " ="
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "String"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "join"
|
||||
, text " "
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text " "
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text " truncatedWords"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|
@ -252,311 +354,34 @@ elmCodeRenderer =
|
|||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 16 0 ]
|
||||
, text "el"
|
||||
, text "if"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
, text " wasTextTruncated"
|
||||
, text " then"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "["
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " alignRight"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " alignTop"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " padding"
|
||||
, text " 10"
|
||||
, text "result"
|
||||
, text " ++ "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "..."
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
, text "\""
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "]"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 16 0 ]
|
||||
, text "<|"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "el"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "["
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " D"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "rounded"
|
||||
, text " 100"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " D"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "width"
|
||||
, text " 5"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " glowDeepDarkGrey"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " D"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "color"
|
||||
, text " colourTheme"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "backgroundDarkGrey"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " B"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "color"
|
||||
, text " colourTheme"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "backgroundDarkGrey"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "]"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "<|"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 48 0 ]
|
||||
, text "E"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "image"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "["
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " alignRight"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " alignTop"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " D"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "rounded"
|
||||
, text " 100"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " clip"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "]"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "++"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text " ("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "case"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
, text " ("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " device"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "class"
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " device"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "orientation"
|
||||
, text " )"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " of"
|
||||
, text "else"
|
||||
|> el [ F.color syntaxTheme.keyword ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 80 0 ]
|
||||
, text "("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " Phone"
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " Portrait"
|
||||
, text " )"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " ->"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 96 0 ]
|
||||
, text "mobileImageSize"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 80 0 ]
|
||||
, text "("
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " Tablet"
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " Portrait"
|
||||
, text " )"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " ->"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 96 0 ]
|
||||
, text "mobileImageSize"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 80 0 ]
|
||||
, text "_"
|
||||
, text " ->"
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 96 0 ]
|
||||
, text "["
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " E"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "width"
|
||||
, text " <| "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "px"
|
||||
, text " 90"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 96 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " E"
|
||||
, text "."
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text "height"
|
||||
, text " <| "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "px"
|
||||
, text " 90"
|
||||
|> el [ F.color syntaxTheme.string ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 96 0 ]
|
||||
, text "]"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ")"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ")"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "{"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " src"
|
||||
, text " = "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "image"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text ","
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
, text " description"
|
||||
, text " = "
|
||||
|> el [ F.color syntaxTheme.operator ]
|
||||
, text "blurb"
|
||||
]
|
||||
, renderCodeLine syntaxTheme
|
||||
[ text ""
|
||||
|> el [ paddingXY 64 0 ]
|
||||
, text "}"
|
||||
|> el [ F.color syntaxTheme.punctuation ]
|
||||
|> el [ paddingXY 32 0 ]
|
||||
, text "result"
|
||||
]
|
||||
]
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module Pages.Services.Nix exposing (Model, Msg, page)
|
||||
|
||||
import Config.Helpers.Articles.Article exposing (contentList)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -13,6 +14,7 @@ import Config.Helpers.Response
|
|||
import Config.Helpers.ServiceFormat exposing (..)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Blog.Types exposing (BlogArticle)
|
||||
import Config.Pages.Services.Records.NixBuilds exposing (servicesNixBuilds)
|
||||
import Config.Style.Colour.Helpers exposing (..)
|
||||
import Config.Style.Colour.Types exposing (..)
|
||||
|
@ -124,27 +126,62 @@ elmBuildsList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\service ->
|
||||
cardMaker device (C.ServicePage service) contentList
|
||||
cardMaker device
|
||||
(C.BlogArticle service)
|
||||
(contentList service
|
||||
[ nixCodeRenderer ]
|
||||
)
|
||||
)
|
||||
[ servicesNixBuilds ]
|
||||
[ nixBuilds ]
|
||||
]
|
||||
|
||||
|
||||
contentList : List (Element msg)
|
||||
contentList =
|
||||
[ column
|
||||
bodyFormat
|
||||
[ chunkMaker servicesNixBuilds.serviceArticle.articleParagraph.paragraph1
|
||||
, chunkMaker servicesNixBuilds.serviceArticle.articleParagraph.paragraph2
|
||||
, chunkMaker servicesNixBuilds.serviceArticle.articleParagraph.paragraph3
|
||||
, titleMaker servicesNixBuilds.serviceArticle.articleTitles.title1
|
||||
, numberMaker servicesNixBuilds.serviceArticle.articleListEntries.list1
|
||||
, titleMaker servicesNixBuilds.serviceArticle.articleTitles.title2
|
||||
, bulletPointMaker servicesNixBuilds.serviceArticle.articleListEntries.list2
|
||||
, titleMaker servicesNixBuilds.serviceArticle.articleTitles.title3
|
||||
, nixCodeRenderer
|
||||
nixBuilds : BlogArticle
|
||||
nixBuilds =
|
||||
{ articleName = String.toUpper "Nix Builds"
|
||||
, articleLink = ""
|
||||
, articleAuthor = ""
|
||||
, isNewTabLink = False
|
||||
, hasReferences = False
|
||||
, hasTableOfContents = False
|
||||
, articleImage = ""
|
||||
, articlePublished = ""
|
||||
, articleBody = """
|
||||
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.
|
||||
If you're interested in having a custom Nix configuration, or having a pre-existing configuration refactored, please inquire at nick@upRootNutrition.com.
|
||||
|
||||
Below is an example of a nix flake that I wrote for the devshell that I used to manage and isolate the development environment for this site. All of the packages, pre-defined settings, and tooling used for this site are managed through this flake.
|
||||
|
||||
The source code for my Nix server is viewable on [Gitlab](https://gitlab.com/upRootNutrition/dotfiles).
|
||||
|
||||
# WHAT YOU GET
|
||||
|
||||
1. A NixOS configuration written to your specifications.
|
||||
|
||||
2. Two refactors for the purposes of improving readability.
|
||||
|
||||
3. Instructions for how to use and build upon your configuration.
|
||||
|
||||
# REQUIREMENTS
|
||||
|
||||
• A comprehensive list of packages you'd like included.
|
||||
|
||||
• A list of configuration architecture specifications.
|
||||
|
||||
• Any bespoke configuration you want included.
|
||||
|
||||
# EXAMPLE
|
||||
|
||||
"""
|
||||
, articleReferences =
|
||||
[ { author = ""
|
||||
, title = ""
|
||||
, journal = ""
|
||||
, year = ""
|
||||
, link = ""
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
renderCodeLine : SyntaxColors -> List (Element msg) -> Element msg
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module Pages.Services.Nutrition exposing (Model, Msg, page)
|
||||
|
||||
import Config.Helpers.Articles.Article exposing (contentList)
|
||||
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
|
||||
import Config.Helpers.Cards.Outer.Types as C
|
||||
import Config.Helpers.Format exposing (..)
|
||||
|
@ -14,6 +15,7 @@ import Config.Helpers.Response
|
|||
import Config.Helpers.ServiceFormat exposing (..)
|
||||
import Config.Helpers.ToolTip exposing (..)
|
||||
import Config.Helpers.Viewport exposing (resetViewport)
|
||||
import Config.Pages.Blog.Types exposing (BlogArticle)
|
||||
import Config.Pages.Services.Records.NutritionScience exposing (servicesNutritionScience)
|
||||
import Config.Style.Colour.Helpers exposing (colourTheme)
|
||||
import Config.Style.Transitions
|
||||
|
@ -124,22 +126,54 @@ nutritionList device =
|
|||
List.concat
|
||||
[ List.map
|
||||
(\service ->
|
||||
cardMaker device (C.ServicePage service) contentList
|
||||
cardMaker device
|
||||
(C.BlogArticle service)
|
||||
(contentList service
|
||||
[ el
|
||||
[ paddingXY 0 10
|
||||
, centerX
|
||||
]
|
||||
<|
|
||||
buyButton "Book!" "https://buy.stripe.com/5kA5lz77pdJq6J28wz"
|
||||
]
|
||||
)
|
||||
)
|
||||
[ servicesNutritionScience ]
|
||||
[ nutritionQA ]
|
||||
]
|
||||
|
||||
|
||||
contentList : List (Element msg)
|
||||
contentList =
|
||||
[ column
|
||||
bodyFormat
|
||||
[ chunkMaker servicesNutritionScience.serviceArticle.articleParagraph.paragraph1
|
||||
, chunkMaker servicesNutritionScience.serviceArticle.articleParagraph.paragraph2
|
||||
, titleMaker servicesNutritionScience.serviceArticle.articleTitles.title1
|
||||
, numberMaker servicesNutritionScience.serviceArticle.articleListEntries.list1
|
||||
, titleMaker servicesNutritionScience.serviceArticle.articleTitles.title2
|
||||
, bulletPointMaker servicesNutritionScience.serviceArticle.articleListEntries.list2
|
||||
, buyButton "Book!" "https://buy.stripe.com/5kA5lz77pdJq6J28wz"
|
||||
nutritionQA : BlogArticle
|
||||
nutritionQA =
|
||||
{ articleName = String.toUpper "Nutrition Q&A"
|
||||
, articleLink = ""
|
||||
, articleAuthor = ""
|
||||
, isNewTabLink = False
|
||||
, hasReferences = False
|
||||
, hasTableOfContents = False
|
||||
, articleImage = ""
|
||||
, articlePublished = ""
|
||||
, articleBody = """
|
||||
This service is designed to help those interested in honing their nutrition science knowledge and boosting their intuition when reading nutrition science literature. Whether the client's goals are to achieve their academic ambitions, satisfy their personal curiosity, or improve their empirical debate chops. The client is free to guide the session in any direction they choose, so long as it is relevant to nutrition science.
|
||||
|
||||
# BENEFITS
|
||||
|
||||
1. One hour to ask me anything about nutrition science.
|
||||
|
||||
2. Access to nutrition science evaluation cheat sheets.
|
||||
|
||||
3. Sharper nutrition science critical appraisal skills.
|
||||
|
||||
# REQUIREMENTS
|
||||
|
||||
• A list of five clear questions related to nutrition science.
|
||||
|
||||
"""
|
||||
, articleReferences =
|
||||
[ { author = ""
|
||||
, title = ""
|
||||
, journal = ""
|
||||
, year = ""
|
||||
, link = ""
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
0
frontend/static/donate/cardano.png
Normal file → Executable file
0
frontend/static/donate/cardano.png
Normal file → Executable file
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
0
frontend/static/services/customnixconfigs.png
Normal file → Executable file
0
frontend/static/services/customnixconfigs.png
Normal file → Executable file
Before Width: | Height: | Size: 524 KiB After Width: | Height: | Size: 524 KiB |
Loading…
Add table
Add a link
Reference in a new issue