chromium/third_party/polymer/v3_0/components-chromium/iron-list/iron-list.d.ts

/**
 * DO NOT EDIT
 *
 * This file was automatically generated by
 *   https://github.com/Polymer/tools/tree/master/packages/gen-typescript-declarations
 *
 * To modify these typings, edit the source file(s):
 *   iron-list.js
 */

import {IronResizableBehavior} from '../iron-resizable-behavior/iron-resizable-behavior.js';

import {IronScrollTargetBehavior} from '../iron-scroll-target-behavior/iron-scroll-target-behavior.js';

import {OptionalMutableDataBehavior} from '../polymer/lib/legacy/mutable-data-behavior.js';

import {Polymer} from '../polymer/lib/legacy/polymer-fn.js';

import {dom} from '../polymer/lib/legacy/polymer.dom.js';

import {Templatizer} from '../polymer/lib/legacy/templatizer-behavior.js';

import {animationFrame, idlePeriod, microTask} from '../polymer/lib/utils/async.js';

import {Debouncer} from '../polymer/lib/utils/debounce.js';

import {enqueueDebouncer, flush} from '../polymer/lib/utils/flush.js';

import {html} from '../polymer/lib/utils/html-tag.js';

import {matches, translate} from '../polymer/lib/utils/path.js';

import {TemplateInstanceBase} from '../polymer/lib/utils/templatize.js';

import {LegacyElementMixin} from '../polymer/lib/legacy/legacy-element-mixin.js';

