diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 96812b762..c6a82c298 100755 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,5 +1,16 @@ ## RELEASE NOTES +### Version 2.3.4 - Aug xx, 2018 + +**Enhancements** + +- **Modal/Dimmer** - Modals and dimmers now include a new setting `useFlex` which defaults to `auto`. Modals and dimmers will automatically revert to using non-flex layouts when there may be layout issues with using flexbox. + +For example when `attachable: false` is used with a modal, or if IE11/Edge is used (Absolutely positioned elements inside flex containers in IE behave differently) + + + + ### Version 2.3.3 - June 18, 2018 **Bug Fixes** diff --git a/src/definitions/modules/dimmer.js b/src/definitions/modules/dimmer.js index bdfc39abb..f622e925a 100755 --- a/src/definitions/modules/dimmer.js +++ b/src/definitions/modules/dimmer.js @@ -243,12 +243,22 @@ $.fn.dimmer = function(parameters) { : function(){} ; if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) { + if(settings.useFlex) { + module.debug('Using flex dimmer'); + module.remove.legacy(); + } + else { + module.debug('Using legacy non-flex dimmer'); + module.set.legacy(); + } if(settings.opacity !== 'auto') { module.set.opacity(); } $dimmer .transition({ - displayType : 'flex', + displayType : settings.useFlex + ? 'flex' + : 'block', animation : settings.transition + ' in', queue : false, duration : module.get.duration(), @@ -293,7 +303,9 @@ $.fn.dimmer = function(parameters) { module.verbose('Hiding dimmer with css'); $dimmer .transition({ - displayType : 'flex', + displayType : settings.useFlex + ? 'flex' + : 'block', animation : settings.transition + ' out', queue : false, duration : module.get.duration(), @@ -415,6 +427,9 @@ $.fn.dimmer = function(parameters) { module.debug('Setting opacity to', opacity); $dimmer.css('background-color', color); }, + legacy: function() { + $dimmer.addClass(className.legacy); + }, active: function() { $dimmer.addClass(className.active); }, @@ -444,6 +459,9 @@ $.fn.dimmer = function(parameters) { .removeClass(className.active) ; }, + legacy: function() { + $dimmer.removeClass(className.legacy); + }, dimmed: function() { $dimmable.removeClass(className.dimmed); }, @@ -657,6 +675,9 @@ $.fn.dimmer.settings = { verbose : false, performance : true, + // whether should use flex layout + useFlex : true, + // name to distinguish between multiple dimmers in context dimmerName : false, @@ -700,6 +721,7 @@ $.fn.dimmer.settings = { dimmer : 'dimmer', disabled : 'disabled', hide : 'hide', + legacy : 'legacy', pageDimmer : 'page', show : 'show' }, diff --git a/src/definitions/modules/dimmer.less b/src/definitions/modules/dimmer.less index 3e534bc28..fb0ce54c5 100755 --- a/src/definitions/modules/dimmer.less +++ b/src/definitions/modules/dimmer.less @@ -113,6 +113,18 @@ Variations *******************************/ + +/*-------------- + Legacy +---------------*/ + +/* Animating / Active / Visible */ +.dimmed.dimmable > .ui.animating.legacy.dimmer, +.dimmed.dimmable > .ui.visible.legacy.dimmer, +.ui.active.legacy.dimmer { + display: block; +} + /*-------------- Alignment ---------------*/ diff --git a/src/definitions/modules/modal.js b/src/definitions/modules/modal.js index b2ccea05e..f281a3b08 100755 --- a/src/definitions/modules/modal.js +++ b/src/definitions/modules/modal.js @@ -132,7 +132,7 @@ $.fn.modal = function(parameters) { $dimmer = $dimmable.dimmer('get dimmer'); }, id: function() { - id = (Math.random().toString(16) + '000000000').substr(2,8); + id = (Math.random().toString(16) + '000000000').substr(2, 8); elementEventNamespace = '.' + id; module.verbose('Creating unique id for element', id); } @@ -167,6 +167,9 @@ $.fn.modal = function(parameters) { refresh: function() { module.remove.scrolling(); module.cacheSizes(); + if(!module.can.useFlex()) { + module.set.modalOffset(); + } module.set.screenHeight(); module.set.type(); }, @@ -212,7 +215,7 @@ $.fn.modal = function(parameters) { get: { id: function() { - return (Math.random().toString(16) + '000000000').substr(2,8); + return (Math.random().toString(16) + '000000000').substr(2, 8); } }, @@ -322,9 +325,16 @@ $.fn.modal = function(parameters) { : function(){} ; if( module.is.animating() || !module.is.active() ) { - module.showDimmer(); module.cacheSizes(); + if(module.can.useFlex()) { + module.remove.legacy(); + } + else { + module.set.legacy(); + module.set.modalOffset(); + module.debug('Using non-flex legacy modal positioning.'); + } module.set.screenHeight(); module.set.type(); module.set.clickaway(); @@ -513,6 +523,9 @@ $.fn.modal = function(parameters) { active: function() { $module.removeClass(className.active); }, + legacy: function() { + $module.removeClass(className.legacy); + }, clickaway: function() { $dimmer .off('click' + elementEventNamespace) @@ -546,11 +559,13 @@ $.fn.modal = function(parameters) { $module.addClass(className.loading); var scrollHeight = $module.prop('scrollHeight'), + modalWidth = $module.outerWidth(), modalHeight = $module.outerHeight() ; if(module.cache === undefined || modalHeight !== 0) { module.cache = { pageHeight : $(document).outerHeight(), + width : modalWidth, height : modalHeight + settings.offset, scrollHeight : scrollHeight + settings.offset, contextHeight : (settings.context == 'body') @@ -564,6 +579,12 @@ $.fn.modal = function(parameters) { }, can: { + useFlex: function() { + return (settings.useFlex == 'auto') + ? settings.detachable && !module.is.ie() + : settings.useFlex + ; + }, fit: function() { var contextHeight = module.cache.contextHeight, @@ -585,6 +606,13 @@ $.fn.modal = function(parameters) { active: function() { return $module.hasClass(className.active); }, + ie: function() { + var + isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window), + isIE = ('ActiveXObject' in window) + ; + return (isIE11 || isIE); + }, animating: function() { return $module.transition('is supported') ? $module.transition('is animating') @@ -596,7 +624,7 @@ $.fn.modal = function(parameters) { }, modernBrowser: function() { // appName for IE11 reports 'Netscape' can no longer use - return !(window.ActiveXObject || "ActiveXObject" in window); + return !(window.ActiveXObject || 'ActiveXObject' in window); } }, @@ -628,10 +656,10 @@ $.fn.modal = function(parameters) { debug : settings.debug, dimmerName : 'modals', closable : 'auto', + useFlex : module.can.useFlex(), variation : settings.centered ? false - : 'top aligned' - , + : 'top aligned', duration : { show : settings.duration, hide : settings.duration @@ -657,6 +685,19 @@ $.fn.modal = function(parameters) { } $context.dimmer('setting', dimmerSettings); }, + modalOffset: function() { + var + width = module.cache.width, + height = module.cache.height + ; + $module + .css({ + marginTop: -(height / 2), + marginLeft: -(width / 2) + }) + ; + module.verbose('Setting modal offset for legacy mode'); + }, screenHeight: function() { if( module.can.fit() ) { $body.css('height', ''); @@ -675,6 +716,9 @@ $.fn.modal = function(parameters) { $dimmable.addClass(className.scrolling); $module.addClass(className.scrolling); }, + legacy: function() { + $module.addClass(className.legacy); + }, type: function() { if(module.can.fit()) { module.verbose('Modal fits on screen'); @@ -880,6 +924,9 @@ $.fn.modal.settings = { name : 'Modal', namespace : 'modal', + useFlex : 'auto', + offset : 0, + silent : false, debug : false, verbose : false, @@ -909,7 +956,6 @@ $.fn.modal.settings = { queue : false, duration : 500, - offset : 0, transition : 'scale', // padding with edge of page @@ -949,6 +995,7 @@ $.fn.modal.settings = { animating : 'animating', blurring : 'blurring', inverted : 'inverted', + legacy : 'legacy', loading : 'loading', scrolling : 'scrolling', undetached : 'undetached' diff --git a/src/definitions/modules/modal.less b/src/definitions/modules/modal.less index 6f0236ce7..03e12b954 100755 --- a/src/definitions/modules/modal.less +++ b/src/definitions/modules/modal.less @@ -23,6 +23,7 @@ *******************************/ .ui.modal { + position: absolute; display: none; z-index: @zIndex; text-align: left; @@ -309,6 +310,13 @@ color: @basicInvertedModalHeaderColor; } +/* Resort to margin positioning if legacy */ +.ui.legacy.modal, +.ui.legacy.page.dimmer > .ui.modal { + top: 50%; + left: 50%; +} + /* Tablet and Mobile */ @media only screen and (max-width : @largestTabletScreen) { .ui.basic.modal > .close {