Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80534 views
1
/**
2
* Copyright 2013-2015, Facebook, Inc.
3
* All rights reserved.
4
*
5
* This source code is licensed under the BSD-style license found in the
6
* LICENSE file in the root directory of this source tree. An additional grant
7
* of patent rights can be found in the PATENTS file in the same directory.
8
*
9
* @providesModule CSSCore
10
* @typechecks
11
*/
12
13
var invariant = require("./invariant");
14
15
/**
16
* The CSSCore module specifies the API (and implements most of the methods)
17
* that should be used when dealing with the display of elements (via their
18
* CSS classes and visibility on screen. It is an API focused on mutating the
19
* display and not reading it as no logical state should be encoded in the
20
* display of elements.
21
*/
22
23
var CSSCore = {
24
25
/**
26
* Adds the class passed in to the element if it doesn't already have it.
27
*
28
* @param {DOMElement} element the element to set the class on
29
* @param {string} className the CSS className
30
* @return {DOMElement} the element passed in
31
*/
32
addClass: function(element, className) {
33
("production" !== process.env.NODE_ENV ? invariant(
34
!/\s/.test(className),
35
'CSSCore.addClass takes only a single class name. "%s" contains ' +
36
'multiple classes.', className
37
) : invariant(!/\s/.test(className)));
38
39
if (className) {
40
if (element.classList) {
41
element.classList.add(className);
42
} else if (!CSSCore.hasClass(element, className)) {
43
element.className = element.className + ' ' + className;
44
}
45
}
46
return element;
47
},
48
49
/**
50
* Removes the class passed in from the element
51
*
52
* @param {DOMElement} element the element to set the class on
53
* @param {string} className the CSS className
54
* @return {DOMElement} the element passed in
55
*/
56
removeClass: function(element, className) {
57
("production" !== process.env.NODE_ENV ? invariant(
58
!/\s/.test(className),
59
'CSSCore.removeClass takes only a single class name. "%s" contains ' +
60
'multiple classes.', className
61
) : invariant(!/\s/.test(className)));
62
63
if (className) {
64
if (element.classList) {
65
element.classList.remove(className);
66
} else if (CSSCore.hasClass(element, className)) {
67
element.className = element.className
68
.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)', 'g'), '$1')
69
.replace(/\s+/g, ' ') // multiple spaces to one
70
.replace(/^\s*|\s*$/g, ''); // trim the ends
71
}
72
}
73
return element;
74
},
75
76
/**
77
* Helper to add or remove a class from an element based on a condition.
78
*
79
* @param {DOMElement} element the element to set the class on
80
* @param {string} className the CSS className
81
* @param {*} bool condition to whether to add or remove the class
82
* @return {DOMElement} the element passed in
83
*/
84
conditionClass: function(element, className, bool) {
85
return (bool ? CSSCore.addClass : CSSCore.removeClass)(element, className);
86
},
87
88
/**
89
* Tests whether the element has the class specified.
90
*
91
* @param {DOMNode|DOMWindow} element the element to set the class on
92
* @param {string} className the CSS className
93
* @return {boolean} true if the element has the class, false if not
94
*/
95
hasClass: function(element, className) {
96
("production" !== process.env.NODE_ENV ? invariant(
97
!/\s/.test(className),
98
'CSS.hasClass takes only a single class name.'
99
) : invariant(!/\s/.test(className)));
100
if (element.classList) {
101
return !!className && element.classList.contains(className);
102
}
103
return (' ' + element.className + ' ').indexOf(' ' + className + ' ') > -1;
104
}
105
106
};
107
108
module.exports = CSSCore;
109
110