diff --git a/frontend/src/Config/CardFormat.elm b/frontend/src/Config/CardFormat.elm
index 2799aef..5ae4df0 100755
--- a/frontend/src/Config/CardFormat.elm
+++ b/frontend/src/Config/CardFormat.elm
@@ -84,6 +84,8 @@ cardImageMaker image =
, D.width 5
, D.color colourTheme.backgroundDarkGrey
, B.color colourTheme.backgroundDarkGrey
+ , mouseOver [ D.color colourTheme.textDarkOrange]
+ , htmlAttribute <| style "transition" "all 0.1s ease-in-out"
]
[ E.image
[ alignRight
diff --git a/frontend/src/Config/Format.elm b/frontend/src/Config/Format.elm
index 045cb0e..9c3ecac 100755
--- a/frontend/src/Config/Format.elm
+++ b/frontend/src/Config/Format.elm
@@ -22,7 +22,7 @@ pageList : List (Attribute msg)
pageList =
[ spacing 30
, centerX
- , centerY
+ , alignTop
, paddingEach { top = 30, bottom = 30, left = 30, right = 30 }
]
diff --git a/frontend/src/Config/Identity.elm b/frontend/src/Config/Identity.elm
index de735c5..23467b7 100755
--- a/frontend/src/Config/Identity.elm
+++ b/frontend/src/Config/Identity.elm
@@ -10,7 +10,6 @@ type alias PageInput =
, pageHyperBlog : String
, pageInterviews : String
, pageNutriDex : String
- , pagePlatforms : String
, pageServices : String
, pageDonate : String
}
@@ -20,7 +19,6 @@ pageNames : PageInput
pageNames =
{ pageRoot = "home"
, pageHome = "upRootNutrition"
- , pagePlatforms = "platforms"
, pageServices = "services"
, pageDodgers = "cuckList"
, pageDebate = "arguments"
@@ -77,11 +75,6 @@ nutriDexName =
createPageName pageNames.pageNutriDex
-platformsName : String
-platformsName =
- createPageName pageNames.pagePlatforms
-
-
servicesName : String
servicesName =
createPageName pageNames.pageServices
diff --git a/frontend/src/Config/Viewport.elm b/frontend/src/Config/Viewport.elm
new file mode 100644
index 0000000..904de6c
--- /dev/null
+++ b/frontend/src/Config/Viewport.elm
@@ -0,0 +1,14 @@
+module Config.Viewport exposing (..)
+
+import Browser.Dom as Dom
+import Effect exposing (..)
+import Task
+
+
+type Msg
+ = NoOp
+
+
+resetViewport : Cmd Msg
+resetViewport =
+ Task.perform (\_ -> NoOp) (Dom.setViewport 0 0)
diff --git a/frontend/src/Contact/Helpers.elm b/frontend/src/Contact/Helpers.elm
index 5dde457..84a13e0 100755
--- a/frontend/src/Contact/Helpers.elm
+++ b/frontend/src/Contact/Helpers.elm
@@ -1,3 +1,425 @@
module Contact.Helpers exposing (..)
+import Config.CardFormat exposing (..)
+import Config.Colour exposing (..)
+import Config.Format exposing (..)
+import Config.StrengthBar exposing (..)
+import Config.ToolTip exposing (..)
+import Contact.Methods.Discord exposing (contactDiscord)
import Contact.Types exposing (..)
+import Effect exposing (Effect)
+import Element as E exposing (..)
+import Element.Background as B exposing (..)
+import Element.Border as D
+import Element.Events exposing (onClick)
+import Element.Font as F
+import Headers.Types exposing (..)
+import Html.Attributes as H exposing (style)
+import Html.Events exposing (onMouseOver)
+import Interviews.Types exposing (..)
+import Layouts
+import Page exposing (Page)
+import Products.Types exposing (..)
+import Route exposing (Route)
+import Shared
+import View exposing (View)
+
+
+contactMaker : Contact -> Element msg
+contactMaker contact =
+ row
+ topLevelBox
+ [ cardImageMaker (contactImage contact)
+ , cardMaker
+ [ cardTitleMaker (contactTitle contact)
+ , cardFormatter
+ [ cardContentSpacing
+ [ column
+ fieldSpacer
+ [ linkMaker contact
+ , descriptionMaker contact
+ ]
+ ]
+ ]
+ ]
+ ]
+
+
+contactImage :
+ Contact
+ ->
+ { src : String
+ , description : String
+ }
+contactImage contact =
+ { src = "contact/" ++ contact.contactImage ++ ".png"
+ , description = contact.contactName
+ }
+
+
+contactTitle : Contact -> String
+contactTitle contact =
+ contact.contactName
+
+
+descriptionMaker : Contact -> Element msg
+descriptionMaker contact =
+ column
+ [ width fill
+ , height fill
+ ]
+ [ column [ width fill, F.size 15, spacing 10 ] <|
+ List.map makeDescription
+ contact.contactEntry
+ ]
+
+
+makeDescription : Method -> Element msg
+makeDescription method =
+ paragraph
+ [ F.regular
+ , F.alignLeft
+ ]
+ [ row []
+ [ paragraph
+ [ F.color colourTheme.textLightGrey
+ ]
+ [ text method.contactInstructions
+ ]
+ ]
+ ]
+
+
+linkMaker : Contact -> Element msg
+linkMaker contact =
+ row
+ (paragraphBoldFormat
+ ++ [ F.size 18
+ , spacing 8
+ ]
+ )
+ [ paragraphLinkFormat
+ { url = contact.contactLink
+ , label = transitionHighlightedLinkHover <| text contact.contactLinkLabel
+ }
+ ]
+
+
+instructionMaker : Element msg
+instructionMaker =
+ row
+ topLevelBox
+ [ column
+ [ E.width <| px 785
+ , D.width 5
+ , D.color colourTheme.backgroundDarkGrey
+ , D.roundEach
+ { topLeft = 32
+ , topRight = 32
+ , bottomRight = 32
+ , bottomLeft = 32
+ }
+ ]
+ [ paragraph
+ (nonHighlightedTitleFormat
+ ++ [ F.size 20
+ , B.color colourTheme.textDarkOrange
+ , paddingEach
+ { top = 6
+ , bottom = 3
+ , left = 25
+ , right = 15
+ }
+ , alignBottom
+ , width fill
+ , F.center
+ , D.roundEach
+ { topLeft = 26
+ , topRight = 26
+ , bottomRight = 0
+ , bottomLeft = 0
+ }
+ ]
+ )
+ [ text "CONTACT" ]
+ , cardFormatter
+ [ cardContentSpacing
+ [ column
+ fieldSpacer
+ [ paragraph
+ (paragraphFormat
+ ++ [ F.size 18
+ , F.center
+ ]
+ )
+ [ instructionBody ]
+ ]
+ ]
+ ]
+ ]
+ ]
+
+
+instructionBody : Element msg
+instructionBody =
+ column [ spacing 10 ]
+ [ paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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." ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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." ]
+ , paragraph
+ (paragraphBoldFormat
+ ++ [ F.center
+ , width fill
+ , paddingEach
+ { top = 10
+ , bottom = 10
+ , left = 0
+ , right = 0
+ }
+ ]
+ )
+ [ el
+ (orangeFormat ++ [ F.size 18 ])
+ <|
+ text "Terms and Conditions"
+ ]
+ , column [ spacing 10 ] <|
+ List.indexedMap
+ (\index term ->
+ row
+ [ spacing 10
+ , width fill
+ ]
+ [ column
+ [ width <| px 15
+ , alignTop
+ , alignRight
+ ]
+ [ el [] <| text (String.fromInt (index + 1) ++ ". ") ]
+ , column
+ [ spacing 10
+ , width fill
+ , alignRight
+ ]
+ [ paragraph
+ [ width fill
+ , F.size 16
+ ]
+ term
+ ]
+ ]
+ )
+ termsAndConditions
+ , paragraph
+ (paragraphBoldFormat
+ ++ [ F.center
+ , width fill
+ , paddingEach
+ { top = 10
+ , bottom = 10
+ , left = 0
+ , right = 0
+ }
+ ]
+ )
+ [ el (orangeFormat ++ [ F.size 18 ]) <| text "Additional Clarifications" ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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."
+ ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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." ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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." ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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."
+ ]
+ , paragraph
+ (paragraphFormat
+ ++ [ F.alignLeft
+ , width fill
+ ]
+ )
+ [ 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
+ , mouseOver [ F.color colourTheme.textDarkOrange ]
+ , htmlAttribute <| style "transition" "all 0.1s ease-in-out"
+ ]
+
+
+termsAndConditions : List (List (Element msg))
+termsAndConditions =
+ [ [ row [ 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 = ""
+ , label = el orangeFormat <| text "upRootNutrition Discord Server"
+ }
+ , text " (if you haven't already)."
+ ]
+ ]
+ , [ el [ alignLeft ] <| text "You will click the \"😃\" emoji to enter the server (if you haven't already)." ]
+ , [ row [ alignLeft ]
+ [ text "You will locate the "
+ , newTabLink []
+ { url = ""
+ , label = el orangeFormat <| text "💻┃general"
+ }
+ , text " channel in General category."
+ ]
+ ]
+ , [ column [ alignLeft, width fill, spacing 10 ]
+ [ row [ alignLeft ] [ paragraph [] [ text "You will post exactly this in the 💻┃general channel:" ] ]
+ , row [ alignLeft ]
+ [ paragraph
+ [ paddingEach
+ { top = 0
+ , bottom = 0
+ , left = 20
+ , right = 0
+ }
+ ]
+ [ text "• "
+ , text "\"@Moderators I have a criticism for Nick.\""
+ ]
+ ]
+ ]
+ ]
+ , [ el [ alignLeft ] <| text "You will then receive the @Critic role." ]
+ , [ row [ alignLeft ]
+ [ text "You will locate the "
+ , newTabLink []
+ { url = ""
+ , label = el orangeFormat <| text "🔎┃criticism"
+ }
+ , text " channel in the General category."
+ ]
+ ]
+ , [ row [ alignLeft ]
+ [ text "You will post your criticism in the "
+ , newTabLink []
+ { url = ""
+ , label = el orangeFormat <| text "🔎┃criticism"
+ }
+ , text " channel with this exact format:"
+ ]
+ ]
+ , [ column
+ [ paddingEach
+ { top = 15
+ , bottom = 15
+ , left = 20
+ , right = 15
+ }
+ , B.color colourTheme.backgroundLightGrey
+ , D.rounded 30
+ , 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."
+ ]
+ ]
+ ]
+ ]
+ , [ el [ alignLeft ] <| text "You will not post additional criticisms until the last one has been resolved." ]
+ , [ row [ alignLeft ]
+ [ text "You will not post anything other than criticisms in the "
+ , newTabLink [ alignLeft ]
+ { url = ""
+ , 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." ]
+ ]
diff --git a/frontend/src/Contact/Methods/Discord.elm b/frontend/src/Contact/Methods/Discord.elm
index 0a374da..f303e3c 100755
--- a/frontend/src/Contact/Methods/Discord.elm
+++ b/frontend/src/Contact/Methods/Discord.elm
@@ -1,3 +1,22 @@
module Contact.Methods.Discord exposing (..)
-import Contact.Types exposing (..)
\ No newline at end of file
+import Contact.Types exposing (..)
+import Element exposing (paragraph, text)
+
+
+contactDiscord : Contact
+contactDiscord =
+ let
+ name =
+ "Discord"
+ in
+ { contactName = name
+ , contactImage = formatName name
+ , contactLink = "https://discord.com/invite/YrcEvgRTqy"
+ , contactLinkLabel = "upRootNutrition Server"
+ , contactEntry =
+ [ { contactInstructions =
+ ""
+ }
+ ]
+ }
diff --git a/frontend/src/Contact/Methods/Email.elm b/frontend/src/Contact/Methods/Email.elm
new file mode 100644
index 0000000..7ba4a1d
--- /dev/null
+++ b/frontend/src/Contact/Methods/Email.elm
@@ -0,0 +1,27 @@
+module Contact.Methods.Email exposing (..)
+
+import Config.Colour exposing (colourTheme)
+import Contact.Types exposing (..)
+import Element exposing (paragraph, text)
+import Element.Font as F
+
+
+contactEmail : Contact
+contactEmail =
+ let
+ name =
+ "Email"
+
+ contact =
+ "nick@uprootnutrition.com"
+ in
+ { contactName = name
+ , contactImage = formatName name
+ , contactLink = contact
+ , contactLinkLabel = contact
+ , contactEntry =
+ [ { contactInstructions =
+ ""
+ }
+ ]
+ }
diff --git a/frontend/src/Contact/Types.elm b/frontend/src/Contact/Types.elm
index 6b1f491..d42cd60 100755
--- a/frontend/src/Contact/Types.elm
+++ b/frontend/src/Contact/Types.elm
@@ -1,2 +1,26 @@
module Contact.Types exposing (..)
+
+type alias Contact =
+ { contactName : String
+ , contactImage : String
+ , contactLink : String
+ , contactLinkLabel : String
+ , contactEntry : List Method
+ }
+
+
+type alias Method =
+ { contactInstructions : String
+ }
+
+
+type alias FormattedName =
+ String
+
+
+formatName : String -> FormattedName
+formatName name =
+ name
+ |> String.toLower
+ |> String.replace " " ""
diff --git a/frontend/src/Debate/Helpers.elm b/frontend/src/Debate/Helpers.elm
index c31d788..e8bc15d 100755
--- a/frontend/src/Debate/Helpers.elm
+++ b/frontend/src/Debate/Helpers.elm
@@ -125,7 +125,7 @@ reductioMaker argument =
, column [ E.width fill, E.alignLeft ]
[ paragraph
(paragraphFormat
- ++ [ F.size 18
+ ++ [ F.size 16
, spacing 3
]
)
diff --git a/frontend/src/Pages/Arguments.elm b/frontend/src/Pages/Arguments.elm
index 90dc09c..e2146a2 100755
--- a/frontend/src/Pages/Arguments.elm
+++ b/frontend/src/Pages/Arguments.elm
@@ -3,6 +3,7 @@ module Pages.Arguments exposing (Model, Msg, page)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Debate.Arguments.Abortion exposing (..)
import Debate.Arguments.Agnosticism exposing (..)
import Debate.Arguments.AgriculturalPredation exposing (..)
@@ -100,7 +101,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Contact.elm b/frontend/src/Pages/Contact.elm
index 6dfb59d..8e9601e 100755
--- a/frontend/src/Pages/Contact.elm
+++ b/frontend/src/Pages/Contact.elm
@@ -3,9 +3,15 @@ module Pages.Contact exposing (Model, Msg, page)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
+import Contact.Helpers exposing (..)
+import Contact.Methods.Discord exposing (contactDiscord)
+import Contact.Methods.Email exposing (contactEmail)
import Effect exposing (Effect)
import Element exposing (..)
import Element.Font as F
+import Headers.Helpers exposing (..)
+import Headers.Pages.Contact exposing (contactHeader)
import Html
import Html.Attributes as H exposing (style)
import Layouts
@@ -42,7 +48,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
@@ -91,13 +99,7 @@ contactContainer =
contactList : Element msg
contactList =
- none
-
-
-
--- column
--- pageList
--- <|
--- List.map contactMaker
--- [
--- ]
+ column pageList <|
+ List.concat
+ [ [ instructionMaker ]
+ ]
diff --git a/frontend/src/Pages/Cucklist.elm b/frontend/src/Pages/Cucklist.elm
index f7a3782..ad4c22f 100755
--- a/frontend/src/Pages/Cucklist.elm
+++ b/frontend/src/Pages/Cucklist.elm
@@ -3,6 +3,7 @@ module Pages.Cucklist exposing (Model, Msg, page)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Cuckery.CuckList.AdamSinger.AdamSinger exposing (cuckAdamSinger)
import Cuckery.CuckList.AmberOHearn.AmberOHearn exposing (cuckAmberOHearn)
import Cuckery.CuckList.AnnChilders.AnnChilders exposing (cuckAnnChilders)
@@ -111,7 +112,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Donate.elm b/frontend/src/Pages/Donate.elm
index 2054643..a8cf274 100755
--- a/frontend/src/Pages/Donate.elm
+++ b/frontend/src/Pages/Donate.elm
@@ -1,8 +1,10 @@
module Pages.Donate exposing (Model, Msg, page)
+import Browser.Dom as Dom
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Donate.Helpers exposing (..)
import Donate.Methods.Cardano exposing (donateCardano)
import Donate.Methods.KoFi exposing (donateKoFi)
@@ -24,6 +26,7 @@ import Layouts
import Page exposing (Page)
import Route exposing (Route)
import Shared exposing (..)
+import Task
import View exposing (View)
@@ -54,7 +57,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Home_.elm b/frontend/src/Pages/Home_.elm
index d9a314d..ea8b6f4 100755
--- a/frontend/src/Pages/Home_.elm
+++ b/frontend/src/Pages/Home_.elm
@@ -4,6 +4,7 @@ import Blog.Helpers exposing (..)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Effect exposing (Effect)
import Element exposing (..)
import Element.Font as F
@@ -42,7 +43,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Hyperblog.elm b/frontend/src/Pages/Hyperblog.elm
index 93e94b4..60136f9 100755
--- a/frontend/src/Pages/Hyperblog.elm
+++ b/frontend/src/Pages/Hyperblog.elm
@@ -15,7 +15,7 @@ import Page exposing (Page)
import Route exposing (Route)
import Shared exposing (..)
import View exposing (View)
-
+import Config.Viewport exposing (..)
page : Shared.Model -> Route () -> Page Model Msg
page shared route =
@@ -44,7 +44,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Interviews.elm b/frontend/src/Pages/Interviews.elm
index 2f6d8a1..67507cc 100755
--- a/frontend/src/Pages/Interviews.elm
+++ b/frontend/src/Pages/Interviews.elm
@@ -3,6 +3,7 @@ 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 Config.Viewport exposing (..)
import Effect exposing (Effect)
import Element exposing (..)
import Element.Border as D
@@ -56,7 +57,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Pages/Nutridex.elm b/frontend/src/Pages/Nutridex.elm
index 8c0a8ce..931cd3d 100755
--- a/frontend/src/Pages/Nutridex.elm
+++ b/frontend/src/Pages/Nutridex.elm
@@ -3,6 +3,7 @@ module Pages.Nutridex exposing (Model, Msg, page)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Donate.Types exposing (..)
import Effect exposing (Effect)
import Element as E exposing (..)
@@ -51,11 +52,12 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
-
-- UPDATE
diff --git a/frontend/src/Pages/Platforms.elm b/frontend/src/Pages/Platforms.elm
deleted file mode 100755
index b2cffda..0000000
--- a/frontend/src/Pages/Platforms.elm
+++ /dev/null
@@ -1,247 +0,0 @@
-module Pages.Platforms 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.Font as F
-import Html.Attributes as H exposing (style)
-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 = platformsName
- , attributes = []
- , element = platformsContainer
- }
-
-
-platformsContainer : Element msg
-platformsContainer =
- topLevelContainer platformsList
-
-
-platformsList : Element msg
-platformsList =
- column
- pageList
- platforms
-
-
-type alias MakeRowInput msg =
- { logoImage : String
- , logoDescription : String
- , platformsLink : String
- , platformsTitle : String
- , platformsParagraph1 : List (Element msg)
- , platformsParagraph2 : List (Element msg)
- , platformsRecommendedClients : List ClientEntry
- }
-
-
-type alias ClientEntry =
- { clientLink : String
- , clientLabel : String
- , clientText : String
- }
-
-
-type alias ClientType =
- { android : String
- , ios : String
- , desktop : String
- , multiPlatform : String
- , browser : String
- }
-
-
-makeRow : MakeRowInput msg -> Element msg
-makeRow makeRowInput =
- let
- recommendedClients : Element msg
- recommendedClients =
- el [ F.bold ] (text "Recommended Clients: ")
-
- platformImageFormat : List (Attribute msg)
- platformImageFormat =
- [ width <| px 150
- , alignTop
- ]
-
- clientRows : List (Element msg)
- clientRows =
- if List.isEmpty makeRowInput.platformsRecommendedClients then
- [ text "No recommended clients available. Please use your browser." ]
-
- else
- List.map
- (\client ->
- row []
- [ paragraphLinkFormat
- { url = client.clientLink
- , label = transitionHighlightedLinkHover <| text client.clientLabel
- }
- , text client.clientText
- ]
- )
- makeRowInput.platformsRecommendedClients
- in
- row [ spacing 20 ]
- [ image platformImageFormat
- { src = makeRowInput.logoImage
- , description = makeRowInput.logoDescription
- }
- , column [ width <| px 500, spacing 10 ]
- [ column []
- [ newTabLink highlightedTitleFormat
- { url = makeRowInput.platformsLink
- , label = text makeRowInput.platformsTitle
- }
- ]
- , column [ spacing 20 ]
- [ paragraph paragraphFormat makeRowInput.platformsParagraph1
- , paragraph paragraphFormat makeRowInput.platformsParagraph2
- , paragraph paragraphFormat
- (recommendedClients :: clientRows)
- ]
- ]
- ]
-
-
-platforms : List (Element msg)
-platforms =
- let
- clientType : ClientType
- clientType =
- { android = " (android) "
- , ios = " (iOS)"
- , desktop = " (desktop) "
- , multiPlatform = " (multi-platform)"
- , browser = " (browser only)"
- }
- in
- List.map makeRow
- [ { logoImage = "platforms/mastodon.png"
- , logoDescription = "mastodon logo"
- , platformsLink = "https://the-nutrivore.social/"
- , platformsTitle = "MASTODON"
- , platformsParagraph1 = [ text "Microblogging will now be posted to my own self-hosted Mastodon instance. I've kinda grown tired of microblogging on X, where political correctness and unclear ban policies force me to constantly self-censor. I considered and ultimately rejected several alternative platforms. Eventually, I realized the solution to this problem is to simply self-host my own space―somewhere where I can be myself and speak as I please. And I recently obtained the necessary infrastructure to do this." ]
- , platformsParagraph2 =
- [ text "This instance is 100% mine, and I can't be censored or fucked with there. I invite everyone who values my content and interactions to follow me on this new platform (whether you agree with my views or not). My instance is a \"single-user\" instances, meaning I'm the only user. But you can still follow me! Just make an account on another instance, like "
- , paragraphLinkFormat { url = "https://mastodon.social", label = text "Mastodon.social" }
- , text " (alternatively, you can select whatever instance you wish from the "
- , paragraphLinkFormat { url = "https://instances.social/", label = text "official index" }
- , text "), follow me, and turn on notifications."
- ]
- , platformsRecommendedClients =
- [ { clientLink = "https://github.com/LucasGGamerM/moshidon"
- , clientLabel = "Moshidon"
- , clientText = clientType.android
- }
- , { clientLink = "https://github.com/mastodon/mastodon-android"
- , clientLabel = "Official"
- , clientText = clientType.android
- }
- , { clientLink = "https://github.com/tuskyapp/Tusky"
- , clientLabel = "Tusky"
- , clientText = clientType.android
- }
- , { clientLink = "https://apps.apple.com/us/app/mastodon/id1571998974"
- , clientLabel = "Official"
- , clientText = clientType.ios
- }
- ]
- }
- , { logoImage = "platforms/peertube.png"
- , logoDescription = "peertube logo"
- , platformsLink = "https://video.the-nutrivore.social/"
- , platformsTitle = "PEERTUBE"
- , platformsParagraph1 = [ text "I'm transitioning my video content from YouTube to my self-hosted PeerTube instance, because I strongly believe in freedom of speech, copyleft, and digital autonomy. YouTube has proven unreliable due to both censorship and copyright strikes levied against my channel. This shift allows me to better control my content and avoid these silly pitfalls." ]
- , platformsParagraph2 = [ text "Full-length videos are now exclusively available on PeerTube, while YouTube will only host clips. By registering on PeerTube and subscribing to my channels, you'll have access to all content. Just be sure to enable email notifications to be alerted of new uploads. I believe that those who are truly fans of my work and want the best experience possible will see this as a positive change." ]
- , platformsRecommendedClients = []
- }
- , { logoImage = "platforms/discord.png"
- , logoDescription = "discord logo"
- , platformsLink = "https://discord.gg/eeYQ2wJknS"
- , platformsTitle = "DISCORD"
- , platformsParagraph1 = [ text "The Nutrivore Discord server is an evidence-based community dedicated to debunking pseudoscience, especially in the fields of nutrition, health and fitness. Casual discourse is welcome, and includes topics such as cooking, gaming, technology, and more. Current members span many disciplines and include both students and professionals, all levels of interest and expertise are welcome." ]
- , platformsParagraph2 = [ text "The Discord server is not explicitly a debate server. However, we strongly encourage that disagreements be resolved using debate (preferably verbal), as long as it is conducted respectfully and in good faith. Though we also firmly believe that shaming sophistry and bad faith behaviour is a net good overall. The Discord server is planned to be replaced with a Matrix server in future." ]
- , platformsRecommendedClients =
- [ { clientLink = "https://github.com/Vendicated/Vencord"
- , clientLabel = "Vencord"
- , clientText = clientType.desktop
- }
- , { clientLink = "https://discord.com/download"
- , clientLabel = "Official"
- , clientText = clientType.multiPlatform
- }
- ]
- }
- ]
diff --git a/frontend/src/Pages/Services.elm b/frontend/src/Pages/Services.elm
index c9e5202..fbbfa7e 100755
--- a/frontend/src/Pages/Services.elm
+++ b/frontend/src/Pages/Services.elm
@@ -3,6 +3,7 @@ module Pages.Services exposing (Model, Msg, page)
import Config.Colour as T exposing (..)
import Config.Format as O exposing (..)
import Config.Identity as I exposing (..)
+import Config.Viewport exposing (..)
import Effect exposing (Effect)
import Element exposing (..)
import Element.Font as F
@@ -49,7 +50,9 @@ type alias Model =
init : () -> ( Model, Effect Msg )
init () =
( {}
- , Effect.none
+ , Effect.map
+ (\_ -> NoOp)
+ (Effect.sendCmd resetViewport)
)
diff --git a/frontend/src/Products/Helpers.elm b/frontend/src/Products/Helpers.elm
index 43ae91a..32860df 100755
--- a/frontend/src/Products/Helpers.elm
+++ b/frontend/src/Products/Helpers.elm
@@ -59,7 +59,7 @@ nutriDexMaker nutridex =
}
]
)
- [ text nutridex.nutriDexTitle ]
+ [ text (String.toUpper nutridex.nutriDexTitle) ]
, cardFormatter
[ cardContentSpacing
[ column
diff --git a/frontend/static/arguments/immortality.png b/frontend/static/arguments/immortality.png
new file mode 100755
index 0000000..99506b6
Binary files /dev/null and b/frontend/static/arguments/immortality.png differ
diff --git a/frontend/static/arguments/mda.png b/frontend/static/arguments/mda.png
new file mode 100755
index 0000000..19bb44a
Binary files /dev/null and b/frontend/static/arguments/mda.png differ
diff --git a/frontend/static/contact/discord.png b/frontend/static/contact/discord.png
new file mode 100644
index 0000000..f731098
Binary files /dev/null and b/frontend/static/contact/discord.png differ
diff --git a/frontend/static/contact/email.png b/frontend/static/contact/email.png
new file mode 100644
index 0000000..101e893
Binary files /dev/null and b/frontend/static/contact/email.png differ
diff --git a/frontend/static/navbar/cucklist.png b/frontend/static/navbar/cucklist.png
old mode 100644
new mode 100755
diff --git a/frontend/static/navbar/cucklist2.png b/frontend/static/navbar/cucklist2.png
old mode 100644
new mode 100755
diff --git a/frontend/static/navbar/upRootNutrition1.ps b/frontend/static/navbar/upRootNutrition1.ps
new file mode 100644
index 0000000..6b02df4
--- /dev/null
+++ b/frontend/static/navbar/upRootNutrition1.ps
@@ -0,0 +1,3340 @@
+%PDF-1.5
%
+1 0 obj
<>/OCGs[32 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
+
+
+
+
+ application/pdf
+
+
+ upRootNutrition1
+
+
+ 2024-12-02T18:04:09+05:00
+ 2024-12-02T18:04:09+05:00
+ 2024-12-02T18:04:09+06:00
+ Adobe Illustrator 28.0 (Windows)
+
+
+
+ 256
+ 44
+ JPEG
+ /9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA
AQEsAAAAAQAB/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJ
AAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAz
ZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwA
AAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAA
A9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RS
QwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1Q
YWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS
c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAA
AAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNj
AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p
ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA
AAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAA
AAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp
biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDP
FAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAA
AAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMA
KAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCy
ALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIB
WQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4
AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oD
ZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT
BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowG
nQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiq
CL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsL
Igs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e
DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPUR
ExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSL
FK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUY
ihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzM
HPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUh
oSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3
JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDks
biyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj
Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5
BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/i
QCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVH
e0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9J
T5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX
4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2Cq
YPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFq
SGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQU
dHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+
wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZ
if6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSV
X5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFH
obaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1Erbiu
La6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsu
u6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJ
Osm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc
1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3m
lucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe
9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///+4ADkFkb2JlAGTAAAAAAf/bAIQA
BgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8f
Hx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f
Hx8fHx8fHx8fHx8fHx8f/8AAEQgALAEAAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQF
AwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMB
AgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdU
ZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eX
p7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUE
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
irsVdirsVdirsVdirsVf/9k=
+
+
+
+ uuid:284acf14-21d5-467c-a4cc-7ff053b61871
+ xmp.did:1e6b69a4-aca4-4f44-967f-03e801d35322
+ uuid:5D20892493BFDB11914A8590D31508C8
+ proof:pdf
+
+ uuid:593c3f81-b59f-4ed4-a601-11f9441e4f46
+ xmp.did:4a10e5c1-906a-0d4e-96e5-2652a54bc3b3
+ uuid:5D20892493BFDB11914A8590D31508C8
+ default
+
+
+
+
+ saved
+ xmp.iid:193f220b-bc15-064d-b07e-aad815753e3a
+ 2024-12-02T17:59:50+05:00
+ Adobe Illustrator 28.0 (Windows)
+ /
+
+
+ saved
+ xmp.iid:1e6b69a4-aca4-4f44-967f-03e801d35322
+ 2024-12-02T18:01:31+05:00
+ Adobe Illustrator 28.0 (Windows)
+ /
+
+
+
+ Document
+ Print
+ AIRobin
+ False
+ True
+ 1
+
+ 1280.000000
+ 769.000000
+ Pixels
+
+
+
+ Cyan
+ Magenta
+ Yellow
+ Black
+
+
+
+
+
+ Default Swatch Group
+ 0
+
+
+
+ White
+ RGB
+ PROCESS
+ 255
+ 255
+ 255
+
+
+ Black
+ RGB
+ PROCESS
+ 35
+ 31
+ 32
+
+
+ CMYK Red
+ RGB
+ PROCESS
+ 237
+ 28
+ 36
+
+
+ CMYK Yellow
+ RGB
+ PROCESS
+ 255
+ 242
+ 0
+
+
+ CMYK Green
+ RGB
+ PROCESS
+ 0
+ 166
+ 81
+
+
+ CMYK Cyan
+ RGB
+ PROCESS
+ 0
+ 174
+ 239
+
+
+ CMYK Blue
+ RGB
+ PROCESS
+ 46
+ 49
+ 146
+
+
+ CMYK Magenta
+ RGB
+ PROCESS
+ 236
+ 0
+ 140
+
+
+ C=15 M=100 Y=90 K=10
+ RGB
+ PROCESS
+ 190
+ 30
+ 45
+
+
+ C=0 M=90 Y=85 K=0
+ RGB
+ PROCESS
+ 239
+ 65
+ 54
+
+
+ C=0 M=80 Y=95 K=0
+ RGB
+ PROCESS
+ 241
+ 90
+ 41
+
+
+ C=0 M=50 Y=100 K=0
+ RGB
+ PROCESS
+ 247
+ 148
+ 29
+
+
+ C=0 M=35 Y=85 K=0
+ RGB
+ PROCESS
+ 251
+ 176
+ 64
+
+
+ C=5 M=0 Y=90 K=0
+ RGB
+ PROCESS
+ 249
+ 237
+ 50
+
+
+ C=20 M=0 Y=100 K=0
+ RGB
+ PROCESS
+ 215
+ 223
+ 35
+
+
+ C=50 M=0 Y=100 K=0
+ RGB
+ PROCESS
+ 141
+ 198
+ 63
+
+
+ C=75 M=0 Y=100 K=0
+ RGB
+ PROCESS
+ 57
+ 181
+ 74
+
+
+ C=85 M=10 Y=100 K=10
+ RGB
+ PROCESS
+ 0
+ 148
+ 68
+
+
+ C=90 M=30 Y=95 K=30
+ RGB
+ PROCESS
+ 0
+ 104
+ 56
+
+
+ C=75 M=0 Y=75 K=0
+ RGB
+ PROCESS
+ 43
+ 182
+ 115
+
+
+ C=80 M=10 Y=45 K=0
+ RGB
+ PROCESS
+ 0
+ 167
+ 157
+
+
+ C=70 M=15 Y=0 K=0
+ RGB
+ PROCESS
+ 39
+ 170
+ 225
+
+
+ C=85 M=50 Y=0 K=0
+ RGB
+ PROCESS
+ 28
+ 117
+ 188
+
+
+ C=100 M=95 Y=5 K=0
+ RGB
+ PROCESS
+ 43
+ 57
+ 144
+
+
+ C=100 M=100 Y=25 K=25
+ RGB
+ PROCESS
+ 38
+ 34
+ 98
+
+
+ C=75 M=100 Y=0 K=0
+ RGB
+ PROCESS
+ 102
+ 45
+ 145
+
+
+ C=50 M=100 Y=0 K=0
+ RGB
+ PROCESS
+ 146
+ 39
+ 143
+
+
+ C=35 M=100 Y=35 K=10
+ RGB
+ PROCESS
+ 158
+ 31
+ 99
+
+
+ C=10 M=100 Y=50 K=0
+ RGB
+ PROCESS
+ 218
+ 28
+ 92
+
+
+ C=0 M=95 Y=20 K=0
+ RGB
+ PROCESS
+ 238
+ 42
+ 123
+
+
+ C=25 M=25 Y=40 K=0
+ RGB
+ PROCESS
+ 194
+ 181
+ 155
+
+
+ C=40 M=45 Y=50 K=5
+ RGB
+ PROCESS
+ 155
+ 133
+ 121
+
+
+ C=50 M=50 Y=60 K=25
+ RGB
+ PROCESS
+ 114
+ 102
+ 88
+
+
+ C=55 M=60 Y=65 K=40
+ RGB
+ PROCESS
+ 89
+ 74
+ 66
+
+
+ C=25 M=40 Y=65 K=0
+ RGB
+ PROCESS
+ 196
+ 154
+ 108
+
+
+ C=30 M=50 Y=75 K=10
+ RGB
+ PROCESS
+ 169
+ 124
+ 80
+
+
+ C=35 M=60 Y=80 K=25
+ RGB
+ PROCESS
+ 139
+ 94
+ 60
+
+
+ C=40 M=65 Y=90 K=35
+ RGB
+ PROCESS
+ 117
+ 76
+ 41
+
+
+ C=40 M=70 Y=100 K=50
+ RGB
+ PROCESS
+ 96
+ 57
+ 19
+
+
+ C=50 M=70 Y=80 K=70
+ RGB
+ PROCESS
+ 60
+ 36
+ 21
+
+
+
+
+
+ Grays
+ 1
+
+
+
+ C=0 M=0 Y=0 K=100
+ RGB
+ PROCESS
+ 35
+ 31
+ 32
+
+
+ C=0 M=0 Y=0 K=90
+ RGB
+ PROCESS
+ 65
+ 64
+ 66
+
+
+ C=0 M=0 Y=0 K=80
+ RGB
+ PROCESS
+ 88
+ 89
+ 91
+
+
+ C=0 M=0 Y=0 K=70
+ RGB
+ PROCESS
+ 109
+ 110
+ 113
+
+
+ C=0 M=0 Y=0 K=60
+ RGB
+ PROCESS
+ 128
+ 130
+ 133
+
+
+ C=0 M=0 Y=0 K=50
+ RGB
+ PROCESS
+ 147
+ 149
+ 152
+
+
+ C=0 M=0 Y=0 K=40
+ RGB
+ PROCESS
+ 167
+ 169
+ 172
+
+
+ C=0 M=0 Y=0 K=30
+ RGB
+ PROCESS
+ 188
+ 190
+ 192
+
+
+ C=0 M=0 Y=0 K=20
+ RGB
+ PROCESS
+ 209
+ 211
+ 212
+
+
+ C=0 M=0 Y=0 K=10
+ RGB
+ PROCESS
+ 230
+ 231
+ 232
+
+
+ C=0 M=0 Y=0 K=5
+ RGB
+ PROCESS
+ 241
+ 242
+ 242
+
+
+
+
+
+ Brights
+ 1
+
+
+
+ C=0 M=100 Y=100 K=0
+ RGB
+ PROCESS
+ 237
+ 28
+ 36
+
+
+ C=0 M=75 Y=100 K=0
+ RGB
+ PROCESS
+ 242
+ 101
+ 34
+
+
+ C=0 M=10 Y=95 K=0
+ RGB
+ PROCESS
+ 255
+ 222
+ 23
+
+
+ C=85 M=10 Y=100 K=0
+ RGB
+ PROCESS
+ 0
+ 161
+ 75
+
+
+ C=100 M=90 Y=0 K=0
+ RGB
+ PROCESS
+ 33
+ 64
+ 154
+
+
+ C=60 M=90 Y=0 K=0
+ RGB
+ PROCESS
+ 127
+ 63
+ 152
+
+
+
+
+
+
+ Adobe PDF library 17.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+endstream
endobj
3 0 obj
<>
endobj
5 0 obj
<>/ExtGState<>/Properties<>/Shading<>>>/TrimBox[0.0 0.0 1280.0 769.0]/Type/Page/PieceInfo<>>>
endobj
31 0 obj
<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 1280.0 769.0]/Type/Page/PieceInfo<>>>
endobj
34 0 obj
<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 1280.0 769.0]/Type/Page/PieceInfo<>>>
endobj
43 0 obj
<>stream
+HWI$+}j$z@M/ճCx.p73w!##~wGu7_>>~>/8 ֑K)|W?>RxZ9g#8GXC8Wh%3ŰQC?L9T1Bր.ӆ;;f>hRfO_s0ׇylۆ.atzW