Vue 3 (CLI) imports global styles many times than need - css

So, I have scss file with global styles. This file seems like that:
#import "colors";
#import "border-radius";
#import "box-shadow";
#import "paddings";
#import "margins";
#import "fonts-famalies";
#import "font-sizes";
#import "transition-durations";
#import "global-path";
#import "mixins";
#import "mixins-properties";
#import "../design/animations/fade-animation";
::v-global(*), ::v-global(*::before), ::v-global(*::after) {
box-sizing: border-box;
outline-color: var(--color-outline__global);
transition: background-color 0.2s linear;
}
::v-global(html), ::v-global(body), ::v-global(#application) {
font-family: var(--font-famaly__comfortaa);
background-color: var(--color-background__global);
color: var(--color-font__content);
margin: 0;
font-size: 95%;
height: 100vh;
overflow-wrap: anywhere;
}
v:global(a) {
color: var(--color-font__link);
}
Styles imports using vue.config.js with this configuration:
module.exports = defineConfig({
transpileDependencies: true,
css: {
loaderOptions: {
sass: {
additionalData: `
#import "#/styles/global/global.scss";
`
}
}
}
})
All good, but when I open developer console in chrome I see picture like that.
When I checked header tag in HTML I see a lot of same css imports. If I comment all css styles - header have a lot of styles still. What am I doing wrong? I think that problem in loader

If you're going to be adding a global import (for example for shared SCSS variables and mixins), don't put ANY global styles in that import.
scss-loader's additionalData modifies each scss file it loads with the given string template. As a result, you're putting an import with your global style definitions at the start of every component's style block.
To fix this, move all your v-global(html) styles and the animations to a different file, which you import once in your index.html or App.vue. Ensure that the file you want to automatically import in your components only contains code that does not generate any styles by themselves (so scss variables, mixins, functions, etc. are fine). It's common that you name this file 'variables.scss' or similar, so no style definitions accidentally end up in this file or its dependencies.

Related

LESS variable overrides and import order

In our app.less file, we import a few variable files, and then the individual component style sheets.
app.less
#import variables.less /* Original app styles/colors */
#import corp-colors.less /* corporate color variables */
#import light-theme.less /* Theme definitions */
#import '../components/style' /* This file contains imports of every component in the app */
The variables.less file defines #link-color...
variables.less
#link-color: #1997CA;
And the light-theme.less redefines it by pulling in the corp color.
light-theme.less
body.light-theme {
#link-color: #corp-blue;
}
corp-colors.less
```less
#corp-blue: #2a60c8;
```
Finally, in my component, I digest the variable for a tab bottom border.
x-component/style.less
li {
&.is-selected {
.tab-label {
border-bottom: 3px solid #link-color;
}
}
}
As the light-theme is imported after variables, I'd expect to see the border color as #2a60c8, but am seeing the original #1997CA instead.
However, if I change the component style to use #corp-blue instead of #link-color, it shows correctly.
Am I overlooking something with import and override ordering?
LESS variables work not like CSS variables, they calculate their values on the compilation stage, not in runtime. It seems like you need to change:
body.light-theme {
#link-color: #corp-blue;
}
to:
#link-color: #corp-blue;

De-duplicating CSS

Our web application (Angular 1, Telerik Kendo, Bootstrap v4) has two themes: "light" and "dark". We produce our CSS using SCSS equivalent to the following:
html {
/* common css properties [snipped] */
&.light {
#import "./kendo/kendo.common-bootstrap.core.min";
#import "./kendo/kendo.bootstrap-v4.min";
#import "./variables.scss";
#import "components.scss";
}
&.dark {
#import "./kendo/kendo.common-material.min";
#import "./kendo/kendo.materialblack.min";
#import "./variables-inverse.scss";
#import "components.scss";
}
}
We set a class on the html element to set the theme. The site will always be "light" or "dark", nothing else. This works perfectly well for us. However, it also results in a lot of duplicated CSS rules, resulting in a larger-than-necessary CSS file. A contrived example of what I mean:
html.light a { margin: 2em; }
html.dark a { margin: 2em; }
If the site is always "light" or "dark", these rules are effectively duplicates that can be simplified to:
a { margin: 2em; }
We use Gulp in our build process.
Question: How can I de-duplicate my CSS rules OR avoid duplicating them in the first place?

vuejs multiple themes with scoped css in single file vue components

So let's assume we have a variables scss file like the following
$darken-percentage: 15%;
$primary-color: #2aaae1;
$dim-primary-color: darken($primary-color, $darken-percentage);
$complementary-color: #faaf48;
$dim-complementary-color: darken($complementary-color, $darken-percentage);
$background-color: #1d1f29;
$middleground-color: #313444;
$dim-middleground-color: darken($middleground-color, $darken-percentage);
$light-middleground-color: lighten($middleground-color, $darken-percentage);
In the main.js we could use #import 'variables.scss'
what if I have two themes and I want to change on user action I could have 2 variables files and conditionally import either based on user actions but what about single file vue components
like
<style scoped lang="scss">
#import '../../theme/_variables.scss';
.bm-upload{
background: $primary-color;
}
</style>
Then the import will not work so is there anyway for me to have global variables files and use it in other files without re importing it
The easiest is to import both style files and change a parent element's class. The browser will immediately apply the styles when the class changes.
You can, for example, change the body's class with classList and have all styles depend on that.
created(){
let body = document.getElementsByTagName('body')[0];
body.classList.add("theme1");
},
methods: {
changeTheme(){
let body = document.getElementsByTagName('body')[0];
body.classList.remove("theme1");
body.classList.add("theme2");
}
}
Style should inherit from the theme class name, like this:
.theme1 {
.exampleClass {
padding: 0;
}
}