/**
 * `iron-list` displays a virtual, 'infinite' list. The template inside
 * the iron-list element represents the DOM to create for each list item.
 * The `items` property specifies an array of list item data.
 *
 * For performance reasons, not every item in the list is rendered at once;
 * instead a small subset of actual template elements *(enough to fill the
 * viewport)* are rendered and reused as the user scrolls. As such, it is important
 * that all state of the list template is bound to the model driving it, since the
 * view may be reused with a new model at any time. Particularly, any state that
 * may change as the result of a user interaction with the list item must be bound
 * to the model to avoid view state inconsistency.
 *
 * ### Sizing iron-list
 *
 * `iron-list` must either be explicitly sized, or delegate scrolling to an
 * explicitly sized parent. By "explicitly sized", we mean it either has an
 * explicit CSS `height` property set via a class or inline style, or else is sized
 * by other layout means (e.g. the `flex` or `fit` classes).
 *
 * #### Flexbox - [jsbin](https://jsbin.com/vejoni/edit?html,output)
 *
 * ```html
 * <template is="x-list">
 *   <style>
 *     :host {
 *       display: block;
 *       height: 100vh;
 *       display: flex;
 *       flex-direction: column;
 *     }
 *
 *     iron-list {
 *       flex: 1 1 auto;
 *     }
 *   </style>
 *   <app-toolbar>App name</app-toolbar>
 *   <iron-list items="[[items]]">
 *     <template>
 *       <div>
 *         ...
 *       </div>
 *     </template>
 *   </iron-list>
 * </template>
 * ```
 * #### Explicit size - [jsbin](https://jsbin.com/vopucus/edit?html,output)
 * ```html
 * <template is="x-list">
 *   <style>
 *     :host {
 *       display: block;
 *     }
 *
 *     iron-list {
 *       height: 100vh; /* don't use % values unless the parent element is sized.
 * \/
 *     }
 *   </style>
 *   <iron-list items="[[items]]">
 *     <template>
 *       <div>
 *         ...
 *       </div>
 *     </template>
 *   </iron-list>
 * </template>
 * ```
 * #### Main document scrolling -
 * [jsbin](https://jsbin.com/wevirow/edit?html,output)
 * ```html
 * <head>
 *   <style>
 *     body {
 *       height: 100vh;
 *       margin: 0;
 *       display: flex;
 *       flex-direction: column;
 *     }
 *
 *     app-toolbar {
 *       position: fixed;
 *       top: 0;
 *       left: 0;
 *       right: 0;
 *     }
 *
 *     iron-list {
 *       /* add padding since the app-toolbar is fixed at the top *\/
 *       padding-top: 64px;
 *     }
 *   </style>
 * </head>
 * <body>
 *   <app-toolbar>App name</app-toolbar>
 *   <iron-list scroll-target="document">
 *     <template>
 *       <div>
 *         ...
 *       </div>
 *     </template>
 *   </iron-list>
 * </body>
 * ```
 *
 * `iron-list` must be given a `<template>` which contains exactly one element. In
 * the examples above we used a `<div>`, but you can provide any element (including
 * custom elements).
 *
 * ### Template model
 *
 * List item templates should bind to template models of the following structure:
 *
 * ```js
 * {
 *   index: 0,        // index in the item array
 *   selected: false, // true if the current item is selected
 *   tabIndex: -1,    // a dynamically generated tabIndex for focus management
 *   item: {}         // user data corresponding to items[index]
 * }
 * ```
 *
 * Alternatively, you can change the property name used as data index by changing
 * the `indexAs` property. The `as` property defines the name of the variable to
 * add to the binding scope for the array.
 *
 * For example, given the following `data` array:
 *
 * ##### data.json
 *
 * ```js
 * [
 *   {"name": "Bob"},
 *   {"name": "Tim"},
 *   {"name": "Mike"}
 * ]
 * ```
 *
 * The following code would render the list (note the name property is bound from
 * the model object provided to the template scope):
 *
 * ```html
 * <iron-ajax url="data.json" last-response="{{data}}" auto></iron-ajax>
 * <iron-list items="[[data]]" as="item">
 *   <template>
 *     <div>
 *       Name: [[item.name]]
 *     </div>
 *   </template>
 * </iron-list>
 * ```
 *
 * ### Grid layout
 *
 * `iron-list` supports a grid layout in addition to linear layout by setting
 * the `grid` attribute.  In this case, the list template item must have both fixed
 * width and height (e.g. via CSS). Based on this, the number of items
 * per row are determined automatically based on the size of the list viewport.
 *
 * ### Accessibility
 *
 * `iron-list` automatically manages the focus state for the items. It also
 * provides a `tabIndex` property within the template scope that can be used for
 * keyboard navigation. For example, users can press the up and down keys to move
 * to previous and next items in the list:
 *
 * ```html
 * <iron-list items="[[data]]" as="item">
 *   <template>
 *     <div tabindex$="[[tabIndex]]">
 *       Name: [[item.name]]
 *     </div>
 *   </template>
 * </iron-list>
 * ```
 *
 * ### Styling
 *
 * You can use the `--iron-list-items-container` mixin to style the container of
 * items:
 *
 * ```css
 * iron-list {
 *  --iron-list-items-container: {
 *     margin: auto;
 *   };
 * }
 * ```
 *
 * ### Resizing
 *
 * `iron-list` lays out the items when it receives a notification via the
 * `iron-resize` event. This event is fired by any element that implements
 * `IronResizableBehavior`.
 *
 * By default, elements such as `iron-pages`, `paper-tabs` or `paper-dialog` will
 * trigger this event automatically. If you hide the list manually (e.g. you use
 * `display: none`) you might want to implement `IronResizableBehavior` or fire
 * this event manually right after the list became visible again. For example:
 *
 * ```js
 * document.querySelector('iron-list').fire('iron-resize');
 * ```
 *
 * ### When should `<iron-list>` be used?
 *
 * `iron-list` should be used when a page has significantly more DOM nodes than the
 * ones visible on the screen. e.g. the page has 500 nodes, but only 20 are visible
 * at a time. This is why we refer to it as a `virtual` list. In this case, a
 * `dom-repeat` will still create 500 nodes which could slow down the web app, but
 * `iron-list` will only create 20.
 *
 * However, having an `iron-list` does not mean that you can load all the data at
 * once. Say you have a million records in the database, you want to split the data
 * into pages so you can bring in a page at the time. The page could contain 500
 * items, and iron-list will only render 20.
 */
interface IronListElement extends Templatizer, IronResizableBehavior, IronScrollTargetBehavior, OptionalMutableDataBehavior, LegacyElementMixin, HTMLElement {
  readonly _defaultScrollTarget: any;

  /**
   * An array containing items determining how many instances of the template
   * to stamp and that that each template instance should bind to.
   */
  items: any[]|null|undefined;

  /**
   * The name of the variable to add to the binding scope for the array
   * element associated with a given template instance.
   */
  as: string|null|undefined;

  /**
   * The name of the variable to add to the binding scope with the index
   * for the row.
   */
  indexAs: string|null|undefined;

  /**
   * The name of the variable to add to the binding scope to indicate
   * if the row is selected.
   */
  selectedAs: string|null|undefined;

