Stylup 

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.
<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
-
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)
;
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}}))?/
};
}
Configure
By default stylup
will look for a file called stylup.config.js
at the root of your project.
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 );
Or use it as a pHTML plugin:
const phtml = require('phtml');
const stylup = require('stylup');
phtml([
stylup()
]).process(YOUR_HTML );
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)
.
let options = {
processBlockStyles: false
}