<!-- @license Copyright (c) 2015 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --> <link rel="import" href="../polymer/polymer.html"> <link rel="import" href="../iron-flex-layout/iron-flex-layout.html"> <link rel="import" href="../paper-dialog-behavior/paper-dialog-behavior.html"> <link rel="import" href="../paper-styles/default-theme.html"> <!-- Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html) `paper-dialog-scrollable` implements a scrolling area used in a Material Design dialog. It shows a divider at the top and/or bottom indicating more content, depending on scroll position. Use this together with elements implementing `Polymer.PaperDialogBehavior`. <paper-dialog-impl> <h2>Header</h2> <paper-dialog-scrollable> Lorem ipsum... </paper-dialog-scrollable> <div class="buttons"> <paper-button>OK</paper-button> </div> </paper-dialog-impl> It shows a top divider after scrolling if it is not the first child in its parent container, indicating there is more content above. It shows a bottom divider if it is scrollable and it is not the last child in its parent container, indicating there is more content below. The bottom divider is hidden if it is scrolled to the bottom. If `paper-dialog-scrollable` is not a direct child of the element implementing `Polymer.PaperDialogBehavior`, remember to set the `dialogElement`: <paper-dialog-impl id="myDialog"> <h2>Header</h2> <div class="my-content-wrapper"> <h4>Sub-header</h4> <paper-dialog-scrollable> Lorem ipsum... </paper-dialog-scrollable> </div> <div class="buttons"> <paper-button>OK</paper-button> </div> </paper-dialog-impl> <script> var scrollable = Polymer.dom(myDialog).querySelector('paper-dialog-scrollable'); scrollable.dialogElement = myDialog; </script> ### Styling The following custom properties and mixins are available for styling: Custom property | Description | Default ----------------|-------------|---------- `--paper-dialog-scrollable` | Mixin for the scrollable content | {} @group Paper Elements @element paper-dialog-scrollable @demo demo/index.html @hero hero.svg --> <dom-module id="paper-dialog-scrollable"> <template> <style> :host { display: block; @apply(--layout-relative); } :host(.is-scrolled:not(:first-child))::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--divider-color); } :host(.can-scroll:not(.scrolled-to-bottom):not(:last-child))::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 1px; background: var(--divider-color); } .scrollable { padding: 0 24px; @apply(--layout-scroll); @apply(--paper-dialog-scrollable); } .fit { @apply(--layout-fit); } </style> <div id="scrollable" class="scrollable"> <content></content> </div> </template> </dom-module> <script> Polymer({ is: 'paper-dialog-scrollable', properties: { /** * The dialog element that implements `Polymer.PaperDialogBehavior` containing this element. * @type {?Node} */ dialogElement: { type: Object } }, listeners: { 'scrollable.scroll': '_scroll' }, /** * Returns the scrolling element. */ get scrollTarget() { return this.$.scrollable; }, ready: function () { this._ensureTarget(); }, attached: function() { this.classList.add('no-padding'); this._ensureTarget(); requestAnimationFrame(this._scroll.bind(this)); }, _scroll: function() { this.toggleClass('is-scrolled', this.scrollTarget.scrollTop > 0); this.toggleClass('can-scroll', this.scrollTarget.offsetHeight < this.scrollTarget.scrollHeight); this.toggleClass('scrolled-to-bottom', this.scrollTarget.scrollTop + this.scrollTarget.offsetHeight >= this.scrollTarget.scrollHeight); }, _ensureTarget: function () { // read parentNode on attached because if dynamically created, // parentNode will be null on creation. this.dialogElement = this.dialogElement || Polymer.dom(this).parentNode; // Check if parent implements paper-dialog-behavior. If not, fit scrollTarget to host. if (this.dialogElement && this.dialogElement.behaviors && this.dialogElement.behaviors.indexOf(Polymer.PaperDialogBehaviorImpl) >= 0) { this.dialogElement.sizingTarget = this.scrollTarget; this.scrollTarget.classList.remove('fit'); } else if (this.dialogElement) { this.scrollTarget.classList.add('fit'); } } }); </script>