Search code examples
csswebpackpostcsscss-modules

Is it possible to have a local class inherit all classes imported from a file?


Say I have a css file that looks something like this:

/* Base styles */
.content {
    background-color: var(--background);
    color: var(--text);
    font-family: "Helvetica Neue", Helvetica, sans-serif;
    font-size: 16px;
    line-height: 1.5;
    text-rendering: optimizeLegibility;
}

@media (min-width: 500px) {
    .content {
        font-size: 22px;
    }
}

/* Headers */
h2 {
    font-family: "Helvetica Neue", Helvetica, sans-serif;
    font-size: 24px;
    font-weight: 700;
}

/* Classes */
.small-caps {
    font-feature-settings: "tnum";
    letter-spacing: 0.05em;
}

With PostCSS you can consume another class’s properties like this:

.another-class {
    composes: content from "other-file.css";
}

… which will be compiled to:

.another-class {
    background-color: var(--background);
    color: var(--text);
    font-family: "Helvetica Neue", Helvetica, sans-serif;
    font-size: 16px;
    line-height: 1.5;
    text-rendering: optimizeLegibility;
}

Is it possible to have a class inherit all styles from a given target so you can write something like (pseudo code):

.another-class {
    composes: * from "other-file.css";
}

… that when rendered it comes out like this?

/* Base styles */
.another-class .content {
    background-color: var(--background);
    color: var(--text);
    font-family: "Helvetica Neue", Helvetica, sans-serif;
    font-size: 16px;
    line-height: 1.5;
    text-rendering: optimizeLegibility;
}

@media (min-width: 500px) {
    .another-class .content {
        font-size: 22px;
    }
}

/* Headers */
.another-class h2 {
    font-family: "Helvetica Neue", Helvetica, sans-serif;
    font-size: 24px;
    font-weight: 700;
}

/* Classes */
.another-class .small-caps {
    font-feature-settings: "tnum";
    letter-spacing: 0.05em;
}

Solution

  • This is possible using Sass (Scss).

    Example:

    test1.scss

    .elem {
      background: red;
      @import 'test2';
    }
    

    test2.scss

    .inner {
      background: blue;
    }
    
    .outer {
      background: green;
    }
    
    @media (max-width: 500px){
      .something {
        color: black;
      }
    }
    

    Output:

    .elem {
      background: red; }
      .elem .inner {
        background: blue; }
      .elem .outer {
        background: green; }
      @media (max-width: 500px) {
        .elem .something {
          color: black; } }