csscomb.js icon indicating copy to clipboard operation
csscomb.js copied to clipboard

Sass: Option to add new line before pseudo elements

Open lefoy opened this issue 11 years ago • 14 comments

Is it possible to add a new life before pseudo elements like &:before, &:after, &:focus etc?

Edit: I'm using the dev build

Before:

.folder-button{
    color: #000;
    background-color: #fff;

    &:hover{
        color: #fff;
        background-color: #000;
    }
}

After:

.folder-button{
    color: #000;

    background-color: #fff;
    &:hover{
        color: #fff;

        background-color: #000;
    }
}

Result I want:

.folder-button{
    color: #000;

    background-color: #fff;

    &:hover{
        color: #fff;

        background-color: #000;
    }
}

My config:

"always-semicolon": true,
"block-indent": 4,
"color-case": "lower",
"color-shorthand": true,
"element-case": "lower",
"eof-newline": true,
"leading-zero": false,
"remove-empty-rulesets": true,
"space-after-colon": " ",
"space-after-combinator": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": "\n",
"space-before-closing-brace": "\n",
"space-before-colon": "",
"space-before-combinator": " ",
"space-before-opening-brace": "",
"space-before-selector-delimiter": "",
"strip-spaces": true,
"unitless-zero": true,
"vendor-prefix-align": true,

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1519012-sass-option-to-add-new-line-before-pseudo-elements?utm_campaign=plugin&utm_content=tracker%2F214563&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F214563&utm_medium=issues&utm_source=github).

lefoy avatar Mar 31 '14 15:03 lefoy

In fact, is it possible to add a new file before each new selector inside another selector?

Example:

Before:

h2{
    font: $font-lastnews-article-h2;
    font-weight: 600;

    a{
        text-decoration: none;
        color: white;

        &:hover{
            text-decoration: underline;
        }
    }
}

After:

h2{
    font: $font-lastnews-article-h2;
    font-weight: 600;
    a{
        text-decoration: none;

        color: white;
        &:hover{
            text-decoration: underline;
        }
    }
}

Result I want:

h2{
    font: $font-lastnews-article-h2;
    font-weight: 600;

    a{
        text-decoration: none;

        color: white;

        &:hover{
            text-decoration: underline;
        }
    }
}

lefoy avatar Mar 31 '14 15:03 lefoy

Do you really have

.folder-button{
    color: #000;
    background-color: #fff;

    &:hover{...}
}

translated to

.folder-button{
    color: #000;

    background-color: #fff;
    &:hover{...}
}

? I mean the empty line that is jumping around.

tonyganch avatar Mar 31 '14 16:03 tonyganch

Thanks for your quick reply, that was just to show that the sort-order works. Here's another example:

Before:

.folder-button{
    width: 100%;
    display: block;
    position: relative;
    opacity: 0;

    &:hover{
        opacity: 1;
    }
}

After:

.folder-button{
    display: block;
    position: relative;

    width: 100%;

    opacity: 0;
    &:hover{
        opacity: 1;
    }
}

Result I want:

.folder-button{
    display: block;
    position: relative;

    width: 100%;

    opacity: 0;
    // This is the line I want to add ↓

    &:hover{
        opacity: 1;
    }
}

Thanks :)

lefoy avatar Mar 31 '14 16:03 lefoy

Ah, you have sort-order option set. I've thought there is a bug somewhere :)

In fact, is it possible to add a new file before each new selector inside another selector?

