diff --git a/templates/elm/frontend/.gitignore b/templates/elm/frontend/.gitignore new file mode 100644 index 0000000..7295c4f --- /dev/null +++ b/templates/elm/frontend/.gitignore @@ -0,0 +1,7 @@ +/dist +/.elm-land +/.env +/elm-stuff +/node_modules +.DS_Store +*.pem \ No newline at end of file diff --git a/templates/elm/frontend/README.md b/templates/elm/frontend/README.md new file mode 100644 index 0000000..cca2e01 --- /dev/null +++ b/templates/elm/frontend/README.md @@ -0,0 +1,16 @@ +# frontend +> Built with [Elm Land](https://elm.land) 🌈 + +## Local development + +```bash +# Requires Node.js v18+ (https://nodejs.org) +npx elm-land server +``` + +## Deploying to production + +Elm Land projects are most commonly deployed as static websites. + +Please visit [the "Deployment" guide](https://elm.land/guide/deploying) to learn more +about deploying your app for free using Netlify or Vercel. \ No newline at end of file diff --git a/templates/elm/frontend/elm-land.json b/templates/elm/frontend/elm-land.json new file mode 100644 index 0000000..cb66d5a --- /dev/null +++ b/templates/elm/frontend/elm-land.json @@ -0,0 +1,26 @@ +{ + "app": { + "elm": { + "development": { "debugger": true }, + "production": { "debugger": false } + }, + "env": [], + "html": { + "attributes": { + "html": { "lang": "en" }, + "head": {} + }, + "title": "Elm Land", + "meta": [ + { "charset": "UTF-8" }, + { "http-equiv": "X-UA-Compatible", "content": "IE=edge" }, + { "name": "viewport", "content": "width=device-width, initial-scale=1.0" } + ], + "link": [], + "script": [] + }, + "router": { + "useHashRouting": false + } + } +} \ No newline at end of file diff --git a/templates/elm/frontend/elm.json b/templates/elm/frontend/elm.json new file mode 100644 index 0000000..e17888d --- /dev/null +++ b/templates/elm/frontend/elm.json @@ -0,0 +1,53 @@ +{ + "type": "application", + "source-directories": [ + "src", + ".elm-land/src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "dillonkearns/elm-markdown": "7.0.1", + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.0", + "elm/json": "1.1.3", + "elm/svg": "1.0.1", + "elm/url": "1.0.0", + "elm-community/list-extra": "8.7.0", + "elm-community/maybe-extra": "5.3.0", + "gampleman/elm-visualization": "2.4.2", + "hecrj/html-parser": "2.4.0", + "mdgriffith/elm-ui": "1.1.8" + }, + "indirect": { + "avh4/elm-color": "1.0.0", + "elm/parser": "1.1.0", + "elm/random": "1.0.0", + "elm/regex": "1.0.0", + "elm/time": "1.0.0", + "elm/virtual-dom": "1.0.3", + "elmcraft/core-extra": "2.2.0", + "folkertdev/elm-deque": "3.0.1", + "folkertdev/one-true-path-experiment": "6.0.1", + "folkertdev/svg-path-lowlevel": "4.0.1", + "gampleman/elm-rosetree": "1.1.0", + "ianmackenzie/elm-1d-parameter": "1.0.1", + "ianmackenzie/elm-float-extra": "1.1.0", + "ianmackenzie/elm-geometry": "3.11.0", + "ianmackenzie/elm-interval": "3.1.0", + "ianmackenzie/elm-triangular-mesh": "1.1.0", + "ianmackenzie/elm-units": "2.10.0", + "ianmackenzie/elm-units-interval": "3.2.0", + "ianmackenzie/elm-units-prefixed": "2.8.0", + "justinmimbs/date": "4.1.0", + "justinmimbs/time-extra": "1.2.0", + "rtfeldman/elm-hex": "1.0.0", + "ryan-haskell/date-format": "1.0.0" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/templates/elm/frontend/src/Config/Helpers/Response.elm b/templates/elm/frontend/src/Config/Helpers/Response.elm new file mode 100755 index 0000000..647993a --- /dev/null +++ b/templates/elm/frontend/src/Config/Helpers/Response.elm @@ -0,0 +1,94 @@ +module Config.Helpers.Response exposing + ( contentContainer + , pageList + , pageListCenter + , pageListFormat + , topLevelContainer + ) + +import Config.Style.Colour.Helpers exposing (colourTheme) +import Element as E + exposing + ( Attribute + , Device + , DeviceClass(..) + , Element + , Orientation(..) + , alignTop + , centerX + , centerY + , el + , fill + , height + , maximum + , minimum + , padding + , paddingXY + , scrollbarY + , spacing + , width + ) +import Element.Background as B exposing (color) +import Html.Attributes exposing (style) + + +topLevelContainer : Element msg -> Element msg +topLevelContainer = + el + [ width fill + , height fill + , B.color colourTheme.backgroundLightGrey + ] + + +pageListCenter : Device -> List (Attribute msg) +pageListCenter device = + [ centerY + ] + ++ pageListFormat device + + +pageList : Device -> List (Attribute msg) +pageList device = + [ alignTop + ] + ++ pageListFormat device + + +pageListFormat : Device -> List (Attribute msg) +pageListFormat device = + let + pageListAttr = + [ centerX + , width fill + , height fill + , scrollbarY + ] + in + pageListAttr + ++ (case ( device.class, device.orientation ) of + ( Phone, Portrait ) -> + [ spacing 0 + , paddingXY 10 30 + ] + + ( Tablet, Portrait ) -> + [ spacing 0 + , paddingXY 10 30 + ] + + _ -> + [ spacing 20 + , paddingXY 30 30 + ] + ) + + +contentContainer : Element msg -> Element msg +contentContainer = + el + [ width (fill |> minimum 100) + , width (fill |> maximum 875) + , padding 10 + , centerX + ] diff --git a/templates/elm/frontend/src/Config/Helpers/Viewport.elm b/templates/elm/frontend/src/Config/Helpers/Viewport.elm new file mode 100755 index 0000000..0d9d44f --- /dev/null +++ b/templates/elm/frontend/src/Config/Helpers/Viewport.elm @@ -0,0 +1,16 @@ +module Config.Helpers.Viewport exposing + ( Msg + , resetViewport + ) + +import Browser.Dom as Dom exposing (setViewport) +import Task exposing (attempt) + + +type Msg + = NoOp + + +resetViewport : Cmd Msg +resetViewport = + Task.attempt (\_ -> NoOp) (Dom.setViewportOf "scroll-container" 0 0) diff --git a/templates/elm/frontend/src/Config/Style/Colour/Helpers.elm b/templates/elm/frontend/src/Config/Style/Colour/Helpers.elm new file mode 100755 index 0000000..f87604d --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Colour/Helpers.elm @@ -0,0 +1,118 @@ +module Config.Style.Colour.Helpers exposing + ( ThemeColor(..) + , colourTheme + , getThemeColor + , syntaxTheme + ) + +import Config.Style.Colour.Types + exposing + ( SyntaxColors + , Theme + ) +import Element as E + exposing + ( Color + , rgb255 + , rgba + ) +import Element.Font as F exposing (color) + + +colourTheme : Theme +colourTheme = + { textLightGrey = rgb255 212 212 212 + , textDarkGrey = rgb255 126 126 126 + , textLightOrange = rgb255 204 102 0 + , textDarkOrange = rgb255 120 60 0 + , textDeepDarkOrange = rgb255 60 30 0 + , backgroundLightGrey = rgb255 40 40 40 + , backgroundDarkGrey = rgb255 30 30 30 + , backgroundDeepDarkGrey = rgb255 20 20 20 + , backgroundSpreadsheet = rgb255 36 36 36 + , backgroundSpreadsheetDark = rgb255 26 26 26 + , shadow = rgb255 10 10 10 + , barGreen = rgb255 0 102 0 + , barRed = rgb255 102 0 0 + , debugColour = rgb255 227 28 121 + , transparent = rgba 1 1 1 0 + } + + +syntaxTheme : SyntaxColors +syntaxTheme = + { punctuation = rgb255 202 158 230 + , key = rgb255 138 173 244 + , string = rgb255 166 218 149 + , keyword = rgb255 245 169 127 + , operator = rgb255 178 185 194 + , background = rgb255 36 39 58 + , text = rgb255 202 211 245 + } + + +type ThemeColor + = TextLightGrey + | TextDarkGrey + | TextLightOrange + | TextDarkOrange + | TextDeepDarkOrange + | BackgroundLightGrey + | BackgroundDarkGrey + | BackgroundDeepDarkGrey + | BackgroundSpreadsheet + | BackgroundSpreadsheetDark + | Shadow + | BarGreen + | BarRed + | DebugColour + | Transparent + + +getThemeColor : ThemeColor -> Color +getThemeColor color = + case color of + TextLightGrey -> + colourTheme.textLightGrey + + TextDarkGrey -> + colourTheme.textDarkGrey + + TextLightOrange -> + colourTheme.textLightOrange + + TextDarkOrange -> + colourTheme.textDarkOrange + + TextDeepDarkOrange -> + colourTheme.textDeepDarkOrange + + BackgroundLightGrey -> + colourTheme.backgroundLightGrey + + BackgroundDarkGrey -> + colourTheme.backgroundDarkGrey + + BackgroundDeepDarkGrey -> + colourTheme.backgroundDeepDarkGrey + + BackgroundSpreadsheet -> + colourTheme.backgroundSpreadsheet + + BackgroundSpreadsheetDark -> + colourTheme.backgroundSpreadsheetDark + + Shadow -> + colourTheme.shadow + + BarGreen -> + colourTheme.barGreen + + BarRed -> + colourTheme.barRed + + DebugColour -> + colourTheme.debugColour + + Transparent -> + colourTheme.transparent diff --git a/templates/elm/frontend/src/Config/Style/Colour/Types.elm b/templates/elm/frontend/src/Config/Style/Colour/Types.elm new file mode 100755 index 0000000..dc316ce --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Colour/Types.elm @@ -0,0 +1,36 @@ +module Config.Style.Colour.Types exposing + ( SyntaxColors + , Theme + ) + +import Element exposing (Color) + + +type alias Theme = + { textLightGrey : Color + , textDarkGrey : Color + , textLightOrange : Color + , textDarkOrange : Color + , textDeepDarkOrange : Color + , backgroundLightGrey : Color + , backgroundDarkGrey : Color + , backgroundDeepDarkGrey : Color + , backgroundSpreadsheet : Color + , backgroundSpreadsheetDark : Color + , shadow : Color + , barGreen : Color + , barRed : Color + , debugColour : Color + , transparent : Color + } + + +type alias SyntaxColors = + { punctuation : Color + , key : Color + , string : Color + , keyword : Color + , operator : Color + , background : Color + , text : Color + } diff --git a/templates/elm/frontend/src/Config/Style/Fonts.elm b/templates/elm/frontend/src/Config/Style/Fonts.elm new file mode 100755 index 0000000..ffe9d4f --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Fonts.elm @@ -0,0 +1,50 @@ +module Config.Style.Fonts exposing + ( defaultFontSize + , headerFontSizeBig + , headerFontSizeMedium + , paragraphSpacing + , smallTextFontSize + , spartanFont + ) + +import Element + exposing + ( Attr + , Attribute + , spacing + ) +import Element.Font as F + exposing + ( size + , typeface + ) + + +spartanFont : F.Font +spartanFont = + F.typeface "League Spartan" + + +paragraphSpacing : Attribute msg +paragraphSpacing = + spacing 0 + + +headerFontSizeBig : Attr decorative msg +headerFontSizeBig = + F.size 23 + + +headerFontSizeMedium : Attr decorative msg +headerFontSizeMedium = + F.size 20 + + +defaultFontSize : Attr decorative msg +defaultFontSize = + F.size 18 + + +smallTextFontSize : Attr decorative msg +smallTextFontSize = + F.size 16 diff --git a/templates/elm/frontend/src/Config/Style/Glow.elm b/templates/elm/frontend/src/Config/Style/Glow.elm new file mode 100755 index 0000000..0a5a809 --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Glow.elm @@ -0,0 +1,24 @@ +module Config.Style.Glow exposing + ( glowDeepDarkGrey + , glowDeepDarkGreyNavbar + , glowDeepDarkOrange + ) + +import Config.Style.Colour.Helpers exposing (ThemeColor(..), colourTheme, getThemeColor) +import Element exposing (Attr) +import Element.Border as D exposing (glow) + + +glowDeepDarkGrey : Attr decorative msg +glowDeepDarkGrey = + D.glow (getThemeColor Shadow) 4 + + +glowDeepDarkOrange : Attr decorative msg +glowDeepDarkOrange = + D.glow (getThemeColor TextDeepDarkOrange) 4 + + +glowDeepDarkGreyNavbar : Attr decorative msg +glowDeepDarkGreyNavbar = + D.glow (getThemeColor Shadow) 10 diff --git a/templates/elm/frontend/src/Config/Style/Icons/Helpers.elm b/templates/elm/frontend/src/Config/Style/Icons/Helpers.elm new file mode 100755 index 0000000..b6ebcef --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Icons/Helpers.elm @@ -0,0 +1,32 @@ +module Config.Style.Icons.Helpers exposing (buildSvg) + +import Config.Style.Icons.Types as SvgTypes + exposing + ( InnerPart + , OuterPart + ) +import Element as E + exposing + ( Element + , el + , html + ) +import Svg exposing (svg) + + + +{- buildSvg consumes an inner record to construct most of an SVG, and an outer record to supply + any potentially varying TypedSvg.Core.Attribute msgs and wrap it in an Element.el so it can be + used by elm-ui. It provides a consistent interface for inserting SVGs into elm-ui code. +-} + + +buildSvg : SvgTypes.OuterPart msg -> SvgTypes.InnerPart msg -> Element msg +buildSvg outer inner = + el + outer.elementAttributes + <| + html <| + Svg.svg + (outer.svgAttributes ++ inner.svgAttributes) + inner.svg diff --git a/templates/elm/frontend/src/Config/Style/Icons/Icons.elm b/templates/elm/frontend/src/Config/Style/Icons/Icons.elm new file mode 100755 index 0000000..e7b99c8 --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Icons/Icons.elm @@ -0,0 +1,1038 @@ +module Config.Style.Icons.Icons exposing + ( circleDots + , circleX + , code + , construction + , contact + , copyLink + , debate + , discord + , donate + , gitlab + , home + , hyperBlog + , interviews + , leaving + , line + , lock + , mastodon + , nutriDex + , nutriDexLogo + , services + , source + , thumbsDown + , thumbsUp + , twitter + , upRootLarge + , upRootMedium + , upRootSmall + , video + ) + +import Config.Style.Icons.Helpers as HeSvg exposing (buildSvg) +import Config.Style.Icons.Types as SvgTypes + exposing + ( InnerPart + , OuterPart + ) +import Element as E exposing (Element) +import Html exposing (Html) +import Svg + exposing + ( path + , svg + ) +import Svg.Attributes as SvgAttr + + +upRootSmall : Html msg +upRootSmall = + svg + [ SvgAttr.width "100%" + , SvgAttr.height "100%" + , SvgAttr.viewBox "0 0 286 203" + , SvgAttr.version "1.1" + , SvgAttr.xmlSpace "preserve" + , SvgAttr.style "fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,-1702.49,-2847.36)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,1072.22,2290.29)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,373.077,489.488)" + ] + [ path + [ SvgAttr.d "M410,379.833C410,379.833 410.056,260.455 410.09,188.088C410.095,176.87 404.503,163.127 395.402,151.992C386.302,140.858 375.063,134.008 365.884,134.002C358.352,133.997 351.428,133.992 346.641,133.989C345.213,133.988 343.47,132.952 342.03,131.25C340.591,129.547 339.658,127.419 339.564,125.619C338.962,114.141 337.955,94.916 337.955,94.916L397.955,94.916C397.955,94.916 537.356,266.295 570.787,307.394C575.207,312.828 580.681,316.175 585.149,316.175C597.174,316.175 620,316.175 620,316.175L620,379.833L560.605,379.833C553.617,379.833 545.056,374.614 538.129,366.13C524.324,349.222 491.306,308.782 480.375,295.394C476.268,290.363 471.189,287.278 467.055,287.302C462.921,287.326 460.361,290.456 460.34,295.511C460.211,327.614 460,379.833 460,379.833L410,379.833Z" + , SvgAttr.style "fill:rgb(212,212,212);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,345.028,514.865)" + ] + [ path + [ SvgAttr.d "M600,253.872C600,256.824 598.525,258.666 596.128,258.709C593.731,258.751 590.774,256.987 588.364,254.078C577.294,240.715 561.273,221.376 553.937,212.52C551.503,209.583 550,205.927 550,202.947C550,184.124 550,116.624 550,116.624L600,116.624L600,253.872Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.70645,0,-0.149774,1.77773,-440.616,-481.127)" + ] + [ path + [ SvgAttr.d "M781.333,624.54L849.897,624.185L836.011,584L781.333,624.54Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + ] + ] + ] + + +upRootMedium : Html msg +upRootMedium = + svg + [ SvgAttr.width "100%" + , SvgAttr.height "100%" + , SvgAttr.viewBox "0 0 718 236" + , SvgAttr.version "1.1" + , SvgAttr.xmlSpace "preserve" + , SvgAttr.style "fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,-945.584,-3365.22)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,744.72,2810.42)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,338.58,489.488)" + ] + [ path + [ SvgAttr.d "M372.344,360.399C372.693,355.91 371.866,349.371 368.149,340.13C364.701,331.561 359.604,323.609 353.731,317.061L310.917,264.032C300.938,251.338 287.91,242.703 276.931,242.703C265.89,242.703 259.803,251.436 260.112,264.249L260.074,290L260,290L260,317.487C259.859,319.273 259.857,321.16 260,323.133L260,380L209.998,380.001L209.998,178.068C209.998,166.904 215.643,160 224.772,159.998L406.092,159.962C409.529,159.961 413.739,162.524 417.149,166.694C420.559,170.863 422.656,176.011 422.656,180.214L422.656,213.468C422.656,219.626 420.947,224.62 417.745,227.822L379.172,266.395C377.289,268.278 376.609,271.556 377.281,275.51C377.953,279.463 379.922,283.767 382.755,287.474L413.545,327.767C419.235,335.214 422.656,344.061 422.656,351.333L422.656,422.862L366.923,422.869L371.072,375.058L372.305,360.848C372.319,360.699 372.332,360.55 372.344,360.399ZM360.277,196.701L314.978,197.291C311.426,197.337 309.303,200.157 309.462,204.615C309.622,209.073 312.038,214.436 315.738,218.543L329.196,233.485C333.595,238.369 338.865,240.179 341.813,237.82L370.371,214.965C372.613,213.171 372.463,208.69 370.012,204.255C367.56,199.819 363.488,196.659 360.277,196.701Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,25.2846,-499.837)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,2.10134,-540.366)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,-21.0054,-499.837)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,746.985,2808.15)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,373.077,489.488)" + ] + [ path + [ SvgAttr.d "M410,379.833C410,379.833 410.056,260.455 410.09,188.088C410.095,176.87 404.503,163.127 395.402,151.992C386.302,140.858 375.063,134.008 365.884,134.002C358.352,133.997 351.428,133.992 346.641,133.989C345.213,133.988 343.47,132.952 342.03,131.25C340.591,129.547 339.658,127.419 339.564,125.619C338.962,114.141 337.955,94.916 337.955,94.916L397.955,94.916C397.955,94.916 537.356,266.295 570.787,307.394C575.207,312.828 580.681,316.175 585.149,316.175C597.174,316.175 620,316.175 620,316.175L620,379.833L560.605,379.833C553.617,379.833 545.056,374.614 538.129,366.13C524.324,349.222 491.306,308.782 480.375,295.394C476.268,290.363 471.189,287.278 467.055,287.302C462.921,287.326 460.361,290.456 460.34,295.511C460.211,327.614 460,379.833 460,379.833L410,379.833Z" + , SvgAttr.style "fill:rgb(212,212,212);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,345.028,514.865)" + ] + [ path + [ SvgAttr.d "M600,253.872C600,256.824 598.525,258.666 596.128,258.709C593.731,258.751 590.774,256.987 588.364,254.078C577.294,240.715 561.273,221.376 553.937,212.52C551.503,209.583 550,205.927 550,202.947C550,184.124 550,116.624 550,116.624L600,116.624L600,253.872Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.70645,0,-0.149774,1.77773,-440.616,-481.127)" + ] + [ path + [ SvgAttr.d "M781.333,624.54L849.897,624.185L836.011,584L781.333,624.54Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,1092.58,3267.29)" + ] + [ path + [ SvgAttr.d "M128.358,409.275C128.368,417.539 124.19,422.646 117.431,422.632C95.856,422.586 49.907,422.489 49.907,422.489C40.439,422.47 28.16,415.401 18.78,403.921C9.4,392.44 4.327,378.273 4.326,366.706L4.323,260.755L74.344,260.755L74.37,336.128L134.449,336.195C144.333,336.206 150.426,328.705 150.373,316.592L150.031,260.746L200.055,260.862L200.446,422.931C200.446,422.931 176.719,422.875 162.366,422.84C160.154,422.835 157.446,421.179 155.258,418.492C153.07,415.805 151.732,412.494 151.745,409.8C151.808,397.197 151.895,379.981 151.895,379.981C151.895,379.981 145.967,379.997 140.056,380.013C132.805,380.032 128.329,385.536 128.34,394.419C128.346,399.221 128.352,404.551 128.358,409.275Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + ] + ] + + +upRootLarge : Html msg +upRootLarge = + svg + [ SvgAttr.width "100%" + , SvgAttr.height "100%" + , SvgAttr.viewBox "0 0 2093 261" + , SvgAttr.version "1.1" + , SvgAttr.xmlSpace "preserve" + , SvgAttr.style "fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,-1020.41,-1366.12)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,1358.72,809.046)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,373.077,489.488)" + ] + [ path + [ SvgAttr.d "M410,379.833C410,379.833 410.056,260.455 410.09,188.088C410.095,176.87 404.503,163.127 395.402,151.992C386.302,140.858 375.063,134.008 365.884,134.002C358.352,133.997 351.428,133.992 346.641,133.989C345.213,133.988 343.47,132.952 342.03,131.25C340.591,129.547 339.658,127.419 339.564,125.619C338.962,114.141 337.955,94.916 337.955,94.916L397.955,94.916C397.955,94.916 537.356,266.295 570.787,307.394C575.207,312.828 580.681,316.175 585.149,316.175C597.174,316.175 620,316.175 620,316.175L620,379.833L560.605,379.833C553.617,379.833 545.056,374.614 538.129,366.13C524.324,349.222 491.306,308.782 480.375,295.394C476.268,290.363 471.189,287.278 467.055,287.302C462.921,287.326 460.361,290.456 460.34,295.511C460.211,327.614 460,379.833 460,379.833L410,379.833Z" + , SvgAttr.style "fill:rgb(212,212,212);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,345.028,514.865)" + ] + [ path + [ SvgAttr.d "M600,253.872C600,256.824 598.525,258.666 596.128,258.709C593.731,258.751 590.774,256.987 588.364,254.078C577.294,240.715 561.273,221.376 553.937,212.52C551.503,209.583 550,205.927 550,202.947C550,184.124 550,116.624 550,116.624L600,116.624L600,253.872Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.70645,0,-0.149774,1.77773,-440.616,-481.127)" + ] + [ path + [ SvgAttr.d "M781.333,624.54L849.897,624.185L836.011,584L781.333,624.54Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,975.131,809.281)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,338.58,489.488)" + ] + [ path + [ SvgAttr.d "M372.344,360.399C372.693,355.91 371.866,349.371 368.149,340.13C364.701,331.561 359.604,323.609 353.731,317.061L310.917,264.032C300.938,251.338 287.91,242.703 276.931,242.703C265.89,242.703 259.803,251.436 260.112,264.249L260.074,290L260,290L260,317.487C259.859,319.273 259.857,321.16 260,323.133L260,380L209.998,380.001L209.998,178.068C209.998,166.904 215.643,160 224.772,159.998L406.092,159.962C409.529,159.961 413.739,162.524 417.149,166.694C420.559,170.863 422.656,176.011 422.656,180.214L422.656,213.468C422.656,219.626 420.947,224.62 417.745,227.822L379.172,266.395C377.289,268.278 376.609,271.556 377.281,275.51C377.953,279.463 379.922,283.767 382.755,287.474L413.545,327.767C419.235,335.214 422.656,344.061 422.656,351.333L422.656,422.862C410.757,423.856 366.923,422.869 366.923,422.869L371.072,375.058L372.305,360.848C372.319,360.699 372.332,360.55 372.344,360.399ZM360.277,196.701L314.978,197.291C311.426,197.337 309.303,200.157 309.462,204.615C309.622,209.073 312.038,214.436 315.738,218.543L329.196,233.485C333.595,238.369 338.865,240.179 341.813,237.82L370.371,214.965C372.613,213.171 372.463,208.69 370.012,204.255C367.56,199.819 363.488,196.659 360.277,196.701Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,25.2846,-499.837)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,2.10134,-540.366)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.39385,0,0,1.39385,-21.0054,-499.837)" + ] + [ Svg.circle + [ SvgAttr.cx "370.033" + , SvgAttr.cy "883.522" + , SvgAttr.r "12.565" + , SvgAttr.style "fill:rgb(126,126,126);" + ] + [] + ] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,1167.41,1268.19)" + ] + [ path + [ SvgAttr.d "M128.358,409.275C128.368,417.539 124.19,422.646 117.431,422.632C95.856,422.586 49.907,422.489 49.907,422.489C40.439,422.47 28.16,415.401 18.78,403.921C9.4,392.44 4.327,378.273 4.326,366.706L4.323,260.755L74.344,260.755L74.37,336.128L134.449,336.195C144.333,336.206 150.426,328.705 150.373,316.592L150.031,260.746L200.055,260.862L200.446,422.931C200.446,422.931 176.719,422.875 162.366,422.84C160.154,422.835 157.446,421.179 155.258,418.492C153.07,415.805 151.732,412.494 151.745,409.8C151.808,397.197 151.895,379.981 151.895,379.981C151.895,379.981 145.967,379.997 140.056,380.013C132.805,380.032 128.329,385.536 128.34,394.419C128.346,399.221 128.352,404.551 128.358,409.275Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.981895,0,-0.581998,0.981895,739.791,1296.26)" + ] + [ path + [ SvgAttr.d "M773.523,268.073C773.523,273.29 771.24,277.482 766.676,280.649C762.577,283.537 757.825,284.981 752.422,284.981L697.086,284.981L697.086,319.077C697.086,324.294 694.804,328.486 690.239,331.654C686.14,334.542 681.389,335.985 675.986,335.985C670.582,335.985 665.831,334.542 661.732,331.654C657.074,328.486 654.745,324.294 654.745,319.077L654.745,174.868C654.745,169.558 657.028,165.319 661.593,162.151C665.692,159.357 670.489,157.959 675.986,157.959L752.422,157.959C757.919,157.959 762.67,159.357 766.676,162.151C771.24,165.319 773.523,169.558 773.523,174.868L773.523,268.073ZM731.182,259.549L731.182,183.112L697.086,183.112L697.086,259.549L731.182,259.549Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.981895,0,-0.581998,0.981895,1206.2,1171.92)" + ] + [ path + [ SvgAttr.d "M760.603,385.172C760.603,390.389 758.321,394.581 753.756,397.748C749.657,400.636 744.906,402.08 739.503,402.08L663.066,402.08C657.663,402.08 652.912,400.636 648.813,397.748C644.155,394.581 641.826,390.389 641.826,385.172L641.826,291.967C641.826,286.657 644.108,282.418 648.673,279.251C652.772,276.456 657.57,275.058 663.066,275.058L739.503,275.058C744.999,275.058 749.75,276.456 753.756,279.251C758.321,282.418 760.603,286.657 760.603,291.967L760.603,385.172ZM718.263,376.648L718.263,300.211L684.167,300.211L684.167,376.648L718.263,376.648Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M901.18,385.172C901.18,390.389 898.897,394.581 894.333,397.748C890.234,400.636 885.482,402.08 880.079,402.08L803.643,402.08C798.239,402.08 793.488,400.636 789.389,397.748C784.731,394.581 782.402,390.389 782.402,385.172L782.402,291.967C782.402,286.657 784.685,282.418 789.25,279.251C793.349,276.456 798.146,275.058 803.643,275.058L880.079,275.058C885.576,275.058 890.327,276.456 894.333,279.251C898.897,282.418 901.18,286.657 901.18,291.967L901.18,385.172ZM858.839,376.648L858.839,300.211L824.743,300.211L824.743,376.648L858.839,376.648Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1003.75,287.775C1003.75,279.297 999.415,275.058 990.752,275.058L965.739,275.058L965.739,249.486C965.739,244.27 963.41,240.031 958.752,236.77C954.746,233.882 949.855,232.438 944.079,232.438C938.49,232.438 933.692,233.882 929.686,236.77C925.308,240.031 923.119,244.27 923.119,249.486L923.119,385.032C923.119,390.435 925.401,394.674 929.966,397.748C934.065,400.636 938.769,402.08 944.079,402.08C949.669,402.08 954.466,400.636 958.472,397.748C963.317,394.674 965.739,390.435 965.739,385.032L965.739,300.072L990.752,300.072C999.415,300.072 1003.75,295.973 1003.75,287.775Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.981895,0,-0.581998,0.981895,1371.86,1363.66)" + ] + [ path + [ SvgAttr.d "M1109.66,193.253C1109.66,198.469 1107.38,202.662 1102.82,205.829C1098.72,208.717 1093.97,210.161 1088.56,210.161L1012.13,210.161C1006.73,210.161 1001.97,208.717 997.874,205.829C993.217,202.662 990.888,198.469 990.888,193.253L990.888,100.047C990.888,94.737 993.17,90.499 997.735,87.331C1001.83,84.536 1006.63,83.139 1012.13,83.139C1017.62,83.139 1022.38,84.536 1026.38,87.331C1030.95,90.499 1033.23,94.737 1033.23,100.047L1033.23,184.729L1067.32,184.729L1067.32,100.047C1067.32,94.737 1069.61,90.499 1074.17,87.331C1078.18,84.536 1082.97,83.139 1088.56,83.139C1094.06,83.139 1098.81,84.536 1102.82,87.331C1107.38,90.499 1109.66,94.737 1109.66,100.047L1109.66,193.253Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1212.23,95.855C1212.23,87.378 1207.9,83.139 1199.24,83.139L1174.22,83.139L1174.22,57.567C1174.22,52.35 1171.89,48.111 1167.24,44.851C1163.23,41.963 1158.34,40.519 1152.56,40.519C1146.98,40.519 1142.18,41.963 1138.17,44.851C1133.79,48.111 1131.6,52.35 1131.6,57.567L1131.6,193.113C1131.6,198.516 1133.89,202.755 1138.45,205.829C1142.55,208.717 1147.25,210.161 1152.56,210.161C1158.15,210.161 1162.95,208.717 1166.96,205.829C1171.8,202.755 1174.22,198.516 1174.22,193.113L1174.22,108.152L1199.24,108.152C1207.9,108.152 1212.23,104.053 1212.23,95.855Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1336.46,100.047C1336.46,105.264 1334.13,109.456 1329.47,112.624C1325.47,115.418 1320.72,116.816 1315.22,116.816C1307.21,116.816 1301.11,113.975 1296.91,108.292L1268.55,108.292L1268.55,193.253C1268.55,198.469 1266.27,202.662 1261.7,205.829C1257.6,208.717 1252.85,210.161 1247.45,210.161C1242.04,210.161 1237.29,208.717 1233.19,205.829C1228.54,202.662 1226.21,198.469 1226.21,193.253L1226.21,100.047C1226.21,94.737 1228.49,90.499 1233.05,87.331C1237.15,84.536 1241.95,83.139 1247.45,83.139L1315.22,83.139C1320.72,83.139 1325.51,84.536 1329.61,87.331C1334.18,90.499 1336.46,94.737 1336.46,100.047Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1389.42,57.567C1389.42,62.877 1387.14,67.116 1382.57,70.283C1378.57,73.078 1373.82,74.475 1368.32,74.475C1362.82,74.475 1358.03,73.078 1353.93,70.283C1349.36,67.116 1347.08,62.877 1347.08,57.567C1347.08,52.35 1349.36,48.111 1353.93,44.851C1357.93,41.963 1362.73,40.519 1368.32,40.519C1373.82,40.519 1378.57,41.963 1382.57,44.851C1387.14,48.111 1389.42,52.35 1389.42,57.567ZM1389.42,193.253C1389.42,198.469 1387.14,202.662 1382.57,205.829C1378.47,208.717 1373.72,210.161 1368.32,210.161C1362.92,210.161 1358.17,208.717 1354.07,205.829C1349.41,202.662 1347.08,198.469 1347.08,193.253L1347.08,100.047C1347.08,94.737 1349.36,90.499 1353.93,87.331C1358.03,84.536 1362.82,83.139 1368.32,83.139C1373.82,83.139 1378.57,84.536 1382.57,87.331C1387.14,90.499 1389.42,94.737 1389.42,100.047L1389.42,193.253Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1491.99,95.855C1491.99,87.378 1487.66,83.139 1478.99,83.139L1453.98,83.139L1453.98,57.567C1453.98,52.35 1451.65,48.111 1446.99,44.851C1442.99,41.963 1438.1,40.519 1432.32,40.519C1426.73,40.519 1421.93,41.963 1417.93,44.851C1413.55,48.111 1411.36,52.35 1411.36,57.567L1411.36,193.113C1411.36,198.516 1413.64,202.755 1418.21,205.829C1422.31,208.717 1427.01,210.161 1432.32,210.161C1437.91,210.161 1442.71,208.717 1446.71,205.829C1451.56,202.755 1453.98,198.516 1453.98,193.113L1453.98,108.152L1478.99,108.152C1487.66,108.152 1491.99,104.053 1491.99,95.855Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1548.3,57.567C1548.3,62.877 1546.02,67.116 1541.45,70.283C1537.45,73.078 1532.7,74.475 1527.2,74.475C1521.71,74.475 1516.91,73.078 1512.81,70.283C1508.24,67.116 1505.96,62.877 1505.96,57.567C1505.96,52.35 1508.24,48.111 1512.81,44.851C1516.82,41.963 1521.61,40.519 1527.2,40.519C1532.7,40.519 1537.45,41.963 1541.45,44.851C1546.02,48.111 1548.3,52.35 1548.3,57.567ZM1548.3,193.253C1548.3,198.469 1546.02,202.662 1541.45,205.829C1537.36,208.717 1532.61,210.161 1527.2,210.161C1521.8,210.161 1517.05,208.717 1512.95,205.829C1508.29,202.662 1505.96,198.469 1505.96,193.253L1505.96,100.047C1505.96,94.737 1508.24,90.499 1512.81,87.331C1516.91,84.536 1521.71,83.139 1527.2,83.139C1532.7,83.139 1537.45,84.536 1541.45,87.331C1546.02,90.499 1548.3,94.737 1548.3,100.047L1548.3,193.253Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1688.88,193.253C1688.88,198.469 1686.6,202.662 1682.03,205.829C1677.93,208.717 1673.18,210.161 1667.78,210.161L1591.34,210.161C1585.94,210.161 1581.19,208.717 1577.09,205.829C1572.43,202.662 1570.1,198.469 1570.1,193.253L1570.1,100.047C1570.1,94.737 1572.38,90.499 1576.95,87.331C1581.05,84.536 1585.85,83.139 1591.34,83.139L1667.78,83.139C1673.28,83.139 1678.03,84.536 1682.03,87.331C1686.6,90.499 1688.88,94.737 1688.88,100.047L1688.88,193.253ZM1646.54,184.729L1646.54,108.292L1612.44,108.292L1612.44,184.729L1646.54,184.729Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + , path + [ SvgAttr.d "M1829.45,193.253C1829.45,198.469 1827.17,202.662 1822.61,205.829C1818.51,208.717 1813.76,210.161 1808.36,210.161C1802.86,210.161 1798.06,208.763 1793.96,205.969C1789.4,202.708 1787.12,198.469 1787.12,193.253L1787.12,108.292L1753.02,108.292L1753.02,193.253C1753.02,198.469 1750.74,202.662 1746.17,205.829C1742.07,208.717 1737.32,210.161 1731.92,210.161C1726.52,210.161 1721.76,208.717 1717.66,205.829C1713.01,202.662 1710.68,198.469 1710.68,193.253L1710.68,100.047C1710.68,94.737 1712.96,90.499 1717.53,87.331C1721.62,84.536 1726.42,83.139 1731.92,83.139L1808.36,83.139C1813.85,83.139 1818.6,84.536 1822.61,87.331C1827.17,90.499 1829.45,94.737 1829.45,100.047L1829.45,193.253Z" + , SvgAttr.style "fill:rgb(204,102,0);fill-rule:nonzero;" + ] + [] + ] + ] + ] + + +nutriDexLogo : Html msg +nutriDexLogo = + svg + [ SvgAttr.width "100%" + , SvgAttr.height "100%" + , SvgAttr.viewBox "0 0 269 254" + , SvgAttr.version "1.1" + , SvgAttr.xmlSpace "preserve" + , SvgAttr.style "fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;" + ] + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,-3230.36,-2630.73)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(-0.305281,-0.528763,-0.528763,0.305281,4494.3,3752.71)" + ] + [ path + [ SvgAttr.d "M2438.06,573.79L2421.04,607.88" + , SvgAttr.style "fill:none;stroke:rgb(120,60,0);stroke-width:26.21px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(-0.520336,-0.901248,-0.901248,0.520336,5232.34,4537.46)" + ] + [ path + [ SvgAttr.d "M2384.94,593.791L2428.07,593.791" + , SvgAttr.style "fill:none;stroke:rgb(120,60,0);stroke-width:15.37px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(-1.46201,0,0,1.46201,6999.63,1413.74)" + ] + [ path + [ SvgAttr.d "M2439.01,851.153L2458.28,851.153" + , SvgAttr.style "fill:none;stroke:rgb(120,60,0);stroke-width:10.94px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.520336,-0.901248,0.901248,0.520336,1631.94,4537.46)" + ] + [ path + [ SvgAttr.d "M2319.68,627.395C2323.07,629.57 2324.23,634.05 2322.24,637.617L2299.1,678.996C2298.35,680.341 2297.25,681.373 2295.98,682.042L2292.05,675.243L2319.68,627.395Z" + , SvgAttr.style "fill:rgb(120,60,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.520336,-0.901248,0.901248,0.520336,1631.94,4537.46)" + ] + [ path + [ SvgAttr.d "M2344.65,603.881L2362.65,634.203L2338.66,673.941L2384.94,673.941" + , SvgAttr.style "fill:none;stroke:rgb(120,60,0);stroke-width:15.37px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.46201,0,0,1.46201,-135.345,1413.74)" + ] + [ path + [ SvgAttr.d "M2423.66,877.745L2456.6,877.745" + , SvgAttr.style "fill:none;stroke:rgb(120,60,0);stroke-width:10.94px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1671.21,4250.37)" + ] + [ path + [ SvgAttr.d "M2484.47,812.271C2487.52,814.103 2490.15,816.709 2492.05,820.001C2498.05,830.377 2494.49,843.663 2484.11,849.654C2477.29,853.592 2469.21,853.402 2462.77,849.863L2484.47,812.271ZM2456.98,859.904C2463.26,863.709 2467.46,870.611 2467.46,878.486C2467.46,890.467 2457.74,900.193 2445.76,900.193C2441.96,900.193 2438.38,899.215 2435.28,897.496L2456.98,859.904ZM2429.48,907.537C2435.76,911.342 2439.96,918.243 2439.96,926.117C2439.96,934.544 2435.15,941.856 2428.13,945.452L2417.86,927.666L2429.48,907.537ZM2451.62,832.633C2450.96,824.532 2454.9,816.387 2462.4,812.056C2462.92,811.757 2463.45,811.482 2463.97,811.231L2451.62,832.633ZM2406.34,944.257C2400.44,940.374 2396.55,933.697 2396.55,926.117C2396.55,917.453 2401.64,909.968 2408.98,906.488L2400.88,920.526C2398.33,924.945 2398.33,930.389 2400.88,934.807L2406.34,944.257ZM2424.12,880.266C2424.07,879.679 2424.05,879.086 2424.05,878.486C2424.05,869.824 2429.13,862.34 2436.48,858.859L2424.12,880.266Z" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1719.37,4166.96)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,0.75827,-0.75827,0.437787,3003.47,457.873)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1695.29,4208.67)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1743.45,4208.67)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1719.37,4250.37)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.style "fill:rgb(204,102,0);" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,2973.17,2613.98)" + ] + [ path + [ SvgAttr.d "M410,379.833C410,379.833 410.056,260.455 410.09,188.088C410.095,176.87 404.503,163.127 395.402,151.992C386.302,140.858 375.063,134.008 365.884,134.002C358.352,133.997 351.428,133.992 346.641,133.989C345.213,133.988 343.47,132.952 342.03,131.25C340.591,129.547 339.658,127.419 339.564,125.619C338.962,114.141 337.955,94.916 337.955,94.916L397.955,94.916C397.955,94.916 537.356,266.295 570.787,307.394C575.207,312.828 580.681,316.175 585.149,316.175C597.174,316.175 620,316.175 620,316.175L620,379.833L560.605,379.833C553.617,379.833 545.056,374.614 538.129,366.13C524.324,349.222 491.306,308.782 480.375,295.394C476.268,290.363 471.189,287.278 467.055,287.302C462.921,287.326 460.361,290.456 460.34,295.511C460.211,327.614 460,379.833 460,379.833L410,379.833Z" + , SvgAttr.style "fill:rgb(212,212,212);" + ] + [] + ] + ] + ] + + +home : SvgTypes.OuterPart msg -> Element msg +home inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 576 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M575.8 255.5c0 18-15 32.1-32 32.1l-32 0 .7 160.2c0 2.7-.2 5.4-.5 8.1l0 16.2c0 22.1-17.9 40-40 40l-16 0c-1.1 0-2.2 0-3.3-.1c-1.4 .1-2.8 .1-4.2 .1L416 512l-24 0c-22.1 0-40-17.9-40-40l0-24 0-64c0-17.7-14.3-32-32-32l-64 0c-17.7 0-32 14.3-32 32l0 64 0 24c0 22.1-17.9 40-40 40l-24 0-31.9 0c-1.5 0-3-.1-4.5-.2c-1.2 .1-2.4 .2-3.6 .2l-16 0c-22.1 0-40-17.9-40-40l0-112c0-.9 0-1.9 .1-2.8l0-69.7-32 0c-18 0-32-14-32-32.1c0-9 3-17 10-24L266.4 8c7-7 15-8 22-8s15 2 21 7L564.8 231.5c8 7 12 15 11 24z" + ] + [] + ] + } + + +services : SvgTypes.OuterPart msg -> Element msg +services inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M78.6 5C69.1-2.4 55.6-1.5 47 7L7 47c-8.5 8.5-9.4 22-2.1 31.6l80 104c4.5 5.9 11.6 9.4 19 9.4l54.1 0 109 109c-14.7 29-10 65.4 14.3 89.6l112 112c12.5 12.5 32.8 12.5 45.3 0l64-64c12.5-12.5 12.5-32.8 0-45.3l-112-112c-24.2-24.2-60.6-29-89.6-14.3l-109-109 0-54.1c0-7.5-3.5-14.5-9.4-19L78.6 5zM19.9 396.1C7.2 408.8 0 426.1 0 444.1C0 481.6 30.4 512 67.9 512c18 0 35.3-7.2 48-19.9L233.7 374.3c-7.8-20.9-9-43.6-3.6-65.1l-61.7-61.7L19.9 396.1zM512 144c0-10.5-1.1-20.7-3.2-30.5c-2.4-11.2-16.1-14.1-24.2-6l-63.9 63.9c-3 3-7.1 4.7-11.3 4.7L352 176c-8.8 0-16-7.2-16-16l0-57.4c0-4.2 1.7-8.3 4.7-11.3l63.9-63.9c8.1-8.1 5.2-21.8-6-24.2C388.7 1.1 378.5 0 368 0C288.5 0 224 64.5 224 144l0 .8 85.3 85.3c36-9.1 75.8 .5 104 28.7L429 274.5c49-23 83-72.8 83-130.5zM56 432a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z" + ] + [] + ] + } + + +hyperBlog : SvgTypes.OuterPart msg -> Element msg +hyperBlog inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M248 106.6c18.9-9 32-28.3 32-50.6c0-30.9-25.1-56-56-56s-56 25.1-56 56c0 22.3 13.1 41.6 32 50.6l0 98.8c-2.8 1.3-5.5 2.9-8 4.7l-80.1-45.8c1.6-20.8-8.6-41.6-27.9-52.8C57.2 96 23 105.2 7.5 132S1.2 193 28 208.5c1.3 .8 2.6 1.5 4 2.1l0 90.8c-1.3 .6-2.7 1.3-4 2.1C1.2 319-8 353.2 7.5 380S57.2 416 84 400.5c19.3-11.1 29.4-32 27.8-52.8l50.5-28.9c-11.5-11.2-19.9-25.6-23.8-41.7L88 306.1c-2.6-1.8-5.2-3.3-8-4.7l0-90.8c2.8-1.3 5.5-2.9 8-4.7l80.1 45.8c-.1 1.4-.2 2.8-.2 4.3c0 22.3 13.1 41.6 32 50.6l0 98.8c-18.9 9-32 28.3-32 50.6c0 30.9 25.1 56 56 56s56-25.1 56-56c0-22.3-13.1-41.6-32-50.6l0-98.8c2.8-1.3 5.5-2.9 8-4.7l80.1 45.8c-1.6 20.8 8.6 41.6 27.8 52.8c26.8 15.5 61 6.3 76.5-20.5s6.3-61-20.5-76.5c-1.3-.8-2.7-1.5-4-2.1l0-90.8c1.4-.6 2.7-1.3 4-2.1c26.8-15.5 36-49.7 20.5-76.5S390.8 96 364 111.5c-19.3 11.1-29.4 32-27.8 52.8l-50.6 28.9c11.5 11.2 19.9 25.6 23.8 41.7L360 205.9c2.6 1.8 5.2 3.3 8 4.7l0 90.8c-2.8 1.3-5.5 2.9-8 4.6l-80.1-45.8c.1-1.4 .2-2.8 .2-4.3c0-22.3-13.1-41.6-32-50.6l0-98.8z" + ] + [] + ] + } + + +video : SvgTypes.OuterPart msg -> Element msg +video inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M0 96C0 60.7 28.7 32 64 32l384 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM48 368l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16l-32 0c-8.8 0-16 7.2-16 16zm368-16c-8.8 0-16 7.2-16 16l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16l-32 0zM48 240l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16l-32 0c-8.8 0-16 7.2-16 16zm368-16c-8.8 0-16 7.2-16 16l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16l-32 0zM48 112l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16L64 96c-8.8 0-16 7.2-16 16zM416 96c-8.8 0-16 7.2-16 16l0 32c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l0-32c0-8.8-7.2-16-16-16l-32 0zM160 128l0 64c0 17.7 14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-64c0-17.7-14.3-32-32-32L192 96c-17.7 0-32 14.3-32 32zm32 160c-17.7 0-32 14.3-32 32l0 64c0 17.7 14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-64c0-17.7-14.3-32-32-32l-128 0z" + ] + [] + ] + } + +source : SvgTypes.OuterPart msg -> Element msg +source inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48zm80-24c0 32.8-19.7 61-48 73.3l0 87.8c18.8-10.9 40.7-17.1 64-17.1l96 0c35.3 0 64-28.7 64-64l0-6.7C307.7 141 288 112.8 288 80c0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3l0 6.7c0 70.7-57.3 128-128 128l-96 0c-35.3 0-64 28.7-64 64l0 6.7c28.3 12.3 48 40.5 48 73.3c0 44.2-35.8 80-80 80s-80-35.8-80-80c0-32.8 19.7-61 48-73.3l0-6.7 0-198.7C19.7 141 0 112.8 0 80C0 35.8 35.8 0 80 0s80 35.8 80 80zm232 0a24 24 0 1 0 -48 0 24 24 0 1 0 48 0zM80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z" + ] + [] + ] + } + +debate : SvgTypes.OuterPart msg -> Element msg +debate inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8l0 378.1C394 378 431.1 230.1 432 141.4L256 66.8s0 0 0 0z" + ] + [] + ] + } + + +nutriDex : SvgTypes.OuterPart msg -> Element msg +nutriDex inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 269 254" + , SvgAttr.fill "currentColor" + + -- , SvgAttr.width "100%" + -- , SvgAttr.height "100%" + , SvgAttr.viewBox "0 0 269 254" + , SvgAttr.version "1.1" + , SvgAttr.xmlSpace "preserve" + , SvgAttr.style "fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;" + ] + , svg = + [ Svg.g + [ SvgAttr.transform "matrix(1,0,0,1,-3213.08,-2929.6)" + ] + [ Svg.g + [ SvgAttr.transform "matrix(-0.305281,-0.528763,-0.528763,0.305281,4477.01,4051.59)" + ] + [ path + [ SvgAttr.d "M2438.06,573.79L2421.04,607.88" + , SvgAttr.stroke "currentColor" + , SvgAttr.fill "none" + , SvgAttr.style "stroke-width:26.21px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(-0.520336,-0.901248,-0.901248,0.520336,5215.05,4836.33)" + ] + [ path + [ SvgAttr.d "M2384.94,593.791L2428.07,593.791" + , SvgAttr.fill "none" + , SvgAttr.stroke "currentColor" + , SvgAttr.style "stroke-width:15.37px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(-1.46201,0,0,1.46201,6982.34,1712.61)" + ] + [ path + [ SvgAttr.d "M2439.01,851.153L2458.28,851.153" + , SvgAttr.fill "none" + , SvgAttr.stroke "currentColor" + , SvgAttr.style "stroke-width:10.94px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.520336,-0.901248,0.901248,0.520336,1614.66,4836.33)" + ] + [ path + [ SvgAttr.d "M2319.68,627.395C2323.07,629.57 2324.23,634.05 2322.24,637.617L2299.1,678.996C2298.35,680.341 2297.25,681.373 2295.98,682.042L2292.05,675.243L2319.68,627.395Z" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.520336,-0.901248,0.901248,0.520336,1614.66,4836.33)" + ] + [ path + [ SvgAttr.d "M2344.65,603.881L2362.65,634.203L2338.66,673.941L2384.94,673.941" + , SvgAttr.fill "none" + , SvgAttr.stroke "currentColor" + , SvgAttr.style "stroke-width:15.37px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1.46201,0,0,1.46201,-152.629,1712.61)" + ] + [ path + [ SvgAttr.d "M2423.66,877.745L2456.6,877.745" + , SvgAttr.fill "none" + , SvgAttr.stroke "currentColor" + , SvgAttr.style "stroke-width:10.94px;" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1653.93,4549.24)" + ] + [ path + [ SvgAttr.d "M2484.47,812.271C2487.52,814.103 2490.15,816.709 2492.05,820.001C2498.05,830.377 2494.49,843.663 2484.11,849.654C2477.29,853.592 2469.21,853.402 2462.77,849.863L2484.47,812.271ZM2456.98,859.904C2463.26,863.709 2467.46,870.611 2467.46,878.486C2467.46,890.467 2457.74,900.193 2445.76,900.193C2441.96,900.193 2438.38,899.215 2435.28,897.496L2456.98,859.904ZM2429.48,907.537C2435.76,911.342 2439.96,918.243 2439.96,926.117C2439.96,934.544 2435.15,941.856 2428.13,945.452L2417.86,927.666L2429.48,907.537ZM2451.62,832.633C2450.96,824.532 2454.9,816.387 2462.4,812.056C2462.92,811.757 2463.45,811.482 2463.97,811.231L2451.62,832.633ZM2406.34,944.257C2400.44,940.374 2396.55,933.697 2396.55,926.117C2396.55,917.453 2401.64,909.968 2408.98,906.488L2400.88,920.526C2398.33,924.945 2398.33,930.389 2400.88,934.807L2406.34,944.257ZM2424.12,880.266C2424.07,879.679 2424.05,879.086 2424.05,878.486C2424.05,869.824 2429.13,862.34 2436.48,858.859L2424.12,880.266Z" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1702.08,4465.83)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,0.75827,-0.75827,0.437787,2986.19,756.746)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1678.01,4507.54)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1726.16,4507.54)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(0.437787,-0.75827,0.75827,0.437787,1702.08,4549.24)" + ] + [ Svg.circle + [ SvgAttr.cx "2445.76" + , SvgAttr.cy "878.486" + , SvgAttr.r "21.707" + , SvgAttr.fill "currentColor" + ] + [] + ] + , Svg.g + [ SvgAttr.transform "matrix(1,0,-0.402297,0.712005,2955.89,2912.86)" + ] + [ path + [ SvgAttr.d "M410,379.833C410,379.833 410.056,260.455 410.09,188.088C410.095,176.87 404.503,163.127 395.402,151.992C386.302,140.858 375.063,134.008 365.884,134.002C358.352,133.997 351.428,133.992 346.641,133.989C345.213,133.988 343.47,132.952 342.03,131.25C340.591,129.547 339.658,127.419 339.564,125.619C338.962,114.141 337.955,94.916 337.955,94.916L397.955,94.916C397.955,94.916 537.356,266.295 570.787,307.394C575.207,312.828 580.681,316.175 585.149,316.175C597.174,316.175 620,316.175 620,316.175L620,379.833L560.605,379.833C553.617,379.833 545.056,374.614 538.129,366.13C524.324,349.222 491.306,308.782 480.375,295.394C476.268,290.363 471.189,287.278 467.055,287.302C462.921,287.326 460.361,290.456 460.34,295.511C460.211,327.614 460,379.833 460,379.833L410,379.833Z" + , SvgAttr.fill "currentColor" + ] + [] + ] + ] + ] + } + + +interviews : SvgTypes.OuterPart msg -> Element msg +interviews inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 640 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M208 352c114.9 0 208-78.8 208-176S322.9 0 208 0S0 78.8 0 176c0 38.6 14.7 74.3 39.6 103.4c-3.5 9.4-8.7 17.7-14.2 24.7c-4.8 6.2-9.7 11-13.3 14.3c-1.8 1.6-3.3 2.9-4.3 3.7c-.5 .4-.9 .7-1.1 .8l-.2 .2s0 0 0 0s0 0 0 0C1 327.2-1.4 334.4 .8 340.9S9.1 352 16 352c21.8 0 43.8-5.6 62.1-12.5c9.2-3.5 17.8-7.4 25.2-11.4C134.1 343.3 169.8 352 208 352zM448 176c0 112.3-99.1 196.9-216.5 207C255.8 457.4 336.4 512 432 512c38.2 0 73.9-8.7 104.7-23.9c7.5 4 16 7.9 25.2 11.4c18.3 6.9 40.3 12.5 62.1 12.5c6.9 0 13.1-4.5 15.2-11.1c2.1-6.6-.2-13.8-5.8-17.9c0 0 0 0 0 0s0 0 0 0l-.2-.2c-.2-.2-.6-.4-1.1-.8c-1-.8-2.5-2-4.3-3.7c-3.6-3.3-8.5-8.1-13.3-14.3c-5.5-7-10.7-15.4-14.2-24.7c24.9-29 39.6-64.7 39.6-103.4c0-92.8-84.9-168.9-192.6-175.5c.4 5.1 .6 10.3 .6 15.5z" + ] + [] + ] + } + + +donate : SvgTypes.OuterPart msg -> Element msg +donate inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 576 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M64 32C28.7 32 0 60.7 0 96l0 32 576 0 0-32c0-35.3-28.7-64-64-64L64 32zM576 224L0 224 0 416c0 35.3 28.7 64 64 64l448 0c35.3 0 64-28.7 64-64l0-192zM112 352l64 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-64 0c-8.8 0-16-7.2-16-16s7.2-16 16-16zm112 16c0-8.8 7.2-16 16-16l128 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-128 0c-8.8 0-16-7.2-16-16z" + ] + [] + ] + } + + +contact : SvgTypes.OuterPart msg -> Element msg +contact inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M215.4 96L144 96l-36.2 0L96 96l0 8.8L96 144l0 40.4 0 89L.2 202.5c1.6-18.1 10.9-34.9 25.7-45.8L48 140.3 48 96c0-26.5 21.5-48 48-48l76.6 0 49.9-36.9C232.2 3.9 243.9 0 256 0s23.8 3.9 33.5 11L339.4 48 416 48c26.5 0 48 21.5 48 48l0 44.3 22.1 16.4c14.8 10.9 24.1 27.7 25.7 45.8L416 273.4l0-89 0-40.4 0-39.2 0-8.8-11.8 0L368 96l-71.4 0-81.3 0zM0 448L0 242.1 217.6 403.3c11.1 8.2 24.6 12.7 38.4 12.7s27.3-4.4 38.4-12.7L512 242.1 512 448s0 0 0 0c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64c0 0 0 0 0 0zM176 160l160 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-160 0c-8.8 0-16-7.2-16-16s7.2-16 16-16zm0 64l160 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-160 0c-8.8 0-16-7.2-16-16s7.2-16 16-16z" + ] + [] + ] + } + + +gitlab : SvgTypes.OuterPart msg -> Element msg +gitlab inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M503.5 204.6L502.8 202.8L433.1 21C431.7 17.5 429.2 14.4 425.9 12.4C423.5 10.8 420.8 9.9 417.9 9.6C415 9.3 412.2 9.7 409.5 10.7C406.8 11.7 404.4 13.3 402.4 15.5C400.5 17.6 399.1 20.1 398.3 22.9L351.3 166.9H160.8L113.7 22.9C112.9 20.1 111.5 17.6 109.6 15.5C107.6 13.4 105.2 11.7 102.5 10.7C99.9 9.7 97 9.3 94.1 9.6C91.3 9.9 88.5 10.8 86.1 12.4C82.8 14.4 80.3 17.5 78.9 21L9.3 202.8L8.5 204.6C-1.5 230.8-2.7 259.6 5 286.6C12.8 313.5 29.1 337.3 51.5 354.2L51.7 354.4L52.3 354.8L158.3 434.3L210.9 474L242.9 498.2C246.6 500.1 251.2 502.5 255.9 502.5C260.6 502.5 265.2 500.1 268.9 498.2L300.9 474L353.5 434.3L460.2 354.4L460.5 354.1C482.9 337.2 499.2 313.5 506.1 286.6C514.7 259.6 513.5 230.8 503.5 204.6z" + ] + [] + ] + } + + +twitter : SvgTypes.OuterPart msg -> Element msg +twitter inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z" + ] + [] + ] + } + + +mastodon : SvgTypes.OuterPart msg -> Element msg +mastodon inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5 0 0 1 -.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.3V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z" + ] + [] + ] + } + + +discord : SvgTypes.OuterPart msg -> Element msg +discord inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 640 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z" + ] + [] + ] + } + + +lock : SvgTypes.OuterPart msg -> Element msg +lock inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 16 0c35.3 0 64 28.7 64 64l0 192c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 256c0-35.3 28.7-64 64-64l16 0z" + ] + [] + ] + } + + +circleX : SvgTypes.OuterPart msg -> Element msg +circleX inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M256 48a208 208 0 1 1 0 416 208 208 0 1 1 0-416zm0 464A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM175 175c-9.4 9.4-9.4 24.6 0 33.9l47 47-47 47c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l47-47 47 47c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-47-47 47-47c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-47 47-47-47c-9.4-9.4-24.6-9.4-33.9 0z" + ] + [] + ] + } + + +line : SvgTypes.OuterPart msg -> Element msg +line inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z" + ] + [] + ] + } + + +circleDots : SvgTypes.OuterPart msg -> Element msg +circleDots inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 448 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z" + ] + [] + ] + } + + +construction : Html msg +construction = + svg + [ SvgAttr.viewBox "0 0 576 512" + , SvgAttr.fill "currentColor" + ] + [ path + [ SvgAttr.d "M208 64a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM9.8 214.8c5.1-12.2 19.1-18 31.4-12.9L60.7 210l22.9-38.1C99.9 144.6 129.3 128 161 128c51.4 0 97 32.9 113.3 81.7l34.6 103.7 79.3 33.1 34.2-45.6c6.4-8.5 16.6-13.3 27.2-12.8s20.3 6.4 25.8 15.5l96 160c5.9 9.9 6.1 22.2 .4 32.2s-16.3 16.2-27.8 16.2l-256 0c-11.1 0-21.4-5.7-27.2-15.2s-6.4-21.2-1.4-31.1l16-32c5.4-10.8 16.5-17.7 28.6-17.7l32 0 22.5-30L22.8 246.2c-12.2-5.1-18-19.1-12.9-31.4zm82.8 91.8l112 48c11.8 5 19.4 16.6 19.4 29.4l0 96c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-74.9-60.6-26-37 111c-5.6 16.8-23.7 25.8-40.5 20.2S-3.9 486.6 1.6 469.9l48-144 11-33 32 13.7z" + ] + [] + ] + + +leaving : SvgTypes.OuterPart msg -> Element msg +leaving inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 576 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l82.7 0L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3l0 82.7c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160c0-17.7-14.3-32-32-32L320 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-112c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 112c0 8.8-7.2 16-16 16L80 448c-8.8 0-16-7.2-16-16l0-320c0-8.8 7.2-16 16-16l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L80 32z" + ] + [] + ] + } + + +copyLink : SvgTypes.OuterPart msg -> Element msg +copyLink inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 640 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z" + ] + [] + ] + } + + +code : SvgTypes.OuterPart msg -> Element msg +code inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 640 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3L562.7 256l-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z" + ] + [] + ] + } + + +thumbsUp : SvgTypes.OuterPart msg -> Element msg +thumbsUp inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 512 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M323.8 34.8c-38.2-10.9-78.1 11.2-89 49.4l-5.7 20c-3.7 13-10.4 25-19.5 35l-51.3 56.4c-8.9 9.8-8.2 25 1.6 33.9s25 8.2 33.9-1.6l51.3-56.4c14.1-15.5 24.4-34 30.1-54.1l5.7-20c3.6-12.7 16.9-20.1 29.7-16.5s20.1 16.9 16.5 29.7l-5.7 20c-5.7 19.9-14.7 38.7-26.6 55.5c-5.2 7.3-5.8 16.9-1.7 24.9s12.3 13 21.3 13L448 224c8.8 0 16 7.2 16 16c0 6.8-4.3 12.7-10.4 15c-7.4 2.8-13 9-14.9 16.7s.1 15.8 5.3 21.7c2.5 2.8 4 6.5 4 10.6c0 7.8-5.6 14.3-13 15.7c-8.2 1.6-15.1 7.3-18 15.2s-1.6 16.7 3.6 23.3c2.1 2.7 3.4 6.1 3.4 9.9c0 6.7-4.2 12.6-10.2 14.9c-11.5 4.5-17.7 16.9-14.4 28.8c.4 1.3 .6 2.8 .6 4.3c0 8.8-7.2 16-16 16l-97.5 0c-12.6 0-25-3.7-35.5-10.7l-61.7-41.1c-11-7.4-25.9-4.4-33.3 6.7s-4.4 25.9 6.7 33.3l61.7 41.1c18.4 12.3 40 18.8 62.1 18.8l97.5 0c34.7 0 62.9-27.6 64-62c14.6-11.7 24-29.7 24-50c0-4.5-.5-8.8-1.3-13c15.4-11.7 25.3-30.2 25.3-51c0-6.5-1-12.8-2.8-18.7C504.8 273.7 512 257.7 512 240c0-35.3-28.6-64-64-64l-92.3 0c4.7-10.4 8.7-21.2 11.8-32.2l5.7-20c10.9-38.2-11.2-78.1-49.4-89zM32 192c-17.7 0-32 14.3-32 32L0 448c0 17.7 14.3 32 32 32l64 0c17.7 0 32-14.3 32-32l0-224c0-17.7-14.3-32-32-32l-64 0z" + ] + [] + ] + } + + +thumbsDown : SvgTypes.OuterPart msg -> Element msg +thumbsDown inner = + HeSvg.buildSvg inner + { svgAttributes = + [ SvgAttr.viewBox "0 0 640 512" + , SvgAttr.fill "currentColor" + ] + , svg = + [ path + [ SvgAttr.d "M323.8 477.2c-38.2 10.9-78.1-11.2-89-49.4l-5.7-20c-3.7-13-10.4-25-19.5-35l-51.3-56.4c-8.9-9.8-8.2-25 1.6-33.9s25-8.2 33.9 1.6l51.3 56.4c14.1 15.5 24.4 34 30.1 54.1l5.7 20c3.6 12.7 16.9 20.1 29.7 16.5s20.1-16.9 16.5-29.7l-5.7-20c-5.7-19.9-14.7-38.7-26.6-55.5c-5.2-7.3-5.8-16.9-1.7-24.9s12.3-13 21.3-13L448 288c8.8 0 16-7.2 16-16c0-6.8-4.3-12.7-10.4-15c-7.4-2.8-13-9-14.9-16.7s.1-15.8 5.3-21.7c2.5-2.8 4-6.5 4-10.6c0-7.8-5.6-14.3-13-15.7c-8.2-1.6-15.1-7.3-18-15.2s-1.6-16.7 3.6-23.3c2.1-2.7 3.4-6.1 3.4-9.9c0-6.7-4.2-12.6-10.2-14.9c-11.5-4.5-17.7-16.9-14.4-28.8c.4-1.3 .6-2.8 .6-4.3c0-8.8-7.2-16-16-16l-97.5 0c-12.6 0-25 3.7-35.5 10.7l-61.7 41.1c-11 7.4-25.9 4.4-33.3-6.7s-4.4-25.9 6.7-33.3l61.7-41.1c18.4-12.3 40-18.8 62.1-18.8L384 32c34.7 0 62.9 27.6 64 62c14.6 11.7 24 29.7 24 50c0 4.5-.5 8.8-1.3 13c15.4 11.7 25.3 30.2 25.3 51c0 6.5-1 12.8-2.8 18.7C504.8 238.3 512 254.3 512 272c0 35.3-28.6 64-64 64l-92.3 0c4.7 10.4 8.7 21.2 11.8 32.2l5.7 20c10.9 38.2-11.2 78.1-49.4 89zM32 384c-17.7 0-32-14.3-32-32L0 128c0-17.7 14.3-32 32-32l64 0c17.7 0 32 14.3 32 32l0 224c0 17.7-14.3 32-32 32l-64 0z" + ] + [] + ] + } diff --git a/templates/elm/frontend/src/Config/Style/Icons/Types.elm b/templates/elm/frontend/src/Config/Style/Icons/Types.elm new file mode 100755 index 0000000..78633a7 --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Icons/Types.elm @@ -0,0 +1,28 @@ +module Config.Style.Icons.Types exposing + ( InnerPart + , OuterPart + ) + +{-| The types used for SVG management. +-} + +import Element exposing (Attribute) +import Shared exposing (Model) +import Svg exposing (svg) + + +{-| The outer record for the SVG builder. This is explained in ../Helpers/Svg.elm. +-} +type alias OuterPart msg = + { elementAttributes : List (Element.Attribute msg) + , sharedModel : Shared.Model + , svgAttributes : List (Svg.Attribute msg) + } + + +{-| The inner record for the SVG builder. This is explained in ../Helpers/Svg.elm. +-} +type alias InnerPart msg = + { svgAttributes : List (Svg.Attribute msg) + , svg : List (Svg.Svg msg) + } diff --git a/templates/elm/frontend/src/Config/Style/Transitions.elm b/templates/elm/frontend/src/Config/Style/Transitions.elm new file mode 100755 index 0000000..9d11432 --- /dev/null +++ b/templates/elm/frontend/src/Config/Style/Transitions.elm @@ -0,0 +1,69 @@ +module Config.Style.Transitions exposing (..) + +import Config.Style.Colour.Helpers exposing (colourTheme) +import Config.Style.Glow + exposing + ( glowDeepDarkGrey + , glowDeepDarkOrange + ) +import Element + exposing + ( Attribute + , htmlAttribute + , mouseOver + ) +import Element.Background as B exposing (color) +import Element.Border as D exposing (color) +import Element.Font as F exposing (color) +import Html.Attributes as H exposing (style) + + +transitionStyleSlow : Attribute msg +transitionStyleSlow = + htmlAttribute <| style "transition" "all 0.4s ease-in-out" + + +transitionStyleMedium : Attribute msg +transitionStyleMedium = + htmlAttribute <| style "transition" "all 0.2s ease-in-out" + + +transitionStyleFast : Attribute msg +transitionStyleFast = + htmlAttribute <| style "transition" "all 0.1s ease-in-out" + + +specialNavbarTransition : Attribute msg +specialNavbarTransition = + htmlAttribute <| style "transition" "opacity .4s" + + + +-- This special transition is needed to avoid weird animation sequencing rather in Chrome-based browsers. + + +hoverFontLightOrange : Attribute msg +hoverFontLightOrange = + mouseOver [ F.color colourTheme.textLightOrange ] + + +hoverFontDarkOrange : Attribute msg +hoverFontDarkOrange = + mouseOver [ F.color colourTheme.textDarkOrange ] + + +hoverCircleButtonDarkOrange : Attribute msg +hoverCircleButtonDarkOrange = + mouseOver + [ D.color colourTheme.textDarkOrange + , B.color colourTheme.textDarkOrange + , glowDeepDarkOrange + ] + + +hoverPageButtonDeepDarkOrange : Attribute msg +hoverPageButtonDeepDarkOrange = + mouseOver + [ B.color colourTheme.textDeepDarkOrange + , F.color colourTheme.textLightOrange + ] diff --git a/templates/elm/frontend/src/Effect.elm b/templates/elm/frontend/src/Effect.elm new file mode 100644 index 0000000..996fbcf --- /dev/null +++ b/templates/elm/frontend/src/Effect.elm @@ -0,0 +1,194 @@ +module Effect exposing + ( Effect + , none, batch + , sendCmd, sendMsg + , pushRoute, replaceRoute, loadExternalUrl + , map, toCmd + ) + +{-| + +@docs Effect +@docs none, batch +@docs sendCmd, sendMsg +@docs pushRoute, replaceRoute, loadExternalUrl + +@docs map, toCmd + +-} + +import Browser.Navigation +import Dict exposing (Dict) +import Route exposing (Route) +import Route.Path +import Shared.Model +import Shared.Msg +import Task +import Url exposing (Url) + + +type Effect msg + = -- BASICS + None + | Batch (List (Effect msg)) + | SendCmd (Cmd msg) + -- ROUTING + | PushUrl String + | ReplaceUrl String + | LoadExternalUrl String + -- SHARED + | SendSharedMsg Shared.Msg.Msg + + + +-- BASICS + + +{-| Don't send any effect. +-} +none : Effect msg +none = + None + + +{-| Send multiple effects at once. +-} +batch : List (Effect msg) -> Effect msg +batch = + Batch + + +{-| Send a normal `Cmd msg` as an effect, something like `Http.get` or `Random.generate`. +-} +sendCmd : Cmd msg -> Effect msg +sendCmd = + SendCmd + + +{-| Send a message as an effect. Useful when emitting events from UI components. +-} +sendMsg : msg -> Effect msg +sendMsg msg = + Task.succeed msg + |> Task.perform identity + |> SendCmd + + + +-- ROUTING + + +{-| Set the new route, and make the back button go back to the current route. +-} +pushRoute : + { path : Route.Path.Path + , query : Dict String String + , hash : Maybe String + } + -> Effect msg +pushRoute route = + PushUrl (Route.toString route) + +{-| Set given path as route (without any query params or hash), and make the back button go back to the current route. +-} +pushPath : + Route.Path.Path + -> Effect msg +pushPath path = + PushUrl (Route.toString { path = path, query = Dict.empty, hash = Nothing }) + +{-| Set the new route, but replace the previous one, so clicking the back +button **won't** go back to the previous route. +-} +replaceRoute : + { path : Route.Path.Path + , query : Dict String String + , hash : Maybe String + } + -> Effect msg +replaceRoute route = + ReplaceUrl (Route.toString route) + +{-| Set given path as route (without any query params or hash), but replace the previous route, +so clicking the back button **won't** go back to the previous route +-} +replacePath : + Route.Path.Path + -> Effect msg +replacePath path = + ReplaceUrl (Route.toString { path = path, query = Dict.empty, hash = Nothing }) + +{-| Redirect users to a new URL, somewhere external your web application. +-} +loadExternalUrl : String -> Effect msg +loadExternalUrl = + LoadExternalUrl + + + +-- INTERNALS + + +{-| Elm Land depends on this function to connect pages and layouts +together into the overall app. +-} +map : (msg1 -> msg2) -> Effect msg1 -> Effect msg2 +map fn effect = + case effect of + None -> + None + + Batch list -> + Batch (List.map (map fn) list) + + SendCmd cmd -> + SendCmd (Cmd.map fn cmd) + + PushUrl url -> + PushUrl url + + ReplaceUrl url -> + ReplaceUrl url + + LoadExternalUrl url -> + LoadExternalUrl url + + SendSharedMsg sharedMsg -> + SendSharedMsg sharedMsg + + +{-| Elm Land depends on this function to perform your effects. +-} +toCmd : + { key : Browser.Navigation.Key + , url : Url + , shared : Shared.Model.Model + , fromSharedMsg : Shared.Msg.Msg -> msg + , batch : List msg -> msg + , toCmd : msg -> Cmd msg + } + -> Effect msg + -> Cmd msg +toCmd options effect = + case effect of + None -> + Cmd.none + + Batch list -> + Cmd.batch (List.map (toCmd options) list) + + SendCmd cmd -> + cmd + + PushUrl url -> + Browser.Navigation.pushUrl options.key url + + ReplaceUrl url -> + Browser.Navigation.replaceUrl options.key url + + LoadExternalUrl url -> + Browser.Navigation.load url + + SendSharedMsg sharedMsg -> + Task.succeed sharedMsg + |> Task.perform options.fromSharedMsg diff --git a/templates/elm/frontend/src/Pages/Home_.elm b/templates/elm/frontend/src/Pages/Home_.elm new file mode 100644 index 0000000..4f8998d --- /dev/null +++ b/templates/elm/frontend/src/Pages/Home_.elm @@ -0,0 +1,70 @@ +module Pages.Home_ exposing (Model, Msg, page) + +import Effect exposing (Effect) +import Route exposing (Route) +import Html +import Page exposing (Page) +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 + } + + + +-- 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 = "Pages.Home_" + , body = [ Html.text "/" ] + } diff --git a/templates/elm/frontend/src/Pages/NotFound_.elm b/templates/elm/frontend/src/Pages/NotFound_.elm new file mode 100644 index 0000000..0550ed9 --- /dev/null +++ b/templates/elm/frontend/src/Pages/NotFound_.elm @@ -0,0 +1,69 @@ +module Pages.NotFound_ exposing (Model, Msg, page) + +import Effect exposing (Effect) +import Html exposing (..) +import Page exposing (Page) +import Route exposing (Route) +import Route.Path +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 + } + + + +-- 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 = + View.fromString "Page not found" diff --git a/templates/elm/frontend/src/Shared.elm b/templates/elm/frontend/src/Shared.elm new file mode 100644 index 0000000..348e72f --- /dev/null +++ b/templates/elm/frontend/src/Shared.elm @@ -0,0 +1,74 @@ +module Shared exposing + ( Flags, decoder + , Model, Msg + , init, update, subscriptions + ) + +{-| + +@docs Flags, decoder +@docs Model, Msg +@docs init, update, subscriptions + +-} + +import Effect exposing (Effect) +import Json.Decode +import Route exposing (Route) +import Route.Path +import Shared.Model +import Shared.Msg + + + +-- FLAGS + + +type alias Flags = + {} + + +decoder : Json.Decode.Decoder Flags +decoder = + Json.Decode.succeed {} + + + +-- INIT + + +type alias Model = + Shared.Model.Model + + +init : Result Json.Decode.Error Flags -> Route () -> ( Model, Effect Msg ) +init flagsResult route = + ( {} + , Effect.none + ) + + + +-- UPDATE + + +type alias Msg = + Shared.Msg.Msg + + +update : Route () -> Msg -> Model -> ( Model, Effect Msg ) +update route msg model = + case msg of + Shared.Msg.NoOp -> + ( model + , Effect.none + ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Route () -> Model -> Sub Msg +subscriptions route model = + Sub.none diff --git a/templates/elm/frontend/src/Shared/Model.elm b/templates/elm/frontend/src/Shared/Model.elm new file mode 100644 index 0000000..bebb739 --- /dev/null +++ b/templates/elm/frontend/src/Shared/Model.elm @@ -0,0 +1,14 @@ +module Shared.Model exposing (Model) + +{-| -} + + +{-| Normally, this value would live in "Shared.elm" +but that would lead to a circular dependency import cycle. + +For that reason, both `Shared.Model` and `Shared.Msg` are in their +own file, so they can be imported by `Effect.elm` + +-} +type alias Model = + {} diff --git a/templates/elm/frontend/src/Shared/Msg.elm b/templates/elm/frontend/src/Shared/Msg.elm new file mode 100644 index 0000000..0277660 --- /dev/null +++ b/templates/elm/frontend/src/Shared/Msg.elm @@ -0,0 +1,14 @@ +module Shared.Msg exposing (Msg(..)) + +{-| -} + + +{-| Normally, this value would live in "Shared.elm" +but that would lead to a circular dependency import cycle. + +For that reason, both `Shared.Model` and `Shared.Msg` are in their +own file, so they can be imported by `Effect.elm` + +-} +type Msg + = NoOp diff --git a/templates/elm/frontend/src/View.elm b/templates/elm/frontend/src/View.elm new file mode 100644 index 0000000..e5c695f --- /dev/null +++ b/templates/elm/frontend/src/View.elm @@ -0,0 +1,72 @@ +module View exposing + ( View, map + , none, fromString + , toBrowserDocument + ) + +{-| + +@docs View, map +@docs none, fromString +@docs toBrowserDocument + +-} + +import Browser +import Html exposing (Html) +import Route exposing (Route) +import Shared.Model + + +type alias View msg = + { title : String + , body : List (Html msg) + } + + +{-| Used internally by Elm Land to create your application +so it works with Elm's expected `Browser.Document msg` type. +-} +toBrowserDocument : + { shared : Shared.Model.Model + , route : Route () + , view : View msg + } + -> Browser.Document msg +toBrowserDocument { view } = + { title = view.title + , body = view.body + } + + +{-| Used internally by Elm Land to connect your pages together. +-} +map : (msg1 -> msg2) -> View msg1 -> View msg2 +map fn view = + { title = view.title + , body = List.map (Html.map fn) view.body + } + + +{-| Used internally by Elm Land whenever transitioning between +authenticated pages. +-} +none : View msg +none = + { title = "" + , body = [] + } + + +{-| If you customize the `View` module, anytime you run `elm-land add page`, +the generated page will use this when adding your `view` function. + +That way your app will compile after adding new pages, and you can see +the new page working in the web browser! + +-} +fromString : String -> View msg +fromString moduleName = + { title = moduleName + , body = [ Html.text moduleName ] + } diff --git a/templates/elm/frontend/src/interop.ts b/templates/elm/frontend/src/interop.ts new file mode 100644 index 0000000..d7f4b56 --- /dev/null +++ b/templates/elm/frontend/src/interop.ts @@ -0,0 +1,25 @@ +// This returns the flags passed into your Elm application +export const flags = async ({ env } : ElmLand.FlagsArgs) => { + return {} +} + +// This function is called after your Elm app starts +export const onReady = ({ app, env } : ElmLand.OnReadyArgs) => { + console.log('Elm is ready', app) +} + + +// Type definitions for Elm Land +namespace ElmLand { + export type FlagsArgs = { + env: Record + } + export type OnReadyArgs = { + env: Record + app: { ports?: Record } + } + export type Port = { + send?: (data: unknown) => void + subscribe?: (callback: (data: unknown) => unknown) => void + } +} \ No newline at end of file