How can you setup a index.scss and import global stylesheets for variables, mixins, etc, to an angular 6 library?
Angular CLI generates a lib with a root component &
For global styles, I've answered it in this question.
For ng-packgr
versions 9.x and above
Copying assest to output folder is now directly supported as explained in this page
{
"$schema": "./node_modules/ng-packagr/package.schema.json",
"name": "@my/library",
"version": "1.0.0",
"ngPackage": {
"assets": [
"CHANGELOG.md",
"./styles/**/*.theme.scss"
],
"lib": {
...
}
}
}
index.scss
file in your library's root folder. If you follow this guide from Angular, then your path will be my-project/projects/my-library/index.scss
. This is also the folder where your package.json
is.So, index.scss
will be the file with your variables and mixins
$grey: #222;
@mixin mymixin {
background: #222;
}
import
@import '../../index.scss';
or whatever relative path your component scss file is at.
package.json
file (NOT THE LIBRARY'S).{
"name": "my-project",
"version": "1.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build && npm run copyScss",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"copyScss": "xcopy \"projects\my-library\index.scss\" \"dist\\my-library\\\""
},
...
}
Now, very important, DO NOT use ng build
to build your library, instead use npm run build
. This will automatically execute the copy command. Now the index.scss
file is exported along with your library in the my-project/dist
folder.
Include the index.scss
in your app project's scss files
// ~ stands for the node_modules folder
@import '~my-library/index.scss';
Now you have all your library mixins in all of the projects you installed your library.
Cheers!
PS Workarounds are not the most elegant solutions, but when nothing else works, they work around!
Have you tried setting the encapsulation level of the component to none as part of the component metadata? Like this:
@Component({
selector: 'app-component',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
encapsulation: ViewEncapsulation.None
})
The ViewEncapsulation levels are:
Check out the Angular Docs on ViewEncapsulation and I wrote a blog post on it.
I think people may be missing the fact that while encapsulation options exist, global styles are output in style tags and can cascade throughout your project.
Here is my setup:
My global styles: styles.scss is output in style tags. The rules target all matching classes and elements as expected. Even within components.
Component styles are encapsulated. That is their value prop. They overwrite globals and keeps component-specific styles with the component family.
@includes
such as variables.scss, mixins.scss etc. are included explicitly at the top of any component .scss files when needed.
@import '../../../../scss/includes/variables';
What else would we need?
Run ng init
on the project, so that it will initialize the project as an Angular CLI project.
Edit:
My bad, it seems they removed init
from the CLI. You can try ng new --src
It might overwrite some files, so try this on a copy of the project.