diff --git a/frontend/src/Cuckery/Helpers.elm b/frontend/src/Cuckery/Helpers.elm index 2ac87ff..e1292f2 100755 --- a/frontend/src/Cuckery/Helpers.elm +++ b/frontend/src/Cuckery/Helpers.elm @@ -76,7 +76,15 @@ makeDodge dodgeEntry index = displayFallacy fallacyText = row paragraphBoldFormat [ column [ alignTop, width (px 165) ] - [ text "Fallacy:" |> el [ paddingEach { top = 0, right = 0, bottom = 0, left = 70 } ] + [ text "Fallacy:" + |> el + [ paddingEach + { top = 0 + , right = 0 + , bottom = 0 + , left = 70 + } + ] ] , column [ E.width fill, alignLeft ] [ paragraph [ F.regular ] @@ -84,11 +92,21 @@ makeDodge dodgeEntry index = ] ] in - column (paragraphAlignLeft ++ [ spacing 3, width fill ]) + column + (paragraphAlignLeft + ++ [ spacing 3 + , width fill + ] + ) [ row (paragraphFormat ++ [ F.size 18 - , paddingEach { top = 0, bottom = 0, left = 15, right = 15 } + , paddingEach + { top = 0 + , bottom = 0 + , left = 15 + , right = 15 + } , E.width fill ] ) @@ -213,31 +231,24 @@ cuckMaker cuck = , E.height <| px 115 , alignTop , alignRight - - -- , explain Debug.todo ] - [ E.image - [ alignRight - , alignTop - , D.rounded 100 - , clip - , E.width <| px 90 - , E.height <| px 90 + [ column + [ D.rounded 100 + , D.width 5 + , D.color colourTheme.cardBackground + ] + [ E.image + [ alignRight + , alignTop + , D.rounded 100 + , clip + , E.width <| px 90 + , E.height <| px 90 + ] + { src = "cucks/" ++ cuck.cuckImage ++ "/" ++ cuck.cuckImage ++ ".png" + , description = cuck.cuckName + } ] - { src = "cucks/" ++ cuck.cuckImage ++ "/" ++ cuck.cuckImage ++ ".png" - , description = cuck.cuckName - } - -- , E.image - -- [ D.rounded 100 - -- , clip - -- , moveUp 107 - -- , moveRight 7 - -- , E.width <| px 125 - -- , E.height <| px 125 - -- ] - -- { src = "cucks/clownborder.png" - -- , description = cuck.cuckName - -- } ] , column [ E.width <| px 600 ] diff --git a/frontend/src/Interviews/Episodes/FitAndFurious.elm b/frontend/src/Interviews/Episodes/FitAndFurious.elm new file mode 100644 index 0000000..1f17a4d --- /dev/null +++ b/frontend/src/Interviews/Episodes/FitAndFurious.elm @@ -0,0 +1,29 @@ +module Interviews.Episodes.FitAndFurious exposing (..) + +import Interviews.Types exposing (..) + + +fitAndFurious : Interview +fitAndFurious = + let + name : String + name = + "Fit and Furious" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/FitAndFuriousND" + , interviewAppearances = + [ { appearanceTitle = "Seed Oil Schooling!" + , appearanceEpisode = "51" + , appearanceLink = "https://www.youtube.com/watch?v=7I1IJSZIGm0" + , appearanceExperience = 7 + , appearanceSubjects = + [ { subject = "The story behind the Nutri-Dex." } + , { subject = "Seed oil consumption and health." } + , { subject = "Natural diets versus artificial diets." } + , { subject = "Ethical veganism and Nick's diet." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/FoolproofMastery.elm b/frontend/src/Interviews/Episodes/FoolproofMastery.elm new file mode 100644 index 0000000..609f11a --- /dev/null +++ b/frontend/src/Interviews/Episodes/FoolproofMastery.elm @@ -0,0 +1,42 @@ +module Interviews.Episodes.FoolproofMastery exposing (..) + +import Interviews.Types exposing (..) + + +foolproofMastery : Interview +foolproofMastery = + let + name : String + name = + "Foolproof Mastery" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/FoolproofMaster" + , interviewAppearances = + [ { appearanceTitle = "Seed Oils & Statistics" + , appearanceEpisode = "14" + , appearanceLink = "https://www.youtube.com/watch?v=3w0wvckA1Hw" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "Vegetable oils & health outcomes." } + , { subject = "Lipid peroxidation." } + , { subject = "Lag time to LDL oxidation." } + , { subject = "Statistical analysis." } + , { subject = "Study design" } + ] + } + , { appearanceTitle = "Bizarre Nutrition Claims" + , appearanceEpisode = "15" + , appearanceLink = "https://www.youtube.com/watch?v=9k7COJgwCo4" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "Meat eating in Hong Kong." } + , { subject = "Different eating patterns." } + , { subject = "Glycine methionine ratio." } + , { subject = "Oysters as a vegan food." } + , { subject = "Nick's supplements." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/KetogeeksPodcast.elm b/frontend/src/Interviews/Episodes/KetogeeksPodcast.elm new file mode 100644 index 0000000..6634a02 --- /dev/null +++ b/frontend/src/Interviews/Episodes/KetogeeksPodcast.elm @@ -0,0 +1,31 @@ +module Interviews.Episodes.KetogeeksPodcast exposing (..) + +import Interviews.Types exposing (..) + + +ketoGeeksPodcast : Interview +ketoGeeksPodcast = + let + name : String + name = + "Ketogeek's Podcast" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/fmahmad88" + , interviewAppearances = + [ { appearanceTitle = "In Defense of Seed Oils and Polyunsaturated Fats" + , appearanceEpisode = "78" + , appearanceLink = "https://ketogeek.libsyn.com/in-defense-of-seed-oils-and-polyunsaturated-fats-nick-hiebert" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "How did you start getting into the seed oil debate?" } + , { subject = "What are some common claims made against seed oils?" } + , { subject = "Does PUFA cause chronic diseases like CVD and cancer?" } + , { subject = "Critique of the ancestral approach towards food and nutrition." } + , { subject = "Why and when epidemiology can be good evidence." } + , { subject = "Resources people can read regarding PUFA and health." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/LegendaryLifePodcast.elm b/frontend/src/Interviews/Episodes/LegendaryLifePodcast.elm new file mode 100644 index 0000000..1cf8a77 --- /dev/null +++ b/frontend/src/Interviews/Episodes/LegendaryLifePodcast.elm @@ -0,0 +1,32 @@ +module Interviews.Episodes.LegendaryLifePodcast exposing (..) + +import Interviews.Types exposing (..) + + +legendaryLifePodcast : Interview +legendaryLifePodcast = + let + name : String + name = + "Legendary Life Podcast" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/ted_ryce" + , interviewAppearances = + [ { appearanceTitle = "Common Food And Nutrition Myths Debunked" + , appearanceEpisode = "391" + , appearanceLink = "https://www.legendarylifepodcast.com/391-5-common-food-and-nutrition-myths-debunked-with-nick-hiebert/c" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "The importance of identifying quality evidence." } + , { subject = "Salt doesn’t cost high blood pressure?" } + , { subject = "Foods that are high in potassium." } + , { subject = "Why eating processed foods might make you fat." } + , { subject = "Western Diet Culture Mentality." } + , { subject = "Are there good foods and bad foods." } + , { subject = "Nutrient Density: Guide and Tools." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/MarkBellsPowerProject.elm b/frontend/src/Interviews/Episodes/MarkBellsPowerProject.elm new file mode 100644 index 0000000..4724fd4 --- /dev/null +++ b/frontend/src/Interviews/Episodes/MarkBellsPowerProject.elm @@ -0,0 +1,31 @@ +module Interviews.Episodes.MarkBellsPowerProject exposing (..) + +import Interviews.Types exposing (..) + + +markBellsPowerProject : Interview +markBellsPowerProject = + let + name : String + name = + "Mark Bell's Power Project" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/MarkSmellyBell" + , interviewAppearances = + [ { appearanceTitle = "Seed Oils Aren’t as Bad as You May Think" + , appearanceEpisode = "670" + , appearanceLink = "https://www.youtube.com/watch?v=omzCi2CGoxo" + , appearanceExperience = 1 + , appearanceSubjects = + [ { subject = "Quick background on seed oils." } + , { subject = "How does red meat increase disease risk?" } + , { subject = "Exact health benefits of vegetable oils." } + , { subject = "Tucker Goodrich & Alan Flanagan debate review." } + , { subject = "Should you remove seed oils all together at once?" } + , { subject = "Maybe vegetable oils aren’t that important?" } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/MuscleMemoirsPodcast.elm b/frontend/src/Interviews/Episodes/MuscleMemoirsPodcast.elm new file mode 100644 index 0000000..2211553 --- /dev/null +++ b/frontend/src/Interviews/Episodes/MuscleMemoirsPodcast.elm @@ -0,0 +1,43 @@ +module Interviews.Episodes.MuscleMemoirsPodcast exposing (..) + +import Interviews.Types exposing (..) + + +muscleMemoirsPodcast : Interview +muscleMemoirsPodcast = + let + name : String + name = + "Muscle Memoirs Podcast" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/MikeMurrayRD" + , interviewAppearances = + [ { appearanceTitle = "The Nutri-Dex, Misconceptions, and Optimizing Body Composition" + , appearanceEpisode = "11" + , appearanceLink = "https://www.youtube.com/watch?v=SF1BBOA5FAQ" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "The story behind the Nutri-Dex." } + , { subject = "Misconceptions about nutrient density." } + , { subject = "Using the cheat sheet to optimize body composition." } + , { subject = "Top foods that are beneficial for bodybuilding." } + , { subject = "How are the most satiating foods determined?" } + , { subject = "Nick gives some of his tops foods" } + ] + } + , { appearanceTitle = "Seed Oils, Saturated Fat, and Cardiovascular Disease" + , appearanceEpisode = "82" + , appearanceLink = "https://www.youtube.com/watch?v=WfApzH4Dj3M" + , appearanceExperience = 10 + , appearanceSubjects = + [ { subject = "Mechanistic arguments against seed oils." } + , { subject = "Linoleic acid consumption and heart disease." } + , { subject = "Are hunter-gatherer diets optimal for modern humans?" } + , { subject = "Saturated fat and blood lipids." } + , { subject = "Meta-analysis in nutrition." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Episodes/SigmaNutritionRadio.elm b/frontend/src/Interviews/Episodes/SigmaNutritionRadio.elm new file mode 100644 index 0000000..e95e3f9 --- /dev/null +++ b/frontend/src/Interviews/Episodes/SigmaNutritionRadio.elm @@ -0,0 +1,32 @@ +module Interviews.Episodes.SigmaNutritionRadio exposing (..) + +import Interviews.Types exposing (..) + + +sigmaNutritionRadio : Interview +sigmaNutritionRadio = + let + name : String + name = + "Sigma Nutrition Radio" + in + { interviewName = name + , interviewImage = formatInterviewName name + , interviewSocial = "https://x.com/NutritionDanny" + , interviewAppearances = + [ { appearanceTitle = "Micronutrients, Anti-nutrients, and Non-essential Nutrients" + , appearanceEpisode = "360" + , appearanceLink = "https://sigmanutrition.com/episode360/" + , appearanceExperience = 1 + , appearanceSubjects = + [ { subject = "How best to measure nutrient density." } + , { subject = "The downsides of maximizing nutrient density." } + , { subject = "Anti-nutrients: how relevant are they?" } + , { subject = "Understanding the effect of phytate, oxalate, etc." } + , { subject = "Hard to get nutrients in typical diets." } + , { subject = "Synergistic and moderating effects of nutrients." } + , { subject = "Non-essential nutrients & importance for health." } + ] + } + ] + } diff --git a/frontend/src/Interviews/Helpers.elm b/frontend/src/Interviews/Helpers.elm new file mode 100644 index 0000000..8d62bdf --- /dev/null +++ b/frontend/src/Interviews/Helpers.elm @@ -0,0 +1,217 @@ +module Interviews.Helpers exposing (..) + +import Config.Colour exposing (..) +import Config.Format exposing (..) +import Cuckery.Types exposing (..) +import Effect exposing (Effect) +import Element as E exposing (..) +import Element.Background as B exposing (..) +import Element.Border as D +import Element.Font as F +import Html.Attributes as H exposing (style) +import Interviews.Types exposing (..) +import Layouts +import Page exposing (Page) +import Route exposing (Route) +import Shared +import View exposing (View) + + +makeSubject : Subjects -> Element msg +makeSubject subjects = + column [ E.width fill, alignLeft ] + [ paragraph [ F.regular ] + [ text ("‣ " ++ subjects.subject) ] + ] + + +makeAppearance : Appearance -> Int -> Element msg +makeAppearance appearanceEntry index = + column + (paragraphAlignLeft + ++ [ spacing 3 + , width fill + ] + ) + [ row + (paragraphFormat + ++ [ F.size 18 + , paddingEach + { top = 0 + , bottom = 0 + , left = 15 + , right = 15 + } + , E.width fill + ] + ) + [ text " " + , text (String.fromInt index ++ ". ") + , paragraphLinkFormat + { url = appearanceEntry.appearanceLink + , label = + row + [ F.size 18 + ] + [ text ("#"++appearanceEntry.appearanceEpisode++": "++appearanceEntry.appearanceTitle) + |> el + [ F.color colourTheme.highlightText + , mouseOver [ F.color colourTheme.highlightTextHover ] + , transitionStyle + ] + ] + } + ] + , row paragraphBoldFormat + [ column [ alignTop, width <| px 125 ] + [ text "Subjects:" + |> el + [ paddingEach + { top = 0 + , right = 0 + , bottom = 0 + , left = 55 + } + ] + ] + , column + [ spacing 8 + , width fill + ] + <| + List.map2 (\x y -> makeSubject x) + appearanceEntry.appearanceSubjects + (List.range 1 (List.length appearanceEntry.appearanceSubjects)) + ] + ] + + +interviewMaker : Interview -> Element msg +interviewMaker interview = + row + [ spacing 20 + , width fill + , E.height fill + , alignTop + , alignRight + ] + [ column + [ E.width <| px 115 + , E.height <| px 115 + , alignTop + , alignRight + ] + [ column + [ D.rounded 100 + , D.width 5 + , D.color colourTheme.cardBackground + ] + [ E.image + [ alignRight + , alignTop + , D.rounded 100 + , clip + , E.width <| px 90 + , E.height <| px 90 + ] + { src = "interviews/" ++ interview.interviewImage ++ ".png" + , description = interview.interviewImage + } + ] + ] + , column + [ E.width <| px 600 ] + [ row + (nonHighlightedTitleFormat + ++ [ F.size 20 + , paddingEach + { top = 6 + , bottom = 3 + , left = 25 + , right = 15 + } + , alignBottom + , width fill + , D.roundEach + { topLeft = 26 + , topRight = 15 + , bottomRight = 0 + , bottomLeft = 0 + } + , B.gradient + { angle = 1.5708 + , steps = + [ colourTheme.highlightTextHover + , colourTheme.highlightTextHover + , colourTheme.transparent + , colourTheme.transparent + ] + } + ] + ) + [ text interview.interviewName ] + , column + [ E.height fill + , E.width fill + + -- , B.color colourTheme.cardBackground + , paddingEach + { top = 10 + , bottom = 10 + , left = 10 + , right = 10 + } + , D.roundEach + { topLeft = 0 + , topRight = 0 + , bottomRight = 0 + , bottomLeft = 26 + } + , spacing 3 + , B.gradient + { angle = 1.5708 + , steps = + [ colourTheme.cardBackground + , colourTheme.cardBackground + , colourTheme.transparent + , colourTheme.transparent + ] + } + ] + [ row + (paragraphBoldFormat + ++ [ F.size 18 + , paddingEach + { top = 0 + , bottom = 0 + , left = 15 + , right = 15 + } + , spacing 5 + ] + ) + [ text "Social:" + , paragraphLinkFormat + { url = interview.interviewSocial + , label = transitionHighlightedLinkHover <| text (formatInterviewSocial interview.interviewSocial) + } + ] + , row + (paragraphBoldFormat + ++ [ F.size 18 + , paddingEach + { top = 0 + , bottom = 0 + , left = 15 + , right = 15 + } + ] + ) + [ text "Appearances:" ] + , column [ spacing 8, width fill ] <| + List.map2 (\x y -> makeAppearance x y) + interview.interviewAppearances + (List.range 1 (List.length interview.interviewAppearances)) + ] + ] + ] diff --git a/frontend/src/Interviews/Types.elm b/frontend/src/Interviews/Types.elm new file mode 100644 index 0000000..d72ccb4 --- /dev/null +++ b/frontend/src/Interviews/Types.elm @@ -0,0 +1,44 @@ +module Interviews.Types exposing (..) + + +type alias Interview = + { interviewName : String + , interviewImage : String + , interviewSocial : String + , interviewAppearances : List Appearance + } + + +type alias Appearance = + { appearanceEpisode : String + , appearanceLink : String + , appearanceTitle : String + , appearanceExperience : Int + , appearanceSubjects : List Subjects + } + + +type alias Subjects = + { subject : String } + + +type alias FormattedInterviewName = + String + + +type alias FormattedInterviewSocial = + String + + +formatInterviewName : String -> FormattedInterviewName +formatInterviewName name = + name + |> String.toLower + |> String.replace " " "" + |> String.replace "'" "" + + +formatInterviewSocial : String -> FormattedInterviewSocial +formatInterviewSocial name = + name + |> String.replace "https://x.com/" "@" diff --git a/frontend/src/Layouts/Navbar.elm b/frontend/src/Layouts/Navbar.elm index e21e891..0f12cea 100755 --- a/frontend/src/Layouts/Navbar.elm +++ b/frontend/src/Layouts/Navbar.elm @@ -155,7 +155,8 @@ view { toContentMsg, model, content } = , hyperbolgButton , argumentsButton , cucklistButton - , communityButton + + -- , communityButton , nutridexButton , donateButton , interviewButton diff --git a/frontend/src/Pages/Interviews.elm b/frontend/src/Pages/Interviews.elm new file mode 100644 index 0000000..bb4311b --- /dev/null +++ b/frontend/src/Pages/Interviews.elm @@ -0,0 +1,114 @@ +module Pages.Interviews exposing (Model, Msg, page) + +import Config.Colour as T exposing (..) +import Config.Format as O exposing (..) +import Config.Identity as I exposing (..) +import Effect exposing (Effect) +import Element exposing (..) +import Element.Border as D +import Element.Font as F +import Html +import Html.Attributes as H exposing (style) +import Interviews.Episodes.FitAndFurious exposing (fitAndFurious) +import Interviews.Episodes.FoolproofMastery exposing (foolproofMastery) +import Interviews.Episodes.KetogeeksPodcast exposing (ketoGeeksPodcast) +import Interviews.Episodes.LegendaryLifePodcast exposing (legendaryLifePodcast) +import Interviews.Episodes.MarkBellsPowerProject exposing (markBellsPowerProject) +import Interviews.Episodes.MuscleMemoirsPodcast exposing (muscleMemoirsPodcast) +import Interviews.Episodes.SigmaNutritionRadio exposing (sigmaNutritionRadio) +import Interviews.Helpers exposing (..) +import Layouts +import Page exposing (Page) +import Route exposing (Route) +import Shared +import View exposing (View) + + +page : Shared.Model -> Route () -> Page Model Msg +page shared route = + Page.new + { init = init + , update = update + , subscriptions = subscriptions + , view = view + } + |> Page.withLayout toLayout + + +toLayout : Model -> Layouts.Layout Msg +toLayout model = + Layouts.Navbar {} + + + +-- INIT + + +type alias Model = + {} + + +init : () -> ( Model, Effect Msg ) +init () = + ( {} + , Effect.none + ) + + + +-- UPDATE + + +type Msg + = NoOp + + +update : Msg -> Model -> ( Model, Effect Msg ) +update msg model = + case msg of + NoOp -> + ( model + , Effect.none + ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions model = + Sub.none + + + +-- VIEW + + +view : Model -> View Msg +view model = + { title = dodgersName + , attributes = [] + , element = interviewContainer + } + + +interviewContainer : Element msg +interviewContainer = + topLevelContainer interviewList + + +interviewList : Element msg +interviewList = + column + pageList + <| + List.map interviewMaker + [ sigmaNutritionRadio + , markBellsPowerProject + , foolproofMastery + , ketoGeeksPodcast + , legendaryLifePodcast + , muscleMemoirsPodcast + , fitAndFurious + ] diff --git a/frontend/static/interviews/fitandfurious.png b/frontend/static/interviews/fitandfurious.png new file mode 100644 index 0000000..41ddb19 Binary files /dev/null and b/frontend/static/interviews/fitandfurious.png differ diff --git a/frontend/static/interviews/foolproofmastery.png b/frontend/static/interviews/foolproofmastery.png new file mode 100644 index 0000000..48d5398 Binary files /dev/null and b/frontend/static/interviews/foolproofmastery.png differ diff --git a/frontend/static/interviews/ketogeekspodcast.png b/frontend/static/interviews/ketogeekspodcast.png new file mode 100644 index 0000000..b77cfb7 Binary files /dev/null and b/frontend/static/interviews/ketogeekspodcast.png differ diff --git a/frontend/static/interviews/legendarylifepodcast.png b/frontend/static/interviews/legendarylifepodcast.png new file mode 100644 index 0000000..e7a9daa Binary files /dev/null and b/frontend/static/interviews/legendarylifepodcast.png differ diff --git a/frontend/static/interviews/markbellspowerproject.png b/frontend/static/interviews/markbellspowerproject.png new file mode 100644 index 0000000..52d92ae Binary files /dev/null and b/frontend/static/interviews/markbellspowerproject.png differ diff --git a/frontend/static/interviews/musclememoirspodcast.png b/frontend/static/interviews/musclememoirspodcast.png new file mode 100644 index 0000000..7dfd2ec Binary files /dev/null and b/frontend/static/interviews/musclememoirspodcast.png differ diff --git a/frontend/static/interviews/sigmanutritionradio.png b/frontend/static/interviews/sigmanutritionradio.png new file mode 100644 index 0000000..330eb90 Binary files /dev/null and b/frontend/static/interviews/sigmanutritionradio.png differ