@@ -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
14451446var 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
14511452var _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;
20792093Object . 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 */
0 commit comments