From a3196a53584c7aa4ed47ceae7b4cff8f78c9624e Mon Sep 17 00:00:00 2001 From: Adam Wathan Date: Fri, 25 Aug 2017 12:39:23 -0400 Subject: [PATCH] Add shadows and flex generators, extract defineClass(es) --- src/generators/background-colors.js | 11 +--- src/generators/flex.js | 86 +++++++++++++++++++++++++++++ src/generators/shadows.js | 10 ++++ src/tailwind.js | 21 ++++++- src/util/define-class.js | 16 ++++++ src/util/define-classes.js | 8 +++ 6 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 src/generators/flex.js create mode 100644 src/generators/shadows.js create mode 100644 src/util/define-class.js create mode 100644 src/util/define-classes.js diff --git a/src/generators/background-colors.js b/src/generators/background-colors.js index 628c7b4fc..133aa9a77 100644 --- a/src/generators/background-colors.js +++ b/src/generators/background-colors.js @@ -1,5 +1,5 @@ -const postcss = require('postcss') const _ = require('lodash') +const defineClass = require('../util/define-class') function findColor(colors, color) { const colorsNormalized = _.mapKeys(colors, (value, key) => { @@ -20,13 +20,8 @@ module.exports = function ({ colors, backgroundColors }) { } return _(backgroundColors).toPairs().map(([className, colorName]) => { - const kebabClass = _.kebabCase(className) - - return postcss.rule({ - selector: `.bg-${kebabClass}` - }).append({ - prop: 'background-color', - value: findColor(colors, colorName) + return defineClass(`bg-${className}`, { + backgroundColor: findColor(colors, colorName), }) }).value() } diff --git a/src/generators/flex.js b/src/generators/flex.js new file mode 100644 index 000000000..99edf2f80 --- /dev/null +++ b/src/generators/flex.js @@ -0,0 +1,86 @@ +const postcss = require('postcss') +const _ = require('lodash') +const defineClasses = require('../util/define-classes') + +module.exports = function () { + return defineClasses({ + flex: { + display: 'flex', + }, + inlineFlex: { + display: 'inline-flex', + }, + flexRow: { + flexDirection: 'row', + }, + flexRowReverse: { + flexDirection: 'row-reverse', + }, + flexCol: { + flexDirection: 'column', + }, + flexColReverse: { + flexDirection: 'column-reverse', + }, + flexWrap: { + flexWrap: 'wrap', + }, + flexWrapReverse: { + flexWrap: 'wrap-reverse', + }, + flexNowrap: { + flexWrap: 'nowrap', + }, + itemsStart: { + alignItems: 'flex-start', + }, + itemsEnd: { + alignItems: 'flex-end', + }, + itemsCenter: { + alignItems: 'center', + }, + itemsBaseline: { + alignItems: 'baseline', + }, + itemsStretch: { + alignItems: 'stretch', + }, + justifyStart: { + justifyContent: 'flex-start', + }, + justifyEnd: { + justifyContent: 'flex-end', + }, + justifyCenter: { + justifyContent: 'center', + }, + justifyBetween: { + justifyContent: 'space-between', + }, + justifyAround: { + justifyContent: 'space-around', + }, + flexAuto: { + flex: 'auto', + }, + flexInitial: { + flex: 'initial', + }, + flexNone: { + flex: 'none', + }, + flexGrow: { + flexGrow: '1', + }, + flexShrink: { + flexShrink: '1', + }, + flexNoGrow: { + flexGrow: '0', + }, + flexNoShrink: { + flexShrink: '0', + }, + }) +} diff --git a/src/generators/shadows.js b/src/generators/shadows.js new file mode 100644 index 000000000..e96a05210 --- /dev/null +++ b/src/generators/shadows.js @@ -0,0 +1,10 @@ +const _ = require('lodash') +const defineClass = require('../util/define-class') + +module.exports = function ({ shadows }) { + return _(shadows).toPairs().map(([className, shadow]) => { + return defineClass(`shadow-${className}`, { + boxShadow: shadow, + }) + }).value() +} diff --git a/src/tailwind.js b/src/tailwind.js index 56b9de7d4..22d97bf83 100644 --- a/src/tailwind.js +++ b/src/tailwind.js @@ -2,6 +2,8 @@ const _ = require('lodash') const postcss = require('postcss') const cssnext = require('postcss-cssnext') const backgroundColors = require('./generators/background-colors') +const shadows = require('./generators/shadows') +const flex = require('./generators/flex') function findMixin(css, mixin, onError) { let match @@ -51,10 +53,27 @@ function generateUtilities(css, options) { if (atRule.params === 'utilities') { const rules = _.flatten([ - backgroundColors(options) + backgroundColors(options), + shadows(options), + flex(), ]) css.insertBefore(atRule, rules) + + Object.keys(options.breakpoints).forEach(breakpoint => { + const mediaQuery = postcss.atRule({ + name: 'media', + params: `(--breakpoint-${breakpoint})`, + }) + + mediaQuery.append(rules.map(rule => { + const cloned = rule.clone() + cloned.selector = `.${breakpoint}\\:${rule.selector.slice(1)}` + return cloned + })) + css.insertBefore(atRule, mediaQuery) + }) + atRule.remove() return false } diff --git a/src/util/define-class.js b/src/util/define-class.js new file mode 100644 index 000000000..e85ecfdc5 --- /dev/null +++ b/src/util/define-class.js @@ -0,0 +1,16 @@ +const _ = require('lodash') +const postcss = require('postcss') + +module.exports = function defineClass(className, properties) { + const kebabClass = _.kebabCase(className) + const decls = _(properties).toPairs().map(([property, value]) => { + return postcss.decl({ + prop: _.kebabCase(property), + value: value, + }) + }).value() + + return postcss.rule({ + selector: `.${kebabClass}` + }).append(decls) +} diff --git a/src/util/define-classes.js b/src/util/define-classes.js new file mode 100644 index 000000000..80a578aec --- /dev/null +++ b/src/util/define-classes.js @@ -0,0 +1,8 @@ +const _ = require('lodash') +const defineClass = require('./define-class') + +module.exports = function defineClasses(classes) { + return _(classes).toPairs().map(([className, properties]) => { + return defineClass(className, properties) + }).value() +}