  /**
   * When true, the list is rendered as a grid. Grid items must have
   * fixed width and height set via CSS. e.g.
   *
   * ```html
   * <iron-list grid>
   *   <template>
   *      <div style="width: 100px; height: 100px;"> 100x100 </div>
   *   </template>
   * </iron-list>
   * ```
   */
  grid: boolean|null|undefined;

  /**
   * When true, tapping a row will select the item, placing its data model
   * in the set of selected items retrievable via the selection property.
   *
   * Note that tapping focusable elements within the list item will not
   * result in selection, since they are presumed to have their * own action.
   */
  selectionEnabled: boolean|null|undefined;

  /**
   * When `multiSelection` is false, this is the currently selected item, or
   * `null` if no item is selected.
   */
  selectedItem: object|null|undefined;

  /**
   * When `multiSelection` is true, this is an array that contains the
   * selected items.
   */
  selectedItems: object|null|undefined;

  /**
   * When `true`, multiple items may be selected at once (in this case,
   * `selected` is an array of currently selected items).  When `false`,
   * only one item may be selected at a time.
   */
  multiSelection: boolean|null|undefined;

  /**
   * The offset top from the scrolling element to the iron-list element.
   * This value can be computed using the position returned by
   * `getBoundingClientRect()` although it's preferred to use a constant value
   * when possible.
   *
   * This property is useful when an external scrolling element is used and
   * there's some offset between the scrolling element and the list. For
   * example: a header is placed above the list.
   */
  scrollOffset: number|null|undefined;

  /**
   * The ratio of hidden tiles that should remain in the scroll direction.
   * Recommended value ~0.5, so it will distribute tiles evenly in both
   * directions.
   *    
   */
  _ratio: number;

  /**
   * The padding-top value for the list.
   *    
   */
  _scrollerPaddingTop: number;

  /**
   * This value is a cached value of `scrollTop` from the last `scroll` event.
   *    
   */
  _scrollPosition: number;

  /**
   * The sum of the heights of all the tiles in the DOM.
   *    
   */
  _physicalSize: number;

  /**
   * The average `offsetHeight` of the tiles observed till now.
   *    
   */
  _physicalAverage: number;

  /**
   * The number of tiles which `offsetHeight` > 0 observed until now.
   *    
   */
  _physicalAverageCount: number;

  /**
   * The Y position of the item rendered in the `_physicalStart`
   * tile relative to the scrolling list.
   *    
   */
  _physicalTop: number;

  /**
   * The number of items in the list.
   *    
   */
  _virtualCount: number;

  /**
   * The estimated scroll height based on `_physicalAverage`
   *    
   */
  _estScrollHeight: number;

  /**
   * The scroll height of the dom node
   *    
   */
  _scrollHeight: number;

  /**
   * The height of the list. This is referred as the viewport in the context of
   * list.
   *    
   */
  _viewportHeight: number;

  /**
   * The width of the list. This is referred as the viewport in the context of
   * list.
   *    
   */
  _viewportWidth: number;

  /**
   * An array of DOM nodes that are currently in the tree
   */
  _physicalItems: HTMLElement[]|null;

  /**
   * An array of heights for each item in `_physicalItems`
   */
  _physicalSizes: number[]|null;

  /**
   * A cached value for the first visible index.
   * See `firstVisibleIndex`
   */
  _firstVisibleIndexVal: number|null;

  /**
   * A cached value for the last visible index.
   * See `lastVisibleIndex`
   */
  _lastVisibleIndexVal: number|null;

  /**
   * The max number of pages to render. One page is equivalent to the height of
   * the list.
   *    
   */
  _maxPages: number;

  /**
   * The currently focused physical item.
   *    
   */
  _focusedItem: null;

  /**
   * The virtual index of the focused item.
   *    
   */
  _focusedVirtualIndex: any;

  /**
   * The physical index of the focused item.
   *    
   */
  _focusedPhysicalIndex: any;

  /**
   * The item that backfills the `_offscreenFocusedItem` in the physical items
   * list when that item is moved offscreen.
   */
  _focusBackfillItem: HTMLElement|null;

  /**
   * The maximum items per row
   *    
   */
  _itemsPerRow: number;

  /**
   * The width of each grid item
   *    
   */
  _itemWidth: number;

  /**
   * The height of the row in grid layout.
   *    
   */
  _rowHeight: number;

  /**
   * The cost of stamping a template in ms.
   *    
   */
  _templateCost: number;

  /**
   * Needed to pass event.model property to declarative event handlers -
   * see polymer/polymer#4339.
   *    
   */
  _parentModel: boolean;

