@@ -16,6 +16,7 @@ module Internal.Model exposing
16 , LayoutContext(..)
16 , LayoutContext(..)
17 , Length(..)
17 , Length(..)
18 , Location(..)
18 , Location(..)
19 , NodeName(..)
20 , NodeName(..)
20 , Option(..)
21 , Option(..)
21 , OptionRecord
22 , OptionRecord
@@ -41,7 +42,7 @@ module Internal.Model exposing
41 , asParagraph
42 , asParagraph
43 , asTextColumn
44 , asTextColumn
44− , boxShadowName
45+ , boxShadowClass
45 , columnClass
46 , columnClass
46 , composeTransformation
47 , composeTransformation
47 , contextClasses
48 , contextClasses
@@ -78,31 +79,30 @@ module Internal.Model exposing
78 , onlyStyles
79 , onlyStyles
79 , optionsToRecord
80 , optionsToRecord
80 , paddingName
81 , paddingName
81 , pageClass
83 , pageClass
82 , paragraphClass
84 , paragraphClass
83 , reduceRecursive
85 , reduceRecursive
84 , reduceStyles
86 , reduceStyles
85 , reduceStylesRecursive
87 , reduceStylesRecursive
86 , removeNever
88 , removeNever
90 , renderFontClassName
89 , renderFontClassName
91 , renderHeight
90 , renderHeight
92 , renderRoot
91 , renderRoot
93 , renderWidth
93 , renderWidth
94 , rootStyle
94 , rootStyle
95 , rowClass
95 , rowClass
96 , singleClass
96 , singleClass
97 , spacingName
97 , spacingName
100− , textShadowName
99+ , textShadowClass
102 , toStyleSheet
101 , toStyleSheet
103 , transformClass
102 , transformClass
104 , unstyled
103 , unstyled
105 , unwrapDecorations
104 , unwrapDecorations
@@ -112,7 +112,7 @@ import Html.Attributes
112import Html.Keyed
112import Html.Keyed
113import Internal.Flag as Flag exposing (Flag)
113import Internal.Flag as Flag exposing (Flag)
114import Internal.Style exposing (classes, dot)
114import Internal.Style exposing (classes, dot)
115−import Json.Encode as Json
115+import Json.Encode as Encode
116import Set exposing (Set)
116import Set exposing (Set)
117import VirtualDom
117import VirtualDom
@@ -174,7 +174,7 @@ type Style
174 | Colored String String Color
174 | Colored String String Color
175 | SpacingStyle String Int Int
175 | SpacingStyle String Int Int
176 | BorderWidth String Int Int Int Int
176 | BorderWidth String Int Int Int Int
177− | PaddingStyle String Int Int Int Int
177+ | PaddingStyle String Float Float Float Float
178 | GridTemplateStyle
178 | GridTemplateStyle
179 { spacing : ( Length, Length )
179 { spacing : ( Length, Length )
180 , columns : List Length
180 , columns : List Length
@@ -222,8 +222,7 @@ type Font
222 | ImportFont String String
222 | ImportFont String String
223 | FontWith
223 | FontWith
224 { name : String
224 { name : String
225− , url : Maybe String
226− , adjustment : Adjustment
225+ , adjustment : Maybe Adjustment
227 , variants : List Variant
226 , variants : List Variant
@@ -246,6 +245,18 @@ renderVariant var =
246 "\"" ++ name ++ "\" " ++ String.fromInt index
245 "\"" ++ name ++ "\" " ++ String.fromInt index
250+ VariantActive name ->
256+ VariantIndexed name index ->
257+ name ++ "-" ++ String.fromInt index
249renderVariants typeface =
260renderVariants typeface =
250 case typeface of
261 case typeface of
251 FontWith font ->
262 FontWith font ->
@@ -444,7 +455,10 @@ finalizeNode has node attributes children embedMode parentContext =
444 Embedded nodeName internal ->
455 Embedded nodeName internal ->
445 VirtualDom.node nodeName
456 VirtualDom.node nodeName
446 attributes
457 attributes
458+ [ createNode internal
459+ [ Html.Attributes.class
447− [ createNode internal [ Html.Attributes.class (classes.any ++ " " ++ classes.single) ]
460+ (classes.any ++ " " ++ classes.single)
450 case parentContext of
464 case parentContext of
@@ -521,49 +535,45 @@ finalizeNode has node attributes children embedMode parentContext =
523embedWith static opts styles children =
537embedWith static opts styles children =
541+ |> List.foldl reduceStyles ( Set.empty, renderFocusStyle opts.focus )
543+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
545+ |> toStyleSheet opts
524 if static then
547 if static then
525− staticRoot
548+ staticRoot opts
526− :: (styles
549+ :: dynamicStyleSheet
527− |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
529− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
531− |> toStyleSheet opts
533 :: children
550 :: children
536− (styles
553+ dynamicStyleSheet
537− |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
539− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
541− |> toStyleSheet opts
543 :: children
554 :: children
546embedKeyed static opts styles children =
557embedKeyed static opts styles children =
561+ |> List.foldl reduceStyles ( Set.empty, renderFocusStyle opts.focus )
563+ -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
565+ |> toStyleSheet opts
547 if static then
567 if static then
548− ( "static-stylesheet", staticRoot )
568+ ( "static-stylesheet", staticRoot opts )
549 :: ( "dynamic-stylesheet"
569 :: ( "dynamic-stylesheet"
550− , styles
570+ , dynamicStyleSheet
551− |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
553− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
555− |> toStyleSheet opts
557 :: children
572 :: children
560 ( "dynamic-stylesheet"
575 ( "dynamic-stylesheet"
561− , styles
576+ , dynamicStyleSheet
562− |> List.foldl reduceStyles ( Set.empty, [ renderFocusStyle opts.focus ] )
564− -- |> reduceStylesRecursive Set.empty [ ]) --renderFocusStyle opts.focus ]
566− |> toStyleSheet opts
568 :: children
578 :: children
@@ -1022,7 +1032,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1023 gatherAttrRecursive (classes ++ " " ++ newClass)
1033 gatherAttrRecursive (classes ++ " " ++ newClass)
1025− (Flag.merge addToFlags has)
1035+ (Flag.merge addToFlags (Flag.add Flag.width has))
1026 transform
1036 transform
1027 (newStyles ++ styles)
1037 (newStyles ++ styles)
@@ -1043,7 +1053,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1044 "height-px-" ++ val
1054 "height-px-" ++ val
1046− gatherAttrRecursive (name ++ " " ++ classes)
1056+ gatherAttrRecursive (Internal.Style.classes.heightExact ++ " " ++ name ++ " " ++ classes)
1048 (Flag.add Flag.height has)
1058 (Flag.add Flag.height has)
1049 transform
1059 transform
@@ -1100,7 +1110,7 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1101 gatherAttrRecursive (classes ++ " " ++ newClass)
1111 gatherAttrRecursive (classes ++ " " ++ newClass)
1103− (Flag.merge addToFlags has)
1113+ (Flag.merge addToFlags (Flag.add Flag.height has))
1104 transform
1114 transform
1105 (newStyles ++ styles)
1115 (newStyles ++ styles)
@@ -1132,20 +1142,15 @@ gatherAttrRecursive classes node has transform styles attrs children elementAttr
1132 gatherAttrRecursive classes (addNodeName "h6" node) has transform styles attrs children remaining
1142 gatherAttrRecursive classes (addNodeName "h6" node) has transform styles attrs children remaining
1134 Paragraph ->
1144 Paragraph ->
1135− let
1145+ -- previously we rendered a <p> tag, though apparently this invalidates the html if it has <div>s inside.
1136− newNode =
1146+ -- Since we can't guaranteee that there are no divs, we need another strategy.
1137− case node of
1147+ -- While it's not documented in many places, there apparently is a paragraph aria role
1138− Generic ->
1148+ -- https://github.com/w3c/aria/blob/11f85f41a5b621fdbe85fc9bcdcd270e653a48ba/common/script/roleInfo.js
1139− NodeName "p"
1149+ -- Though we'll need to wait till it gets released in an official wai-aria spec to use it.
1140−
1150+ -- If it's used at the moment, then Lighthouse complains (likely rightfully) that role paragraph is not recognized.
1147− gatherAttrRecursive classes
1151+ gatherAttrRecursive
1148− newNode
1152+ classes
1150 transform
1155 transform
@@ -1431,7 +1436,7 @@ renderHeight h =
1431 "height-px-" ++ val
1436 "height-px-" ++ val
1433 ( Flag.none
1438 ( Flag.none
1434− , name
1439+ , Internal.Style.classes.heightExact ++ " " ++ name
1435 , [ Single name "height" (val ++ "px") ]
1440 , [ Single name "height" (val ++ "px") ]
@@ -1454,7 +1459,7 @@ renderHeight h =
1454 , [ Single
1459 , [ Single
1455 (Internal.Style.classes.any
1460 (Internal.Style.classes.any
1457− ++ Internal.Style.classes.row
1462+ ++ Internal.Style.classes.column
1458 ++ " > "
1463 ++ " > "
1459 ++ (Internal.Style.dot <| "height-fill-" ++ String.fromInt portion)
1464 ++ (Internal.Style.dot <| "height-fill-" ++ String.fromInt portion)
@@ -1473,7 +1478,9 @@ renderHeight h =
1475 "min-height"
1480 "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.
1476− (String.fromInt minSize ++ "px")
1483+ (String.fromInt minSize ++ "px !important")
1478 ( newFlag, newAttrs, newStyle ) =
1485 ( newFlag, newAttrs, newStyle ) =
1479 renderHeight len
1486 renderHeight len
@@ -1810,8 +1817,20 @@ defaultOptions =
1813−staticRoot =
1820+staticRoot : OptionRecord -> VirtualDom.Node msg
1824+ -- wrap the style node in a div to prevent `Dark Reader` from blowin up the dom.
1825+ VirtualDom.node "div"
1814− 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) ] []
1817addWhen ifThis x to =
1836addWhen ifThis x to =
@@ -1929,7 +1948,7 @@ type Spacing
1931type Padding
1950type Padding
1932− = Padding String Int Int Int Int
1951+ = Padding String Float Float Float Float
1935extractSpacingAndPadding : List (Attribute aligned msg) -> ( Maybe Padding, Maybe Spacing )
1954extractSpacingAndPadding : List (Attribute aligned msg) -> ( Maybe Padding, Maybe Spacing )
@@ -2025,34 +2044,44 @@ getHeight attrs =
2047+textElementClasses : String
2048+textElementClasses =
2053+ ++ classes.widthContent
2055+ ++ classes.heightContent
2028textElement : String -> VirtualDom.Node msg
2058textElement : String -> VirtualDom.Node msg
2029textElement str =
2059textElement str =
2030 Html.div
2060 Html.div
2031 [ Html.Attributes.class
2061 [ Html.Attributes.class
2032− (String.join " "
2062+ textElementClasses
2035− , classes.widthContent
2036− , classes.heightContent
2040 [ Html.text str ]
2064 [ Html.text str ]
2067+textElementFillClasses : String
2068+textElementFillClasses =
2073+ ++ classes.widthFill
2075+ ++ classes.heightFill
2043textElementFill : String -> VirtualDom.Node msg
2078textElementFill : String -> VirtualDom.Node msg
2044textElementFill str =
2079textElementFill str =
2045− VirtualDom.node "div"
2080+ Html.div
2046 [ Html.Attributes.class
2081 [ Html.Attributes.class
2047− (String.join " "
2082+ textElementFillClasses
2050− , classes.widthFill
2051− , classes.heightFill
2055− [ VirtualDom.text str ]
2084+ [ Html.text str ]
2058type Children x
2087type Children x
@@ -2060,10 +2089,6 @@ type Children x
2060 | Keyed (List ( String, x ))
2089 | Keyed (List ( String, x ))
2064−-- toHtml : OptionRecord -> Element msg -> VirtualDom.Node msg
2067toHtml mode el =
2092toHtml mode el =
2068 case el of
2093 case el of
2069 Unstyled html ->
2094 Unstyled html ->
@@ -2099,8 +2124,7 @@ renderRoot optionList attributes child =
2101type RenderMode
2126type RenderMode
2103− | Layout
2127+ = Layout
2104 | NoStaticStyleSheet
2128 | NoStaticStyleSheet
2105 | WithVirtualCss
2129 | WithVirtualCss
@@ -2149,8 +2173,8 @@ rootStyle =
2149 , SansSerif
2173 , SansSerif
2152− [ StyleClass Flag.bgColor (Colored ("bg-color-" ++ formatColorClass (Rgba 1 1 1 0)) "background-color" (Rgba 1 1 1 0))
2176+ [ StyleClass Flag.bgColor (Colored ("bg-" ++ formatColorClass (Rgba 1 1 1 0)) "background-color" (Rgba 1 1 1 0))
2153− , StyleClass Flag.fontColor (Colored ("font-color-" ++ formatColorClass (Rgba 0 0 0 1)) "color" (Rgba 0 0 0 1))
2177+ , StyleClass Flag.fontColor (Colored ("fc-" ++ formatColorClass (Rgba 0 0 0 1)) "color" (Rgba 0 0 0 1))
2154 , StyleClass Flag.fontSize (FontSize 20)
2178 , StyleClass Flag.fontSize (FontSize 20)
2155 , StyleClass Flag.fontFamily <|
2179 , StyleClass Flag.fontFamily <|
2156 FontFamily (List.foldl renderFontClassName "font-" families)
2180 FontFamily (List.foldl renderFontClassName "font-" families)
@@ -2193,9 +2217,38 @@ renderFontClassName font current =
2194renderFocusStyle :
2218renderFocusStyle :
2195 FocusStyle
2219 FocusStyle
2196− -> Style
2220+ -> List Style
2197renderFocusStyle focus =
2221renderFocusStyle 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, ")
2198− Style (Internal.Style.dot classes.any ++ ":focus .focusable, " ++ Internal.Style.dot classes.any ++ ".focusable:focus")
2249+ ++ (Internal.Style.dot classes.any ++ ".focusable:focus, ")
2250+ ++ (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb")
2199 (List.filterMap identity
2252 (List.filterMap identity
2200 [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
2253 [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
2201 , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
2254 , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
@@ -2218,6 +2271,7 @@ renderFocusStyle focus =
2218 , Just <| Property "outline" "none"
2271 , Just <| Property "outline" "none"
2223focusDefaultStyle : { backgroundColor : Maybe Color, borderColor : Maybe Color, shadow : Maybe Shadow }
2277focusDefaultStyle : { backgroundColor : Maybe Color, borderColor : Maybe Color, shadow : Maybe Shadow }
@@ -2229,7 +2283,7 @@ focusDefaultStyle =
2229 { color =
2283 { color =
2230 Rgba (155 / 255) (203 / 255) 1 1
2284 Rgba (155 / 255) (203 / 255) 1 1
2231 , offset = ( 0, 0 )
2285 , offset = ( 0, 0 )
2232− , blur = 3
2286+ , blur = 0
2233 , size = 3
2287 , size = 3
@@ -2299,7 +2353,31 @@ optionsToRecord options =
2300toStyleSheet : OptionRecord -> List Style -> VirtualDom.Node msg
2354toStyleSheet : OptionRecord -> List Style -> VirtualDom.Node msg
2301toStyleSheet options styleSheet =
2355toStyleSheet 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"
2302− VirtualDom.node "style" [] [ VirtualDom.text (toStyleSheetString options styleSheet) ]
2372+ [ VirtualDom.text (toStyleSheetString options styleSheet) ]
2376+ VirtualDom.node "elm-ui-rules"
2377+ [ VirtualDom.property "rules"
2378+ (encodeStyles options styleSheet)
2305renderTopLevelValues rules =
2383renderTopLevelValues rules =
@@ -2309,14 +2387,12 @@ renderTopLevelValues rules =
2309 ImportFont _ url ->
2387 ImportFont _ url ->
2310 Just ("@import url('" ++ url ++ "');")
2388 Just ("@import url('" ++ url ++ "');")
2312− FontWith with ->
2390+ -- FontWith with ->
2313− case with.url of
2391+ -- case with.url of
2314− Just x ->
2392+ -- Just x ->
2315− Just ("@import url('" ++ x ++ "');")
2393+ -- Just ("@import url('" ++ x ++ "');")
2317− Nothing ->
2394+ -- Nothing ->
2318− Nothing
2395+ -- Nothing
@@ -2457,12 +2533,17 @@ typefaceAdjustment typefaces =
2457 Nothing ->
2533 Nothing ->
2458 case face of
2534 case face of
2459 FontWith with ->
2535 FontWith with ->
2460− Just
2536+ case with.adjustment of
2461− ( fontAdjustmentRules
2542+ ( fontAdjustmentRules
2462− (.full (convertAdjustment with.adjustment))
2543+ (.full (convertAdjustment adjustment))
2463− , fontAdjustmentRules
2544+ , fontAdjustmentRules
2464− (.capital (convertAdjustment with.adjustment))
2545+ (.capital (convertAdjustment adjustment))
@@ -2512,489 +2593,492 @@ renderProps force (Property key val) existing =
2512 existing ++ "\n " ++ key ++ ": " ++ val ++ ";"
2593 existing ++ "\n " ++ key ++ ": " ++ val ++ ";"
2596+encodeStyles options stylesheet =
2602+ renderStyleRule options style Nothing
2604+ ( getStyleName style, Encode.list Encode.string styled )
2515toStyleSheetString : OptionRecord -> List Style -> String
2609toStyleSheetString : OptionRecord -> List Style -> String
2516toStyleSheetString options stylesheet =
2610toStyleSheetString options stylesheet =
2518− renderStyle maybePseudo selector props =
2612+ combine style rendered =
2519− case maybePseudo of
2613+ { rules = rendered.rules ++ renderStyleRule options style Nothing
2520− Nothing ->
2614+ , topLevel =
2521− selector ++ "{" ++ List.foldl (renderProps False) "" props ++ "\n}"
2615+ case topLevelValue style of
2523− Just pseudo ->
2619+ Just topLevel ->
2524− case pseudo of
2620+ topLevel :: rendered.topLevel
2526− case options.hover of
2622+ in
2527− NoHover ->
2623+ case List.foldl combine { topLevel = [], rules = [] } stylesheet of
2528− ""
2624+ { topLevel, rules } ->
2625+ renderTopLevelValues topLevel ++ String.concat rules
2531− selector ++ "-hv {" ++ List.foldl (renderProps True) "" props ++ "\n}"
2533− AllowHover ->
2628+renderStyle : OptionRecord -> Maybe PseudoClass -> String -> List Property -> List String
2629+renderStyle options maybePseudo selector props =
2630+ case maybePseudo of
2534− selector ++ "-hv:hover {" ++ List.foldl (renderProps False) "" props ++ "\n}"
2632+ [ selector ++ "{" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2536− Focus ->
2634+ Just pseudo ->
2537− let
2635+ case pseudo of
2538− renderedProps =
2636+ Hover ->
2539− List.foldl (renderProps False) "" props
2637+ case options.hover of
2550− ++ "-fs:not(.focus) {"
2560− , ".focusable-parent:focus ~ "
2570− Active ->
2641+ ForceHover ->
2571− selector ++ "-act:active {" ++ List.foldl (renderProps False) "" props ++ "\n}"
2642+ [ selector ++ "-hv {" ++ List.foldl (renderProps True) "" props ++ "\n}" ]
2573− renderStyleRule rule maybePseudo =
2575− Style selector props ->
2576− renderStyle maybePseudo selector props
2578− Shadows name prop ->
2644+ AllowHover ->
2579− renderStyle
2645+ [ selector ++ "-hv:hover {" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2582− [ Property "box-shadow" prop
2585− Transparency name transparency ->
2647+ Focus ->
2587− opacity =
2649+ renderedProps =
2588− (1 - transparency)
2650+ List.foldl (renderProps False) "" props
2592− renderStyle
2652+ [ selector ++ "-fs:focus {" ++ renderedProps ++ "\n}"
2593− maybePseudo
2653+ , ("." ++ classes.any ++ ":focus " ++ selector ++ "-fs {")
2594− ("." ++ name)
2654+ ++ renderedProps
2595− [ Property "opacity" (String.fromFloat opacity)
2655+ ++ "\n}"
2656+ , (selector ++ "-fs:focus-within {")
2659+ , (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb" ++ selector ++ "-fs {")
2598− FontSize i ->
2664+ Active ->
2599− renderStyle
2665+ [ selector ++ "-act:active {" ++ List.foldl (renderProps False) "" props ++ "\n}" ]
2601− (".font-size-" ++ String.fromInt i)
2602− [ Property "font-size" (String.fromInt i ++ "px")
2605− FontFamily name typefaces ->
2609− |> List.filterMap renderVariants
2610− |> String.join ", "
2613− [ Property "font-family"
2615− |> List.map fontName
2616− |> String.join ", "
2618− , Property "font-feature-settings" features
2619− , Property "font-variant"
2620− (if List.any hasSmallCaps typefaces then
2623− else
2668+renderStyleRule : OptionRecord -> Style -> Maybe PseudoClass -> List String
2624− "normal"
2669+renderStyleRule options rule maybePseudo =
2625− )
2670+ case rule of
2626− ]
2671+ Style selector props ->
2627− in
2672+ renderStyle options maybePseudo selector props
2628− String.join " "
2673+
2674+ Shadows name prop ->
2629− [ renderStyle
2675+ renderStyle options
2630− maybePseudo
2676+ maybePseudo
2631− ("." ++ name)
2677+ ("." ++ name)
2632− families
2678+ [ Property "box-shadow" prop
2635− Single class prop val ->
2681+ Transparency name transparency ->
2636− renderStyle
2688+ renderStyle options
2637− maybePseudo
2689+ maybePseudo
2638− ("." ++ class)
2690+ ("." ++ name)
2639− [ Property prop val
2691+ [ Property "opacity" (String.fromFloat opacity)
2642− Colored class prop color ->
2694+ FontSize i ->
2643− renderStyle
2695+ renderStyle options
2644− maybePseudo
2696+ maybePseudo
2645− ("." ++ class)
2697+ (".font-size-" ++ String.fromInt i)
2646− [ Property prop (formatColor color)
2698+ [ Property "font-size" (String.fromInt i ++ "px")
2649− SpacingStyle cls x y ->
2701+ FontFamily name typefaces ->
2651− class =
2703+ features =
2652− "." ++ cls
2704+ 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
2655− String.fromFloat (toFloat x / 2) ++ "px"
2720+ "normal"
2724+ renderStyle options
2657− halfY =
2729+ Single class prop val ->
2658− String.fromFloat (toFloat y / 2) ++ "px"
2730+ renderStyle options
2733+ [ Property prop val
2660− xPx =
2736+ Colored class prop color ->
2661− String.fromInt x ++ "px"
2737+ renderStyle options
2740+ [ Property prop (formatColor color)
2663− yPx =
2743+ SpacingStyle cls x y ->
2664− String.fromInt y ++ "px"
2744+ let
2667− "." ++ Internal.Style.classes.row
2749+ String.fromFloat (toFloat x / 2) ++ "px"
2669− wrappedRow =
2751+ halfY =
2670− "." ++ Internal.Style.classes.wrapped ++ row
2752+ String.fromFloat (toFloat y / 2) ++ "px"
2672− column =
2754+ xPx =
2673− "." ++ Internal.Style.classes.column
2755+ String.fromInt x ++ "px"
2676− "." ++ Internal.Style.classes.page
2758+ String.fromInt y ++ "px"
2678− paragraph =
2760+ row =
2679− "." ++ Internal.Style.classes.paragraph
2761+ "." ++ Internal.Style.classes.row
2681− left =
2763+ wrappedRow =
2682− "." ++ Internal.Style.classes.alignLeft
2764+ "." ++ Internal.Style.classes.wrapped ++ row
2684− right =
2766+ column =
2685− "." ++ Internal.Style.classes.alignRight
2767+ "." ++ Internal.Style.classes.column
2688− "." ++ Internal.Style.classes.any
2770+ "." ++ Internal.Style.classes.page
2690− single =
2772+ paragraph =
2691− "." ++ Internal.Style.classes.single
2773+ "." ++ Internal.Style.classes.paragraph
2694− [ renderStyle maybePseudo (class ++ row ++ " > " ++ any ++ " + " ++ any) [ Property "margin-left" xPx ]
2696− -- margins don't apply to last element of normal, unwrapped rows
2697− -- , renderStyle maybePseudo (class ++ row ++ " > " ++ any ++ ":first-child") [ Property "margin" "0" ]
2698− -- For wrapped rows, margins always apply because we handle "canceling out" the other margins manually in the element.
2699− , renderStyle maybePseudo
2700− (class ++ wrappedRow ++ " > " ++ any)
2701− [ Property "margin" (halfY ++ " " ++ halfX)
2704− -- , renderStyle maybePseudo
2775+ left =
2705− -- (class ++ wrappedRow ++ " > " ++ any ++ ":last-child")
2776+ "." ++ Internal.Style.classes.alignLeft
2706− -- [ Property "margin-right" "0"
2709− , renderStyle maybePseudo (class ++ column ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2710− , renderStyle maybePseudo (class ++ page ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2711− , renderStyle maybePseudo (class ++ page ++ " > " ++ left) [ Property "margin-right" xPx ]
2712− , renderStyle maybePseudo (class ++ page ++ " > " ++ right) [ Property "margin-left" xPx ]
2715− (class ++ paragraph)
2716− [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2720− ("textarea" ++ class)
2721− [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2726− -- (class ++ paragraph ++ " > " ++ any)
2727− -- [ Property "margin-right" xPx
2728− -- , Property "margin-bottom" yPx
2732− (class ++ paragraph ++ " > " ++ left)
2733− [ Property "margin-right" xPx
2737− (class ++ paragraph ++ " > " ++ right)
2778+ right =
2738− [ Property "margin-left" xPx
2779+ "." ++ Internal.Style.classes.alignRight
2742− (class ++ paragraph ++ "::after")
2743− [ Property "content" "''"
2744− , Property "display" "block"
2745− , Property "height" "0"
2746− , Property "width" "0"
2747− , Property "margin-top" (String.fromInt (-1 * (y // 2)) ++ "px")
2751− (class ++ paragraph ++ "::before")
2752− [ Property "content" "''"
2753− , Property "display" "block"
2754− , Property "height" "0"
2755− , Property "width" "0"
2756− , Property "margin-bottom" (String.fromInt (-1 * (y // 2)) ++ "px")
2760− PaddingStyle cls top right bottom left ->
2781+ any =
2761− let
2782+ "." ++ Internal.Style.classes.any
2769− [ Property "padding"
2770− (String.fromInt top
2772− ++ String.fromInt right
2774− ++ String.fromInt bottom
2776− ++ String.fromInt left
2781− BorderWidth cls top right bottom left ->
2784+ single =
2782− let
2785+ "." ++ Internal.Style.classes.single
2787− renderStyle
2787+ List.concat
2788− maybePseudo
2788+ [ renderStyle options maybePseudo (class ++ row ++ " > " ++ any ++ " + " ++ any) [ Property "margin-left" xPx ]
2790− [ Property "border-width"
2790+ -- margins don't apply to last element of normal, unwrapped rows
2791− (String.fromInt top
2791+ -- , renderStyle options maybePseudo (class ++ row ++ " > " ++ any ++ ":first-child") [ Property "margin" "0" ]
2792− ++ "px "
2792+ -- For wrapped rows, margins always apply because we handle "canceling out" the other margins manually in the element.
2793− ++ String.fromInt right
2793+ , renderStyle options
2794− ++ "px "
2794+ maybePseudo
2795− ++ String.fromInt bottom
2795+ (class ++ wrappedRow ++ " > " ++ any)
2796− ++ "px "
2796+ [ Property "margin" (halfY ++ " " ++ halfX)
2797− ++ String.fromInt left
2802− GridTemplateStyle template ->
2799+ -- , renderStyle options maybePseudo
2803− let
2800+ -- (class ++ wrappedRow ++ " > " ++ any ++ ":last-child")
2804− class =
2801+ -- [ Property "margin-right" "0"
2805− ".grid-rows-"
2802+ -- ]
2806− ++ String.join "-" (List.map lengthClassName template.rows)
2808− ++ String.join "-" (List.map lengthClassName template.columns)
2810− ++ lengthClassName (Tuple.first template.spacing)
2812− ++ lengthClassName (Tuple.second template.spacing)
2815− toGridLength (Tuple.second template.spacing)
2818− toGridLength (Tuple.first template.spacing)
2821− toGridLengthHelper Nothing Nothing x
2823− toGridLengthHelper minimum maximum x =
2826− String.fromInt px ++ "px"
2829− case ( minimum, maximum ) of
2830− ( Nothing, Nothing ) ->
2833− ( Just minSize, Nothing ) ->
2834− "minmax(" ++ String.fromInt minSize ++ "px, " ++ "max-content)"
2836− ( Nothing, Just maxSize ) ->
2837− "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2839− ( Just minSize, Just maxSize ) ->
2840− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2843− case ( minimum, maximum ) of
2844− ( Nothing, Nothing ) ->
2845− String.fromInt i ++ "fr"
2847− ( Just minSize, Nothing ) ->
2848− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt i ++ "fr" ++ "fr)"
2850− ( Nothing, Just maxSize ) ->
2851− "minmax(max-content, " ++ String.fromInt maxSize ++ "px)"
2853− ( Just minSize, Just maxSize ) ->
2854− "minmax(" ++ String.fromInt minSize ++ "px, " ++ String.fromInt maxSize ++ "px)"
2857− toGridLengthHelper (Just m) maximum len
2860− toGridLengthHelper minimum (Just m) len
2864− |> List.map toGridLength
2865− |> String.join ySpacing
2866− |> (\x -> "-ms-grid-columns: " ++ x ++ ";")
2870− |> List.map toGridLength
2871− |> String.join ySpacing
2872− |> (\x -> "-ms-grid-rows: " ++ x ++ ";")
2875− class ++ "{" ++ msColumns ++ msRows ++ "}"
2878− template.columns
2803+ -- columns
2879− |> List.map toGridLength
2804+ , renderStyle options maybePseudo (class ++ column ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2880− |> String.join " "
2805+ , renderStyle options maybePseudo (class ++ page ++ " > " ++ any ++ " + " ++ any) [ Property "margin-top" yPx ]
2881− |> (\x -> "grid-template-columns: " ++ x ++ ";")
2806+ , renderStyle options maybePseudo (class ++ page ++ " > " ++ left) [ Property "margin-right" xPx ]
2882−
2807+ , renderStyle options maybePseudo (class ++ page ++ " > " ++ right) [ Property "margin-left" xPx ]
2883− rows =
2808+ , renderStyle options
2884− template.rows
2809+ maybePseudo
2885− |> List.map toGridLength
2810+ (class ++ paragraph)
2886− |> String.join " "
2811+ [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2887− |> (\x -> "grid-template-rows: " ++ x ++ ";")
2812+ ]
2888−
2813+ , renderStyle options
2889− gapX =
2814+ maybePseudo
2890− "grid-column-gap:" ++ toGridLength (Tuple.first template.spacing) ++ ";"
2815+ ("textarea" ++ any ++ class)
2891−
2816+ [ Property "line-height" ("calc(1em + " ++ String.fromInt y ++ "px)")
2892− gapY =
2817+ , Property "height" ("calc(100% + " ++ String.fromInt y ++ "px)")
2893− "grid-row-gap:" ++ toGridLength (Tuple.second template.spacing) ++ ";"
2818+ ]
2896− class ++ "{" ++ columns ++ rows ++ gapX ++ gapY ++ "}"
2899− "@supports (display:grid) {" ++ modernGrid ++ "}"
2903− GridPosition position ->
2820+ -- , renderStyle options
2904− let
2821+ -- maybePseudo
2905− class =
2822+ -- (class ++ paragraph ++ " > " ++ any)
2906− ".grid-pos-"
2823+ -- [ Property "margin-right" xPx
2907− ++ String.fromInt position.row
2824+ -- , Property "margin-bottom" yPx
2909− ++ String.fromInt position.col
2826+ , renderStyle options
2910− ++ "-"
2827+ maybePseudo
2911− ++ String.fromInt position.width
2828+ (class ++ paragraph ++ " > " ++ left)
2912− ++ "-"
2829+ [ Property "margin-right" xPx
2913− ++ String.fromInt position.height
2830+ ]
2914−
2831+ , renderStyle options
2915− msPosition =
2832+ maybePseudo
2916− String.join " "
2833+ (class ++ paragraph ++ " > " ++ right)
2917− [ "-ms-grid-row: "
2834+ [ Property "margin-left" xPx
2918− ++ String.fromInt position.row
2835+ ]
2919− ++ ";"
2836+ , renderStyle options
2920− , "-ms-grid-row-span: "
2837+ maybePseudo
2921− ++ String.fromInt position.height
2838+ (class ++ paragraph ++ "::after")
2922− ++ ";"
2839+ [ Property "content" "''"
2923− , "-ms-grid-column: "
2840+ , Property "display" "block"
2924− ++ String.fromInt position.col
2841+ , Property "height" "0"
2925− ++ ";"
2842+ , Property "width" "0"
2926− , "-ms-grid-column-span: "
2843+ , Property "margin-top" (String.fromInt (-1 * (y // 2)) ++ "px")
2927− ++ String.fromInt position.width
2844+ ]
2928− ++ ";"
2845+ , renderStyle options
2930−
2847+ (class ++ paragraph ++ "::before")
2931− base =
2848+ [ Property "content" "''"
2932− class ++ "{" ++ msPosition ++ "}"
2849+ , Property "display" "block"
2933−
2850+ , Property "height" "0"
2934− modernPosition =
2851+ , Property "width" "0"
2935− String.join " "
2852+ , Property "margin-bottom" (String.fromInt (-1 * (y // 2)) ++ "px")
2936− [ "grid-row: "
2853+ ]
2937− ++ String.fromInt position.row
2854+ ]
2939− ++ String.fromInt (position.row + position.height)
2942− ++ String.fromInt position.col
2944− ++ String.fromInt (position.col + position.width)
2949− class ++ "{" ++ modernPosition ++ "}"
2952− "@supports (display:grid) {" ++ modernGrid ++ "}"
2956− PseudoSelector class styles ->
2856+ PaddingStyle cls top right bottom left ->
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 ->
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 ->
2958− renderPseudoRule style =
2900+ class =
2959− renderStyleRule style (Just class)
2901+ ".grid-rows-"
2960− in
2902+ ++ String.join "-" (List.map lengthClassName template.rows)
2961− List.map renderPseudoRule styles
2903+ ++ "-cols-"
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
2962 |> String.join " "
2976 |> String.join " "
2977+ |> (\x -> "grid-template-columns: " ++ x ++ ";")
2964− Transform transform ->
2979+ rows =
2965− let
2980+ template.rows
2966− val =
2981+ |> List.map toGridLength
2967− transformValue transform
2982+ |> String.join " "
2983+ |> (\x -> "grid-template-rows: " ++ x ++ ";")
2969− class =
2985+ gapX =
2970− transformClass transform
2986+ "grid-column-gap:" ++ toGridLength (Tuple.first template.spacing) ++ ";"
2972− case ( class, val ) of
2973− ( Just cls, Just v ) ->
2977− [ Property "transform"
2982− ""
2989+ "grid-row-gap:" ++ toGridLength (Tuple.second template.spacing) ++ ";"
2984− combine style rendered =
2991+ modernGrid =
2985− { rules = rendered.rules ++ renderStyleRule style Nothing
2992+ class ++ "{" ++ columns ++ rows ++ gapX ++ gapY ++ "}"
2987− case topLevelValue style of
2991− Just topLevel ->
2994+ supports =
2992− topLevel :: rendered.topLevel
2995+ "@supports (display:grid) {" ++ modernGrid ++ "}"
3001+ GridPosition position ->
3005+ ++ String.fromInt position.row
3007+ ++ String.fromInt position.col
3009+ ++ String.fromInt position.width
3011+ ++ String.fromInt position.height
3016+ ++ String.fromInt position.row
3018+ , "-ms-grid-row-span: "
3019+ ++ String.fromInt position.height
3021+ , "-ms-grid-column: "
3022+ ++ String.fromInt position.col
3024+ , "-ms-grid-column-span: "
3025+ ++ String.fromInt position.width
3030+ class ++ "{" ++ msPosition ++ "}"
3035+ ++ String.fromInt position.row
3037+ ++ String.fromInt (position.row + position.height)
3040+ ++ String.fromInt position.col
3042+ ++ String.fromInt (position.col + position.width)
3047+ class ++ "{" ++ modernPosition ++ "}"
3050+ "@supports (display:grid) {" ++ modernGrid ++ "}"
2995− case List.foldl combine { topLevel = [], rules = "" } stylesheet of
3052+ [ base
2996− { topLevel, rules } ->
3053+ , supports
2997− renderTopLevelValues topLevel ++ rules
3054+ ]
3056+ PseudoSelector class styles ->
3058+ renderPseudoRule style =
3059+ renderStyleRule options style (Just class)
3061+ List.concatMap renderPseudoRule styles
3063+ Transform transform ->
3066+ transformValue transform
3069+ transformClass transform
3071+ case ( class, val ) of
3072+ ( Just cls, Just v ) ->
3073+ renderStyle options
3076+ [ Property "transform"
3000lengthClassName : Length -> String
3084lengthClassName : Length -> String
@@ -3034,12 +3118,12 @@ formatTextShadow shadow =
3037−textShadowName shadow =
3121+textShadowClass shadow =
3038 String.concat
3122 String.concat
3040− , String.fromFloat (Tuple.first shadow.offset) ++ "px"
3124+ , floatClass (Tuple.first shadow.offset) ++ "px"
3041− , String.fromFloat (Tuple.second shadow.offset) ++ "px"
3125+ , floatClass (Tuple.second shadow.offset) ++ "px"
3042− , String.fromFloat shadow.blur ++ "px"
3126+ , floatClass shadow.blur ++ "px"
3043 , formatColorClass shadow.color
3127 , formatColorClass shadow.color
@@ -3060,17 +3144,17 @@ formatBoxShadow shadow =
3063−boxShadowName shadow =
3147+boxShadowClass shadow =
3064 String.concat <|
3148 String.concat <|
3065 [ if shadow.inset then
3149 [ if shadow.inset then
3066 "box-inset"
3150 "box-inset"
3070− , String.fromFloat (Tuple.first shadow.offset) ++ "px"
3154+ , floatClass (Tuple.first shadow.offset) ++ "px"
3071− , String.fromFloat (Tuple.second shadow.offset) ++ "px"
3155+ , floatClass (Tuple.second shadow.offset) ++ "px"
3072− , String.fromFloat shadow.blur ++ "px"
3156+ , floatClass shadow.blur ++ "px"
3073− , String.fromFloat shadow.size ++ "px"
3157+ , floatClass shadow.size ++ "px"
3074 , formatColorClass shadow.color
3158 , formatColorClass shadow.color
@@ -3115,6 +3199,17 @@ paddingName top right bottom left =
3115 ++ String.fromInt left
3199 ++ String.fromInt left
3202+paddingNameFloat top right bottom left =
3206+ ++ floatClass right
3208+ ++ floatClass bottom
3118getStyleName : Style -> String
3213getStyleName : Style -> String
3119getStyleName style =
3214getStyleName style =
3120 case style of
3215 case style of