LESS - Mixin as variable argument

I'm importing bootstrap files and rewriting the source variables, eg :
#import "./../../../../vendor/bootstrap/less/scaffolding.less";
#import "./../../../../vendor/bootstrap/less/type.less";
#import "./../../../../vendor/bootstrap/less/code.less";
#import "./../../../../vendor/bootstrap/less/grid.less";
#import "./../../../../vendor/bootstrap/less/tables.less";
#import "./../../../../vendor/bootstrap/less/forms.less";
#import "./../../../../vendor/bootstrap/less/buttons.less";
//etc ...
#font-size-base: 100%;
Then in my own variables.less I set something like that, a mixin for rem font sizing
.font-size(#sizeValue) {
#remValue: #sizeValue;
#pxValue: (#sizeValue * 10);
font-size: ~"#{pxValue}px";
font-size: ~"#{remValue}rem";
}
Now of course, I dont see how I can make that working, this is what I wanted, and it doesn't work (input not recognised) :
// In bootstrap import file, trying to overwrite their variable parameter with my mixin
#font-size-h2: .font-size(32);
Any way to do what I want ?

CSS zurb foundation and dhtmlx

I have a project that requires zurb foundation css and dhtml scheduler and the css is not playing very nicely.
There are two issues in particular.
The monthly calendar is misaligned because of the .56em .62em padding on the table.
A bit more complicated is the appointments on the calender.
this is what it looks like. notice the hole in the side menu.
The styles by default that are the problem.
And I need to remove them to properly render the page.
We are using scss version of foundation but I'm not very familiar with its capabilities and the dhtmlx controls do not use it.
So my basic question is how should i change these styles with the least amount of impact to foundation or dhtml?
I'm sure I could use java script but I think that would be a pain as the calender changes having to find all the elements to apply styles again, and i'm really hopping there is a nifty css trick. =)
Thanks!
******* EDIT ***********
The table issue was quickly fixed for chrome and IE by adding another style sheet after foundation to override the conflicting styles. Short and simple.
<style type="text/css" media="screen">
#scheduler_here table tr td, #scheduler_here table tr th
{
padding: 0;
}
#scheduler_here *, #scheduler_here *:before, #scheduler_here *,after {
box-sizing: content-box;
-webkit-box-sizing: content-box;
}
</style>
If you use Foundation 4 (F4) you can pick and choose which parts of foundation CSS are generated by Compass / Sass. Don't forget to run compass compile after you make the change.
edit -> sass/app.scss
// Global Foundation Settings
#import "settings";
// Comment out this import if you are customizing you imports below
// #import "foundation";
// Import specific parts of Foundation by commenting the import "foundation"
// and uncommenting what you want below. You must uncomment the following if customizing
#import "foundation/components/global"; // *always required
#import "foundation/components/grid";
#import "foundation/components/visibility";
#import "foundation/components/block-grid";
#import "foundation/components/type";
#import "foundation/components/buttons";
#import "foundation/components/forms"; // *requires components/buttons
#import "foundation/components/custom-forms"; // *requires components/buttons, components/forms
#import "foundation/components/button-groups"; // *requires components/buttons
#import "foundation/components/dropdown-buttons"; // *requires components/buttons
#import "foundation/components/split-buttons"; // *requires components/buttons
#import "foundation/components/flex-video";
#import "foundation/components/section";
#import "foundation/components/top-bar"; // *requires components/grid
#import "foundation/components/orbit";
#import "foundation/components/reveal";
#import "foundation/components/joyride";
#import "foundation/components/clearing";
#import "foundation/components/alert-boxes";
#import "foundation/components/breadcrumbs";
#import "foundation/components/keystrokes";
#import "foundation/components/labels";
#import "foundation/components/inline-lists";
#import "foundation/components/pagination";
#import "foundation/components/panels";
#import "foundation/components/pricing-tables";
#import "foundation/components/progress-bars";
#import "foundation/components/side-nav";
#import "foundation/components/sub-nav";
#import "foundation/components/switch";
#import "foundation/components/magellan";
// #import "foundation/components/tables"; // prevent Table CSS from loading
#import "foundation/components/thumbs";
#import "foundation/components/tooltips";
#import "foundation/components/dropdown";
Another option, if you know how you would like to change the padding, borders, etc. to match your other included elements is you could edit the _settings.scss, lines 1064 - 1097 where it has variables for tables. I am showing the variables here unmodified to illustrate what can be changed.
//
// Table Variables
//
//// Background color for the table and even rows
// $table-bg: #fff;
// $table-even-row-bg: #f9f9f9;
//// Table cell border style
// $table-border-style: solid;
// $table-border-size: 1px;
// $table-border-color: #ddd;
//// Table head styles
// $table-head-bg: #f5f5f5;
// $table-head-font-size: emCalc(14px);
// $table-head-font-color: #222;
// $table-head-font-weight: bold;
// $table-head-padding: emCalc(8px) emCalc(10px) emCalc(10px);
//// Row padding and font styles
// $table-row-padding: emCalc(9px) emCalc(10px);
// $table-row-font-size: emCalc(14px);
// $table-row-font-color: #222;
// $table-line-height: emCalc(18px);
//// Display and margin of tables
// $table-display: table-cell;
// $table-margin-bottom: emCalc(20px);
If you have time and want to go even further, you can pull the foundation/components/tables.scss file into your local project, modify it however you like and link to the modified version as above. You can find the original files by running gem which zurb-foundation I have installed with rvm so I get something like ~/.rvm/gems/ruby-1.9.3-p286/gems/zurb-foundation-4.1.5/lib/zurb-foundation.rb from the zurb-foundation-4.1.5 directory the file is located in scss/foundation/components and called _tables.scss

Resources