  /**
   * The bottom of the physical content.
   *    
   */
  readonly _physicalBottom: any;

  /**
   * The bottom of the scroll.
   *    
   */
  readonly _scrollBottom: any;

  /**
   * The n-th item rendered in the last physical item.
   *    
   */
  readonly _virtualEnd: any;

  /**
   * The height of the physical content that isn't on the screen.
   *    
   */
  readonly _hiddenContentSize: any;

  /**
   * The parent node for the _userTemplate.
   *    
   */
  readonly _itemsParent: any;

  /**
   * The maximum scroll top value.
   *    
   */
  readonly _maxScrollTop: any;

  /**
   * The largest n-th value for an item such that it can be rendered in
   * `_physicalStart`.
   *    
   */
  readonly _maxVirtualStart: any;
  _virtualStart: any;
  _physicalStart: any;

  /**
   * The k-th tile that is at the bottom of the scrolling list.
   *    
   */
  readonly _physicalEnd: any;
  _physicalCount: any;

  /**
   * An optimal physical size such that we will have enough physical items
   * to fill up the viewport and recycle when the user scrolls.
   *
   * This default value assumes that we will at least have the equivalent
   * to a viewport of physical items above and below the user's viewport.
   *    
   */
  readonly _optPhysicalSize: any;

  /**
   * True if the current list is visible.
   *    
   */
  readonly _isVisible: any;

  /**
   * Gets the index of the first visible item in the viewport.
   */
  readonly firstVisibleIndex: any;

  /**
   * Gets the index of the last visible item in the viewport.
   */
  readonly lastVisibleIndex: any;
  readonly _virtualRowCount: any;
  readonly _estRowsInView: any;
  readonly _physicalRows: any;
  readonly _scrollOffset: any;
  preserveFocus: boolean;
  attached(): void;
  detached(): void;

  /**
   * Recycles the physical items when needed.
   */
  _scrollHandler(): void;
  ready(): void;

  /**
   * Set the overflow property if this element has its own scrolling region
   */
  _setOverflow(scrollTarget: any): void;

  /**
   * Invoke this method if you dynamically update the viewport's
   * size or CSS padding.
   */
  updateViewportBoundaries(): void;

  /**
   * Returns an object that contains the indexes of the physical items
   * that might be reused and the physicalTop.
   *
   * @param fromTop If the potential reusable items are above the scrolling region.
   */
  _getReusables(fromTop: boolean): any;

  /**
   * Update the list of items, starting from the `_virtualStart` item.
   */
  _update(itemSet?: number[], movingUp?: number[]): void;

  /**
   * Creates a pool of DOM elements and attaches them to the local dom.
   *
   * @param size Size of the pool
   */
  _createPool(size: number): any;
  _isClientFull(): any;

  /**
   * Increases the pool size.
   */
  _increasePoolIfNeeded(count: any): void;

  /**
   * Renders the a new list.
   */
  _render(): void;

  /**
   * Templetizes the user template.
   */
  _ensureTemplatized(): void;
  _gridChanged(newGrid: any, oldGrid: any): void;

  /**
   * Called when the items have changed. That is, reassignments
   * to `items`, splices or updates to a single item.
   */
  _itemsChanged(change: any): void;
  _forwardItemPath(path: any, value: any): void;
  _adjustVirtualIndex(splices: object[]): void;
  _removeItem(item: any): void;

  /**
   * Executes a provided function per every physical index in `itemSet`
   * `itemSet` default value is equivalent to the entire set of physical
   * indexes.
   */
  _iterateItems(fn: (p0: number, p1: number) => any, itemSet?: number[]): any;

  /**
   * Returns the virtual index for a given physical index
   *
   * @param pidx Physical index
   */
  _computeVidx(pidx: number): number;

  /**
   * Assigns the data models to a given set of items.
   */
  _assignModels(itemSet?: number[]): void;

  /**
   * Updates the height for a given set of items.
   */
  _updateMetrics(itemSet?: number[]): void;
  _updateGridMetrics(): void;

  /**
   * Updates the position of the physical items.
   */
  _positionItems(): void;
  _getPhysicalSizeIncrement(pidx: any): any;

  /**
   * Returns, based on the current index,
   * whether or not the next index will need
   * to be rendered on a new row.
   *
   * @param vidx Virtual index
   */
  _shouldRenderNextRow(vidx: number): boolean;

