|
| 1 | +const _ = require('lodash'); |
| 2 | + |
| 3 | +const tailwindcssRfs = function(userConfig = {}) { |
| 4 | + return ({ addUtilities, e, theme, variants }) => { |
| 5 | + const defaultOptions = { |
| 6 | + prefix: 'rfs-', |
| 7 | + suffix: '', |
| 8 | + fontSizeUtilities: true, |
| 9 | + paddingUtilities: true, |
| 10 | + marginUtilities: true, |
| 11 | + }; |
| 12 | + |
| 13 | + const options = _.defaults({}, userConfig, defaultOptions); |
| 14 | + |
| 15 | + const prefixNegativeModifiers = function(base, modifier) { |
| 16 | + if (modifier === '-') { |
| 17 | + return `-${base}`; |
| 18 | + } |
| 19 | + if (_.startsWith(modifier, '-')) { |
| 20 | + return `-${options.prefix}${base}-${modifier.slice(1)}${options.suffix}`; |
| 21 | + } |
| 22 | + return `${options.prefix}${base}-${modifier}${options.suffix}`; |
| 23 | + }; |
| 24 | + |
| 25 | + const fontSizeGenerator = (size, modifier) => ({ |
| 26 | + [`.${e(`${options.prefix}text-${modifier}${options.suffix}`)}`]: { 'font-size': `rfs(${size})` }, |
| 27 | + }); |
| 28 | + |
| 29 | + const paddingGenerator = (size, modifier) => ({ |
| 30 | + [`.${e(`${options.prefix}p-${modifier}${options.suffix}`)}`]: { padding: `rfs(${size})` }, |
| 31 | + [`.${e(`${options.prefix}py-${modifier}${options.suffix}`)}`]: { 'padding-top': `rfs(${size})`, 'padding-bottom': `rfs(${size})` }, |
| 32 | + [`.${e(`${options.prefix}px-${modifier}${options.suffix}`)}`]: { 'padding-left': `rfs(${size})`, 'padding-right': `rfs(${size})` }, |
| 33 | + [`.${e(`${options.prefix}pt-${modifier}${options.suffix}`)}`]: { 'padding-top': `rfs(${size})` }, |
| 34 | + [`.${e(`${options.prefix}pr-${modifier}${options.suffix}`)}`]: { 'padding-right': `rfs(${size})` }, |
| 35 | + [`.${e(`${options.prefix}pb-${modifier}${options.suffix}`)}`]: { 'padding-bottom': `rfs(${size})` }, |
| 36 | + [`.${e(`${options.prefix}pl-${modifier}${options.suffix}`)}`]: { 'padding-left': `rfs(${size})` }, |
| 37 | + }); |
| 38 | + |
| 39 | + const marginGenerator = (size, modifier) => ({ |
| 40 | + [`.${e(prefixNegativeModifiers('m', modifier))}`]: { margin: `rfs(${size})` }, |
| 41 | + [`.${e(prefixNegativeModifiers('my', modifier))}`]: { 'margin-top': `rfs(${size})`, 'margin-bottom': `rfs(${size})` }, |
| 42 | + [`.${e(prefixNegativeModifiers('mx', modifier))}`]: { 'margin-left': `rfs(${size})`, 'margin-right': `rfs(${size})` }, |
| 43 | + [`.${e(prefixNegativeModifiers('mt', modifier))}`]: { 'margin-top': `rfs(${size})` }, |
| 44 | + [`.${e(prefixNegativeModifiers('mr', modifier))}`]: { 'margin-right': `rfs(${size})` }, |
| 45 | + [`.${e(prefixNegativeModifiers('mb', modifier))}`]: { 'margin-bottom': `rfs(${size})` }, |
| 46 | + [`.${e(prefixNegativeModifiers('ml', modifier))}`]: { 'margin-left': `rfs(${size})` }, |
| 47 | + }); |
| 48 | + |
| 49 | + const fontSizeUtilities = _.flatMap(theme('fontSize'), fontSizeGenerator); |
| 50 | + const paddingUtilities = _.flatMap(theme('padding'), paddingGenerator); |
| 51 | + const marginUtilities = _.flatMap(theme('margin'), marginGenerator); |
| 52 | + |
| 53 | + if (options.fontSizeUtilities) addUtilities(fontSizeUtilities, variants('rfsFontSize')); |
| 54 | + if (options.paddingUtilities) addUtilities(paddingUtilities, variants('rfsPadding')); |
| 55 | + if (options.marginUtilities) addUtilities(marginUtilities, variants('rfsMargin')); |
| 56 | + }; |
| 57 | +}; |
| 58 | + |
| 59 | +module.exports = tailwindcssRfs; |
0 commit comments