// Type definitions for sandstone/Popup

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 PopupBaseProps {
  /**
   * The contents to be displayed in the body of the popup.
   */
  children: React.ReactNode;
  /**
   * Set the priority with which screen reader should treat updates to live regions for the Popup.
   */
  "aria-live"?: string | object;
  /**
   * Disables transition animation.
   */
  noAnimation?: boolean;
  /**
   * Called after the popup's "hide" transition finishes.
   */
  onHide?: Function;
  /**
   * Called after the popup's "show" transition finishes.
   */
  onShow?: Function;
  /**
   * Controls the visibility of the Popup.
   *
   * By default, the Popup and its contents are not rendered until  `open` .
   */
  open?: boolean;
  /**
   * Position of the Popup on the screen.
   */
  position?: "bottom" | "center" | "fullscreen" | "left" | "right" | "top";
  /**
   * The ARIA role for the Popup.
   */
  role?: string | object;
  /**
   * The container id for   .
   */
  spotlightId?: string;
  /**
 * Restricts or prioritizes navigation when focus attempts to leave the popup.
 * 
 * It can be either  `'none'` ,  `'self-first'` , or  `'self-only'` .
 * 
 * Note: The ready-to-use    component only supports
 `'self-first'`  and  `'self-only'` .
 */
  spotlightRestrict?: "none" | "self-first" | "self-only";
}
/**
 * The base popup component.
 */

export class PopupBase extends React.Component<
  Merge<React.HTMLProps<HTMLElement>, PopupBaseProps>
> {}

export interface PopupProps extends PopupBaseProps {
  /**
   * Disables transition animation.
   */
  noAnimation?: boolean;
  /**
 * Indicates that the popup will not trigger  `onClose`  when the user presses the cancel/back (e.g.  `ESC` ) key or
taps outside of the popup.
 */
  noAutoDismiss?: boolean;
  /**
 * Called on:
 * *  pressing  `ESC`  key,
 * *  clicking on outside the boundary of the popup, or
 * *  moving spotlight focus outside the boundary of the popup when  `spotlightRestrict`  is
 `'self-first'` .
 * 
 * Event payload:
 * *  pressing  `ESC`  key, carries  `detail`  property containing  `inputType`  value of  `'key'` .
 * *  clicking outside the boundary of the popup, carries  `detail`  property containing
 `inputType`  value of  `'click'` .
 * 
 * It is the responsibility of the callback to set the  `open`  property to  `false` .
 */
  onClose?: Function;
  /**
   * Called after hide transition has completed, and immediately with no transition.
   */
  onHide?: Function;
  /**
   * Called when a key is pressed.
   */
  onKeyDown?: Function;
  /**
 * Called after show transition has completed, and immediately with no transition.
 * 
 * Note: The function does not run if Popup is initially opened and
   is  `true` .
 */
  onShow?: Function;
  /**
   * Controls the visibility of the Popup.
   *
   * By default, the Popup and its contents are not rendered until  `open` .
   */
  open?: boolean;
  /**
   * Position of the Popup on the screen.
   */
  position?: "bottom" | "center" | "fullscreen" | "left" | "right" | "top";
  /**
 * Scrim type.
 * *  Values:  `'transparent'` ,  `'translucent'` , or  `'none'` .
 * 
 * `'none'`  is not compatible with  `spotlightRestrict`  of  `'self-only'` , use a transparent scrim
to prevent mouse focus when using popup.
 */
  scrimType?: "transparent" | "translucent" | "none";
  /**
 * Restricts or prioritizes navigation when focus attempts to leave the popup.
 * *  Values:  `'self-first'` , or  `'self-only'` .
 * 
 * When using  `self-first` , attempts to leave the popup via 5-way will fire  `onClose`  based
on the following values of  `position` :
 * *  `'bottom'`  - When leaving via 5-way up
 * *  `'top'`  - When leaving via 5-way down
 * *  `'left'`  - When leaving via 5-way right
 * *  `'right'`  - When leaving via 5-way left
 * *  `'center'`  - When leaving via any 5-way direction
 * 
 * Note: If  `onClose`  is not set, then this has no effect on 5-way navigation. If the popup
has no spottable children, 5-way navigation will cause the Popup to fire  `onClose` .
 */
  spotlightRestrict?: "self-first" | "self-only";
}
/**
 * A stateful component that renders a popup in a
  .
 */

export class Popup extends React.Component<
  Merge<React.HTMLProps<HTMLElement>, PopupProps>
> {}

export default Popup;
