@@ -16,7 +16,6 @@ module Internal.Model exposing
16 , LayoutContext(..)
16 , LayoutContext(..)
17 , Length(..)
17 , Length(..)
18 , Location(..)
18 , Location(..)
20 , NodeName(..)
19 , NodeName(..)
21 , Option(..)
20 , Option(..)
22 , OptionRecord
21 , OptionRecord
@@ -42,7 +41,7 @@ module Internal.Model exposing
42 , asParagraph
41 , asParagraph
44 , asTextColumn
43 , asTextColumn
45− , boxShadowClass
44+ , boxShadowName
46 , columnClass
45 , columnClass
47 , composeTransformation
46 , composeTransformation
48 , contextClasses
47 , contextClasses
@@ -79,13 +78,15 @@ module Internal.Model exposing
79 , onlyStyles
78 , onlyStyles
80 , optionsToRecord
79 , optionsToRecord
81 , paddingName
80 , paddingName
83 , pageClass
81 , pageClass
84 , paragraphClass
82 , paragraphClass
85 , reduceRecursive
83 , reduceRecursive
86 , reduceStyles
84 , reduceStyles
87 , reduceStylesRecursive
85 , reduceStylesRecursive
88 , removeNever
86 , removeNever
89 , renderFontClassName
90 , renderFontClassName
90 , renderHeight
91 , renderHeight
91 , renderRoot
92 , renderRoot
@@ -95,8 +96,9 @@ module Internal.Model exposing
95 , rowClass
96 , rowClass
96 , singleClass
97 , singleClass
97 , spacingName
98 , spacingName
99− , textShadowClass
101+ , textShadowName
101 , toStyleSheet
103 , toStyleSheet
102 , transformClass
104 , transformClass
@@ -112,7 +114,7 @@ import Html.Attributes
112import Html.Keyed
114import Html.Keyed
113import Internal.Flag as Flag exposing (Flag)
115import Internal.Flag as Flag exposing (Flag)
114import Internal.Style exposing (classes, dot)
116import Internal.Style exposing (classes, dot)
115−import Json.Encode as Encode
117+import Json.Encode as Json
116import Set exposing (Set)
118import Set exposing (Set)
117import VirtualDom
119import VirtualDom
@@ -174,7 +176,7 @@ type Style
174 | Colored String String Color
176 | Colored String String Color
175 | SpacingStyle String Int Int
177 | SpacingStyle String Int Int
176 | BorderWidth String Int Int Int Int
178 | BorderWidth String Int Int Int Int
177− | PaddingStyle String Float Float Float Float
179+ | PaddingStyle String Int Int Int Int
178 | GridTemplateStyle
180 | GridTemplateStyle
179 { spacing : ( Length, Length )
181 { spacing : ( Length, Length )
180 , columns : List Length
182 , columns : List Length
@@ -455,10 +457,7 @@ finalizeNode has node attributes children embedMode parentContext =
455 Embedded nodeName internal ->
457 Embedded nodeName internal ->
456 VirtualDom.node nodeName
458 VirtualDom.node nodeName
457 attributes
459 attributes
458− [ createNode internal
459− [ Html.Attributes.class
460− (classes.any ++ " " ++ classes.single)
460+ [ createNode internal [ Html.Attributes.class (classes.any ++ " " ++ classes.single) ]
464 case parentContext of
463 case parentContext of
@@ -535,45 +534,49 @@ finalizeNode has node attributes children embedMode parentContext =
537embedWith static opts styles children =
536embedWith static opts styles children =
541− |> List.foldl reduceStyles ( Set.empty, renderFocusStyle opts.focus )
543− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
545− |> toStyleSheet opts
547 if static then
537 if static then
548− staticRoot opts
538+ staticRoot
549− :: dynamicStyleSheet
539+ :: (styles
540+ |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
542+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
544+ |> toStyleSheet opts
550 :: children
546 :: children
553− dynamicStyleSheet
549+ (styles
550+ |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
552+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
554+ |> toStyleSheet opts
554 :: children
556 :: children
557embedKeyed static opts styles children =
559embedKeyed static opts styles children =
561− |> List.foldl reduceStyles ( Set.empty, renderFocusStyle opts.focus )
563− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
565− |> toStyleSheet opts
567 if static then
560 if static then
568− ( "static-stylesheet", staticRoot opts )
561+ ( "static-stylesheet", staticRoot )
569 :: ( "dynamic-stylesheet"
562 :: ( "dynamic-stylesheet"
570− , dynamicStyleSheet
563+ , styles
564+ |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
566+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
568+ |> toStyleSheet opts
572 :: children
570 :: children
575 ( "dynamic-stylesheet"
573 ( "dynamic-stylesheet"
576− , dynamicStyleSheet
574+ , styles
575+ |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
577+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
579+ |> toStyleSheet opts
578 :: children
581 :: children
@@ -1032,7 +1035,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1033 gatherAttrRecursive (classes ++ " " ++ newClass)
1036 gatherAttrRecursive (classes ++ " " ++ newClass)
1035− (Flag.merge addToFlags (Flag.add Flag.width has))
1038+ (Flag.merge addToFlags has)
1036 transform
1039 transform
1037 (newStyles ++ styles)
1040 (newStyles ++ styles)
@@ -1053,7 +1056,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1054 "height-px-" ++ val
1057 "height-px-" ++ val
1056− gatherAttrRecursive (Internal.Style.classes.heightExact ++ " " ++ name ++ " " ++ classes)
1059+ gatherAttrRecursive (name ++ " " ++ classes)
1058 (Flag.add Flag.height has)
1061 (Flag.add Flag.height has)
1059 transform
1062 transform
@@ -1110,7 +1113,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1111 gatherAttrRecursive (classes ++ " " ++ newClass)
1114 gatherAttrRecursive (classes ++ " " ++ newClass)
1113− (Flag.merge addToFlags (Flag.add Flag.height has))
1116+ (Flag.merge addToFlags has)
1114 transform
1117 transform
1115 (newStyles ++ styles)
1118 (newStyles ++ styles)
@@ -1142,15 +1145,20 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1142 gatherAttrRecursive classes (addNodeName "h6" node) has transform styles attrs children remaining
1145 gatherAttrRecursive classes (addNodeName "h6" node) has transform styles attrs children remaining
1144 Paragraph ->
1147 Paragraph ->
1145− -- previously we rendered a <p> tag, though apparently this invalidates the html if it has <div>s inside.
1148+ let
1146− -- Since we can't guaranteee that there are no divs, we need another strategy.
1149+ newNode =
1147− -- While it's not documented in many places, there apparently is a paragraph aria role
1150+ case node of
1148− -- https://github.com/w3c/aria/blob/11f85f41a5b621fdbe85fc9bcdcd270e653a48ba/common/script/roleInfo.js
1151+ Generic ->
1149− -- Though we'll need to wait till it gets released in an official wai-aria spec to use it.
1152+ NodeName "p"
1150− -- If it's used at the moment, then Lighthouse complains (likely rightfully) that role paragraph is not recognized.
1153+
1151− gatherAttrRecursive
1160+ gatherAttrRecursive classes
1152− classes
1161+ newNode
1155 transform
1163 transform
@@ -1436,7 +1444,7 @@ renderHeight h =
1436 "height-px-" ++ val
1444 "height-px-" ++ val
1438 ( Flag.none
1446 ( Flag.none
1439− , Internal.Style.classes.heightExact ++ " " ++ name
1447+ , name
1440 , [ Single name "height" (val ++ "px") ]
1448 , [ Single name "height" (val ++ "px") ]
@@ -1459,7 +1467,7 @@ renderHeight h =
1459 , [ Single
1467 , [ Single
1460 (Internal.Style.classes.any
1468 (Internal.Style.classes.any
1462− ++ Internal.Style.classes.column
1470+ ++ Internal.Style.classes.row
1463 ++ " > "
1471 ++ " > "
1464 ++ (Internal.Style.dot <| "height-fill-" ++ String.fromInt portion)
1472 ++ (Internal.Style.dot <| "height-fill-" ++ String.fromInt portion)
@@ -1478,9 +1486,7 @@ renderHeight h =
1480 "min-height"
1488 "min-height"
1481− -- This needs to be !important because we're using `min-height: min-content`
1482− -- to correct for safari's incorrect implementation of flexbox.
1483− (String.fromInt minSize ++ "px !important")
1489+ (String.fromInt minSize ++ "px")
1485 ( newFlag, newAttrs, newStyle ) =
1491 ( newFlag, newAttrs, newStyle ) =
1486 renderHeight len
1492 renderHeight len
@@ -1817,20 +1823,8 @@ defaultOptions =
1820−staticRoot : OptionRecord -> VirtualDom.Node msg
1826+staticRoot =
1824− -- wrap the style node in a div to prevent `Dark Reader` from blowin up the dom.
1825− VirtualDom.node "div"
1827− [ VirtualDom.node "style" [] [ VirtualDom.text Internal.Style.rules ] ]
1827+ VirtualDom.node "style" [] [ VirtualDom.text Internal.Style.rules ]
1829− NoStaticStyleSheet ->
1833− VirtualDom.node "elm-ui-static-rules" [ VirtualDom.property "rules" (Encode.string Internal.Style.rules) ] []
1836addWhen ifThis x to =
1830addWhen ifThis x to =
@@ -1948,7 +1942,7 @@ type Spacing
1950type Padding
1944type Padding
1951− = Padding String Float Float Float Float
1945+ = Padding String Int Int Int Int
1954extractSpacingAndPadding : List (Attribute aligned msg) -> ( Maybe Padding, Maybe Spacing )
1948extractSpacingAndPadding : List (Attribute aligned msg) -> ( Maybe Padding, Maybe Spacing )
@@ -2044,44 +2038,34 @@ getHeight attrs =
2047−textElementClasses : String
2048−textElementClasses =
2053− ++ classes.widthContent
2055− ++ classes.heightContent
2058textElement : String -> VirtualDom.Node msg
2041textElement : String -> VirtualDom.Node msg
2059textElement str =
2042textElement str =
2060 Html.div
2043 Html.div
2061 [ Html.Attributes.class
2044 [ Html.Attributes.class
2062− textElementClasses
2045+ (String.join " "
2048+ , classes.widthContent
2049+ , classes.heightContent
2064 [ Html.text str ]
2053 [ Html.text str ]
2067−textElementFillClasses : String
2068−textElementFillClasses =
2073− ++ classes.widthFill
2075− ++ classes.heightFill
2078textElementFill : String -> VirtualDom.Node msg
2056textElementFill : String -> VirtualDom.Node msg
2079textElementFill str =
2057textElementFill str =
2080− Html.div
2058+ VirtualDom.node "div"
2081 [ Html.Attributes.class
2059 [ Html.Attributes.class
2082− textElementFillClasses
2060+ (String.join " "
2063+ , classes.widthFill
2064+ , classes.heightFill
2084− [ Html.text str ]
2068+ [ VirtualDom.text str ]
2087type Children x
2071type Children x
@@ -2089,6 +2073,10 @@ type Children x
2089 | Keyed (List ( String, x ))
2073 | Keyed (List ( String, x ))
2077+-- toHtml : OptionRecord -> Element msg -> VirtualDom.Node msg
2092toHtml mode el =
2080toHtml mode el =
2093 case el of
2081 case el of
2094 Unstyled html ->
2082 Unstyled html ->
@@ -2124,7 +2112,8 @@ renderRoot optionList attributes child =
2126type RenderMode
2114type RenderMode
2127− = Layout
2116+ | Layout
2128 | NoStaticStyleSheet
2117 | NoStaticStyleSheet
2129 | WithVirtualCss
2118 | WithVirtualCss
@@ -2173,8 +2162,8 @@ rootStyle =
2173 , SansSerif
2162 , SansSerif
2176− [ StyleClass Flag.bgColor (Colored ("bg-" ++ formatColorClass (Rgba 1 1 1 0)) "background-color" (Rgba 1 1 1 0))
2165+ [ StyleClass Flag.bgColor (Colored ("bg-color-" ++ formatColorClass (Rgba 1 1 1 0)) "background-color" (Rgba 1 1 1 0))
2177− , StyleClass Flag.fontColor (Colored ("fc-" ++ formatColorClass (Rgba 0 0 0 1)) "color" (Rgba 0 0 0 1))
2166+ , StyleClass Flag.fontColor (Colored ("font-color-" ++ formatColorClass (Rgba 0 0 0 1)) "color" (Rgba 0 0 0 1))
2178 , StyleClass Flag.fontSize (FontSize 20)
2167 , StyleClass Flag.fontSize (FontSize 20)
2179 , StyleClass Flag.fontFamily <|
2168 , StyleClass Flag.fontFamily <|
2180 FontFamily (List.foldl renderFontClassName "font-" families)
2169 FontFamily (List.foldl renderFontClassName "font-" families)
@@ -2217,38 +2206,9 @@ renderFontClassName font current =
2218renderFocusStyle :
2207renderFocusStyle :
2219 FocusStyle
2208 FocusStyle
2220− -> List Style
2209+ -> Style
2221renderFocusStyle focus =
2210renderFocusStyle focus =
2222− [ Style (Internal.Style.dot classes.focusedWithin ++ ":focus-within")
2223− (List.filterMap identity
2224− [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
2225− , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
2228− Property "box-shadow"
2230− { color = shadow.color
2233− |> Tuple.mapFirst toFloat
2234− |> Tuple.mapSecond toFloat
2237− toFloat shadow.blur
2239− toFloat shadow.size
2244− , Just <| Property "outline" "none"
2248− ((Internal.Style.dot classes.any ++ ":focus .focusable, ")
2249− ++ (Internal.Style.dot classes.any ++ ".focusable:focus, ")
2211+ Style (Internal.Style.dot classes.any ++ ":focus .focusable, " ++ Internal.Style.dot classes.any ++ ".focusable:focus")
2250− ++ (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb")
2252 (List.filterMap identity
2212 (List.filterMap identity
2253 [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
2213 [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
2254 , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
2214 , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
@@ -2271,7 +2231,6 @@ renderFocusStyle focus =
2271 , Just <| Property "outline" "none"
2231 , Just <| Property "outline" "none"
2277focusDefaultStyle : { backgroundColor : Maybe Color, borderColor : Maybe Color, shadow : Maybe Shadow }
2236focusDefaultStyle : { backgroundColor : Maybe Color, borderColor : Maybe Color, shadow : Maybe Shadow }
@@ -2283,7 +2242,7 @@ focusDefaultStyle =
2283 { color =
2242 { color =
2284 Rgba (155 / 255) (203 / 255) 1 1
2243 Rgba (155 / 255) (203 / 255) 1 1
2285 , offset = ( 0, 0 )
2244 , offset = ( 0, 0 )
2286− , blur = 0
2245+ , blur = 3
2287 , size = 3
2246 , size = 3
@@ -2353,31 +2312,7 @@ optionsToRecord options =
2354toStyleSheet : OptionRecord -> List Style -> VirtualDom.Node msg
2313toStyleSheet : OptionRecord -> List Style -> VirtualDom.Node msg
2355toStyleSheet options styleSheet =
2314toStyleSheet options styleSheet =
2356− case options.mode of
2358− -- wrap the style node in a div to prevent `Dark Reader` from blowin up the dom.
2359− VirtualDom.node "div"
2361− [ VirtualDom.node "style"
2363− [ VirtualDom.text (toStyleSheetString options styleSheet) ]
2366− NoStaticStyleSheet ->
2367− -- wrap the style node in a div to prevent `Dark Reader` from blowin up the dom.
2368− VirtualDom.node "div"
2370− [ VirtualDom.node "style"
2372− [ VirtualDom.text (toStyleSheetString options styleSheet) ]
2315+ VirtualDom.node "style" [] [ VirtualDom.text (toStyleSheetString options styleSheet) ]
2376− VirtualDom.node "elm-ui-rules"
2377− [ VirtualDom.property "rules"
2378− (encodeStyles options styleSheet)
2383renderTopLevelValues rules =
2318renderTopLevelValues rules =
@@ -2593,492 +2528,489 @@ renderProps force (Property key val) existing =
2593 existing ++ "\n " ++ key ++ ": " ++ val ++ ";"
2528 existing ++ "\n " ++ key ++ ": " ++ val ++ ";"
2596−encodeStyles options stylesheet =
2602− renderStyleRule options style Nothing
2604− ( getStyleName style, Encode.list Encode.string styled )
2609toStyleSheetString : OptionRecord -> List Style -> String
2531toStyleSheetString : OptionRecord -> List Style -> String
2610toStyleSheetString options stylesheet =
2532toStyleSheetString options stylesheet =
2612− combine style rendered =
2534+ renderStyle maybePseudo selector props =
2613− { rules = rendered.rules ++ renderStyleRule options style Nothing
2535+ case maybePseudo of
2615− case topLevelValue style of
2616− Nothing ->
2536+ Nothing ->
2617− rendered.topLevel
2537+ selector ++ "{" ++ List.foldl (renderProps False) "" props ++ "\n}"
2619− Just topLevel ->
2539+ Just pseudo ->
2620− topLevel :: rendered.topLevel
2540+ case pseudo of
2622− in
2542+ case options.hover of
2623− case List.foldl combine { topLevel = [], rules = [] } stylesheet of
2543+ NoHover ->
2624− { topLevel, rules } ->
2544+ ""
2625− renderTopLevelValues topLevel ++ String.concat rules
2547+ selector ++ "-hv {" ++ List.foldl (renderProps True) "" props ++ "\n}"
2628−renderStyle : OptionRecord -> Maybe PseudoClass -> String -> List Property -> List String
2549+ AllowHover ->
2629−renderStyle options maybePseudo selector props =
2630− case maybePseudo of
2632− [ selector ++ "{" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2550+ selector ++ "-hv:hover {" ++ List.foldl (renderProps False) "" props ++ "\n}"
2634− Just pseudo ->
2552+ Focus ->
2635− case pseudo of
2553+ let
2636− Hover ->
2554+ renderedProps =
2637− case options.hover of
2555+ List.foldl (renderProps False) "" props
2566+ ++ "-fs:not(.focus) {"
2576+ , ".focusable-parent:focus ~ "
2641− ForceHover ->
2586+ Active ->
2642− [ selector ++ "-hv {" ++ List.foldl (renderProps True) "" props ++ "\n}" ]
2587+ selector ++ "-act:active {" ++ List.foldl (renderProps False) "" props ++ "\n}"
2644− AllowHover ->
2589+ renderStyleRule rule maybePseudo =
2645− [ selector ++ "-hv:hover {" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2590+ case rule of
2591+ Style selector props ->
2592+ renderStyle maybePseudo selector props
2647− Focus ->
2594+ Shadows name prop ->
2598+ [ Property "box-shadow" prop
2601+ Transparency name transparency ->
2649− renderedProps =
2603+ opacity =
2650− List.foldl (renderProps False) "" props
2604+ (1 - transparency)
2652− [ selector ++ "-fs:focus {" ++ renderedProps ++ "\n}"
2608+ renderStyle
2653− , ("." ++ classes.any ++ ":focus " ++ selector ++ "-fs {")
2609+ maybePseudo
2656− , (selector ++ "-fs:focus-within {")
2659− , (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb" ++ selector ++ "-fs {")
2665− [ selector ++ "-act:active {" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2668−renderStyleRule : OptionRecord -> Style -> Maybe PseudoClass -> List String
2669−renderStyleRule options rule maybePseudo =
2671− Style selector props ->
2672− renderStyle options maybePseudo selector props
2674− Shadows name prop ->
2675− renderStyle options
2677− ("." ++ name)
2610+ ("." ++ name)
2678− [ Property "box-shadow" prop
2681− Transparency name transparency ->
2688− renderStyle options
2691− [ Property "opacity" (String.fromFloat opacity)
2611+ [ Property "opacity" (String.fromFloat opacity)
2695− renderStyle options
2697− (".font-size-" ++ String.fromInt i)
2698− [ Property "font-size" (String.fromInt i ++ "px")
2701− FontFamily name typefaces ->
2705− |> List.filterMap renderVariants
2706− |> String.join ", "
2709− [ Property "font-family"
2711− |> List.map fontName
2712− |> String.join ", "
2714− , Property "font-feature-settings" features
2715− , Property "font-variant"
2716− (if List.any hasSmallCaps typefaces then
2724− renderStyle options
2729− Single class prop val ->
2730− renderStyle options
2733− [ Property prop val
2736− Colored class prop color ->
2737− renderStyle options
2740− [ Property prop (formatColor color)
2743− SpacingStyle cls x y ->
2749− String.fromFloat (toFloat x / 2) ++ "px"
2751− halfY =
2614+ FontSize i ->
2752− String.fromFloat (toFloat y / 2) ++ "px"
2615+ renderStyle
2617+ (".font-size-" ++ String.fromInt i)
2618+ [ Property "font-size" (String.fromInt i ++ "px")
2754− xPx =
2621+ FontFamily name typefaces ->
2625+ |> List.filterMap renderVariants
2755− String.fromInt x ++ "px"
2626+ |> String.join ", "
2629+ [ Property "font-family"
2631+ |> List.map fontName
2632+ |> String.join ", "
2634+ , Property "font-feature-settings" features
2635+ , Property "font-variant"
2636+ (if List.any hasSmallCaps typefaces then
2758− String.fromInt y ++ "px"
2644+ String.join " "
2760− row =
2651+ Single class prop val ->
2761− "." ++ Internal.Style.classes.row
2652+ renderStyle
2655+ [ Property prop val
2763− wrappedRow =
2658+ Colored class prop color ->
2764− "." ++ Internal.Style.classes.wrapped ++ row
2659+ renderStyle
2662+ [ Property prop (formatColor color)
2766− column =
2665+ SpacingStyle cls x y ->
2767− "." ++ Internal.Style.classes.column
2666+ let
2769− page =
2670+ halfX =
2770− "." ++ Internal.Style.classes.page
2671+ String.fromFloat (toFloat x / 2) ++ "px"
2772− paragraph =
2673+ halfY =
2773− "." ++ Internal.Style.classes.paragraph
2674+ String.fromFloat (toFloat y / 2) ++ "px"
2776− "." ++ Internal.Style.classes.alignLeft
2677+ String.fromInt x ++ "px"
2779− "." ++ Internal.Style.classes.alignRight
2680+ String.fromInt y ++ "px"
2782− "." ++ Internal.Style.classes.any
2683+ "." ++ Internal.Style.classes.row
2784− single =
2685+ wrappedRow =
2785− "." ++ Internal.Style.classes.single
2686+ "." ++ Internal.Style.classes.wrapped ++ row
2788− [ renderStyle options maybePseudo (class ++ row ++ " > " ++ any ++ " + " ++ any) [ Property "margin-left" xPx ]
2790− -- margins don't apply to last element of normal, unwrapped rows
2791− -- , renderStyle options maybePseudo (class ++ row ++ " > " ++ any ++ ":first-child") [ Property "margin" "0" ]
2792− -- For wrapped rows, margins always apply because we handle "canceling out" the other margins manually in the element.
2793− , renderStyle options
2795− (class ++ wrappedRow ++ " > " ++ any)
2796− [ Property "margin" (halfY ++ " " ++ halfX)
2799− -- , renderStyle options maybePseudo
2688+ column =
2800− -- (class ++ wrappedRow ++ " > " ++ any ++ ":last-child")
2689+ "." ++ Internal.Style.classes.column
2801− -- [ Property "margin-right" "0"
2804− , renderStyle options maybePseudo (class ++ column ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2805− , renderStyle options maybePseudo (class ++ page ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2806− , renderStyle options maybePseudo (class ++ page ++ " > " ++ left) [ Property "margin-right" xPx ]
2807− , renderStyle options maybePseudo (class ++ page ++ " > " ++ right) [ Property "margin-left" xPx ]
2808− , renderStyle options
2810− (class ++ paragraph)
2811− [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2813− , renderStyle options
2815− ("textarea" ++ any ++ class)
2816− [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2817− , Property "height" ("calc(100% + " ++ String.fromInt y ++ "px)")
2820− -- , renderStyle options
2691+ page =
2821− -- maybePseudo
2692+ "." ++ Internal.Style.classes.page
2822− -- (class ++ paragraph ++ " > " ++ any)
2823− -- [ Property "margin-right" xPx
2824− -- , Property "margin-bottom" yPx
2826− , renderStyle options
2828− (class ++ paragraph ++ " > " ++ left)
2829− [ Property "margin-right" xPx
2831− , renderStyle options
2833− (class ++ paragraph ++ " > " ++ right)
2834− [ Property "margin-left" xPx
2836− , renderStyle options
2838− (class ++ paragraph ++ "::after")
2839− [ Property "content" "''"
2840− , Property "display" "block"
2841− , Property "height" "0"
2842− , Property "width" "0"
2843− , Property "margin-top" (String.fromInt (-1 * (y // 2)) ++ "px")
2845− , renderStyle options
2847− (class ++ paragraph ++ "::before")
2848− [ Property "content" "''"
2849− , Property "display" "block"
2850− , Property "height" "0"
2851− , Property "width" "0"
2852− , Property "margin-bottom" (String.fromInt (-1 * (y // 2)) ++ "px")
2856− PaddingStyle cls top right bottom left ->
2694+ paragraph =
2857− let
2695+ "." ++ Internal.Style.classes.paragraph
2862− renderStyle options
2865− [ Property "padding"
2866− (String.fromFloat top
2868− ++ String.fromFloat right
2870− ++ String.fromFloat bottom
2872− ++ String.fromFloat left
2877− BorderWidth cls top right bottom left ->
2697+ left =
2878− let
2698+ "." ++ Internal.Style.classes.alignLeft
2883− renderStyle options
2886− [ Property "border-width"
2887− (String.fromInt top
2889− ++ String.fromInt right
2891− ++ String.fromInt bottom
2893− ++ String.fromInt left
2898− GridTemplateStyle template ->
2700+ right =
2899− let
2701+ "." ++ Internal.Style.classes.alignRight
2902− ++ String.join "-" (List.map lengthClassName template.rows)
2904− ++ String.join "-" (List.map lengthClassName template.columns)
2906− ++ lengthClassName (Tuple.first template.spacing)
2908− ++ lengthClassName (Tuple.second template.spacing)
2911− toGridLength (Tuple.second template.spacing)
2914− toGridLength (Tuple.first template.spacing)
2917− toGridLengthHelper Nothing Nothing x
2919− toGridLengthHelper minimum maximum x =
2922− String.fromInt px ++ "px"
2925− case ( minimum, maximum ) of
2926− ( Nothing, Nothing ) ->
2929− ( Just minSize, Nothing ) ->
2930− "minmax(" ++ String.fromInt minSize ++ "px, " ++ "max-content)"
2932− ( Nothing, Just maxSize ) ->
2933− "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2935− ( Just minSize, Just maxSize ) ->
2936− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2939− case ( minimum, maximum ) of
2940− ( Nothing, Nothing ) ->
2941− String.fromInt i ++ "fr"
2943− ( Just minSize, Nothing ) ->
2944− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt i ++ "fr" ++ "fr)"
2946− ( Nothing, Just maxSize ) ->
2947− "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2949− ( Just minSize, Just maxSize ) ->
2950− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2953− toGridLengthHelper (Just m) maximum len
2956− toGridLengthHelper minimum (Just m) len
2960− |> List.map toGridLength
2961− |> String.join ySpacing
2962− |> (\x -> "-ms-grid-columns: " ++ x ++ ";")
2966− |> List.map toGridLength
2967− |> String.join ySpacing
2968− |> (\x -> "-ms-grid-rows: " ++ x ++ ";")
2971− class ++ "{" ++ msColumns ++ msRows ++ "}"
2975− |> List.map toGridLength
2977− |> (\x -> "grid-template-columns: " ++ x ++ ";")
2980− template.rows
2704+ "." ++ Internal.Style.classes.any
2981− |> List.map toGridLength
2983− |> (\x -> "grid-template-rows: " ++ x ++ ";")
2985− gapX =
2706+ single =
2986− "grid-column-gap:" ++ toGridLength (Tuple.first template.spacing) ++ ";"
2707+ "." ++ Internal.Style.classes.single
2710+ [ renderStyle maybePseudo (class ++ row ++ " > " ++ any ++ " + " ++ any) [ Property "margin-left" xPx ]
2712+ -- margins don't apply to last element of normal, unwrapped rows
2713+ -- , renderStyle maybePseudo (class ++ row ++ " > " ++ any ++ ":first-child") [ Property "margin" "0" ]
2714+ -- For wrapped rows, margins always apply because we handle "canceling out" the other margins manually in the element.
2715+ , renderStyle maybePseudo
2716+ (class ++ wrappedRow ++ " > " ++ any)
2717+ [ Property "margin" (halfY ++ " " ++ halfX)
2988− gapY =
2720+ -- , renderStyle maybePseudo
2989− "grid-row-gap:" ++ toGridLength (Tuple.second template.spacing) ++ ";"
2721+ -- (class ++ wrappedRow ++ " > " ++ any ++ ":last-child")
2722+ -- [ Property "margin-right" "0"
2725+ , renderStyle maybePseudo (class ++ column ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2726+ , renderStyle maybePseudo (class ++ page ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2727+ , renderStyle maybePseudo (class ++ page ++ " > " ++ left) [ Property "margin-right" xPx ]
2728+ , renderStyle maybePseudo (class ++ page ++ " > " ++ right) [ Property "margin-left" xPx ]
2731+ (class ++ paragraph)
2732+ [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2736+ ("textarea" ++ class)
2737+ [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2991− modernGrid =
2740+ -- , renderStyle
2992− class ++ "{" ++ columns ++ rows ++ gapX ++ gapY ++ "}"
2741+ -- maybePseudo
2742+ -- (class ++ paragraph ++ " > " ++ any)
2743+ -- [ Property "margin-right" xPx
2744+ -- , Property "margin-bottom" yPx
2748+ (class ++ paragraph ++ " > " ++ left)
2749+ [ Property "margin-right" xPx
2753+ (class ++ paragraph ++ " > " ++ right)
2754+ [ Property "margin-left" xPx
2758+ (class ++ paragraph ++ "::after")
2759+ [ Property "content" "''"
2760+ , Property "display" "block"
2761+ , Property "height" "0"
2762+ , Property "width" "0"
2763+ , Property "margin-top" (String.fromInt (-1 * (y // 2)) ++ "px")
2767+ (class ++ paragraph ++ "::before")
2768+ [ Property "content" "''"
2769+ , Property "display" "block"
2770+ , Property "height" "0"
2771+ , Property "width" "0"
2772+ , Property "margin-bottom" (String.fromInt (-1 * (y // 2)) ++ "px")
2994− supports =
2776+ PaddingStyle cls top right bottom left ->
2995− "@supports (display:grid) {" ++ modernGrid ++ "}"
2777+ let
2997− [ base
2782+ renderStyle
2998− , supports
2783+ maybePseudo
2785+ [ Property "padding"
2786+ (String.fromInt top
2788+ ++ String.fromInt right
2790+ ++ String.fromInt bottom
2792+ ++ String.fromInt left
3001− GridPosition position ->
2797+ BorderWidth cls top right bottom left ->
3003− class =
2799+ class =
3004− ".grid-pos-"
2800+ "."
3005− ++ String.fromInt position.row
2801+ ++ cls
3007− ++ String.fromInt position.col
2803+ renderStyle
3008− ++ "-"
2804+ maybePseudo
3009− ++ String.fromInt position.width
2805+ class
3010− ++ "-"
2806+ [ Property "border-width"
3011− ++ String.fromInt position.height
3016− ++ String.fromInt position.row
2807+ (String.fromInt top
3017− ++ ";"
2808+ ++ "px "
3018− , "-ms-grid-row-span: "
3019− ++ String.fromInt position.height
2809+ ++ String.fromInt right
3020− ++ ";"
2810+ ++ "px "
3021− , "-ms-grid-column: "
3022− ++ String.fromInt position.col
2811+ ++ String.fromInt bottom
3023− ++ ";"
2812+ ++ "px "
3024− , "-ms-grid-column-span: "
3025− ++ String.fromInt position.width
2813+ ++ String.fromInt left
3026− ++ ";"
2814+ ++ "px"
2818+ GridTemplateStyle template ->
2822+ ++ String.join "-" (List.map lengthClassName template.rows)
2824+ ++ String.join "-" (List.map lengthClassName template.columns)
2826+ ++ lengthClassName (Tuple.first template.spacing)
2828+ ++ lengthClassName (Tuple.second template.spacing)
2831+ toGridLength (Tuple.second template.spacing)
2834+ toGridLength (Tuple.first template.spacing)
2837+ toGridLengthHelper Nothing Nothing x
2839+ toGridLengthHelper minimum maximum x =
2842+ String.fromInt px ++ "px"
2845+ case ( minimum, maximum ) of
2846+ ( Nothing, Nothing ) ->
2849+ ( Just minSize, Nothing ) ->
2850+ "minmax(" ++ String.fromInt minSize ++ "px, " ++ "max-content)"
2852+ ( Nothing, Just maxSize ) ->
2853+ "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2855+ ( Just minSize, Just maxSize ) ->
2856+ "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2859+ case ( minimum, maximum ) of
2860+ ( Nothing, Nothing ) ->
2861+ String.fromInt i ++ "fr"
2863+ ( Just minSize, Nothing ) ->
2864+ "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt i ++ "fr" ++ "fr)"
2866+ ( Nothing, Just maxSize ) ->
2867+ "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2869+ ( Just minSize, Just maxSize ) ->
2870+ "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2873+ toGridLengthHelper (Just m) maximum len
2876+ toGridLengthHelper minimum (Just m) len
2880+ |> List.map toGridLength
2881+ |> String.join ySpacing
2882+ |> (\x -> "-ms-grid-columns: " ++ x ++ ";")
2886+ |> List.map toGridLength
2887+ |> String.join ySpacing
2888+ |> (\x -> "-ms-grid-rows: " ++ x ++ ";")
3030− class ++ "{" ++ msPosition ++ "}"
2891+ class ++ "{" ++ msColumns ++ msRows ++ "}"
2895+ |> List.map toGridLength
2897+ |> (\x -> "grid-template-columns: " ++ x ++ ";")
2901+ |> List.map toGridLength
2903+ |> (\x -> "grid-template-rows: " ++ x ++ ";")
2906+ "grid-column-gap:" ++ toGridLength (Tuple.first template.spacing) ++ ";"
2909+ "grid-row-gap:" ++ toGridLength (Tuple.second template.spacing) ++ ";"
2912+ class ++ "{" ++ columns ++ rows ++ gapX ++ gapY ++ "}"
2915+ "@supports (display:grid) {" ++ modernGrid ++ "}"
2919+ GridPosition position ->
2923+ ++ String.fromInt position.row
2925+ ++ String.fromInt position.col
2927+ ++ String.fromInt position.width
2929+ ++ String.fromInt position.height
2934+ ++ String.fromInt position.row
2936+ , "-ms-grid-row-span: "
2937+ ++ String.fromInt position.height
2939+ , "-ms-grid-column: "
2940+ ++ String.fromInt position.col
2942+ , "-ms-grid-column-span: "
2943+ ++ String.fromInt position.width
2948+ class ++ "{" ++ msPosition ++ "}"
3032− modernPosition =
2950+ modernPosition =
3033− String.join " "
2951+ String.join " "
3034− [ "grid-row: "
2952+ [ "grid-row: "
3035− ++ String.fromInt position.row
2953+ ++ String.fromInt position.row
3036− ++ " / "
2954+ ++ " / "
3037− ++ String.fromInt (position.row + position.height)
2955+ ++ String.fromInt (position.row + position.height)
3039− , "grid-column: "
2957+ , "grid-column: "
3040− ++ String.fromInt position.col
2958+ ++ String.fromInt position.col
3041− ++ " / "
2959+ ++ " / "
3042− ++ String.fromInt (position.col + position.width)
2960+ ++ String.fromInt (position.col + position.width)
2965+ class ++ "{" ++ modernPosition ++ "}"
2968+ "@supports (display:grid) {" ++ modernGrid ++ "}"
3046− modernGrid =
2972+ PseudoSelector class styles ->
3047− class ++ "{" ++ modernPosition ++ "}"
2973+ let
2974+ renderPseudoRule style =
2975+ renderStyleRule style (Just class)
2977+ List.map renderPseudoRule styles
3049− supports =
2980+ Transform transform ->
3050− "@supports (display:grid) {" ++ modernGrid ++ "}"
2981+ let
3052− [ base
2983+ transformValue transform
3056− PseudoSelector class styles ->
2985+ class =
3057− let
2986+ transformClass transform
3058− renderPseudoRule style =
3059− renderStyleRule options style (Just class)
3061− List.concatMap renderPseudoRule styles
2988+ case ( class, val ) of
2989+ ( Just cls, Just v ) ->
2993+ [ Property "transform"
3063− Transform transform ->
2997+ _ ->
3066− transformValue transform
3068− class =
3000+ combine style rendered =
3069− transformClass transform
3001+ { rules = rendered.rules ++ renderStyleRule style Nothing
3070− in
3002+ , topLevel =
3071− case ( class, val ) of
3003+ case topLevelValue style of
3072− ( Just cls, Just v ) ->
3004+ Nothing ->
3073− renderStyle options
3005+ rendered.topLevel
3076− [ Property "transform"
3080− _ ->
3007+ Just topLevel ->
3081− []
3008+ topLevel :: rendered.topLevel
3011+ case List.foldl combine { topLevel = [], rules = "" } stylesheet of
3012+ { topLevel, rules } ->
3013+ renderTopLevelValues topLevel ++ rules
3084lengthClassName : Length -> String
3016lengthClassName : Length -> String
@@ -3118,12 +3050,12 @@ formatTextShadow shadow =
3121−textShadowClass shadow =
3053+textShadowName shadow =
3122 String.concat
3054 String.concat
3124− , floatClass (Tuple.first shadow.offset) ++ "px"
3056+ , String.fromFloat (Tuple.first shadow.offset) ++ "px"
3125− , floatClass (Tuple.second shadow.offset) ++ "px"
3057+ , String.fromFloat (Tuple.second shadow.offset) ++ "px"
3126− , floatClass shadow.blur ++ "px"
3058+ , String.fromFloat shadow.blur ++ "px"
3127 , formatColorClass shadow.color
3059 , formatColorClass shadow.color
@@ -3144,17 +3076,17 @@ formatBoxShadow shadow =
3147−boxShadowClass shadow =
3079+boxShadowName shadow =
3148 String.concat <|
3080 String.concat <|
3149 [ if shadow.inset then
3081 [ if shadow.inset then
3150 "box-inset"
3082 "box-inset"
3154− , floatClass (Tuple.first shadow.offset) ++ "px"
3086+ , String.fromFloat (Tuple.first shadow.offset) ++ "px"
3155− , floatClass (Tuple.second shadow.offset) ++ "px"
3087+ , String.fromFloat (Tuple.second shadow.offset) ++ "px"
3156− , floatClass shadow.blur ++ "px"
3088+ , String.fromFloat shadow.blur ++ "px"
3157− , floatClass shadow.size ++ "px"
3089+ , String.fromFloat shadow.size ++ "px"
3158 , formatColorClass shadow.color
3090 , formatColorClass shadow.color
@@ -3199,17 +3131,6 @@ paddingName top right bottom left =
3199 ++ String.fromInt left
3131 ++ String.fromInt left
3202−paddingNameFloat top right bottom left =
3206− ++ floatClass right
3208− ++ floatClass bottom
3213getStyleName : Style -> String
3134getStyleName : Style -> String
3214getStyleName style =
3135getStyleName style =
3215 case style of
3136 case style of