// Type definitions for moonstone/UiVirtualList

import * as React from "react";

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;

export interface VirtualListBaseProps {
  /**
 * The rendering function called for each item in the list.
 * 
 * Note : The list does  not  always render a component whenever its render function is called
due to performance optimization.
 * 
 * Example:
 * ```
renderItem = ({index, ...rest}) => {
	delete rest.data;

	return (
		<MyComponent index={index} {...rest} />
	);
}
```
 */
  itemRenderer: Function;
  /**
 * A callback function that receives a reference to the  `scrollTo`  feature.
 * 
 * Once received, the  `scrollTo`  method can be called as an imperative interface.
 * 
 * The  `scrollTo`  function accepts the following parameters:
 * *  {position: {x, y}} - Pixel value for x and/or y position
 * *  {align} - Where the scroll area should be aligned. Values are:
 `'left'` ,  `'right'` ,  `'top'` ,  `'bottom'` ,
 `'topleft'` ,  `'topright'` ,  `'bottomleft'` , and  `'bottomright'` .
 * *  {index} - Index of specific item. ( `0`  or positive integer)
This option is available for only  `VirtualList`  kind.
 * *  {node} - Node to scroll into view
 * *  {animate} - When  `true` , scroll occurs with animation. When  `false` , no
animation occurs.
 * *  {focus} - When  `true` , attempts to focus item after scroll. Only valid when scrolling
by  `index`  or  `node` .
 * 
 * Note: Only specify one of:  `position` ,  `align` ,  `index`  or  `node`
 * 
 * Example:
 * ```
// If you set cbScrollTo prop like below;
cbScrollTo: (fn) => {this.scrollTo = fn;}
// You can simply call like below;
this.scrollTo({align: 'top'}); // scroll to the top
```
 */
  cbScrollTo?: Function;
  /**
   * Additional props included in the object passed to the  `itemsRenderer`  callback.
   */
  childProps?: object;
  /**
   * Client size of the list; valid values are an object that has  `clientWidth`  and  `clientHeight` .
   */
  clientSize?: object;
  /**
   * The number of items of data the list contains.
   */
  dataSize?: number;
  /**
   * The layout direction of the list.
   *
   * Valid values are:
   * *  `'horizontal'` , and
   * *  `'vertical'` .
   */
  direction?: string;
  /**
   * The spacing between items.
   */
  spacing?: number;
  /**
   * Specifies how to show horizontal scrollbar.
   *
   * Valid values are:
   * *  `'auto'` ,
   * *  `'visible'` , and
   * *  `'hidden'` .
   */
  horizontalScrollbar?: string;
  /**
   * Prevents scroll by wheeling on the list.
   */
  noScrollByWheel?: boolean;
  /**
 * Called when scrolling.
 * 
 * Passes  `scrollLeft` ,  `scrollTop` , and  `moreInfo` .
It is not recommended to set this prop since it can cause performance degradation.
Use  `onScrollStart`  or  `onScrollStop`  instead.
 */
  onScroll?: Function;
  /**
 * Called when scroll starts.
 * 
 * Passes  `scrollLeft` ,  `scrollTop` , and  `moreInfo` .
You can get firstVisibleIndex and lastVisibleIndex from VirtualList with  `moreInfo` .
 * 
 * Example:
 * ```
onScrollStart = ({scrollLeft, scrollTop, moreInfo}) => {
    const {firstVisibleIndex, lastVisibleIndex} = moreInfo;
    // do something with firstVisibleIndex and lastVisibleIndex
}

render = () => (
    <VirtualList
        ...
        onScrollStart={this.onScrollStart}
        ...
    />
)
```
 */
  onScrollStart?: Function;
  /**
 * Called when scroll stops.
 * 
 * Passes  `scrollLeft` ,  `scrollTop` , and  `moreInfo` .
You can get firstVisibleIndex and lastVisibleIndex from VirtualList with  `moreInfo` .
 * 
 * Example:
 * ```
onScrollStop = ({scrollLeft, scrollTop, moreInfo}) => {
    const {firstVisibleIndex, lastVisibleIndex} = moreInfo;
    // do something with firstVisibleIndex and lastVisibleIndex
}

render = () => (
    <VirtualList
        ...
        onScrollStop={this.onScrollStop}
        ...
    />
)
```
 */
  onScrollStop?: Function;
  /**
   * Specifies how to show vertical scrollbar.
   *
   * Valid values are:
   * *  `'auto'` ,
   * *  `'visible'` , and
   * *  `'hidden'` .
   */
  verticalScrollbar?: string;
}
/**
 * A basic base component for
   and   .
 */

export class VirtualListBase extends React.Component<
  Merge<React.HTMLProps<HTMLElement>, VirtualListBaseProps>
> {}
