Configuring Less
A great advantage of using Harp is that it has a built-in Less compiler. When you run the $ harp compile
command, it compiles both your .ejs
templates and your .less
files into regular HTML and CSS. This is much easier than using something like less.js
, which you would have to remove from production. When you're compiling your project for the first time, ensure that you include some code inside your theme.less
file. Otherwise, theme.css
will not be written.
Defining your Less variables
Head back to the css
/components
directory that you created earlier and open up the _variables.less
file. Within this file, we'll configure what I call global CSS variables. Moreover, within this file, we'll define only those variables that apply across our entire website. Component-specific variables have no place in this file. I know that some developers like to have one big file for variables, but I prefer to keep the component-specific ones out in their own Less files. We will see more on that later, when we dive into custom components. For now, let's start pasting the following code in _variables.less
.
Colors
Let's start by inserting some color variables that can be used throughout all our Bootstrap projects:
@black: #000; @dark-grey: #333; @grey: #ccc; @light-grey: #ebebeb; @off-white: #f5f5f5; @white: #ffffff; @blue1: #3498db; @blue2: #2980b9; @red1: #e74c3c; @red2: #c0392b; @yellow1: #f1c40f; @yellow2: #f39c12; @green1: #2ecc71; @green2: #27ae60; @orange1: #e67e22; @orange2: #d35400; @aqua1: #1abc9c; @aqua2: #16a085; @purple1: #9b59b6; @purple2: #8e44ad; @navy1: #34495e; @navy2: #2c3e50;
As you'll see, I like to define a fairly large color palette. But this doesn't mean that all my projects will use all of these colors. However, like a good typography, it's a good idea over time to develop a library of colors that work well together. We can then easily include them in all our projects so that we have colors that work well together right at our fingertips. When you are diving deep into theming, this is really valuable because you don't have to go and look for a new color palette with every new theme. You already have a collection of colors that you can pull from, which will speed up your theming process.
Backgrounds
Lets add the background variables:
@primary-background: @white; @secondary-background: @off-white; @third-background: @light-grey; @fourth-background: @grey; @inverse-background: @dark-grey;
Tip
The preceding code is my boilerplate for backgrounds. Note how these colors use a variable name for their value and not a hexadecimal value. The reason that this is done is to speed up theming. Instead of having to change a color in two places, we only have to change it in one, and then it inherits throughout our other variables. Here are a few more key points about backgrounds.
The variable naming convention here is similar to that of Bootstrap, for consistency. This also makes it easier to remember a variable name, such as primary, as against something like white-background.
At the very least, you should have a primary, a secondary, and an inverse background. I like to include a couple more, but feel free to scale this back a bit if it makes it easier for you.
Text
As with our backgrounds, we are following the Bootstrap naming conventions for our text colors:
@primary-text: @dark-grey; @light-text: @light-grey; @loud-text: @black; @inverse-text: @white; @heading-text: @dark-grey;
Consistency is the key as it makes it easier to remember variable names. It is critical when you're dealing with a large framework that you make things as easy as possible to remember. Again, make sure you use color variables for the values here and not actual hexadecimal numbers.
Links
Defining the link colors is pretty straightforward:
@primary-link-color: @blue1; @primary-link-color-hover: @blue2;
One thing that I'll point out here is that this is the first example where you'll see why you should have at least two versions of every color that you use in your palette. Things such as hover states usually require a base color and a darker or lighter version of the same color to indicate a change in hovering. You may want to expand this section to include a second or even third-link color variation.
Borders
The border variable is the first place where you'll see some values that aren't only color-based:
@border-color: @light-grey; @border-size: 1px; @border-type: solid; @border-focus: @grey; @secondary-border-color: @blue1;
In this case, you should always set your size to 1px
. The reason for this is that you can use a Less operation like the following to increase the size of your border. Starting from 1px
makes your operations simple and easy to follow for other developers who may be maintaining or editing your code:
.good-class { border-size: (@border-size + 1); } .bad-class { border-size: 2px; }
Tip
Never use pixel values in any of your custom CSS! You would want to use variables so that you can make any units relative and, therefore, controlled by a variable. This will allow you to quickly spin up a new theme by only editing the variable's Less file.
Typography
Next we need to setup the global settings for our typography variables. We'll set our body and heading font stacks, a base font size and line height.
@body-copy: "Helvetica Neue", helvetica, arial, verdana, sans-serif; @heading-copy: "Helvetica Neue", helvetica, arial, verdana, sans-serif; @base-font-size: 14px; @font-size: 1em; @base-line-height: 1.5;
When I set up typography for a theme, I like to follow a few simple rules:
- Make sure you define at least a body and a heading copy variable.
- Set the base font size as a pixel value.
- Set the actual font size to
1em
and use this variable throughout your custom CSS. In this way, you will be using a relative value that is easier with operations. This is exactly the same as the preceding border example. - I personally prefer to reset Bootstrap's line-height to 1.5 for easier math.
Layout
The only layout variables that you should be setting in your globals are margin
and padding
:
@margin: 1em; @padding: 1em;
Both should be set to 1em
for easy relative operations. This follows the same unit of measurement patterns set with borders and typography.
Mixins
The other element that I recommend including in your global Less file is mixins. In my opinion, there are only two of them (and maybe only one) that you definitely need to include to speed up your Bootstrap theming.
Border radius
The border radius is by far the most important as it is used a ton through Bootstrap components:
.round-corners (@radius: 2px) { -moz-border-radius: @radius; -ms-border-radius: @radius; border-radius: @radius; }
Make sure you set this up and use it for everything. If you are thorough, you can change the border radius of all elements in one place. An example of this would look like the following:
.btn { /* fill in the rest of the styles here */ .round-corners; }
Now, if I change my @radius
value to a different pixel amount, it will inherit down to my button corners. Do this for all your Bootstrap components!
Animations and transitions
Another property that I use heavily in my themes is the animations or transitions property:
.transition (@transition: background .1s linear) { -moz-transition: @transition; -webkit-transition: @transition; transition: background @transition; }
I find that a little transition, when added, can add a lot to a UI. Instead of defining this from the ground up on every component, use this simple mixin. It will speed up your theming time and also ensure that transitions are consistent across your entire theme. That's just good design and coding. Here's an example that shows you how to apply the round corners and transition mixins to a button:
.btn { /* fill in the rest of the styles here */ .round-corners; .transition; }
This completes your _variables.less
file. Save the file and close it. Next, we'll cover the setup of the master theme file for our project.
Setting up your theme
Now that we've set up our variables file, we need to set up the master theme that we'll import it into. The master theme file, or theme.less
, is the primary file that we will link in the <head>
section of our pages. I've organized the theme using the Scalable and Modular CSS (SMACSS) system. Using a modular approach while coding the CSS will make the job easier and the code more maintainable over time.