Skip to content

Commit 857a303

Browse files
committed
Release v3.3.1.
1 parent 0c6d966 commit 857a303

File tree

5 files changed

+123
-32
lines changed

5 files changed

+123
-32
lines changed

CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
v3.3.1 - Wed, 21 Feb 2018 09:53:44 UTC
2+
--------------------------------------
3+
4+
- [0c6d966](../../commit/0c6d966) [added] htmlOpenClassName will follow the same rules like... bodyOpenClassName.
5+
- [088e68e](../../commit/088e68e) [added] add class to html when modal is open
6+
- [e6159b6](../../commit/e6159b6) [chore] Fix README table of contents
7+
- [241b8a6](../../commit/241b8a6) [chore] Move API documentation from README to gitbook
8+
- [4c1e590](../../commit/4c1e590) Expand documentation
9+
10+
111
v3.2.1 - Thu, 15 Feb 2018 09:07:28 UTC
212
--------------------------------------
313

bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-modal",
3-
"version": "3.2.1",
3+
"version": "3.3.1",
44
"homepage": "https://github.com/reactjs/react-modal",
55
"authors": [
66
"Ryan Florence",

dist/react-modal.js

+109-28
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ Modal.propTypes = {
682682
}),
683683
portalClassName: _propTypes2.default.string,
684684
bodyOpenClassName: _propTypes2.default.string,
685+
htmlOpenClassName: _propTypes2.default.string,
685686
className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({
686687
base: _propTypes2.default.string.isRequired,
687688
afterOpen: _propTypes2.default.string.isRequired,
@@ -1444,9 +1445,9 @@ var _ariaAppHider = __webpack_require__(7);
14441445

14451446
var ariaAppHider = _interopRequireWildcard(_ariaAppHider);
14461447

1447-
var _bodyClassList = __webpack_require__(19);
1448+
var _classList = __webpack_require__(19);
14481449

1449-
var bodyClassList = _interopRequireWildcard(_bodyClassList);
1450+
var classList = _interopRequireWildcard(_classList);
14501451

14511452
var _safeHTMLElement = __webpack_require__(8);
14521453

@@ -1498,11 +1499,15 @@ var ModalPortal = function (_Component) {
14981499
_this.afterClose = function () {
14991500
var _this$props = _this.props,
15001501
appElement = _this$props.appElement,
1501-
ariaHideApp = _this$props.ariaHideApp;
1502+
ariaHideApp = _this$props.ariaHideApp,
1503+
htmlOpenClassName = _this$props.htmlOpenClassName,
1504+
bodyOpenClassName = _this$props.bodyOpenClassName;
15021505

1503-
// Remove body class
1506+
// Remove classes.
15041507

1505-
bodyClassList.remove(_this.props.bodyOpenClassName);
1508+
classList.remove(document.body, bodyOpenClassName);
1509+
1510+
htmlOpenClassName && classList.remove(document.getElementsByTagName("html")[0], htmlOpenClassName);
15061511

15071512
// Reset aria-hidden attribute if all modals have been removed
15081513
if (ariaHideApp && ariaHiddenInstances > 0) {
@@ -1694,6 +1699,10 @@ var ModalPortal = function (_Component) {
16941699
// eslint-disable-next-line no-console
16951700
console.warn('React-Modal: "bodyOpenClassName" prop has been modified. ' + "This may cause unexpected behavior when multiple modals are open.");
16961701
}
1702+
if (newProps.htmlOpenClassName !== this.props.htmlOpenClassName) {
1703+
// eslint-disable-next-line no-console
1704+
console.warn('React-Modal: "htmlOpenClassName" prop has been modified. ' + "This may cause unexpected behavior when multiple modals are open.");
1705+
}
16971706
}
16981707
// Focus only needs to be set once when the modal is being opened
16991708
if (!this.props.isOpen && newProps.isOpen) {
@@ -1723,11 +1732,15 @@ var ModalPortal = function (_Component) {
17231732
var _props = this.props,
17241733
appElement = _props.appElement,
17251734
ariaHideApp = _props.ariaHideApp,
1735+
htmlOpenClassName = _props.htmlOpenClassName,
17261736
bodyOpenClassName = _props.bodyOpenClassName;
1727-
// Add body class
17281737

1729-
bodyClassList.add(bodyOpenClassName);
1730-
// Add aria-hidden to appElement
1738+
// Add classes.
1739+
1740+
classList.add(document.body, bodyOpenClassName);
1741+
1742+
htmlOpenClassName && classList.add(document.getElementsByTagName("html")[0], htmlOpenClassName);
1743+
17311744
if (ariaHideApp) {
17321745
ariaHiddenInstances += 1;
17331746
ariaAppHider.hide(appElement);
@@ -1800,6 +1813,7 @@ ModalPortal.propTypes = {
18001813
className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),
18011814
overlayClassName: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),
18021815
bodyOpenClassName: _propTypes2.default.string,
1816+
htmlOpenClassName: _propTypes2.default.string,
18031817
ariaHideApp: _propTypes2.default.bool,
18041818
appElement: _propTypes2.default.instanceOf(_safeHTMLElement2.default),
18051819
onAfterOpen: _propTypes2.default.func,
@@ -2079,41 +2093,108 @@ module.exports = warning;
20792093
Object.defineProperty(exports, "__esModule", {
20802094
value: true
20812095
});
2082-
var classListMap = {};
2096+
exports.dumpClassLists = dumpClassLists;
2097+
var htmlClassList = {};
2098+
var docBodyClassList = {};
2099+
2100+
function dumpClassLists() {
2101+
if (undefined !== "production") {
2102+
var classes = document.getElementsByTagName("html")[0].className;
2103+
var buffer = "Show tracked classes:\n\n";
2104+
2105+
buffer += "<html /> (" + classes + "):\n";
2106+
for (var x in htmlClassList) {
2107+
buffer += " " + x + " " + htmlClassList[x] + "\n";
2108+
}
2109+
2110+
classes = document.body.className;
20832111

2084-
var addClassToMap = function addClassToMap(className) {
2085-
// Set variable and default if none
2086-
if (!classListMap[className]) {
2087-
classListMap[className] = 0;
2112+
// eslint-disable-next-line max-len
2113+
buffer += "\n\ndoc.body (" + classes + "):\n";
2114+
for (var _x in docBodyClassList) {
2115+
buffer += " " + _x + " " + docBodyClassList[_x] + "\n";
2116+
}
2117+
2118+
buffer += "\n";
2119+
2120+
// eslint-disable-next-line no-console
2121+
console.log(buffer);
20882122
}
2089-
classListMap[className] += 1;
2123+
}
2124+
2125+
/**
2126+
* Track the number of reference of a class.
2127+
* @param {object} poll The poll to receive the reference.
2128+
* @param {string} className The class name.
2129+
* @return {string}
2130+
*/
2131+
var incrementReference = function incrementReference(poll, className) {
2132+
if (!poll[className]) {
2133+
poll[className] = 0;
2134+
}
2135+
poll[className] += 1;
20902136
return className;
20912137
};
20922138

2093-
var removeClassFromMap = function removeClassFromMap(className) {
2094-
if (classListMap[className]) {
2095-
classListMap[className] -= 1;
2139+
/**
2140+
* Drop the reference of a class.
2141+
* @param {object} poll The poll to receive the reference.
2142+
* @param {string} className The class name.
2143+
* @return {string}
2144+
*/
2145+
var decrementReference = function decrementReference(poll, className) {
2146+
if (poll[className]) {
2147+
poll[className] -= 1;
20962148
}
20972149
return className;
20982150
};
20992151

2100-
var add = function add(bodyClass) {
2101-
bodyClass.split(" ").map(addClassToMap).forEach(function (className) {
2102-
return document.body.classList.add(className);
2152+
/**
2153+
* Track a class and add to the given class list.
2154+
* @param {Object} classListRef A class list of an element.
2155+
* @param {Object} poll The poll to be used.
2156+
* @param {Array} classes The list of classes to be tracked.
2157+
*/
2158+
var trackClass = function trackClass(classListRef, poll, classes) {
2159+
classes.forEach(function (className) {
2160+
incrementReference(poll, className);
2161+
classListRef.add(className);
21032162
});
21042163
};
21052164

2106-
var remove = function remove(bodyClass) {
2107-
// Remove unused class(es) from body
2108-
bodyClass.split(" ").map(removeClassFromMap).filter(function (className) {
2109-
return classListMap[className] === 0;
2110-
}).forEach(function (className) {
2111-
return document.body.classList.remove(className);
2165+
/**
2166+
* Untrack a class and remove from the given class list if the reference
2167+
* reaches 0.
2168+
* @param {Object} classListRef A class list of an element.
2169+
* @param {Object} poll The poll to be used.
2170+
* @param {Array} classes The list of classes to be untracked.
2171+
*/
2172+
var untrackClass = function untrackClass(classListRef, poll, classes) {
2173+
classes.forEach(function (className) {
2174+
decrementReference(poll, className);
2175+
poll[className] === 0 && classListRef.remove(className);
21122176
});
21132177
};
21142178

2115-
exports.add = add;
2116-
exports.remove = remove;
2179+
/**
2180+
* Public inferface to add classes to the document.body.
2181+
* @param {string} bodyClass The class string to be added.
2182+
* It may contain more then one class
2183+
* with ' ' as separator.
2184+
*/
2185+
var add = exports.add = function add(element, classString) {
2186+
return trackClass(element.classList, element.nodeName.toLowerCase() == "html" ? htmlClassList : docBodyClassList, classString.split(" "));
2187+
};
2188+
2189+
/**
2190+
* Public inferface to remove classes from the document.body.
2191+
* @param {string} bodyClass The class string to be added.
2192+
* It may contain more then one class
2193+
* with ' ' as separator.
2194+
*/
2195+
var remove = exports.remove = function remove(element, classString) {
2196+
return untrackClass(element.classList, element.nodeName.toLowerCase() == "html" ? htmlClassList : docBodyClassList, classString.split(" "));
2197+
};
21172198

21182199
/***/ }),
21192200
/* 20 */

dist/react-modal.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-modal",
3-
"version": "3.2.1",
3+
"version": "3.3.1",
44
"description": "Accessible modal dialog component for React.JS",
55
"main": "./lib/index.js",
66
"repository": {

0 commit comments

Comments
 (0)