How to use scss #use in nest .scss file with react? - sass

I have these .scss files:
src/assets/css/color.scss
$white: #fff;
src/assets/css/index.scss
#use './color' as *;
src/assets/variables.scss
#use './css'
$theme-color = $white;
but it's not working. why?
Element 'white' is resolved only by name without use of explicit imports

You would need to use #forward in src/assets/css/index.scss
src/assets/css/index.scss
#forward './color';
and in src/assets/variables.scss, you would need to use the $white variable in the following manner
src/assets/variables.scss
#use './css';
$theme-color = css.$white;
#forward is use when you want to forward a partial in the main file like you are doing in index.scss and for variable.scss #use './css' will make all variable, function, mixin scoped to css variable so if you want to use $white variable you would need to use css.$white and if you do not want to do that you can use #use './css' as *; this will make you use $white variable directly without css. as prefix.
Hope it solves your issue.

Related

Separate main files in SCSS result in undefined variables

I'm basically doing a "theme" over existing scss by changing some variable definitions. I need to have separate css bundles rendered with different variables. I thought of having separate main files that import the common files to keep it DRY.
File structure
- variables_1.scss
- variables_2.scss
- main_1.scss
- main_2.scss
- _main-shared.scss
_main-shared.scss contains #import statements for all other scss files, but does not import variables.
Main file contents:
//main_1.scss
#use 'variables_1' as *;
#import "main-shared";
//main_2.scss
#use 'variables_2' as *;
#import "main-shared";
But multi-level imports do not seem to work resulting in SassError:
Undefined variable in _main-shared.scss.
Is there a better way to do this? I cannot import variables in _main-shared.scss since it would defeat the purpose of having separate variable files.
Is there a fix for this that I am not aware of or a better solution?

Sass doesn't compile variables properly

I start to write my own SCSS along with boostrap. I follow the hierarchy of the framework like:
/* The main file and all partial files are in the same directory */
#import "variables";
#import "mixins";
#import "other-components";
Everything compiles perfectly except that every variable from variables.scss is not compiled. From my understanding, CSS doesn't have variables except for :root, so SCSS variables will be compiled directly to its value in CSS. But when it's done compiling, the variables in CSS remain the same as they're in SCSS, just name like --primary but not value like #000.
Before my post gets slammed as duplicate, here's what I've done:
I've followed Bootstrap's practice. You can check them on Github.
I use VSCode and my colors have boxes right next to them, so I've written valid hex values;
I've tried to switch to #use and use as namespace instead of #import.
I've tried to rename my variables file with and without underscore _ back and forth. It doesn't help solve the problems.
The compiler shows no error whatsoever.
I only use sass package to compile .scss to .css. No extra libraries.
main.scss
_variables.scss
main.css
Any help is appreciated!
When using standard CSS variables, you should make SASS write out the contents like this:
--variable: #{$sass-var};
Otherwise SASS will print the variable as if it's a valid value inside a CSS value (since you could technically define something like --var: $text and then use it later with content: var(--var) to print out that string). Anyways, it's because SASS otherwise doesn't know if you want to print the output of the variable, or just a string named similar to a sass variable.

How to import a SASS file?

I'm trying to use multiple variables accross my differents files, but I got an error saying Undefined variable.
The example:
base.scss
$dark-blue: #031f60;
$blue: #36b2e6;
$dark-grey: #747577;
center.scss
#use 'base';
p {
color: $dark-blue;
}
I specifically used #use because SASS website mentioned that it will be deprecated in the future.
#use only works with dart-sass so far, nonetheless,
The naming scheme for files that you want to include should have an underscore _ at the start of the file name.
for example if anyone wants to include a variables file they should name it as _variables.scss rather than variables.scss.
In your case, change the name of base.scss to _base.scss and it should work as long as they are in the same folder/path given is correct.

Sass Map (scss map-get) use in other scss import

i have the index.scss that I've import login.scss , my question is how do map-get the color from index.scss ?
index.scss
#import "./style/login";
$colors: (
primary : #005DFF,
accent : #FFF6BB
);
this is what i done but i receive an error :
"File to import not found or unreadable: ./style/login."
login.scss
.bg {
background-color: map-get($colors, primary );
}
thank you in advance
That error means the file isn't at the path you're pointing to. Is index.scss in the same directory as login.scss? If the file path is correct, it might be an issue with your build process. If you can, please add a screenshot of the folder where these files are, so we can see if the path is right.
Once you have that sorted, you'll need to edit this sass to make it work right. In index.scss, you need to declare your $colors map above your #import login. Otherwise, when login gets imported, it doesn't know what $colors is supposed to be.

SCSS 'partially compiled', variables left in CSS?

I have no background in SCSS, but I want to make a small change to an existing SCSS and recompile it. However, I found that variables with a dollar sign appear in the output CSS. Even if I discard my changes, the output CSS does not match the original.
For example,
#-webkit-keyframes $animation-name {...
is in my output, while
#-webkit-keyframes move-up {...
is the expected original output.
I think it is either because I didn't use the right command to compile the SCSS files, or because the SCSS files were written for an older compiler.
I have tried the following commands (I clear any output before each trial):
sass --scss main.scss main.css
sass --scss --update main.scss:main.css
sass --scss --update .
Because main.scss imports another SCSS file, I also tried copying the content of the depedent SCSS file into main.scss. This didn't make any difference.
The reason variable names are printed instead of their values is because they were not interpolated so sass uses them as the values instead.
You should write
//Assuming a variable $animation-name: move-up;
#-webkit-keyframes #{$animation-name} { ....
Which gets compiled to
#-webkit-keyframes move-up { ....
Without the interpolation sass believes that the $animation-name is the actual name intended to be used as the name for the animation.

Resources