@@ -682,6 +682,7 @@ Modal.propTypes = {
682
682
} ) ,
683
683
portalClassName : _propTypes2 . default . string ,
684
684
bodyOpenClassName : _propTypes2 . default . string ,
685
+ htmlOpenClassName : _propTypes2 . default . string ,
685
686
className : _propTypes2 . default . oneOfType ( [ _propTypes2 . default . string , _propTypes2 . default . shape ( {
686
687
base : _propTypes2 . default . string . isRequired ,
687
688
afterOpen : _propTypes2 . default . string . isRequired ,
@@ -1444,9 +1445,9 @@ var _ariaAppHider = __webpack_require__(7);
1444
1445
1445
1446
var ariaAppHider = _interopRequireWildcard ( _ariaAppHider ) ;
1446
1447
1447
- var _bodyClassList = __webpack_require__ ( 19 ) ;
1448
+ var _classList = __webpack_require__ ( 19 ) ;
1448
1449
1449
- var bodyClassList = _interopRequireWildcard ( _bodyClassList ) ;
1450
+ var classList = _interopRequireWildcard ( _classList ) ;
1450
1451
1451
1452
var _safeHTMLElement = __webpack_require__ ( 8 ) ;
1452
1453
@@ -1498,11 +1499,15 @@ var ModalPortal = function (_Component) {
1498
1499
_this . afterClose = function ( ) {
1499
1500
var _this$props = _this . props ,
1500
1501
appElement = _this$props . appElement ,
1501
- ariaHideApp = _this$props . ariaHideApp ;
1502
+ ariaHideApp = _this$props . ariaHideApp ,
1503
+ htmlOpenClassName = _this$props . htmlOpenClassName ,
1504
+ bodyOpenClassName = _this$props . bodyOpenClassName ;
1502
1505
1503
- // Remove body class
1506
+ // Remove classes.
1504
1507
1505
- bodyClassList . remove ( _this . props . bodyOpenClassName ) ;
1508
+ classList . remove ( document . body , bodyOpenClassName ) ;
1509
+
1510
+ htmlOpenClassName && classList . remove ( document . getElementsByTagName ( "html" ) [ 0 ] , htmlOpenClassName ) ;
1506
1511
1507
1512
// Reset aria-hidden attribute if all modals have been removed
1508
1513
if ( ariaHideApp && ariaHiddenInstances > 0 ) {
@@ -1694,6 +1699,10 @@ var ModalPortal = function (_Component) {
1694
1699
// eslint-disable-next-line no-console
1695
1700
console . warn ( 'React-Modal: "bodyOpenClassName" prop has been modified. ' + "This may cause unexpected behavior when multiple modals are open." ) ;
1696
1701
}
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
+ }
1697
1706
}
1698
1707
// Focus only needs to be set once when the modal is being opened
1699
1708
if ( ! this . props . isOpen && newProps . isOpen ) {
@@ -1723,11 +1732,15 @@ var ModalPortal = function (_Component) {
1723
1732
var _props = this . props ,
1724
1733
appElement = _props . appElement ,
1725
1734
ariaHideApp = _props . ariaHideApp ,
1735
+ htmlOpenClassName = _props . htmlOpenClassName ,
1726
1736
bodyOpenClassName = _props . bodyOpenClassName ;
1727
- // Add body class
1728
1737
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
+
1731
1744
if ( ariaHideApp ) {
1732
1745
ariaHiddenInstances += 1 ;
1733
1746
ariaAppHider . hide ( appElement ) ;
@@ -1800,6 +1813,7 @@ ModalPortal.propTypes = {
1800
1813
className : _propTypes2 . default . oneOfType ( [ _propTypes2 . default . string , _propTypes2 . default . object ] ) ,
1801
1814
overlayClassName : _propTypes2 . default . oneOfType ( [ _propTypes2 . default . string , _propTypes2 . default . object ] ) ,
1802
1815
bodyOpenClassName : _propTypes2 . default . string ,
1816
+ htmlOpenClassName : _propTypes2 . default . string ,
1803
1817
ariaHideApp : _propTypes2 . default . bool ,
1804
1818
appElement : _propTypes2 . default . instanceOf ( _safeHTMLElement2 . default ) ,
1805
1819
onAfterOpen : _propTypes2 . default . func ,
@@ -2079,41 +2093,108 @@ module.exports = warning;
2079
2093
Object . defineProperty ( exports , "__esModule" , {
2080
2094
value : true
2081
2095
} ) ;
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 ;
2083
2111
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 ) ;
2088
2122
}
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 ;
2090
2136
return className ;
2091
2137
} ;
2092
2138
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 ;
2096
2148
}
2097
2149
return className ;
2098
2150
} ;
2099
2151
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 ) ;
2103
2162
} ) ;
2104
2163
} ;
2105
2164
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 ) ;
2112
2176
} ) ;
2113
2177
} ;
2114
2178
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
+ } ;
2117
2198
2118
2199
/***/ } ) ,
2119
2200
/* 20 */
0 commit comments