  /**
   * Adjusts the scroll position when it was overestimated.
   */
  _adjustScrollPosition(): void;

  /**
   * Sets the position of the scroll.
   */
  _resetScrollPosition(pos: any): void;

  /**
   * Sets the scroll height, that's the height of the content,
   *
   * @param forceUpdate If true, updates the height no matter what.
   */
  _updateScrollerSize(forceUpdate?: boolean): void;

  /**
   * Scroll to a specific item in the virtual list regardless
   * of the physical items in the DOM tree.
   *
   * @param item The item to be scrolled to
   */
  scrollToItem(item: object|null): any;

  /**
   * Scroll to a specific index in the virtual list regardless
   * of the physical items in the DOM tree.
   *
   * @param idx The index of the item
   */
  scrollToIndex(idx: number): void;

  /**
   * Reset the physical average and the average count.
   */
  _resetAverage(): void;

  /**
   * A handler for the `iron-resize` event triggered by `IronResizableBehavior`
   * when the element is resized.
   */
  _resizeHandler(): void;

  /**
   * Selects the given item.
   *
   * @param item The item instance.
   */
  selectItem(item: object|null): any;

  /**
   * Selects the item at the given index in the items array.
   *
   * @param index The index of the item in the items array.
   */
  selectIndex(index: number): void;

  /**
   * Deselects the given item.
   *
   * @param item The item instance.
   */
  deselectItem(item: object|null): any;

  /**
   * Deselects the item at the given index in the items array.
   *
   * @param index The index of the item in the items array.
   */
  deselectIndex(index: number): void;

  /**
   * Selects or deselects a given item depending on whether the item
   * has already been selected.
   *
   * @param item The item object.
   */
  toggleSelectionForItem(item: object|null): any;

  /**
   * Selects or deselects the item at the given index in the items array
   * depending on whether the item has already been selected.
   *
   * @param index The index of the item in the items array.
   */
  toggleSelectionForIndex(index: number): void;

  /**
   * Clears the current selection in the list.
   */
  clearSelection(): void;

  /**
   * Add an event listener to `tap` if `selectionEnabled` is true,
   * it will remove the listener otherwise.
   */
  _selectionEnabledChanged(selectionEnabled: any): void;

  /**
   * Select an item from an event object.
   */
  _selectionHandler(e: any): void;
  _multiSelectionChanged(multiSelection: any): void;

  /**
   * Updates the size of a given list item.
   *
   * @param item The item instance.
   */
  updateSizeForItem(item: object|null): any;

  /**
   * Updates the size of the item at the given index in the items array.
   *
   * @param index The index of the item in the items array.
   */
  updateSizeForIndex(index: number): any;

  /**
   * Creates a temporary backfill item in the rendered pool of physical items
   * to replace the main focused item. The focused item has tabIndex = 0
   * and might be currently focused by the user.
   *
   * This dynamic replacement helps to preserve the focus state.
   */
  _manageFocus(): void;

  /**
   * Converts a random index to the index of the item that completes it's row.
   * Allows for better order and fill computation when grid == true.
   */
  _convertIndexToCompleteRow(idx: any): any;
  _isIndexRendered(idx: any): any;
  _isIndexVisible(idx: any): any;
  _getPhysicalIndex(vidx: any): any;
  focusItem(idx: any): void;
  _focusPhysicalItem(idx: any): void;
  _removeFocusedItem(): void;
  _createFocusBackfillItem(): void;
  _restoreFocusedItem(): void;
  _didFocus(e: any): void;
  _keydownHandler(e: any): void;
  _clamp(v: any, min: any, max: any): any;
  _debounce(name: any, cb: any, asyncModule: any): void;
  _forwardProperty(inst: any, name: any, value: any): void;

  /**
   * Templatizer bindings for v2
   */
  _forwardHostPropV2(prop: any, value: any): void;
  _notifyInstancePropV2(inst: any, prop: any, value: any): void;

  /**
   * Templatizer bindings for v1
   */
  _getStampedChildren(): any;
  _forwardInstancePath(inst: any, path: any, value: any): void;
  _forwardParentPath(path: any, value: any): void;
  _forwardParentProp(prop: any, value: any): void;

  /**
   * Gets the activeElement of the shadow root/host that contains the list.
   */
  _getActiveElement(): any;
}

export {IronListElement};

declare global {

  interface HTMLElementTagNameMap {
    "iron-list": IronListElement;
  }
}