├── .gitignore ├── .npmignore ├── .babelrc ├── .eslintrc ├── test ├── supports.js ├── helpers │ └── setup-browser-env.js └── index.js ├── DEV_ONLY └── App.js ├── webpack.config.minified.js ├── src ├── prefix.js ├── supports.js ├── index.js └── constants.js ├── CHANGELOG.md ├── LICENSE ├── lib ├── prefix.js ├── supports.js ├── constants.js └── index.js ├── webpack.config.js ├── webpack.config.dev.js ├── package.json ├── README.md └── dist ├── react-prefixer.min.js ├── react-prefixer.js └── react-prefixer.js.map /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | lib -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | DEV_ONLY 2 | src 3 | test 4 | .babelrc 5 | .eslintrc 6 | .gitignore 7 | webpack.config.dev.js 8 | webpack.config.js 9 | webpack.config.minified.js -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins":[ 3 | "add-module-exports" 4 | ], 5 | "presets":[ 6 | ["latest", { 7 | "loose": true 8 | }], 9 | "stage-2" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env":{ 3 | "amd": true, 4 | "browser": true, 5 | "es6": true 6 | }, 7 | "extends": "rapid7/browser", 8 | "globals": { 9 | "process": true 10 | }, 11 | "parser": "babel-eslint", 12 | "parserOptions": { 13 | "ecmaVersion": 6, 14 | "sourceType": "module" 15 | }, 16 | "rules":{} 17 | } 18 | -------------------------------------------------------------------------------- /test/supports.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | 3 | import isSupported from 'src/supports'; 4 | 5 | test('if isSupported works for properties correctly', (t) => { 6 | t.true(isSupported('display', 'block')); 7 | t.false(isSupported('foo', 'bar')); 8 | }); 9 | 10 | test('if isSupported works for values', (t) => { 11 | t.true(isSupported('display', 'flex')); 12 | }); 13 | -------------------------------------------------------------------------------- /test/helpers/setup-browser-env.js: -------------------------------------------------------------------------------- 1 | const jsdom = require('jsdom'); 2 | const jsdomGlobal = require('jsdom-global'); 3 | 4 | const doc = jsdom.jsdom(''); 5 | const win = doc.defaultView; 6 | const nav = win.navigator; 7 | 8 | global.document = doc; 9 | global.window = win; 10 | global.navigator = nav; 11 | 12 | jsdomGlobal(); 13 | 14 | const originalGetComputedStyle = window.getComputedStyle; 15 | 16 | window.getComputedStyle = function(...args) { 17 | if (arguments[0] === document.documentElement) { 18 | return ['-webkit-appearance']; 19 | } 20 | 21 | return originalGetComputedStyle.apply(window, args); 22 | }; 23 | -------------------------------------------------------------------------------- /DEV_ONLY/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | render 4 | } from 'react-dom'; 5 | 6 | import prefix from '../src'; 7 | 8 | const styles = prefix({ 9 | button: { 10 | appearance: 'none', 11 | display: 'block' 12 | }, 13 | container: { 14 | transition: 'column-count 200ms' 15 | } 16 | }); 17 | 18 | console.log(styles.container); 19 | 20 | const App = () => { 21 | return ( 22 |
23 |

24 | App 25 |

26 | 27 | 33 |
34 | ); 35 | }; 36 | 37 | const div = document.createElement('div'); 38 | 39 | div.id = 'app-container'; 40 | 41 | document.body.appendChild(div); 42 | 43 | render(, div); -------------------------------------------------------------------------------- /webpack.config.minified.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const OptimizeJsPlugin = require('optimize-js-plugin'); 3 | 4 | const defaultConfig = require('./webpack.config'); 5 | 6 | module.exports = Object.assign({}, defaultConfig, { 7 | output: Object.assign({}, defaultConfig.output, { 8 | filename: 'react-prefixer.min.js' 9 | }), 10 | 11 | plugins: defaultConfig.plugins.concat([ 12 | new webpack.optimize.DedupePlugin(), 13 | new webpack.optimize.UglifyJsPlugin({ 14 | compress: { 15 | booleans: true, 16 | conditionals: true, 17 | drop_console: true, 18 | drop_debugger: true, 19 | join_vars: true, 20 | sequences: true, 21 | warnings: false 22 | }, 23 | sourceMap: false 24 | }), 25 | new OptimizeJsPlugin({ 26 | sourceMap: false 27 | }) 28 | ]) 29 | }); -------------------------------------------------------------------------------- /src/prefix.js: -------------------------------------------------------------------------------- 1 | let prefixObject = { 2 | css: '', 3 | js: '' 4 | }; 5 | 6 | if (typeof window !== 'undefined') { 7 | const styles = window.getComputedStyle(document.documentElement); 8 | 9 | const prefixString = Array.prototype.slice.call(styles).join(''); 10 | const standardPrefixString = prefixString.match(/-(moz|webkit|ms)-/); 11 | const operaPrefixString = prefixString.match(styles.OLink === '' && ['', 'o']); 12 | const prefixMatch = standardPrefixString || operaPrefixString; 13 | 14 | const prefix = prefixMatch ? prefixMatch[1] : ''; 15 | 16 | prefixObject = { 17 | css: `-${prefix}-`, 18 | js: prefix 19 | }; 20 | 21 | if (prefixObject.js !== 'ms') { 22 | prefixObject = { 23 | ...prefixObject, 24 | js: `${prefixObject.js.charAt(0).toUpperCase()}${prefixObject.js.slice(1)}` 25 | }; 26 | } 27 | } 28 | 29 | export default prefixObject; 30 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # react-prefixer CHANGELOG 2 | 3 | ## 2.0.1 4 | 5 | * Fix support check for properties (thanks [@pinturic](https://github.com/pinturic)) 6 | 7 | ## 2.0.0 8 | 9 | * Rewrite with modern coding standards 10 | * Support server-side rendering 11 | * Show how to use in test environments 12 | 13 | ## 1.1.4 14 | 15 | * Fix camelCase bug 16 | 17 | ## 1.1.3 18 | 19 | * Enhance supports checker 20 | 21 | ## 1.1.2 22 | 23 | * README updates 24 | 25 | ## 1.1.1 26 | 27 | * Fix import of animatable values 28 | 29 | ## 1.1.0 30 | 31 | * Support all animatable properties when used as values in `transition` 32 | 33 | ## 1.0.5 34 | 35 | * Add checker to verify input is an object before running 36 | 37 | ## 1.0.4 38 | 39 | * Have property / value checker a reusable method 40 | * Enhance list of prefixed properties 41 | 42 | ## 1.0.1 - 1.0.3 43 | 44 | * README fixes 45 | 46 | ## 1.0.0 - 1.0.3 47 | 48 | * Initial release 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Rapid7, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/supports.js: -------------------------------------------------------------------------------- 1 | import camelCase from 'lodash/camelCase'; 2 | 3 | /** 4 | * is the property supported, or is the value supported for the given property 5 | * 6 | * @param {string} property 7 | * @param {number|string} value 8 | * @returns {boolean} 9 | */ 10 | const isSupported = (property, value) => { 11 | // Try the native standard method first 12 | if ('CSS' in window && 'supports' in window.CSS) { 13 | return window.CSS.supports(property, value); 14 | } 15 | 16 | // Check Opera's native method 17 | if ('supportsCSS' in window) { 18 | return window.supportsCSS(property, value); 19 | } 20 | 21 | // Convert to camel-case for DOM interactions 22 | const camelCaseProperty = camelCase(property); 23 | 24 | // Check if the property is supported 25 | const element = document.createElement('div'); 26 | const support = (camelCaseProperty in element.style); 27 | 28 | // Assign the property and value to invoke the CSS interpreter 29 | element.style.cssText = `${property}:${value}`; 30 | 31 | // Ensure both the property and value are 32 | // supported and return 33 | return support && (element.style[camelCaseProperty] !== ''); 34 | }; 35 | 36 | export default isSupported; 37 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | 3 | import applyPrefixes from 'src/index'; 4 | 5 | test('if applyPrefixes works for basic styles', (t) => { 6 | const styles = { 7 | appearance: 'none', 8 | display: 'block' 9 | }; 10 | 11 | const result = applyPrefixes(styles); 12 | 13 | t.deepEqual(result, { 14 | WebkitAppearance: 'none', 15 | display: 'block' 16 | }); 17 | }); 18 | 19 | test('if applyPrefixes works for transition styles', (t) => { 20 | const styles = { 21 | transition: 'column-count 200ms' 22 | }; 23 | 24 | const result = applyPrefixes(styles); 25 | 26 | t.deepEqual(result, { 27 | WebkitTransition: '-webkit-column-count 200ms' 28 | }); 29 | }); 30 | 31 | test('if applyPrefixes works for nested styles', (t) => { 32 | const styles = { 33 | appearance: 'none', 34 | display: 'block', 35 | foo: { 36 | columns: 3, 37 | bar: { 38 | display: 'flex' 39 | } 40 | } 41 | }; 42 | 43 | const result = applyPrefixes(styles); 44 | 45 | t.deepEqual(result, { 46 | WebkitAppearance: 'none', 47 | display: 'block', 48 | foo: { 49 | WebkitColumns: 3, 50 | bar: { 51 | display: 'flex' 52 | } 53 | } 54 | }); 55 | }); -------------------------------------------------------------------------------- /lib/prefix.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 8 | 9 | var prefixObject = { 10 | css: '', 11 | js: '' 12 | }; 13 | 14 | if (typeof window !== 'undefined') { 15 | var styles = window.getComputedStyle(document.documentElement); 16 | 17 | var prefixString = Array.prototype.slice.call(styles).join(''); 18 | var standardPrefixString = prefixString.match(/-(moz|webkit|ms)-/); 19 | var operaPrefixString = prefixString.match(styles.OLink === '' && ['', 'o']); 20 | var prefixMatch = standardPrefixString || operaPrefixString; 21 | 22 | var prefix = prefixMatch ? prefixMatch[1] : ''; 23 | 24 | prefixObject = { 25 | css: '-' + prefix + '-', 26 | js: prefix 27 | }; 28 | 29 | if (prefixObject.js !== 'ms') { 30 | prefixObject = _extends({}, prefixObject, { 31 | js: '' + prefixObject.js.charAt(0).toUpperCase() + prefixObject.js.slice(1) 32 | }); 33 | } 34 | } 35 | 36 | exports.default = prefixObject; 37 | module.exports = exports['default']; -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const webpack = require('webpack'); 5 | 6 | const LodashModuleReplacementPlugin = require('lodash-webpack-plugin'); 7 | 8 | module.exports = { 9 | cache: true, 10 | 11 | devtool: '#source-map', 12 | 13 | entry: path.join(__dirname, 'src', 'index.js'), 14 | 15 | eslint:{ 16 | configFile: './.eslintrc', 17 | emitError: true, 18 | failOnError: true, 19 | failOnWarning: true, 20 | formatter: require('eslint-friendly-formatter') 21 | }, 22 | 23 | module: { 24 | preLoaders: [ 25 | { 26 | cacheable: true, 27 | include: [ 28 | /src/ 29 | ], 30 | loader: 'eslint', 31 | test: /\.js$/ 32 | } 33 | ], 34 | 35 | loaders: [ 36 | { 37 | cacheable: true, 38 | exclude: /node_modules/, 39 | loader: 'babel', 40 | test: /\.js?$/ 41 | } 42 | ] 43 | }, 44 | 45 | output: { 46 | filename: 'react-prefixer.js', 47 | library: 'react-prefixer', 48 | libraryTarget: 'umd', 49 | path: path.join(__dirname, 'dist') 50 | }, 51 | 52 | plugins: [ 53 | new webpack.EnvironmentPlugin([ 54 | 'NODE_ENV' 55 | ]), 56 | new LodashModuleReplacementPlugin() 57 | ] 58 | }; 59 | -------------------------------------------------------------------------------- /webpack.config.dev.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | 5 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 6 | const DashboardPlugin = require('webpack-dashboard/plugin'); 7 | 8 | const defaultConfig = require('./webpack.config'); 9 | 10 | const currentLoaders = defaultConfig.module.loaders; 11 | const babelLoaderIndex = currentLoaders.findIndex(({loader}) => { 12 | return loader === 'babel'; 13 | }); 14 | 15 | const loaders = [ 16 | ...currentLoaders.slice(0, babelLoaderIndex), 17 | Object.assign({}, currentLoaders[babelLoaderIndex], { 18 | query: { 19 | presets: [ 20 | 'react' 21 | ] 22 | } 23 | }), 24 | ...currentLoaders.slice(babelLoaderIndex + 1) 25 | ]; 26 | 27 | module.exports = Object.assign({}, defaultConfig, { 28 | cache: true, 29 | 30 | devServer: { 31 | contentBase: './dist', 32 | inline: true, 33 | port: 3000, 34 | stats: { 35 | assets: false, 36 | chunks: true, 37 | chunkModules: false, 38 | colors: true, 39 | hash: false, 40 | timings: true, 41 | version: false 42 | } 43 | }, 44 | 45 | entry: path.join(__dirname, 'DEV_ONLY', 'App.js'), 46 | 47 | eslint: Object.assign({}, defaultConfig.eslint, { 48 | failOnWarning: false 49 | }), 50 | 51 | module: Object.assign({}, defaultConfig.module, { 52 | loaders 53 | }), 54 | 55 | plugins: defaultConfig.plugins.concat([ 56 | new HtmlWebpackPlugin(), 57 | new DashboardPlugin() 58 | ]) 59 | }); -------------------------------------------------------------------------------- /lib/supports.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _camelCase = require('lodash/camelCase'); 8 | 9 | var _camelCase2 = _interopRequireDefault(_camelCase); 10 | 11 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 12 | 13 | /** 14 | * is the property supported, or is the value supported for the given property 15 | * 16 | * @param {string} property 17 | * @param {number|string} value 18 | * @returns {boolean} 19 | */ 20 | var isSupported = function isSupported(property, value) { 21 | // Try the native standard method first 22 | if ('CSS' in window && 'supports' in window.CSS) { 23 | return window.CSS.supports(property, value); 24 | } 25 | 26 | // Check Opera's native method 27 | if ('supportsCSS' in window) { 28 | return window.supportsCSS(property, value); 29 | } 30 | 31 | // Convert to camel-case for DOM interactions 32 | var camelCaseProperty = (0, _camelCase2.default)(property); 33 | 34 | // Check if the property is supported 35 | var element = document.createElement('div'); 36 | var support = camelCaseProperty in element.style; 37 | 38 | // Assign the property and value to invoke the CSS interpreter 39 | element.style.cssText = property + ':' + value; 40 | 41 | // Ensure both the property and value are 42 | // supported and return 43 | return support && element.style[camelCaseProperty] !== ''; 44 | }; 45 | 46 | exports.default = isSupported; 47 | module.exports = exports['default']; -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | var ANIMATABLE_VALUES = ['columnCount', 'columnGap', 'columnRule', 'columnRuleColor', 'columnRuleWidth', 'columns', 'flex', 'flexBasis', 'flexGrow', 'flexShrink', 'order', 'perspective', 'perspectiveOrigin', 'perspectiveOriginX', 'perspectiveOriginY', 'scrollSnapCoordinate', 'scrollSnapDirection', 'textDecoration', 'textDecorationColor', 'transform', 'transformOrigin', 'transformOriginX', 'transformOriginY', 'transformOriginZ', 'transformStyle']; 7 | 8 | var CSS_PROPERTIES = ['alignContent', 'alignItems', 'alignSelf', 'animation', 'animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction', 'appearance', 'aspectRatio', 'backfaceVisibility', 'backgroundClip', 'borderImage', 'borderImageSlice', 'boxShadow', 'columnCount', 'columnFill', 'columnGap', 'columnRule', 'columnRuleColor', 'columnRuleStyle', 'columnRuleWidth', 'columnSpan', 'columnWidth', 'columns', 'flex', 'flexBasis', 'flexDirection', 'flexFlow', 'flexGrow', 'flexShrink', 'flexWrap', 'fontFeatureSettings', 'fontKearning', 'fontVariantLigatures', 'justifyContent', 'grid', 'gridArea', 'gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridColumn', 'gridColumnEnd', 'gridColumnStart', 'gridRow', 'gridRowEnd', 'gridRowStart', 'gridTemplate', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows', 'hyphens', 'lineBreak', 'perspective', 'perspectiveOrigin', 'perspectiveOriginX', 'perspectiveOriginY', 'rubyPosition', 'scrollSnapCoordinate', 'scrollSnapDestination', 'scrollSnapPoints', 'scrollSnapPointsX', 'scrollSnapPointsY', 'scrollSnapType', 'tabSize', 'textDecoration', 'textDecorationColor', 'textDecorationLine', 'textDecorationStyle', 'textOrientation', 'textSizeAdjust', 'transform', 'transition', 'transformOrigin', 'transformOriginX', 'transformOriginY', 'transformOriginZ', 'transformStyle', 'transitionProperty', 'transitionDuration', 'transitionTimingFunction', 'transitionDelay', 'userModify', 'userSelect']; 9 | 10 | exports.ANIMATABLE_VALUES = ANIMATABLE_VALUES; 11 | exports.CSS_PROPERTIES = CSS_PROPERTIES; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import isPlainObject from 'lodash/isPlainObject'; 2 | 3 | import prefix from './prefix'; 4 | import isSupported from './supports'; 5 | 6 | import { 7 | ANIMATABLE_VALUES, 8 | CSS_PROPERTIES 9 | } from './constants'; 10 | 11 | const toKebabCase = (string) => { 12 | return string.replace(/([A-Z])/g, ($1) => { 13 | return `-${$1.toLowerCase()}`; 14 | }); 15 | }; 16 | 17 | /** 18 | * create a new style object with prefixes applied 19 | * 20 | * @param {Object} object 21 | * @returns {Object} 22 | */ 23 | const applyPrefixes = (object) => { 24 | if (!isPlainObject(object)) { 25 | return object; 26 | } 27 | 28 | let value; 29 | 30 | return Object.keys(object).reduce((styleObject, originalKey) => { 31 | let key = originalKey; 32 | 33 | value = object[key]; 34 | 35 | if (isPlainObject(value)) { 36 | return { 37 | ...styleObject, 38 | [key]: applyPrefixes(value) 39 | }; 40 | } 41 | 42 | if (CSS_PROPERTIES.indexOf(key) !== -1 && !isSupported(toKebabCase(key), value)) { 43 | key = `${prefix.js}${key.charAt(0).toUpperCase()}${key.slice(1)}`; 44 | } 45 | 46 | if (originalKey === 'display' && object[originalKey] === 'flex' && !isSupported('display', 'flex')) { 47 | return { 48 | ...styleObject, 49 | [key]: (prefix.js === 'ms' ? '-ms-flexbox' : `${prefix.css}flex`) 50 | }; 51 | } 52 | 53 | if (originalKey === 'transition') { 54 | const animatableValuesObject = ANIMATABLE_VALUES.reduce((animatableValues, animatableValue) => { 55 | const kebabValue = toKebabCase(animatableValue); 56 | const re = new RegExp(kebabValue, 'g'); 57 | 58 | if (re.test(object[originalKey]) && !isSupported(kebabValue)) { 59 | const cleanValue = object[originalKey].replace(re, `${prefix.css}${kebabValue}`); 60 | 61 | return { 62 | ...animatableValues, 63 | [key]: cleanValue 64 | }; 65 | } 66 | 67 | return animatableValues; 68 | }, {}); 69 | 70 | return { 71 | ...styleObject, 72 | ...animatableValuesObject 73 | }; 74 | } 75 | 76 | return { 77 | ...styleObject, 78 | [key]: value 79 | }; 80 | }, {}); 81 | }; 82 | 83 | export default applyPrefixes; 84 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | const ANIMATABLE_VALUES = [ 2 | 'columnCount', 3 | 'columnGap', 4 | 'columnRule', 5 | 'columnRuleColor', 6 | 'columnRuleWidth', 7 | 'columns', 8 | 'flex', 9 | 'flexBasis', 10 | 'flexGrow', 11 | 'flexShrink', 12 | 'order', 13 | 'perspective', 14 | 'perspectiveOrigin', 15 | 'perspectiveOriginX', 16 | 'perspectiveOriginY', 17 | 'scrollSnapCoordinate', 18 | 'scrollSnapDirection', 19 | 'textDecoration', 20 | 'textDecorationColor', 21 | 'transform', 22 | 'transformOrigin', 23 | 'transformOriginX', 24 | 'transformOriginY', 25 | 'transformOriginZ', 26 | 'transformStyle' 27 | ]; 28 | 29 | const CSS_PROPERTIES = [ 30 | 'alignContent', 31 | 'alignItems', 32 | 'alignSelf', 33 | 'animation', 34 | 'animationDelay', 35 | 'animationDirection', 36 | 'animationDuration', 37 | 'animationFillMode', 38 | 'animationIterationCount', 39 | 'animationName', 40 | 'animationPlayState', 41 | 'animationTimingFunction', 42 | 'appearance', 43 | 'aspectRatio', 44 | 'backfaceVisibility', 45 | 'backgroundClip', 46 | 'borderImage', 47 | 'borderImageSlice', 48 | 'boxShadow', 49 | 'columnCount', 50 | 'columnFill', 51 | 'columnGap', 52 | 'columnRule', 53 | 'columnRuleColor', 54 | 'columnRuleStyle', 55 | 'columnRuleWidth', 56 | 'columnSpan', 57 | 'columnWidth', 58 | 'columns', 59 | 'flex', 60 | 'flexBasis', 61 | 'flexDirection', 62 | 'flexFlow', 63 | 'flexGrow', 64 | 'flexShrink', 65 | 'flexWrap', 66 | 'fontFeatureSettings', 67 | 'fontKearning', 68 | 'fontVariantLigatures', 69 | 'justifyContent', 70 | 'grid', 71 | 'gridArea', 72 | 'gridAutoColumns', 73 | 'gridAutoFlow', 74 | 'gridAutoRows', 75 | 'gridColumn', 76 | 'gridColumnEnd', 77 | 'gridColumnStart', 78 | 'gridRow', 79 | 'gridRowEnd', 80 | 'gridRowStart', 81 | 'gridTemplate', 82 | 'gridTemplateAreas', 83 | 'gridTemplateColumns', 84 | 'gridTemplateRows', 85 | 'hyphens', 86 | 'lineBreak', 87 | 'perspective', 88 | 'perspectiveOrigin', 89 | 'perspectiveOriginX', 90 | 'perspectiveOriginY', 91 | 'rubyPosition', 92 | 'scrollSnapCoordinate', 93 | 'scrollSnapDestination', 94 | 'scrollSnapPoints', 95 | 'scrollSnapPointsX', 96 | 'scrollSnapPointsY', 97 | 'scrollSnapType', 98 | 'tabSize', 99 | 'textDecoration', 100 | 'textDecorationColor', 101 | 'textDecorationLine', 102 | 'textDecorationStyle', 103 | 'textOrientation', 104 | 'textSizeAdjust', 105 | 'transform', 106 | 'transition', 107 | 'transformOrigin', 108 | 'transformOriginX', 109 | 'transformOriginY', 110 | 'transformOriginZ', 111 | 'transformStyle', 112 | 'transitionProperty', 113 | 'transitionDuration', 114 | 'transitionTimingFunction', 115 | 'transitionDelay', 116 | 'userModify', 117 | 'userSelect' 118 | ]; 119 | 120 | export {ANIMATABLE_VALUES}; 121 | export {CSS_PROPERTIES}; 122 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "tquetano-r7", 3 | "ava": { 4 | "babel": "inherit", 5 | "concurrency": 10, 6 | "failFast": true, 7 | "files": [ 8 | "test/**/*.js", 9 | "!test/helpers/**" 10 | ], 11 | "source": [ 12 | "src/*.js" 13 | ], 14 | "require": [ 15 | "babel-register", 16 | "babel-polyfill", 17 | "./test/helpers/setup-browser-env.js" 18 | ], 19 | "verbose": true 20 | }, 21 | "bugs": { 22 | "url": "https://github.com/rapid7/react-prefixer/issues" 23 | }, 24 | "dependencies": { 25 | "lodash": "^4.16.6" 26 | }, 27 | "description": "Add vendor-specific prefixes to React styles", 28 | "devDependencies": { 29 | "ava": "^0.16.0", 30 | "babel": "~6.5.2", 31 | "babel-cli": "^6.18.0", 32 | "babel-core": "~6.18.2", 33 | "babel-eslint": "^7.1.0", 34 | "babel-loader": "~6.2.7", 35 | "babel-plugin-add-module-exports": "^0.2.1", 36 | "babel-polyfill": "^6.16.0", 37 | "babel-preset-latest": "^6.16.0", 38 | "babel-preset-react": "^6.16.0", 39 | "babel-preset-stage-2": "^6.18.0", 40 | "babel-register": "^6.18.0", 41 | "eslint": "^3.9.1", 42 | "eslint-config-rapid7": "^2.6.0", 43 | "eslint-friendly-formatter": "^2.0.6", 44 | "eslint-loader": "^1.6.1", 45 | "html-webpack-plugin": "^2.24.1", 46 | "in-publish": "^2.0.0", 47 | "jsdom": "^9.8.3", 48 | "jsdom-global": "^2.1.0", 49 | "lodash": "^4.16.6", 50 | "lodash-webpack-plugin": "^0.10.5", 51 | "optimize-js-plugin": "0.0.4", 52 | "react": "^15.3.2", 53 | "react-dom": "^15.3.2", 54 | "rimraf": "^2.5.4", 55 | "sinon": "^1.17.6", 56 | "webpack": "^1.13.3", 57 | "webpack-dashboard": "^0.2.0", 58 | "webpack-dev-server": "^1.16.2" 59 | }, 60 | "homepage": "https://github.com/rapid7/recess#readme", 61 | "keywords": [ 62 | "autoprefix", 63 | "browser", 64 | "css", 65 | "normalize", 66 | "prefix", 67 | "react", 68 | "style" 69 | ], 70 | "license": "MIT", 71 | "main": "lib", 72 | "name": "react-prefixer", 73 | "repository": { 74 | "type": "git", 75 | "url": "git+https://github.com/rapid7/react-prefixer.git" 76 | }, 77 | "scripts": { 78 | "build": "NODE_ENV=development webpack --profile --progress", 79 | "build:minified": "NODE_ENV=production webpack --profile --progress --config=webpack.config.minified.js", 80 | "clean": "rimraf lib && rimraf dist", 81 | "lint": "NODE_ENV=test eslint src", 82 | "lint:fix": "NODE_ENV=test eslint src --fix", 83 | "prepublish": "in-publish && npm run prepublish:compile || echo ''", 84 | "prepublish:compile": "npm run clean && npm run lint && npm test && npm run transpile && npm run build && npm run build:minified", 85 | "start": "NODE_ENV=development webpack-dashboard -- webpack-dev-server --config=webpack.config.dev.js", 86 | "test": "NODE_PATH=. NODE_ENV=test ava --no-cache", 87 | "test:watch": "NODE_PATH=. NODE_ENV=test ava --watch", 88 | "transpile": "babel src --out-dir lib" 89 | }, 90 | "version": "2.0.1" 91 | } 92 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 8 | 9 | var _isPlainObject = require('lodash/isPlainObject'); 10 | 11 | var _isPlainObject2 = _interopRequireDefault(_isPlainObject); 12 | 13 | var _prefix = require('./prefix'); 14 | 15 | var _prefix2 = _interopRequireDefault(_prefix); 16 | 17 | var _supports = require('./supports'); 18 | 19 | var _supports2 = _interopRequireDefault(_supports); 20 | 21 | var _constants = require('./constants'); 22 | 23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 24 | 25 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 26 | 27 | var toKebabCase = function toKebabCase(string) { 28 | return string.replace(/([A-Z])/g, function ($1) { 29 | return '-' + $1.toLowerCase(); 30 | }); 31 | }; 32 | 33 | /** 34 | * create a new style object with prefixes applied 35 | * 36 | * @param {Object} object 37 | * @returns {Object} 38 | */ 39 | var applyPrefixes = function applyPrefixes(object) { 40 | if (!(0, _isPlainObject2.default)(object)) { 41 | return object; 42 | } 43 | 44 | var value = void 0; 45 | 46 | return Object.keys(object).reduce(function (styleObject, originalKey) { 47 | var key = originalKey; 48 | 49 | value = object[key]; 50 | 51 | if ((0, _isPlainObject2.default)(value)) { 52 | return _extends({}, styleObject, _defineProperty({}, key, applyPrefixes(value))); 53 | } 54 | 55 | if (_constants.CSS_PROPERTIES.indexOf(key) !== -1 && !(0, _supports2.default)(toKebabCase(key), value)) { 56 | key = '' + _prefix2.default.js + key.charAt(0).toUpperCase() + key.slice(1); 57 | } 58 | 59 | if (originalKey === 'display' && object[originalKey] === 'flex' && !(0, _supports2.default)('display', 'flex')) { 60 | return _extends({}, styleObject, _defineProperty({}, key, _prefix2.default.js === 'ms' ? '-ms-flexbox' : _prefix2.default.css + 'flex')); 61 | } 62 | 63 | if (originalKey === 'transition') { 64 | var animatableValuesObject = _constants.ANIMATABLE_VALUES.reduce(function (animatableValues, animatableValue) { 65 | var kebabValue = toKebabCase(animatableValue); 66 | var re = new RegExp(kebabValue, 'g'); 67 | 68 | if (re.test(object[originalKey]) && !(0, _supports2.default)(kebabValue)) { 69 | var cleanValue = object[originalKey].replace(re, '' + _prefix2.default.css + kebabValue); 70 | 71 | return _extends({}, animatableValues, _defineProperty({}, key, cleanValue)); 72 | } 73 | 74 | return animatableValues; 75 | }, {}); 76 | 77 | return _extends({}, styleObject, animatableValuesObject); 78 | } 79 | 80 | return _extends({}, styleObject, _defineProperty({}, key, value)); 81 | }, {}); 82 | }; 83 | 84 | exports.default = applyPrefixes; 85 | module.exports = exports['default']; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-prefixer 2 | 3 | **NOTE**: This library is no longer maintained. It is advised you use one of the many, many CSS-in-JS libraries that exist in today's ecosystem. Examples: 4 | 5 | * [styled-components](https://github.com/styled-components/styled-components) 6 | * [glamor](https://github.com/threepointone/glamor) 7 | * [radium](https://github.com/FormidableLabs/radium) 8 | 9 | react-prefixer is a tiny package designed to provide vender-specific prefixes to the style objects you use in your React project. 10 | 11 | #### Table of contents 12 | * [Installation](#installation) 13 | * [Usage](#usage) 14 | * [Test environments](#test-environments) 15 | * [Browser support](#browser-support) 16 | * [Development](#development) 17 | 18 | #### Installation 19 | 20 | ``` 21 | $ npm install react-prefixer 22 | ``` 23 | 24 | #### Usage 25 | 26 | ```javascript 27 | import prefix from 'react-prefixer'; 28 | 29 | const styles = prefix({ 30 | userSelect: 'none' 31 | }); 32 | 33 | console.log(styles); // {WebkitUserSelect:"none"} 34 | ``` 35 | 36 | It also works on deeply-nested objects: 37 | 38 | ```javascript 39 | import prefix from 'react-prefixer'; 40 | 41 | const styles = prefix({ 42 | some:{ 43 | really:{ 44 | deep:{ 45 | style:{ 46 | userSelect: 'none' 47 | } 48 | } 49 | } 50 | } 51 | }); 52 | 53 | console.log(styles); // {some:{really:{deep:{style:{WebkitUserSelect:"none"}}}}} 54 | ``` 55 | 56 | And will appropriately modify your values for legacy syntaxes on transition: 57 | 58 | ```javascript 59 | import prefix from 'react-prefixer'; 60 | 61 | const styles = prefix({ 62 | transition: 'transform 200ms' 63 | }); 64 | 65 | console.log(styles); // {WebkitTransition:"-webkit-transform 200ms"}, if on Safari for example 66 | ``` 67 | 68 | It will also do the tweener or most recent vendor syntax for flexbox: 69 | 70 | ```javascript 71 | import prefix from 'react-prefixer'; 72 | 73 | const styles = prefix({ 74 | display: 'flex' 75 | }); 76 | 77 | console.log(styles); 78 | // {display: '-webkit-flex'}, if on Safari 79 | // {display: '-ms-flexbox'}, if on IE10 80 | ``` 81 | 82 | #### Test environments 83 | 84 | When running in test environments where there is a JS-based DOM (`jsdom` for example), the `getComputedStyle` method will return an empty array of styles when calculating the prefix. This previously caused an error which is since resolved, however it will default to assuming no browser prefix at all. As such, if you want to perform tests based on a specific browser prefix, you will need to mock the `getComputedStyle` property on the `window`. An example that is for tests with Webkit browsers: 85 | 86 | ```javascript 87 | const originalGetComputedStyle = window.getComputedStyle; 88 | 89 | window.getComputedStyle = function(...args) { 90 | if (arguments[0] === document.documentElement) { 91 | return ['-webkit-appearance']; 92 | } 93 | 94 | return originalGetComputedStyle.apply(window, args); 95 | }; 96 | ``` 97 | 98 | #### Browser support 99 | 100 | * IE10+ and Edge 101 | * Firefox 102 | * Chrome 103 | * Safari 104 | * Opera 105 | 106 | #### Development 107 | 108 | Standard stuff, clone the repo and `npm i` to get the dependencies. npm scripts available: 109 | * `build` => runs webpack to build the compiled JS file with `NODE_ENV` set to `development` 110 | * `build:minified` => runs webpack to build the compiled and optimized JS file with `NODE_ENV` set to `production` 111 | * `clean` => runs `rimraf` on both `lib` and `dist` directories 112 | * `dev` => runs the webpack dev server for the playground 113 | * `lint` => runs ESLint against files in the `src` folder 114 | * `lint:fix` => runs `lint` with `--fix` applied 115 | * `prepublish` => if in publish, runs `prepublish:compile` 116 | * `prepublish:compile` => runs `clean`, `lint`, `test`, `transpile`, `build` and `build:minified` 117 | * `test` => runs `ava` against all files in `src` 118 | * `test:watch` => runs `test` with a persistent watcher 119 | * `transpile` => runs Babel against files in `src` to files in `lib` 120 | 121 | Happy prefixing! 122 | -------------------------------------------------------------------------------- /dist/react-prefixer.min.js: -------------------------------------------------------------------------------- 1 | !(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports["react-prefixer"]=e():t["react-prefixer"]=e()})(this,(function(){return (function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)})(function(t){for(var e in t)if(Object.prototype.hasOwnProperty.call(t,e))switch(typeof t[e]){case"function":break;case"object":t[e]=(function(e){var n=e.slice(1),r=t[e[0]];return function(t,e,o){r.apply(this,[t,e,o].concat(n))}})(t[e]);break;default:t[e]=t[t[e]]}return t}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}Object.defineProperty(e,"__esModule",{value:!0});var i=Object.assign||function(t){for(var e=1;e=r?t:o(t,e,n)}var o=n(14);t.exports=r},function(t,e){function n(t,e,n){var r=-1,o=t.length;e<0&&(e=-e>o?0:o+e),n=n>o?o:n,n<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var i=Array(o);++r false 185 | * 186 | * _.isPlainObject([1, 2, 3]); 187 | * // => false 188 | * 189 | * _.isPlainObject({ 'x': 0, 'y': 0 }); 190 | * // => true 191 | * 192 | * _.isPlainObject(Object.create(null)); 193 | * // => true 194 | */ 195 | function isPlainObject(value) { 196 | if (!isObjectLike(value) || baseGetTag(value) != objectTag) { 197 | return false; 198 | } 199 | var proto = getPrototype(value); 200 | if (proto === null) { 201 | return true; 202 | } 203 | var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; 204 | return typeof Ctor == 'function' && Ctor instanceof Ctor && 205 | funcToString.call(Ctor) == objectCtorString; 206 | } 207 | 208 | module.exports = isPlainObject; 209 | 210 | 211 | /***/ }, 212 | /* 2 */ 213 | /***/ function(module, exports) { 214 | 215 | /** Used for built-in method references. */ 216 | var objectProto = Object.prototype; 217 | 218 | /** 219 | * Used to resolve the 220 | * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) 221 | * of values. 222 | */ 223 | var nativeObjectToString = objectProto.toString; 224 | 225 | /** 226 | * Converts `value` to a string using `Object.prototype.toString`. 227 | * 228 | * @private 229 | * @param {*} value The value to convert. 230 | * @returns {string} Returns the converted string. 231 | */ 232 | function objectToString(value) { 233 | return nativeObjectToString.call(value); 234 | } 235 | 236 | module.exports = objectToString; 237 | 238 | 239 | /***/ }, 240 | /* 3 */ 241 | /***/ function(module, exports, __webpack_require__) { 242 | 243 | var overArg = __webpack_require__(4); 244 | 245 | /** Built-in value references. */ 246 | var getPrototype = overArg(Object.getPrototypeOf, Object); 247 | 248 | module.exports = getPrototype; 249 | 250 | 251 | /***/ }, 252 | /* 4 */ 253 | /***/ function(module, exports) { 254 | 255 | /** 256 | * Creates a unary function that invokes `func` with its argument transformed. 257 | * 258 | * @private 259 | * @param {Function} func The function to wrap. 260 | * @param {Function} transform The argument transform. 261 | * @returns {Function} Returns the new function. 262 | */ 263 | function overArg(func, transform) { 264 | return function(arg) { 265 | return func(transform(arg)); 266 | }; 267 | } 268 | 269 | module.exports = overArg; 270 | 271 | 272 | /***/ }, 273 | /* 5 */ 274 | /***/ function(module, exports) { 275 | 276 | /** 277 | * Checks if `value` is object-like. A value is object-like if it's not `null` 278 | * and has a `typeof` result of "object". 279 | * 280 | * @static 281 | * @memberOf _ 282 | * @since 4.0.0 283 | * @category Lang 284 | * @param {*} value The value to check. 285 | * @returns {boolean} Returns `true` if `value` is object-like, else `false`. 286 | * @example 287 | * 288 | * _.isObjectLike({}); 289 | * // => true 290 | * 291 | * _.isObjectLike([1, 2, 3]); 292 | * // => true 293 | * 294 | * _.isObjectLike(_.noop); 295 | * // => false 296 | * 297 | * _.isObjectLike(null); 298 | * // => false 299 | */ 300 | function isObjectLike(value) { 301 | return value != null && typeof value == 'object'; 302 | } 303 | 304 | module.exports = isObjectLike; 305 | 306 | 307 | /***/ }, 308 | /* 6 */ 309 | /***/ function(module, exports) { 310 | 311 | 'use strict'; 312 | 313 | Object.defineProperty(exports, "__esModule", { 314 | value: true 315 | }); 316 | 317 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 318 | 319 | var prefixObject = { 320 | css: '', 321 | js: '' 322 | }; 323 | 324 | if (typeof window !== 'undefined') { 325 | var styles = window.getComputedStyle(document.documentElement); 326 | 327 | var prefixString = Array.prototype.slice.call(styles).join(''); 328 | var standardPrefixString = prefixString.match(/-(moz|webkit|ms)-/); 329 | var operaPrefixString = prefixString.match(styles.OLink === '' && ['', 'o']); 330 | var prefixMatch = standardPrefixString || operaPrefixString; 331 | 332 | var prefix = prefixMatch ? prefixMatch[1] : ''; 333 | 334 | prefixObject = { 335 | css: '-' + prefix + '-', 336 | js: prefix 337 | }; 338 | 339 | if (prefixObject.js !== 'ms') { 340 | prefixObject = _extends({}, prefixObject, { 341 | js: '' + prefixObject.js.charAt(0).toUpperCase() + prefixObject.js.slice(1) 342 | }); 343 | } 344 | } 345 | 346 | exports.default = prefixObject; 347 | module.exports = exports['default']; 348 | 349 | /***/ }, 350 | /* 7 */ 351 | /***/ function(module, exports, __webpack_require__) { 352 | 353 | 'use strict'; 354 | 355 | Object.defineProperty(exports, "__esModule", { 356 | value: true 357 | }); 358 | 359 | var _camelCase = __webpack_require__(8); 360 | 361 | var _camelCase2 = _interopRequireDefault(_camelCase); 362 | 363 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 364 | 365 | /** 366 | * is the property supported, or is the value supported for the given property 367 | * 368 | * @param {string} property 369 | * @param {number|string} value 370 | * @returns {boolean} 371 | */ 372 | var isSupported = function isSupported(property, value) { 373 | // Try the native standard method first 374 | if ('CSS' in window && 'supports' in window.CSS) { 375 | return window.CSS.supports(property, value); 376 | } 377 | 378 | // Check Opera's native method 379 | if ('supportsCSS' in window) { 380 | return window.supportsCSS(property, value); 381 | } 382 | 383 | // Convert to camel-case for DOM interactions 384 | var camelCaseProperty = (0, _camelCase2.default)(property); 385 | 386 | // Check if the property is supported 387 | var element = document.createElement('div'); 388 | var support = camelCaseProperty in element.style; 389 | 390 | // Assign the property and value to invoke the CSS interpreter 391 | element.style.cssText = property + ':' + value; 392 | 393 | // Ensure both the property and value are 394 | // supported and return 395 | return support && element.style[camelCaseProperty] !== ''; 396 | }; 397 | 398 | exports.default = isSupported; 399 | module.exports = exports['default']; 400 | 401 | /***/ }, 402 | /* 8 */ 403 | /***/ function(module, exports, __webpack_require__) { 404 | 405 | var capitalize = __webpack_require__(9), 406 | createCompounder = __webpack_require__(19); 407 | 408 | /** 409 | * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). 410 | * 411 | * @static 412 | * @memberOf _ 413 | * @since 3.0.0 414 | * @category String 415 | * @param {string} [string=''] The string to convert. 416 | * @returns {string} Returns the camel cased string. 417 | * @example 418 | * 419 | * _.camelCase('Foo Bar'); 420 | * // => 'fooBar' 421 | * 422 | * _.camelCase('--foo-bar--'); 423 | * // => 'fooBar' 424 | * 425 | * _.camelCase('__FOO_BAR__'); 426 | * // => 'fooBar' 427 | */ 428 | var camelCase = createCompounder(function(result, word, index) { 429 | word = word.toLowerCase(); 430 | return result + (index ? capitalize(word) : word); 431 | }); 432 | 433 | module.exports = camelCase; 434 | 435 | 436 | /***/ }, 437 | /* 9 */ 438 | /***/ function(module, exports, __webpack_require__) { 439 | 440 | var toString = __webpack_require__(10), 441 | upperFirst = __webpack_require__(11); 442 | 443 | /** 444 | * Converts the first character of `string` to upper case and the remaining 445 | * to lower case. 446 | * 447 | * @static 448 | * @memberOf _ 449 | * @since 3.0.0 450 | * @category String 451 | * @param {string} [string=''] The string to capitalize. 452 | * @returns {string} Returns the capitalized string. 453 | * @example 454 | * 455 | * _.capitalize('FRED'); 456 | * // => 'Fred' 457 | */ 458 | function capitalize(string) { 459 | return upperFirst(toString(string).toLowerCase()); 460 | } 461 | 462 | module.exports = capitalize; 463 | 464 | 465 | /***/ }, 466 | /* 10 */ 467 | /***/ function(module, exports) { 468 | 469 | /** 470 | * This method returns the first argument it receives. 471 | * 472 | * @static 473 | * @since 0.1.0 474 | * @memberOf _ 475 | * @category Util 476 | * @param {*} value Any value. 477 | * @returns {*} Returns `value`. 478 | * @example 479 | * 480 | * var object = { 'a': 1 }; 481 | * 482 | * console.log(_.identity(object) === object); 483 | * // => true 484 | */ 485 | function identity(value) { 486 | return value; 487 | } 488 | 489 | module.exports = identity; 490 | 491 | 492 | /***/ }, 493 | /* 11 */ 494 | /***/ function(module, exports, __webpack_require__) { 495 | 496 | var createCaseFirst = __webpack_require__(12); 497 | 498 | /** 499 | * Converts the first character of `string` to upper case. 500 | * 501 | * @static 502 | * @memberOf _ 503 | * @since 4.0.0 504 | * @category String 505 | * @param {string} [string=''] The string to convert. 506 | * @returns {string} Returns the converted string. 507 | * @example 508 | * 509 | * _.upperFirst('fred'); 510 | * // => 'Fred' 511 | * 512 | * _.upperFirst('FRED'); 513 | * // => 'FRED' 514 | */ 515 | var upperFirst = createCaseFirst('toUpperCase'); 516 | 517 | module.exports = upperFirst; 518 | 519 | 520 | /***/ }, 521 | /* 12 */ 522 | /***/ function(module, exports, __webpack_require__) { 523 | 524 | var castSlice = __webpack_require__(13), 525 | hasUnicode = __webpack_require__(15), 526 | stringToArray = __webpack_require__(16), 527 | toString = __webpack_require__(10); 528 | 529 | /** 530 | * Creates a function like `_.lowerFirst`. 531 | * 532 | * @private 533 | * @param {string} methodName The name of the `String` case method to use. 534 | * @returns {Function} Returns the new case function. 535 | */ 536 | function createCaseFirst(methodName) { 537 | return function(string) { 538 | string = toString(string); 539 | 540 | var strSymbols = hasUnicode(string) 541 | ? stringToArray(string) 542 | : undefined; 543 | 544 | var chr = strSymbols 545 | ? strSymbols[0] 546 | : string.charAt(0); 547 | 548 | var trailing = strSymbols 549 | ? castSlice(strSymbols, 1).join('') 550 | : string.slice(1); 551 | 552 | return chr[methodName]() + trailing; 553 | }; 554 | } 555 | 556 | module.exports = createCaseFirst; 557 | 558 | 559 | /***/ }, 560 | /* 13 */ 561 | /***/ function(module, exports, __webpack_require__) { 562 | 563 | var baseSlice = __webpack_require__(14); 564 | 565 | /** 566 | * Casts `array` to a slice if it's needed. 567 | * 568 | * @private 569 | * @param {Array} array The array to inspect. 570 | * @param {number} start The start position. 571 | * @param {number} [end=array.length] The end position. 572 | * @returns {Array} Returns the cast slice. 573 | */ 574 | function castSlice(array, start, end) { 575 | var length = array.length; 576 | end = end === undefined ? length : end; 577 | return (!start && end >= length) ? array : baseSlice(array, start, end); 578 | } 579 | 580 | module.exports = castSlice; 581 | 582 | 583 | /***/ }, 584 | /* 14 */ 585 | /***/ function(module, exports) { 586 | 587 | /** 588 | * The base implementation of `_.slice` without an iteratee call guard. 589 | * 590 | * @private 591 | * @param {Array} array The array to slice. 592 | * @param {number} [start=0] The start position. 593 | * @param {number} [end=array.length] The end position. 594 | * @returns {Array} Returns the slice of `array`. 595 | */ 596 | function baseSlice(array, start, end) { 597 | var index = -1, 598 | length = array.length; 599 | 600 | if (start < 0) { 601 | start = -start > length ? 0 : (length + start); 602 | } 603 | end = end > length ? length : end; 604 | if (end < 0) { 605 | end += length; 606 | } 607 | length = start > end ? 0 : ((end - start) >>> 0); 608 | start >>>= 0; 609 | 610 | var result = Array(length); 611 | while (++index < length) { 612 | result[index] = array[index + start]; 613 | } 614 | return result; 615 | } 616 | 617 | module.exports = baseSlice; 618 | 619 | 620 | /***/ }, 621 | /* 15 */ 622 | /***/ function(module, exports) { 623 | 624 | /** 625 | * This method returns `false`. 626 | * 627 | * @static 628 | * @memberOf _ 629 | * @since 4.13.0 630 | * @category Util 631 | * @returns {boolean} Returns `false`. 632 | * @example 633 | * 634 | * _.times(2, _.stubFalse); 635 | * // => [false, false] 636 | */ 637 | function stubFalse() { 638 | return false; 639 | } 640 | 641 | module.exports = stubFalse; 642 | 643 | 644 | /***/ }, 645 | /* 16 */ 646 | /***/ function(module, exports, __webpack_require__) { 647 | 648 | var asciiToArray = __webpack_require__(17), 649 | hasUnicode = __webpack_require__(15), 650 | unicodeToArray = __webpack_require__(18); 651 | 652 | /** 653 | * Converts `string` to an array. 654 | * 655 | * @private 656 | * @param {string} string The string to convert. 657 | * @returns {Array} Returns the converted array. 658 | */ 659 | function stringToArray(string) { 660 | return hasUnicode(string) 661 | ? unicodeToArray(string) 662 | : asciiToArray(string); 663 | } 664 | 665 | module.exports = stringToArray; 666 | 667 | 668 | /***/ }, 669 | /* 17 */ 670 | /***/ function(module, exports) { 671 | 672 | /** 673 | * Converts an ASCII `string` to an array. 674 | * 675 | * @private 676 | * @param {string} string The string to convert. 677 | * @returns {Array} Returns the converted array. 678 | */ 679 | function asciiToArray(string) { 680 | return string.split(''); 681 | } 682 | 683 | module.exports = asciiToArray; 684 | 685 | 686 | /***/ }, 687 | /* 18 */ 688 | /***/ function(module, exports) { 689 | 690 | /** 691 | * Converts an ASCII `string` to an array. 692 | * 693 | * @private 694 | * @param {string} string The string to convert. 695 | * @returns {Array} Returns the converted array. 696 | */ 697 | function asciiToArray(string) { 698 | return string.split(''); 699 | } 700 | 701 | module.exports = asciiToArray; 702 | 703 | 704 | /***/ }, 705 | /* 19 */ 706 | /***/ function(module, exports, __webpack_require__) { 707 | 708 | var arrayReduce = __webpack_require__(20), 709 | deburr = __webpack_require__(21), 710 | words = __webpack_require__(22); 711 | 712 | /** Used to compose unicode capture groups. */ 713 | var rsApos = "['\u2019]"; 714 | 715 | /** Used to match apostrophes. */ 716 | var reApos = RegExp(rsApos, 'g'); 717 | 718 | /** 719 | * Creates a function like `_.camelCase`. 720 | * 721 | * @private 722 | * @param {Function} callback The function to combine each word. 723 | * @returns {Function} Returns the new compounder function. 724 | */ 725 | function createCompounder(callback) { 726 | return function(string) { 727 | return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); 728 | }; 729 | } 730 | 731 | module.exports = createCompounder; 732 | 733 | 734 | /***/ }, 735 | /* 20 */ 736 | /***/ function(module, exports) { 737 | 738 | /** 739 | * A specialized version of `_.reduce` for arrays without support for 740 | * iteratee shorthands. 741 | * 742 | * @private 743 | * @param {Array} [array] The array to iterate over. 744 | * @param {Function} iteratee The function invoked per iteration. 745 | * @param {*} [accumulator] The initial value. 746 | * @param {boolean} [initAccum] Specify using the first element of `array` as 747 | * the initial value. 748 | * @returns {*} Returns the accumulated value. 749 | */ 750 | function arrayReduce(array, iteratee, accumulator, initAccum) { 751 | var index = -1, 752 | length = array == null ? 0 : array.length; 753 | 754 | if (initAccum && length) { 755 | accumulator = array[++index]; 756 | } 757 | while (++index < length) { 758 | accumulator = iteratee(accumulator, array[index], index, array); 759 | } 760 | return accumulator; 761 | } 762 | 763 | module.exports = arrayReduce; 764 | 765 | 766 | /***/ }, 767 | /* 21 */ 768 | /***/ function(module, exports) { 769 | 770 | /** 771 | * This method returns the first argument it receives. 772 | * 773 | * @static 774 | * @since 0.1.0 775 | * @memberOf _ 776 | * @category Util 777 | * @param {*} value Any value. 778 | * @returns {*} Returns `value`. 779 | * @example 780 | * 781 | * var object = { 'a': 1 }; 782 | * 783 | * console.log(_.identity(object) === object); 784 | * // => true 785 | */ 786 | function identity(value) { 787 | return value; 788 | } 789 | 790 | module.exports = identity; 791 | 792 | 793 | /***/ }, 794 | /* 22 */ 795 | /***/ function(module, exports, __webpack_require__) { 796 | 797 | var asciiWords = __webpack_require__(23), 798 | hasUnicodeWord = __webpack_require__(24), 799 | toString = __webpack_require__(10), 800 | unicodeWords = __webpack_require__(25); 801 | 802 | /** 803 | * Splits `string` into an array of its words. 804 | * 805 | * @static 806 | * @memberOf _ 807 | * @since 3.0.0 808 | * @category String 809 | * @param {string} [string=''] The string to inspect. 810 | * @param {RegExp|string} [pattern] The pattern to match words. 811 | * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. 812 | * @returns {Array} Returns the words of `string`. 813 | * @example 814 | * 815 | * _.words('fred, barney, & pebbles'); 816 | * // => ['fred', 'barney', 'pebbles'] 817 | * 818 | * _.words('fred, barney, & pebbles', /[^, ]+/g); 819 | * // => ['fred', 'barney', '&', 'pebbles'] 820 | */ 821 | function words(string, pattern, guard) { 822 | string = toString(string); 823 | pattern = guard ? undefined : pattern; 824 | 825 | if (pattern === undefined) { 826 | return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); 827 | } 828 | return string.match(pattern) || []; 829 | } 830 | 831 | module.exports = words; 832 | 833 | 834 | /***/ }, 835 | /* 23 */ 836 | /***/ function(module, exports) { 837 | 838 | /** Used to match words composed of alphanumeric characters. */ 839 | var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; 840 | 841 | /** 842 | * Splits an ASCII `string` into an array of its words. 843 | * 844 | * @private 845 | * @param {string} The string to inspect. 846 | * @returns {Array} Returns the words of `string`. 847 | */ 848 | function asciiWords(string) { 849 | return string.match(reAsciiWord) || []; 850 | } 851 | 852 | module.exports = asciiWords; 853 | 854 | 855 | /***/ }, 856 | /* 24 */ 857 | /***/ function(module, exports) { 858 | 859 | /** 860 | * This method returns `false`. 861 | * 862 | * @static 863 | * @memberOf _ 864 | * @since 4.13.0 865 | * @category Util 866 | * @returns {boolean} Returns `false`. 867 | * @example 868 | * 869 | * _.times(2, _.stubFalse); 870 | * // => [false, false] 871 | */ 872 | function stubFalse() { 873 | return false; 874 | } 875 | 876 | module.exports = stubFalse; 877 | 878 | 879 | /***/ }, 880 | /* 25 */ 881 | /***/ function(module, exports) { 882 | 883 | /** Used to match words composed of alphanumeric characters. */ 884 | var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; 885 | 886 | /** 887 | * Splits an ASCII `string` into an array of its words. 888 | * 889 | * @private 890 | * @param {string} The string to inspect. 891 | * @returns {Array} Returns the words of `string`. 892 | */ 893 | function asciiWords(string) { 894 | return string.match(reAsciiWord) || []; 895 | } 896 | 897 | module.exports = asciiWords; 898 | 899 | 900 | /***/ }, 901 | /* 26 */ 902 | /***/ function(module, exports) { 903 | 904 | 'use strict'; 905 | 906 | Object.defineProperty(exports, "__esModule", { 907 | value: true 908 | }); 909 | var ANIMATABLE_VALUES = ['columnCount', 'columnGap', 'columnRule', 'columnRuleColor', 'columnRuleWidth', 'columns', 'flex', 'flexBasis', 'flexGrow', 'flexShrink', 'order', 'perspective', 'perspectiveOrigin', 'perspectiveOriginX', 'perspectiveOriginY', 'scrollSnapCoordinate', 'scrollSnapDirection', 'textDecoration', 'textDecorationColor', 'transform', 'transformOrigin', 'transformOriginX', 'transformOriginY', 'transformOriginZ', 'transformStyle']; 910 | 911 | var CSS_PROPERTIES = ['alignContent', 'alignItems', 'alignSelf', 'animation', 'animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction', 'appearance', 'aspectRatio', 'backfaceVisibility', 'backgroundClip', 'borderImage', 'borderImageSlice', 'boxShadow', 'columnCount', 'columnFill', 'columnGap', 'columnRule', 'columnRuleColor', 'columnRuleStyle', 'columnRuleWidth', 'columnSpan', 'columnWidth', 'columns', 'flex', 'flexBasis', 'flexDirection', 'flexFlow', 'flexGrow', 'flexShrink', 'flexWrap', 'fontFeatureSettings', 'fontKearning', 'fontVariantLigatures', 'justifyContent', 'grid', 'gridArea', 'gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridColumn', 'gridColumnEnd', 'gridColumnStart', 'gridRow', 'gridRowEnd', 'gridRowStart', 'gridTemplate', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows', 'hyphens', 'lineBreak', 'perspective', 'perspectiveOrigin', 'perspectiveOriginX', 'perspectiveOriginY', 'rubyPosition', 'scrollSnapCoordinate', 'scrollSnapDestination', 'scrollSnapPoints', 'scrollSnapPointsX', 'scrollSnapPointsY', 'scrollSnapType', 'tabSize', 'textDecoration', 'textDecorationColor', 'textDecorationLine', 'textDecorationStyle', 'textOrientation', 'textSizeAdjust', 'transform', 'transition', 'transformOrigin', 'transformOriginX', 'transformOriginY', 'transformOriginZ', 'transformStyle', 'transitionProperty', 'transitionDuration', 'transitionTimingFunction', 'transitionDelay', 'userModify', 'userSelect']; 912 | 913 | exports.ANIMATABLE_VALUES = ANIMATABLE_VALUES; 914 | exports.CSS_PROPERTIES = CSS_PROPERTIES; 915 | 916 | /***/ } 917 | /******/ ]) 918 | }); 919 | ; 920 | //# sourceMappingURL=react-prefixer.js.map -------------------------------------------------------------------------------- /dist/react-prefixer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 1f51bb4c3604982a9c23","webpack:///./src/index.js","webpack:///./~/lodash/isPlainObject.js","webpack:///./~/lodash/_baseGetTag.js","webpack:///./~/lodash/_getPrototype.js","webpack:///./~/lodash/_overArg.js","webpack:///./~/lodash/isObjectLike.js","webpack:///./src/prefix.js","webpack:///./src/supports.js","webpack:///./~/lodash/camelCase.js","webpack:///./~/lodash/capitalize.js","webpack:///./~/lodash/toString.js","webpack:///./~/lodash/upperFirst.js","webpack:///./~/lodash/_createCaseFirst.js","webpack:///./~/lodash/_castSlice.js","webpack:///./~/lodash/_baseSlice.js","webpack:///./~/lodash/_hasUnicode.js","webpack:///./~/lodash/_stringToArray.js","webpack:///./~/lodash/_asciiToArray.js","webpack:///./~/lodash/_unicodeToArray.js","webpack:///./~/lodash/_createCompounder.js","webpack:///./~/lodash/_arrayReduce.js","webpack:///./~/lodash/deburr.js","webpack:///./~/lodash/words.js","webpack:///./~/lodash/_asciiWords.js","webpack:///./~/lodash/_hasUnicodeWord.js","webpack:///./~/lodash/_unicodeWords.js","webpack:///./src/constants.js"],"names":["toKebabCase","string","replace","$1","toLowerCase","applyPrefixes","object","value","Object","keys","reduce","styleObject","originalKey","key","indexOf","js","charAt","toUpperCase","slice","css","animatableValuesObject","animatableValues","animatableValue","kebabValue","re","RegExp","test","cleanValue","prefixObject","window","styles","getComputedStyle","document","documentElement","prefixString","Array","prototype","call","join","standardPrefixString","match","operaPrefixString","OLink","prefixMatch","prefix","isSupported","property","CSS","supports","supportsCSS","camelCaseProperty","element","createElement","support","style","cssText","ANIMATABLE_VALUES","CSS_PROPERTIES"],"mappings":"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AmBH,QAAnB,EAA6BvC,KAA7B,CAAP;AACD;;AAED;AACA,OAAM2C,oBAAoB,yBAAUJ,QAAV,CAA1B;;AAEA;AACA,OAAMK,UAAUnB,SAASoB,aAAT,CAAuB,KAAvB,CAAhB;AACA,OAAMC,UAAWH,qBAAqBC,QAAQG,KAA9C;;AAEA;AACAH,WAAQG,KAAR,CAAcC,OAAd,GAA2BT,QAA3B,SAAuCvC,KAAvC;;AAEA;AACA;AACA,UAAO8C,WAAYF,QAAQG,KAAR,CAAcJ,iBAAd,MAAqC,EAAxD;AACD,EAxBD;;mBA0BeL,W;;;;;;;ACnCf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;;;;;;AC5BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,cAAa,EAAE;AACf;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACrBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;AChCA;;AAEA;AACA;AACA;AACA;AACA,YAAW,MAAM;AACjB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACjBA;AACA;AACA;AACA;AACA,YAAW,MAAM;AACjB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACjBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACjBA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;;;;;;ACXA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;;;;;;ACXA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB,cAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA,YAAW,MAAM;AACjB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,YAAW,QAAQ;AACnB;AACA,cAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,cAAa,EAAE;AACf;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACpBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,cAAc;AACzB,aAAY,OAAO;AACnB,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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","file":"react-prefixer.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"react-prefixer\"] = factory();\n\telse\n\t\troot[\"react-prefixer\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1f51bb4c3604982a9c23","import isPlainObject from 'lodash/isPlainObject';\n\nimport prefix from './prefix';\nimport isSupported from './supports';\n\nimport {\n ANIMATABLE_VALUES,\n CSS_PROPERTIES\n} from './constants';\n\nconst toKebabCase = (string) => {\n return string.replace(/([A-Z])/g, ($1) => {\n return `-${$1.toLowerCase()}`;\n });\n};\n\n/**\n * create a new style object with prefixes applied\n *\n * @param {Object} object\n * @returns {Object}\n */\nconst applyPrefixes = (object) => {\n if (!isPlainObject(object)) {\n return object;\n }\n\n let value;\n\n return Object.keys(object).reduce((styleObject, originalKey) => {\n let key = originalKey;\n\n value = object[key];\n\n if (isPlainObject(value)) {\n return {\n ...styleObject,\n [key]: applyPrefixes(value)\n };\n }\n\n if (CSS_PROPERTIES.indexOf(key) !== -1 && !isSupported(toKebabCase(key), value)) {\n key = `${prefix.js}${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n }\n\n if (originalKey === 'display' && object[originalKey] === 'flex' && !isSupported('display', 'flex')) {\n return {\n ...styleObject,\n [key]: (prefix.js === 'ms' ? '-ms-flexbox' : `${prefix.css}flex`)\n };\n }\n\n if (originalKey === 'transition') {\n const animatableValuesObject = ANIMATABLE_VALUES.reduce((animatableValues, animatableValue) => {\n const kebabValue = toKebabCase(animatableValue);\n const re = new RegExp(kebabValue, 'g');\n\n if (re.test(object[originalKey]) && !isSupported(kebabValue)) {\n const cleanValue = object[originalKey].replace(re, `${prefix.css}${kebabValue}`);\n\n return {\n ...animatableValues,\n [key]: cleanValue\n };\n }\n\n return animatableValues;\n }, {});\n\n return {\n ...styleObject,\n ...animatableValuesObject\n };\n }\n\n return {\n ...styleObject,\n [key]: value\n };\n }, {});\n};\n\nexport default applyPrefixes;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/isPlainObject.js\n// module id = 1\n// module chunks = 0","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_baseGetTag.js\n// module id = 2\n// module chunks = 0","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_getPrototype.js\n// module id = 3\n// module chunks = 0","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_overArg.js\n// module id = 4\n// module chunks = 0","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/isObjectLike.js\n// module id = 5\n// module chunks = 0","let prefixObject = {\n css: '',\n js: ''\n};\n\nif (typeof window !== 'undefined') {\n const styles = window.getComputedStyle(document.documentElement);\n\n const prefixString = Array.prototype.slice.call(styles).join('');\n const standardPrefixString = prefixString.match(/-(moz|webkit|ms)-/);\n const operaPrefixString = prefixString.match(styles.OLink === '' && ['', 'o']);\n const prefixMatch = standardPrefixString || operaPrefixString;\n\n const prefix = prefixMatch ? prefixMatch[1] : '';\n\n prefixObject = {\n css: `-${prefix}-`,\n js: prefix\n };\n\n if (prefixObject.js !== 'ms') {\n prefixObject = {\n ...prefixObject,\n js: `${prefixObject.js.charAt(0).toUpperCase()}${prefixObject.js.slice(1)}`\n };\n }\n}\n\nexport default prefixObject;\n\n\n\n// WEBPACK FOOTER //\n// ./src/prefix.js","import camelCase from 'lodash/camelCase';\n\n/**\n * is the property supported, or is the value supported for the given property\n * \n * @param {string} property\n * @param {number|string} value\n * @returns {boolean}\n */\nconst isSupported = (property, value) => {\n // Try the native standard method first\n if ('CSS' in window && 'supports' in window.CSS) {\n return window.CSS.supports(property, value);\n }\n\n // Check Opera's native method\n if ('supportsCSS' in window) {\n return window.supportsCSS(property, value);\n }\n\n // Convert to camel-case for DOM interactions\n const camelCaseProperty = camelCase(property);\n\n // Check if the property is supported\n const element = document.createElement('div');\n const support = (camelCaseProperty in element.style);\n\n // Assign the property and value to invoke the CSS interpreter\n element.style.cssText = `${property}:${value}`;\n\n // Ensure both the property and value are\n // supported and return\n return support && (element.style[camelCaseProperty] !== '');\n};\n\nexport default isSupported;\n\n\n\n// WEBPACK FOOTER //\n// ./src/supports.js","var capitalize = require('./capitalize'),\n createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\nmodule.exports = camelCase;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/camelCase.js\n// module id = 8\n// module chunks = 0","var toString = require('./toString'),\n upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/capitalize.js\n// module id = 9\n// module chunks = 0","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/toString.js\n// module id = 10\n// module chunks = 0","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/upperFirst.js\n// module id = 11\n// module chunks = 0","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_createCaseFirst.js\n// module id = 12\n// module chunks = 0","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_castSlice.js\n// module id = 13\n// module chunks = 0","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_baseSlice.js\n// module id = 14\n// module chunks = 0","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_hasUnicode.js\n// module id = 15\n// module chunks = 0","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_stringToArray.js\n// module id = 16\n// module chunks = 0","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_asciiToArray.js\n// module id = 17\n// module chunks = 0","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_unicodeToArray.js\n// module id = 18\n// module chunks = 0","var arrayReduce = require('./_arrayReduce'),\n deburr = require('./deburr'),\n words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\nmodule.exports = createCompounder;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_createCompounder.js\n// module id = 19\n// module chunks = 0","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_arrayReduce.js\n// module id = 20\n// module chunks = 0","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/deburr.js\n// module id = 21\n// module chunks = 0","var asciiWords = require('./_asciiWords'),\n hasUnicodeWord = require('./_hasUnicodeWord'),\n toString = require('./toString'),\n unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/words.js\n// module id = 22\n// module chunks = 0","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_asciiWords.js\n// module id = 23\n// module chunks = 0","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_hasUnicodeWord.js\n// module id = 24\n// module chunks = 0","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/lodash/_unicodeWords.js\n// module id = 25\n// module chunks = 0","const ANIMATABLE_VALUES = [\n 'columnCount',\n 'columnGap',\n 'columnRule',\n 'columnRuleColor',\n 'columnRuleWidth',\n 'columns',\n 'flex',\n 'flexBasis',\n 'flexGrow',\n 'flexShrink',\n 'order',\n 'perspective',\n 'perspectiveOrigin',\n 'perspectiveOriginX',\n 'perspectiveOriginY',\n 'scrollSnapCoordinate',\n 'scrollSnapDirection',\n 'textDecoration',\n 'textDecorationColor',\n 'transform',\n 'transformOrigin',\n 'transformOriginX',\n 'transformOriginY',\n 'transformOriginZ',\n 'transformStyle'\n];\n\nconst CSS_PROPERTIES = [\n 'alignContent',\n 'alignItems',\n 'alignSelf',\n 'animation',\n 'animationDelay',\n 'animationDirection',\n 'animationDuration',\n 'animationFillMode',\n 'animationIterationCount',\n 'animationName',\n 'animationPlayState',\n 'animationTimingFunction',\n 'appearance',\n 'aspectRatio',\n 'backfaceVisibility',\n 'backgroundClip',\n 'borderImage',\n 'borderImageSlice',\n 'boxShadow',\n 'columnCount',\n 'columnFill',\n 'columnGap',\n 'columnRule',\n 'columnRuleColor',\n 'columnRuleStyle',\n 'columnRuleWidth',\n 'columnSpan',\n 'columnWidth',\n 'columns',\n 'flex',\n 'flexBasis',\n 'flexDirection',\n 'flexFlow',\n 'flexGrow',\n 'flexShrink',\n 'flexWrap',\n 'fontFeatureSettings',\n 'fontKearning',\n 'fontVariantLigatures',\n 'justifyContent',\n 'grid',\n 'gridArea',\n 'gridAutoColumns',\n 'gridAutoFlow',\n 'gridAutoRows',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnStart',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowStart',\n 'gridTemplate',\n 'gridTemplateAreas',\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'hyphens',\n 'lineBreak',\n 'perspective',\n 'perspectiveOrigin',\n 'perspectiveOriginX',\n 'perspectiveOriginY',\n 'rubyPosition',\n 'scrollSnapCoordinate',\n 'scrollSnapDestination',\n 'scrollSnapPoints',\n 'scrollSnapPointsX',\n 'scrollSnapPointsY',\n 'scrollSnapType',\n 'tabSize',\n 'textDecoration',\n 'textDecorationColor',\n 'textDecorationLine',\n 'textDecorationStyle',\n 'textOrientation',\n 'textSizeAdjust',\n 'transform',\n 'transition',\n 'transformOrigin',\n 'transformOriginX',\n 'transformOriginY',\n 'transformOriginZ',\n 'transformStyle',\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n 'userModify',\n 'userSelect'\n];\n\nexport {ANIMATABLE_VALUES};\nexport {CSS_PROPERTIES};\n\n\n\n// WEBPACK FOOTER //\n// ./src/constants.js"],"sourceRoot":""} --------------------------------------------------------------------------------