I guess we should add an option like rule-delimiter which will set spaces between rulesets and media queries (this has been already discussed in #92). It seems to me that this option should be more important than space-after-declaration (see #197). So we can have, for example: { 'space-after-declaration': 1, 'rule-delimiter': '\n\n' }

// Before
a {
    color: tomato;
    top: 0;
    panda {
        position: happy;
    }
    raccoon {
        a: b;
    }
    foo: bar;
}

// After
a {
    color: tomato; top: 0;

    panda {
        position: happy;
    }

    raccoon {
        a: b;
    }

    foo: bar;
}

tonyganch avatar Mar 31 '14 16:03 tonyganch

Hm... I still don't understand why there is no empty line before &:hover. Can you show your full config, please? Including sort order.

tonyganch avatar Mar 31 '14 16:03 tonyganch

Hm... I still don't understand why there is no empty line before &:hover. Can you show your full config, please? Including sort order.

I really appreciate your help, here's my full config:

{
    "exclude": [
        ".git/**",
        "node_modules/**",
        "bower_components/**"
    ],
    "always-semicolon": true,
    "block-indent": 4,
    "color-case": "lower",
    "color-shorthand": true,
    "element-case": "lower",
    "eof-newline": true,
    "leading-zero": false,
    "remove-empty-rulesets": true,
    "space-after-colon": " ",
    "space-after-combinator": " ",
    "space-after-opening-brace": "\n",
    "space-after-selector-delimiter": "\n",
    "space-before-closing-brace": "\n",
    "space-before-colon": "",
    "space-before-combinator": " ",
    "space-before-opening-brace": "",
    "space-before-selector-delimiter": "",
    "strip-spaces": true,
    "unitless-zero": true,
    "vendor-prefix-align": true,
    "sort-order": [
        [
            "$variable"
        ],
        [
            "$include"
        ],
        [
            "content",
            "display",
            "visibility",
            "float",
            "clear",
            "position",
            "top",
            "right",
            "bottom",
            "left",
            "z-index",
            "overflow",
            "overflow-x",
            "overflow-y",
            "-ms-overflow-x",
            "-ms-overflow-y",
            "clip",
            "zoom",
            "flex-direction",
            "flex-order",
            "flex-pack",
            "flex-align"
        ],
        [
            "-webkit-box-sizing",
            "-moz-box-sizing",
            "box-sizing",
            "width",
            "min-width",
            "max-width",
            "height",
            "min-height",
            "max-height",
            "margin",
            "margin-top",
            "margin-right",
            "margin-bottom",
            "margin-left",
            "padding",
            "padding-top",
            "padding-right",
            "padding-bottom",
            "padding-left"
        ],
        [
            "font",
            "font-family",
            "font-size",
            "font-weight",
            "font-style",
            "font-variant",
            "font-size-adjust",
            "font-stretch",
            "font-effect",
            "font-emphasize",
            "font-emphasize-position",
            "font-emphasize-style",
            "font-smooth",
            "line-height"
        ],
        [
            "table-layout",
            "empty-cells",
            "caption-side",
            "border-spacing",
            "border-collapse",
            "list-style",
            "list-style-position",
            "list-style-type",
            "list-style-image"
        ],
        [
            "quotes",
            "counter-reset",
            "counter-increment",
            "resize",
            "cursor",
            "-webkit-user-select",
            "-moz-user-select",
            "-ms-user-select",
            "user-select",
            "nav-index",
            "nav-up",
            "nav-right",
            "nav-down",
            "nav-left",
            "-webkit-transition",
            "-moz-transition",
            "-ms-transition",
            "-o-transition",
            "transition",
            "-webkit-transition-delay",
            "-moz-transition-delay",
            "-ms-transition-delay",
            "-o-transition-delay",
            "transition-delay",
            "-webkit-transition-timing-function",
            "-moz-transition-timing-function",
            "-ms-transition-timing-function",
            "-o-transition-timing-function",
            "transition-timing-function",
            "-webkit-transition-duration",
            "-moz-transition-duration",
            "-ms-transition-duration",
            "-o-transition-duration",
            "transition-duration",
            "-webkit-transition-property",
            "-moz-transition-property",
            "-ms-transition-property",
            "-o-transition-property",
            "transition-property",
            "-webkit-transform",
            "-moz-transform",
            "-ms-transform",
            "-o-transform",
            "transform",
            "-webkit-transform-origin",
            "-moz-transform-origin",
            "-ms-transform-origin",
            "-o-transform-origin",
            "transform-origin",
            "-webkit-animation",
            "-moz-animation",
            "-ms-animation",
            "-o-animation",
            "animation",
            "-webkit-animation-name",
            "-moz-animation-name",
            "-ms-animation-name",
            "-o-animation-name",
            "animation-name",
            "-webkit-animation-duration",
            "-moz-animation-duration",
            "-ms-animation-duration",
            "-o-animation-duration",
            "animation-duration",
            "-webkit-animation-play-state",
            "-moz-animation-play-state",
            "-ms-animation-play-state",
            "-o-animation-play-state",
            "animation-play-state",
            "-webkit-animation-timing-function",
            "-moz-animation-timing-function",
            "-ms-animation-timing-function",
            "-o-animation-timing-function",
            "animation-timing-function",
            "-webkit-animation-delay",
            "-moz-animation-delay",
            "-ms-animation-delay",
            "-o-animation-delay",
            "animation-delay",
            "-webkit-animation-iteration-count",
            "-moz-animation-iteration-count",
            "-ms-animation-iteration-count",
            "-o-animation-iteration-count",
            "animation-iteration-count",
            "-webkit-animation-direction",
            "-moz-animation-direction",
            "-ms-animation-direction",
            "-o-animation-direction",
            "animation-direction",
            "text-align",
            "-webkit-text-align-last",
            "-moz-text-align-last",
            "-ms-text-align-last",
            "text-align-last",
            "vertical-align",
            "white-space",
            "text-decoration",
            "text-emphasis",
            "text-emphasis-color",
            "text-emphasis-style",
            "text-emphasis-position",
            "text-indent",
            "-ms-text-justify",
            "text-justify",
            "letter-spacing",
            "word-spacing",
            "-ms-writing-mode",
            "text-outline",
            "text-transform",
            "text-wrap",
            "text-overflow",
            "-ms-text-overflow",
            "text-overflow-ellipsis",
            "text-overflow-mode",
            "-ms-word-wrap",
            "word-wrap",
            "word-break",
            "-ms-word-break",
            "-moz-tab-size",
            "-o-tab-size",
            "tab-size",
            "-webkit-hyphens",
            "-moz-hyphens",
            "hyphens",
            "pointer-events"
        ],
        [
            "opacity",
            "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
            "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha",
            "-ms-interpolation-mode",
            "color",
            "border",
            "border-width",
            "border-style",
            "border-color",
            "border-top",
            "border-top-width",
            "border-top-style",
            "border-top-color",
            "border-right",
            "border-right-width",
            "border-right-style",
            "border-right-color",
            "border-bottom",
            "border-bottom-width",
            "border-bottom-style",
            "border-bottom-color",
            "border-left",
            "border-left-width",
            "border-left-style",
            "border-left-color",
            "-webkit-border-radius",
            "-moz-border-radius",
            "border-radius",
            "-webkit-border-top-left-radius",
            "-moz-border-radius-topleft",
            "border-top-left-radius",
            "-webkit-border-top-right-radius",
            "-moz-border-radius-topright",
            "border-top-right-radius",
            "-webkit-border-bottom-right-radius",
            "-moz-border-radius-bottomright",
            "border-bottom-right-radius",
            "-webkit-border-bottom-left-radius",
            "-moz-border-radius-bottomleft",
            "border-bottom-left-radius",
            "-webkit-border-image",
            "-moz-border-image",
            "-o-border-image",
            "border-image",
            "-webkit-border-image-source",
            "-moz-border-image-source",
            "-o-border-image-source",
            "border-image-source",
            "-webkit-border-image-slice",
            "-moz-border-image-slice",
            "-o-border-image-slice",
            "border-image-slice",
            "-webkit-border-image-width",
            "-moz-border-image-width",
            "-o-border-image-width",
            "border-image-width",
            "-webkit-border-image-outset",
            "-moz-border-image-outset",
            "-o-border-image-outset",
            "border-image-outset",
            "-webkit-border-image-repeat",
            "-moz-border-image-repeat",
            "-o-border-image-repeat",
            "border-image-repeat",
            "outline",
            "outline-width",
            "outline-style",
            "outline-color",
            "outline-offset",
            "background",
            "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
            "background-color",
            "background-image",
            "background-repeat",
            "background-attachment",
            "background-position",
            "background-position-x",
            "-ms-background-position-x",
            "background-position-y",
            "-ms-background-position-y",
            "-webkit-background-clip",
            "-moz-background-clip",
            "background-clip",
            "background-origin",
            "-webkit-background-size",
            "-moz-background-size",
            "-o-background-size",
            "background-size",
            "box-decoration-break",
            "-webkit-box-shadow",
            "-moz-box-shadow",
            "box-shadow",
            "filter:progid:DXImageTransform.Microsoft.gradient",
            "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient",
            "text-shadow"
        ]
    ]
}

lefoy avatar Mar 31 '14 16:03 lefoy

That's a bug, I confirm that it's reproducible both in master and dev. There should definitely be an empty line before &:hover. Will try to include the fix in next release. Thank you!

As for empty lines before every rule set, I've opened #210 for discussion.

tonyganch avatar Mar 31 '14 18:03 tonyganch

I really appreciate your help! I will wait for the next release :)

Any idea when it will be available? I've read that there's a release planned for march, is it still the case? Thanks!

lefoy avatar Mar 31 '14 18:03 lefoy

We've postponed it for a month, so April it is :)

tonyganch avatar Mar 31 '14 19:03 tonyganch

@tonyganch Is this still an issue in the latest version? I'm seeing it in my code.

This:

label {
    margin-bottom: $v-space / 2;

    font-weight: bold;

    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);

    &:active {
        color: $active-link-color;
    }
}

turns into this:

label {
    margin-bottom: $v-space / 2;

    font-weight: bold;

    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    &:active {
        color: $active-link-color;
    }
}

kpeatt avatar Jul 25 '14 22:07 kpeatt

Yeap, I confirm. Newlines still stripped away for some reason

ArmorDarks avatar Sep 09 '14 14:09 ArmorDarks

yep, same here as @tonyganch. Any word on this?

Not working for me - https://gist.github.com/thebugs/977813e0040a4145cf9d

sethburtonhall avatar Sep 25 '14 17:09 sethburtonhall

Same story

igor0ser avatar Nov 25 '15 09:11 igor0ser

I wish it would be this option too.

MayaSol avatar Jun 14 '16 07:06 MayaSol