/**1* Copyright 2013-2015, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under the BSD-style license found in the5* LICENSE file in the root directory of this source tree. An additional grant6* of patent rights can be found in the PATENTS file in the same directory.7*8* @providesModule CSSCore9* @typechecks10*/1112var invariant = require("./invariant");1314/**15* The CSSCore module specifies the API (and implements most of the methods)16* that should be used when dealing with the display of elements (via their17* CSS classes and visibility on screen. It is an API focused on mutating the18* display and not reading it as no logical state should be encoded in the19* display of elements.20*/2122var CSSCore = {2324/**25* Adds the class passed in to the element if it doesn't already have it.26*27* @param {DOMElement} element the element to set the class on28* @param {string} className the CSS className29* @return {DOMElement} the element passed in30*/31addClass: function(element, className) {32("production" !== process.env.NODE_ENV ? invariant(33!/\s/.test(className),34'CSSCore.addClass takes only a single class name. "%s" contains ' +35'multiple classes.', className36) : invariant(!/\s/.test(className)));3738if (className) {39if (element.classList) {40element.classList.add(className);41} else if (!CSSCore.hasClass(element, className)) {42element.className = element.className + ' ' + className;43}44}45return element;46},4748/**49* Removes the class passed in from the element50*51* @param {DOMElement} element the element to set the class on52* @param {string} className the CSS className53* @return {DOMElement} the element passed in54*/55removeClass: function(element, className) {56("production" !== process.env.NODE_ENV ? invariant(57!/\s/.test(className),58'CSSCore.removeClass takes only a single class name. "%s" contains ' +59'multiple classes.', className60) : invariant(!/\s/.test(className)));6162if (className) {63if (element.classList) {64element.classList.remove(className);65} else if (CSSCore.hasClass(element, className)) {66element.className = element.className67.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)', 'g'), '$1')68.replace(/\s+/g, ' ') // multiple spaces to one69.replace(/^\s*|\s*$/g, ''); // trim the ends70}71}72return element;73},7475/**76* Helper to add or remove a class from an element based on a condition.77*78* @param {DOMElement} element the element to set the class on79* @param {string} className the CSS className80* @param {*} bool condition to whether to add or remove the class81* @return {DOMElement} the element passed in82*/83conditionClass: function(element, className, bool) {84return (bool ? CSSCore.addClass : CSSCore.removeClass)(element, className);85},8687/**88* Tests whether the element has the class specified.89*90* @param {DOMNode|DOMWindow} element the element to set the class on91* @param {string} className the CSS className92* @return {boolean} true if the element has the class, false if not93*/94hasClass: function(element, className) {95("production" !== process.env.NODE_ENV ? invariant(96!/\s/.test(className),97'CSS.hasClass takes only a single class name.'98) : invariant(!/\s/.test(className)));99if (element.classList) {100return !!className && element.classList.contains(className);101}102return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1;103}104105};106107module.exports = CSSCore;108109110