@@ -1034,10 +1034,10 @@ MdPanelService.prototype._closeFirstOpenedPanel = function(groupName) {
10341034
10351035
10361036/**
1037- * Wraps the users template in two elements, md-panel-outer-wrapper, which
1038- * covers the entire attachTo element, and md-panel, which contains only the
1039- * template. This allows the panel control over positioning, animations,
1040- * and similar properties .
1037+ * Wraps the user's template in three elements:
1038+ * - md-panel-outer-wrapper - covers the entire ` attachTo` element.
1039+ * - md- panel-inner-wrapper - handles the positioning.
1040+ * - md-panel - contains the user's content and deals with the animations .
10411041 * @param {string } origTemplate The original template.
10421042 * @returns {string } The wrapped template.
10431043 * @private
@@ -1049,26 +1049,32 @@ MdPanelService.prototype._wrapTemplate = function(origTemplate) {
10491049 // height and width for positioning.
10501050 return '' +
10511051 '<div class="md-panel-outer-wrapper">' +
1052- ' <div class="md-panel" style="left: -9999px;">' + template + '</div>' +
1052+ '<div class="md-panel-inner-wrapper" style="left: -9999px;">' +
1053+ '<div class="md-panel">' + template + '</div>' +
1054+ '</div>' +
10531055 '</div>' ;
10541056} ;
10551057
10561058
10571059/**
1058- * Wraps a content element in a md-panel-outer wrapper and
1059- * positions it off-screen. Allows for proper control over positoning
1060- * and animations.
1060+ * Wraps a content element in a ` md-panel-outer- wrapper`, as well as
1061+ * a `md-panel-inner-wrapper`, and positions it off-screen. Allows for
1062+ * proper control over positoning and animations.
10611063 * @param {!angular.JQLite } contentElement Element to be wrapped.
10621064 * @return {!angular.JQLite } Wrapper element.
10631065 * @private
10641066 */
10651067MdPanelService . prototype . _wrapContentElement = function ( contentElement ) {
1066- var wrapper = angular . element ( '<div class="md-panel-outer-wrapper">' ) ;
1068+ var outerWrapper = angular . element (
1069+ '<div class="md-panel-outer-wrapper">' +
1070+ '<div class="md-panel-inner-wrapper" style="left: -9999px;"></div>' +
1071+ '</div>'
1072+ ) ;
10671073
1068- contentElement . addClass ( 'md-panel' ) . css ( 'left' , '-9999px' ) ;
1069- wrapper . append ( contentElement ) ;
1074+ contentElement . addClass ( 'md-panel' ) ;
1075+ outerWrapper . children ( ) . eq ( 0 ) . append ( contentElement ) ;
10701076
1071- return wrapper ;
1077+ return outerWrapper ;
10721078} ;
10731079
10741080
@@ -1132,6 +1138,9 @@ function MdPanelRef(config, $injector) {
11321138 /** @type {!angular.JQLite|undefined } */
11331139 this . panelEl ;
11341140
1141+ /** @type {!angular.JQLite|undefined } */
1142+ this . innerWrapper ;
1143+
11351144 /**
11361145 * Whether the panel is attached. This is synchronous. When attach is called,
11371146 * isAttached is set to true. When detach is called, isAttached is set to
@@ -1574,6 +1583,11 @@ MdPanelRef.prototype._compile = function() {
15741583 ) ;
15751584 }
15761585
1586+ // Save a reference to the inner wrapper.
1587+ self . innerWrapper = angular . element (
1588+ self . panelContainer [ 0 ] . querySelector ( '.md-panel-inner-wrapper' )
1589+ ) ;
1590+
15771591 // Save a reference to the cleanup function from the compiler.
15781592 self . _compilerCleanup = compileData . cleanup ;
15791593
@@ -1648,11 +1662,11 @@ MdPanelRef.prototype._addStyles = function() {
16481662 var self = this ;
16491663 return this . _$q ( function ( resolve ) {
16501664 self . panelContainer . css ( 'z-index' , self . config [ 'zIndex' ] ) ;
1651- self . panelEl . css ( 'z-index' , self . config [ 'zIndex' ] + 1 ) ;
1665+ self . innerWrapper . css ( 'z-index' , self . config [ 'zIndex' ] + 1 ) ;
16521666
16531667 var hideAndResolve = function ( ) {
16541668 // Remove left: -9999px and add hidden class.
1655- self . panelEl . css ( 'left' , '' ) ;
1669+ self . innerWrapper . css ( 'left' , '' ) ;
16561670 self . panelContainer . addClass ( MD_PANEL_HIDDEN ) ;
16571671 resolve ( self ) ;
16581672 } ;
@@ -1704,26 +1718,26 @@ MdPanelRef.prototype._updatePosition = function(init) {
17041718 var positionConfig = this . config [ 'position' ] ;
17051719
17061720 if ( positionConfig ) {
1707- positionConfig . _setPanelPosition ( this . panelEl ) ;
1721+ positionConfig . _setPanelPosition ( this . innerWrapper ) ;
17081722
17091723 // Hide the panel now that position is known.
17101724 if ( init ) {
17111725 this . panelContainer . addClass ( MD_PANEL_HIDDEN ) ;
17121726 }
17131727
1714- this . panelEl . css (
1728+ this . innerWrapper . css (
17151729 MdPanelPosition . absPosition . TOP ,
17161730 positionConfig . getTop ( )
17171731 ) ;
1718- this . panelEl . css (
1732+ this . innerWrapper . css (
17191733 MdPanelPosition . absPosition . BOTTOM ,
17201734 positionConfig . getBottom ( )
17211735 ) ;
1722- this . panelEl . css (
1736+ this . innerWrapper . css (
17231737 MdPanelPosition . absPosition . LEFT ,
17241738 positionConfig . getLeft ( )
17251739 ) ;
1726- this . panelEl . css (
1740+ this . innerWrapper . css (
17271741 MdPanelPosition . absPosition . RIGHT ,
17281742 positionConfig . getRight ( )
17291743 ) ;
@@ -2605,37 +2619,37 @@ MdPanelPosition.prototype.getTransform = function() {
26052619
26062620/**
26072621 * Sets the `transform` value for a panel element.
2608- * @param {!angular.JQLite } panelEl
2622+ * @param {!angular.JQLite } element
26092623 * @returns {!angular.JQLite }
26102624 * @private
26112625 */
2612- MdPanelPosition . prototype . _setTransform = function ( panelEl ) {
2613- return panelEl . css ( this . _$mdConstant . CSS . TRANSFORM , this . getTransform ( ) ) ;
2626+ MdPanelPosition . prototype . _setTransform = function ( element ) {
2627+ return element . css ( this . _$mdConstant . CSS . TRANSFORM , this . getTransform ( ) ) ;
26142628} ;
26152629
26162630
26172631/**
26182632 * True if the panel is completely on-screen with this positioning; false
26192633 * otherwise.
2620- * @param {!angular.JQLite } panelEl
2634+ * @param {!angular.JQLite } element
26212635 * @return {boolean }
26222636 * @private
26232637 */
2624- MdPanelPosition . prototype . _isOnscreen = function ( panelEl ) {
2638+ MdPanelPosition . prototype . _isOnscreen = function ( element ) {
26252639 // this works because we always use fixed positioning for the panel,
26262640 // which is relative to the viewport.
26272641 var left = parseInt ( this . getLeft ( ) ) ;
26282642 var top = parseInt ( this . getTop ( ) ) ;
26292643
26302644 if ( this . _translateX . length || this . _translateY . length ) {
26312645 var prefixedTransform = this . _$mdConstant . CSS . TRANSFORM ;
2632- var offsets = getComputedTranslations ( panelEl , prefixedTransform ) ;
2646+ var offsets = getComputedTranslations ( element , prefixedTransform ) ;
26332647 left += offsets . x ;
26342648 top += offsets . y ;
26352649 }
26362650
2637- var right = left + panelEl [ 0 ] . offsetWidth ;
2638- var bottom = top + panelEl [ 0 ] . offsetHeight ;
2651+ var right = left + element [ 0 ] . offsetWidth ;
2652+ var bottom = top + element [ 0 ] . offsetHeight ;
26392653
26402654 return ( left >= 0 ) &&
26412655 ( top >= 0 ) &&
@@ -2675,52 +2689,52 @@ MdPanelPosition.prototype._reduceTranslateValues =
26752689/**
26762690 * Sets the panel position based on the created panel element and best x/y
26772691 * positioning.
2678- * @param {!angular.JQLite } panelEl
2692+ * @param {!angular.JQLite } element
26792693 * @private
26802694 */
2681- MdPanelPosition . prototype . _setPanelPosition = function ( panelEl ) {
2695+ MdPanelPosition . prototype . _setPanelPosition = function ( element ) {
26822696 // Remove the class in case it has been added before.
2683- panelEl . removeClass ( '_md-panel-position-adjusted' ) ;
2697+ element . removeClass ( '_md-panel-position-adjusted' ) ;
26842698
26852699 // Only calculate the position if necessary.
26862700 if ( this . _absolute ) {
2687- this . _setTransform ( panelEl ) ;
2701+ this . _setTransform ( element ) ;
26882702 return ;
26892703 }
26902704
26912705 if ( this . _actualPosition ) {
2692- this . _calculatePanelPosition ( panelEl , this . _actualPosition ) ;
2693- this . _setTransform ( panelEl ) ;
2706+ this . _calculatePanelPosition ( element , this . _actualPosition ) ;
2707+ this . _setTransform ( element ) ;
26942708 return ;
26952709 }
26962710
26972711 for ( var i = 0 ; i < this . _positions . length ; i ++ ) {
26982712 this . _actualPosition = this . _positions [ i ] ;
2699- this . _calculatePanelPosition ( panelEl , this . _actualPosition ) ;
2700- this . _setTransform ( panelEl ) ;
2713+ this . _calculatePanelPosition ( element , this . _actualPosition ) ;
2714+ this . _setTransform ( element ) ;
27012715
2702- if ( this . _isOnscreen ( panelEl ) ) {
2716+ if ( this . _isOnscreen ( element ) ) {
27032717 return ;
27042718 }
27052719 }
27062720
27072721 // Class that can be used to re-style the panel if it was repositioned.
2708- panelEl . addClass ( '_md-panel-position-adjusted' ) ;
2709- this . _constrainToViewport ( panelEl ) ;
2722+ element . addClass ( '_md-panel-position-adjusted' ) ;
2723+ this . _constrainToViewport ( element ) ;
27102724} ;
27112725
27122726
27132727/**
27142728 * Constrains a panel's position to the viewport.
2715- * @param {!angular.JQLite } panelEl
2729+ * @param {!angular.JQLite } element
27162730 * @private
27172731 */
2718- MdPanelPosition . prototype . _constrainToViewport = function ( panelEl ) {
2732+ MdPanelPosition . prototype . _constrainToViewport = function ( element ) {
27192733 var margin = MdPanelPosition . viewportMargin ;
27202734
27212735 if ( this . getTop ( ) ) {
27222736 var top = parseInt ( this . getTop ( ) ) ;
2723- var bottom = panelEl [ 0 ] . offsetHeight + top ;
2737+ var bottom = element [ 0 ] . offsetHeight + top ;
27242738 var viewportHeight = this . _$window . innerHeight ;
27252739
27262740 if ( top < margin ) {
@@ -2732,7 +2746,7 @@ MdPanelPosition.prototype._constrainToViewport = function(panelEl) {
27322746
27332747 if ( this . getLeft ( ) ) {
27342748 var left = parseInt ( this . getLeft ( ) ) ;
2735- var right = panelEl [ 0 ] . offsetWidth + left ;
2749+ var right = element [ 0 ] . offsetWidth + left ;
27362750 var viewportWidth = this . _$window . innerWidth ;
27372751
27382752 if ( left < margin ) {
@@ -2775,13 +2789,13 @@ MdPanelPosition.prototype._bidi = function(position) {
27752789/**
27762790 * Calculates the panel position based on the created panel element and the
27772791 * provided positioning.
2778- * @param {!angular.JQLite } panelEl
2792+ * @param {!angular.JQLite } element
27792793 * @param {!{x:string, y:string} } position
27802794 * @private
27812795 */
2782- MdPanelPosition . prototype . _calculatePanelPosition = function ( panelEl , position ) {
2796+ MdPanelPosition . prototype . _calculatePanelPosition = function ( element , position ) {
27832797
2784- var panelBounds = panelEl [ 0 ] . getBoundingClientRect ( ) ;
2798+ var panelBounds = element [ 0 ] . getBoundingClientRect ( ) ;
27852799 var panelWidth = panelBounds . width ;
27862800 var panelHeight = panelBounds . height ;
27872801
0 commit comments