If you use Sass and a build system with vue-loader
or vueify
in your project, you can customize the components by overriding Sass variables and then importing the .vue
source files.
The variables can be overridden using the data
and includePaths
options of node-sass
, which can be set in your Webpack config if using Webpack or vue.config.js
file if using Browserify.
In the data
option we import our overriding variables file, which will be prepended to every Sass file processed by node-sass
. The includePaths
option allows us to specify where to look for files imported in data
.
You can customize the primary
and accent
theme colors using the $brand-primary-color
and $brand-accent-color
variables.
The following examples assume these files in your project:
src/styles/variables.scss
:
$brand-primary-color: #673AB7;
$brand-accent-color: #FF4081;
src/App.vue
:
<template>
<div>
<ui-button color="primary">Primary button</ui-button>
<ui-button color="accent">Accent button</ui-button>
</div>
</template>
<script>
import 'nucleus-ui-kit/src/bootstrap'; // Required to setup Nucleus, should be imported only once in your project
import UiButton from 'nucleus-ui-kit/src/UiButton.vue';
export default {
components: {
UiButton
}
}
</script>
Add the following to your Webpack config, at the top level:
plugins: [
new webpack.LoaderOptionsPlugin({
options: {
sassLoader: {
data: '@import "src/styles/variables.scss";',
includePaths: 'src/styles'
},
context: path.resolve(__dirname) // your project root
}
})
]
Add the following to your Webpack config, at the top level:
sassLoader: {
data: '@import "src/styles/variables.scss";',
includePaths: 'src/styles'
}
Add the following to your vue.config.js
file, at the top level:
sass: {
data: '@import "src/styles/variables.scss";',
includePaths: 'src/styles'
}
All other variables in nucleus-ui-kit/src/styles/variables.scss
can be overridden to customize other aspects of the components in the same manner as the examples above.
Some components also have component-specific variables that can be found in their source files. Those can be overridden as well.
Nucleus components use the rem
CSS unit for properties with length values (e.g. font-size
, margin
, padding
, width
, height
, etc). This allows you to customize the size of all components by setting font-size
on the root (<html>
) element.
The default root font size is 100%
, which uses the browser's font size setting, typically 16px
.
To scale the size of components up, set a font size higher than 100%
on the root element, for example:
html {
font-size: 110%;
}
To scale the size of components down, set a font size lower than 100%
on the root element, for example:
html {
font-size: 90%;
}
Some components have props that can be configured globally. The format of the config object and available options can be seen in src/config.js.
Set your global config options on window.NucleusConfig
before importing Nucleus.
import Vue from 'vue';
// Globally configure Nucleus
window.NucleusConfig = {
disableRipple: true,
UiAutocomplete: {
keys: {
label: 'name',
value: 'id',
image: 'picture'
}
}
};
// Using `require()` and not `import` because `import` statements are hoisted
require('nucleus-ui-kit/dist/nucleus-ui-kit.min.css');
const NucleusUI = require('nucleus-ui-kit').default;
const App = require('path/to/App.vue'); // the root Vue instance
Vue.use(NucleusUI);
new Vue({
el: '#app',
render: h => h(App)
});
Note: this usage method only works if you are using
vue-loader
orvueify
in your project and importing Nucleus from source (i.e. importing fromnucleus-ui-kit/src
).
Import NucleusConfig
from nucleus-ui-kit/src/config
and call .set()
with your options before importing Nucleus.
import Vue from 'vue';
// Using `require()` and not `import` because `import` statements are hoisted
const NucleusConfig = require('nucleus-ui-kit/src/config').default;
NucleusConfig.set({
disableRipple: true,
UiAutocomplete: {
keys: {
label: 'name',
value: 'id',
image: 'picture'
}
}
});
const NucleusUI = require('nucleus-ui-kit/src').default;
const App = require('./App.vue'); // the root Vue instance
Vue.use(NucleusUI);
new Vue({
el: '#app',
render: h => h(App)
});