diff --git a/src/Css/Preprocess/Resolve.elm b/src/Css/Preprocess/Resolve.elm index 4985c18c..873db9e8 100644 --- a/src/Css/Preprocess/Resolve.elm +++ b/src/Css/Preprocess/Resolve.elm @@ -279,7 +279,7 @@ applyMixins mixins declarations = applyNestedMixinsToLast nestedMixins rest - (Structure.appendToLastSelector selector) + (Structure.appendRepeatableToLastSelector selector) declarations (NestSnippet selectorCombinator snippets) :: rest -> diff --git a/src/Css/Structure.elm b/src/Css/Structure.elm index 0fc57a72..ced7205f 100644 --- a/src/Css/Structure.elm +++ b/src/Css/Structure.elm @@ -245,34 +245,35 @@ extendLastSelector selector declarations = first :: extendLastSelector selector rest -appendToLastSelector : RepeatableSimpleSelector -> StyleBlock -> List StyleBlock -appendToLastSelector selector styleBlock = +appendToLastSelector : (Selector -> Selector) -> StyleBlock -> List StyleBlock +appendToLastSelector f styleBlock = case styleBlock of StyleBlock only [] properties -> [ StyleBlock only [] properties - , StyleBlock (appendRepeatableSelector selector only) [] [] + , StyleBlock (f only) [] [] ] StyleBlock first rest properties -> let newRest = - mapLast (appendRepeatableSelector selector) rest + List.map f rest + + newFirst = + f first in [ StyleBlock first rest properties - , StyleBlock first newRest [] + , StyleBlock newFirst newRest [] ] +appendRepeatableToLastSelector : RepeatableSimpleSelector -> StyleBlock -> List StyleBlock +appendRepeatableToLastSelector selector styleBlock = + appendToLastSelector (appendRepeatableSelector selector) styleBlock + + appendPseudoElementToLastSelector : PseudoElement -> StyleBlock -> List StyleBlock appendPseudoElementToLastSelector pseudo styleBlock = - case styleBlock of - StyleBlock only [] properties -> - [ StyleBlock only [] properties - , StyleBlock (applyPseudoElement pseudo only) [] [] - ] - - a -> - [ a ] + appendToLastSelector (applyPseudoElement pseudo) styleBlock applyPseudoElement : PseudoElement -> Selector -> Selector diff --git a/test/Fixtures.elm b/test/Fixtures.elm index 9be1111b..b26b309d 100644 --- a/test/Fixtures.elm +++ b/test/Fixtures.elm @@ -69,6 +69,20 @@ bug99 = ] +bug140 : Stylesheet +bug140 = + stylesheet + [ each [ input, select, selector "textarea"] + [ focus + [ borderColor (hex "#000000") + ] + , after + [ color (hex "#aaaaaa") + ] + ] + ] + + simpleEach : Stylesheet simpleEach = stylesheet diff --git a/test/Tests.elm b/test/Tests.elm index b53e1205..f249e2d8 100644 --- a/test/Tests.elm +++ b/test/Tests.elm @@ -22,6 +22,7 @@ all = , atRule , nestedAtRule , bug99 + , bug140 , universal , multiSelector , multiDescendent @@ -210,6 +211,33 @@ nestedAtRule = ] +{-| Regression test for https://github.com/rtfeldman/elm-css/issues/140 +-} +bug140 : Test +bug140 = + let + input = + Fixtures.bug140 + + output = + """ +input:focus, select:focus, textarea:focus { + border-color: #000000; +} + +input::after, select::after, textarea::after { + color: #aaaaaa; +} + """ + in + describe "`each` with pseudo classes" + [ test "pretty prints the expected output" <| + \_ -> + outdented (prettyPrint input) + |> Expect.equal (outdented output) + ] + + {-| Regression test for https://github.com/rtfeldman/elm-css/issues/99 -} bug99 : Test