Skip to content

Write utility classes conveniently while optimising your CSS

License

Notifications You must be signed in to change notification settings

gavinmcfarland/stylup

Repository files navigation

Stylup pHTML

NPM Version Build Status Support Chat

Stylup gives your markup super powers.

  • Automatically processes PostCSS in style tags <style> and inline styles style="".
  • Fully featured CSS can be used inside inline styles.
  • Support for functional class names with dynamic arguments.

Example

Write inteligent functional classes based on their arguments.

<div class="p-4,1,*"></div>

Transforms into styles based on your configuration (not setup by default).

<style>
.80YQhjgv {
  --pt: 4;
  --pr: 1;
  --pl: 1;
}
</style>
<div class="p 80YQhjgv"></div>

You can configure class functions to output whatever you like.

When used with a stylesheet it becomes very powerful, requiring minimal pre configuration to work with your design system.

.p {
  padding-top: calc(var(--pt, initial) * 1rem);
  padding-right: calc(var(--pr, initial) * 1rem);
  padding-bottom: calc(var(--pb, initial) * 1rem);
  padding-left: calc(var(--pl, initial) * 1rem);
}

Features

  • Supports PostCSS

    Add support for PostCSS by including a postcss.config.js file in your project.


  • Inline Styles

    Make use of all CSS features inline including hover states and media queries.

    <div style="&:hover { color: red; }"></div>

  • Functional Class Names

    Use inteligent functional class names. Seperate arguments with commas. Use a wildcard to skip arguments. See below for configuring class names.

    <div class="p-4 m-*,auto fl-wrap"></div>

  • Custom Syntax

    Customise the syntax used for functional classes by by overiding the default regex pattern. stylup.process(html, null, options);

    // Options
    let options = {
      regex: {
        property: /[^-\s]+/,
        number: /[0-9]*\.?[0-9]+|\*/,
        unit: /px|cm|mm|in|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax/,
        seperator: /,/,
        arg: /0*({{number}})({{unit}})?|(\w+)/,
        args: /(?:({{arg}}){{seperator}}?)+/,
        decl: /({{property}})(?:-({{args}}))?/
      	};
    }

Configuration

By default stylup will look for a file called stylup.config.js at the root of your project.

// stylup.config.js
module.exports = {
  classes: [
    {
      class: 'p',
      children: [
        't',
        'r',
        'b',
        'l'
      ],
      style: ({ property, children, args, str }) => {

        if (args.length < 3) args.push(args[0])
        else args.push(args[1])

        for (let [i, side] of children.entries()) {
          str`--${property}${side}: ${args[i]};`
        }

        return str()
      }
    }
    // ...
  ]
}

Usage

Add stylup to your project:

npm install stylup --save-dev

Use stylup to process your HTML:

const stylup = require('stylup');

stylup.process(YOUR_HTML /*, processOptions, pluginOptions */);

Or use it as a pHTML plugin:

const phtml = require('phtml');
const stylup = require('stylup');

phtml([
  stylup(/* pluginOptions */)
]).process(YOUR_HTML /*, processOptions */);

Or to use with Svelte

const stylup = require('stylup');

export default [{
	// ...
    plugins: [
        svelte({
            preprocess:
                [{
                    markup({ content, filename }) {
                        content = content.replace(/(?<=\<[^>]*)=(\{[^{}]*\})/gmi, (match, p1) => {
                            return `="${p1}"`
                        })
                        return stylup.process(content, { from: filename }).then(result => ({ code: result.html, map: null }));
                    }
                }]
        }),
        // ...

Options

By default block styles also processed. Set this to false to avoid processing them. stylup.process(html, null, options).

// Options
let options = {
  processBlockStyles: false
}

About

Write utility classes conveniently while optimising your CSS

Resources

License

Stars

Watchers

Forks

Packages

No packages published