Skip to content

Instantly share code, notes, and snippets.

@pdamoc
Created May 16, 2016 07:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pdamoc/c07eee6b7ab761853d59d8db01d89b71 to your computer and use it in GitHub Desktop.
Save pdamoc/c07eee6b7ab761853d59d8db01d89b71 to your computer and use it in GitHub Desktop.
Flex layout helper
module Flexy
( Design, design
, row, column, rowReverse, columnReverse
, wrap, wrapReverse, noWrap
, justifyStart, justifyCenter, justifyEnd, justifyBetween, justifyAround
, alignItemsStart, alignItemsCenter, alignItemsEnd
, alignItemsStretch, alignItemsBaseline
, alignContentStart, alignContentCenter, alignContentEnd, alignContentStretch
, alignContentBetween, alignContentAround
, flex, order
, alignSelfStart, alignSelfCenter, alignSelfEnd, alignSelfStretch, alignSelfBaseline
, fullscreen
) where
{-| Module Flexy
# Types
@docs Design
# Functions
@docs design, row, column, rowReverse, columnReverse, wrap, wrapReverse, noWrap
@docs justifyStart, justifyCenter, justifyEnd, justifyBetween, justifyAround
@docs alignItemsStart, alignItemsCenter, alignItemsEnd, alignItemsStretch, alignItemsBaseline
@docs alignContentStart, alignContentCenter, alignContentEnd, alignContentStretch, alignContentBetween, alignContentAround
@docs flex, order, alignSelfStart, alignSelfCenter, alignSelfEnd, alignSelfStretch, alignSelfBaseline
# Values
@docs fullscreen
-}
import Html exposing (Attribute)
import Html.Attributes exposing (style)
import Vendor exposing (prefix, Prefix(Webkit))
{-| -}
type alias Design = List (String, String)
{-| -}
dp : Int -> String
dp v = (toString v) ++ "px"
{-| -}
design : Design -> Attribute
design design =
style
([("display", if prefix == Webkit then "-webkit-flex" else "flex")]
++ design)
direction : (String, String, String) -> Design -> Design
direction (boxDirection, boxOrientation, value) design =
[ ("-webkit-box-direction", boxDirection)
, ("-webkit-box-orient", boxOrientation)
, ("-webkit-flex-direction", value)
, ("-ms-flex-direction", value)
, ("flex-direction", value)
] ++ design
{-| -}
row : Design -> Design
row = direction ("normal", "horizontal", "row")
{-| -}
rowReverse : Design -> Design
rowReverse = direction ("reverse", "horizontal", "row-reverse")
{-| -}
column : Design -> Design
column = direction ("normal", "vertical", "column")
{-| -}
columnReverse : Design -> Design
columnReverse = direction ("reverse", "vertical", "column-reverse")
wrapVendor : (String, String) -> Design -> Design
wrapVendor (vendorValue, value) design =
[ ("-webkit-flex-wrap", value)
, ("-ms-flex-wrap", vendorValue)
, ("flex-wrap", value)
] ++ design
{-| -}
wrap : Design -> Design
wrap = wrapVendor ("wrap", "wrap")
{-| -}
wrapReverse : Design -> Design
wrapReverse = wrapVendor ("wrap-reverse", "wrap-reverse")
{-| -}
noWrap : Design -> Design
noWrap = wrapVendor ("none", "nowrap")
justifyVendor : (String, String, String) -> Design -> Design
justifyVendor (webkitValue, msValue, value) design =
[ ("-webkit-box-pack", webkitValue)
, ("-webkit-justify-content", value)
, ("-ms-flex-pack", msValue)
, ("justify-content", value)
] ++ design
{-| -}
justifyStart : Design -> Design
justifyStart = justifyVendor ("start", "start", "flex-start")
{-| -}
justifyCenter : Design -> Design
justifyCenter = justifyVendor ("center", "center", "center")
{-| -}
justifyEnd : Design -> Design
justifyEnd = justifyVendor ("end", "end", "flex-end")
{-| -}
justifyBetween : Design -> Design
justifyBetween = justifyVendor ("justify", "justify", "space-between")
{-| -}
justifyAround : Design -> Design
justifyAround = justifyVendor ("none", "distribute", "space-around")
alignItemsVendor : (String, String) -> Design -> Design
alignItemsVendor (vendorValue, value) design =
[ ("-webkit-box-align", vendorValue)
, ("-webkit-align-items", value)
, ("-ms-flex-align", vendorValue)
, ("align-items", value)
] ++ design
{-| -}
alignItemsStart : Design -> Design
alignItemsStart = alignItemsVendor ("start", "flex-start")
{-| -}
alignItemsCenter : Design -> Design
alignItemsCenter = alignItemsVendor ("center", "center")
{-| -}
alignItemsEnd : Design -> Design
alignItemsEnd = alignItemsVendor ("end", "flex-end")
{-| -}
alignItemsStretch : Design -> Design
alignItemsStretch = alignItemsVendor ("stretch", "stretch")
{-| -}
alignItemsBaseline : Design -> Design
alignItemsBaseline = alignItemsVendor ("baseline", "baseline")
alignContentVendor : String -> Design -> Design
alignContentVendor value design =
[ ("-webkit-align-content", value)
, ("align-content", value)
] ++ design
{-| -}
alignContentStart : Design -> Design
alignContentStart = alignContentVendor "flex-start"
{-| -}
alignContentCenter : Design -> Design
alignContentCenter = alignContentVendor "center"
{-| -}
alignContentEnd : Design -> Design
alignContentEnd = alignContentVendor "flex-end"
{-| -}
alignContentStretch : Design -> Design
alignContentStretch = alignContentVendor "stretch"
{-| -}
alignContentBetween : Design -> Design
alignContentBetween = alignContentVendor "space-between"
{-| -}
alignContentAround : Design -> Design
alignContentAround = alignContentVendor "space-around"
{-| -}
flex : Float -> Float -> String -> Design -> Design
flex grow shrink basis design =
let
growString =
toString grow
shrinkString =
toString shrink
value =
growString ++ " " ++ shrinkString ++ " " ++ basis
in
[ ("-webkit-box-flex", growString)
, ("-webkit-flex", value)
, ("-ms-flex", value)
, ("flex", value)
] ++ design
{-| -}
order : Int -> Design -> Design
order value design=
let
string =
toString value
in
[ ("-webkit-box-ordinal-group", string)
, ("-webkit-order", string)
, ("-ms-flex-order", string)
, ("-order", string)
] ++ design
alignSelfVendor : String -> Design -> Design
alignSelfVendor value design =
[ ("-webkit-align-self", value)
, ("-ms-flex-item-align", value)
, ("align-self", value)
] ++ design
{-| -}
alignSelfStart : Design -> Design
alignSelfStart = alignSelfVendor "flex-start"
{-| -}
alignSelfCenter : Design -> Design
alignSelfCenter = alignSelfVendor "center"
{-| -}
alignSelfEnd : Design -> Design
alignSelfEnd = alignSelfVendor "flex-end"
{-| -}
alignSelfStretch : Design -> Design
alignSelfStretch = alignSelfVendor "stretch"
{-| -}
alignSelfBaseline : Design -> Design
alignSelfBaseline = alignSelfVendor "baseline"
{-| -}
fullscreen : Design
fullscreen = [ ("width", "100vw"), ("minHeight", "100vh")]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment