Stylup gives your markup super powers.
- Automatically processes PostCSS in style tags
<style>
and inline stylesstyle=""
. - Fully featured CSS can be used inside inline styles.
- Support for functional class names with dynamic arguments.
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);
}
-
Add support for PostCSS by including a
postcss.config.js
file in your project.
-
Make use of all CSS features inline including hover states and media queries.
<div style="&:hover { color: red; }"></div>
-
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>
-
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}}))?/ }; }
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()
}
}
// ...
]
}
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 }));
}
}]
}),
// ...
By default block styles also processed. Set this to false to avoid processing them. stylup.process(html, null, options)
.
// Options
let options = {
processBlockStyles: false
}