HorusKol

Adventures and musings in the world of web development

Getting Tailwind CSS into Jigsaw

October 23, 2018

This site is powered by the static site generator Jigsaw, and uses the Tailwind utility-first CSS framework.

Getting Tailwind into Jigsaw is pretty easy if you're already familiar with using various CSS processing tools, along with Laravel Mix and webpack. If, like me, you're only just starting to use these tools, hopefully this will help you.

Prequisites

Assuming you've already got a site using Jigsaw, you'll first need to add a few node packages:

yarn add tailwindcss laravel-mix-purgecss postcss-import --dev

The postcss-import package lets you use @import statements in CSS, while the laravel-mix-purgecss package provides a Mix plugin which removes any unused CSS classes to reduce the payload to browsers. Tailwind generates a very large stylesheet to save you having to write it for yourself, but you are likely only going to use a small subset of all that.

CSS

As I was just starting fresh with my new site, I simply placed this into source\_assets\css\main.css:

/**
 * This injects Tailwind's base styles, which is a combination of
 * Normalize.css and some additional base styles.
 *
 * You can see the styles here:
 * https://github.com/tailwindcss/tailwindcss/blob/master/css/preflight.css
 */
@import  "tailwindcss/preflight";

/**
 * This injects any component classes registered by plugins.
 */
@import  "tailwindcss/components";

/**
 * Here you would add any of your custom component classes; stuff that you'd
 * want loaded *before* the utilities so that the utilities could still
 * override them.
 *
 * Example:
 *
 * .btn { ... }
 * .form-input { ... }
 *
 * Or if using a preprocessor or `postcss-import`:
 *
 * @import  "components/buttons";
 * @import  "components/forms";
 */

@import  "components/markdown";

/**
 * This injects all of Tailwind's utility classes, generated based on your
 * config file.
 */
@import  "tailwindcss/utilities";

/**
 * Here you would add any custom utilities you need that don't come out of the
 * box with Tailwind.
 *
 * Example :
 *
 * .bg-pattern-graph-paper { ... }
 * .skew-45 { ... }
 *
 * Or if using a preprocessor or `postcss-import`:
 *
 * @import  "utilities/background-patterns";
 * @import  "utilities/skew-transforms";
 */

components/markdown

I also introduced a source/_assets/css/components/markdown.css file to let me style the HTML generated by the markdown I use to write my blog posts.

/**
 * define markdown styling using tailwind utility classes
 */
.markdown h1 {
  @apply  mb-4;
}

.markdown p {
  @apply  mb-4 leading-normal;
}

Mix

Lastly, I updated the script in webpack.mix.js:

let mix = require('laravel-mix');
let tailwind = require('tailwindcss');
let build = require('./tasks/build.js');
require('laravel-mix-purgecss');

mix.disableSuccessNotifications();
mix.setPublicPath('source/assets/build');
mix.webpackConfig({
    plugins: [
        build.jigsaw,
        build.browserSync(),
        build.watch(['source/**/*.md', 'source/**/*.php', 'source/**/*.scss', '!source/**/_tmp/*']),
    ]
});

mix.options({
    processCssUrls: false,
    postCss: [
        require('postcss-import'),
        tailwind('tailwind.js'),
    ]
})
    .postCss('source/_assets/css/main.css', 'css/main.css')
    .js('source/_assets/js/main.js', 'js')
    .purgeCss({
        folders: ['source'],
    })
    .version();

Links and references

The Mix/Webpack script was sourced from hellocosmin/jigsaw-tailwindcss