@fluentui/react
Version:
Reusable React components for building web experiences.
202 lines (201 loc) • 6.81 kB
TypeScript
import * as React from 'react';
import { ResponsiveMode } from '../../ResponsiveMode';
import type { IAccessiblePopupProps } from '../../common/IAccessiblePopupProps';
import type { IContextualMenuProps } from '../../ContextualMenu';
import type { IFocusTrapZoneProps } from '../../FocusTrapZone';
import type { IIconProps } from '../../Icon';
import type { ILayerProps } from '../../Layer';
import type { IOverlayProps } from '../../Overlay';
import type { IStyle, ITheme } from '../../Styling';
import type { IRefObject, IStyleFunctionOrObject } from '../../Utilities';
import { IPopupProps } from '../Popup/Popup.types';
export interface IDragOptions {
/**
* Optional selector for the element where the drag can be initiated. If not supplied when
* isDraggable is true dragging can be initiated by the whole contents of the modal
*/
dragHandleSelector?: string;
/**
* IconProps for the icon used to indicate that the dialog is in keyboard move mode
*/
keyboardMoveIconProps?: IIconProps;
/**
* The text to use for the modal move menu item
*/
moveMenuItemText: string;
/**
* The text to use for the modal close menu item
*/
closeMenuItemText: string;
/**
* The Draggable Control Menu so that the draggable zone can be moved via the keyboard
*/
menu: React.FunctionComponent<IContextualMenuProps>;
/**
* Whether the draggable content should be prevented from going off-screen
*/
keepInBounds?: boolean;
}
/**
* {@docCategory Modal}
*/
export interface IModal {
/**
* Sets focus on the first focusable, or configured, child in focus trap zone
*/
focus: () => void;
}
/**
* {@docCategory Modal}
*/
export interface IModalProps extends React.RefAttributes<HTMLDivElement>, IAccessiblePopupProps {
children?: React.ReactNode;
/**
* Optional ref to access the `IModal` interface. Use this instead of `ref` for accessing
* public API of the component.
*/
componentRef?: IRefObject<IModal>;
/**
* Call to provide customized styling that will layer on top of the variant rules.
*/
styles?: IStyleFunctionOrObject<IModalStyleProps, IModalStyles>;
/**
* Theme provided by higher-order component.
*/
theme?: ITheme;
/**
* Whether the dialog is displayed.
* @default false
*/
isOpen?: boolean;
/**
* Whether the overlay is dark themed.
* @default true
*/
isDarkOverlay?: boolean;
/**
* A callback function for when the Modal is dismissed light dismiss, before the animation completes.
*/
onDismiss?: (ev?: React.MouseEvent<HTMLButtonElement | HTMLElement>) => any;
/**
* A callback function which is called after the Modal is dismissed and the animation is complete.
*/
onDismissed?: () => any;
/**
* The specified responsiveMode value for Modal to use.
* @default ResponsiveMode.small
*/
responsiveMode?: ResponsiveMode;
/**
* Defines an optional set of props to be passed through to Layer
*/
layerProps?: ILayerProps;
/**
* Defines an optional set of props to be passed through to Overlay
*/
overlay?: IOverlayProps;
/**
* Whether the dialog can be light dismissed by clicking outside the dialog (on the overlay).
* @default false
*/
isBlocking?: boolean;
/**
* Whether the dialog should be modeless (e.g. not dismiss when focusing/clicking outside of the dialog).
* if true: isBlocking is ignored, there will be no overlay (isDarkOverlay is ignored),
* isClickableOutsideFocusTrap is true, and forceFocusInsideTrap is false
*/
isModeless?: boolean;
/**
* Determines the ARIA role of the dialog (alertdialog/dialog)
* If this is set, it will override the ARIA role determined by isBlocking and isModeless
*
* For more information regarding dialogs please see https://w3c.github.io/aria-practices/#alertdialog
*/
isAlert?: boolean;
/**
* Optional class name to be added to the root class
*/
className?: string;
/**
* Optional override for container class
*/
containerClassName?: string;
/**
* Optional override for scrollable content class
*/
scrollableContentClassName?: string;
/**
* A callback function for when the Modal content is mounted on the overlay layer
* @deprecated Use `layerProps.onLayerDidMount` instead
*/
onLayerDidMount?: () => void;
/**
* ARIA id for the title of the Modal, if any
*/
titleAriaId?: string;
/**
* ARIA id for the subtitle of the Modal, if any
*/
subtitleAriaId?: string;
/**
* Whether the modal should have top offset fixed once opened and expand from the bottom only
* when the content changes dynamically.
*/
topOffsetFixed?: boolean;
/**
* The options to make the modal draggable
*/
dragOptions?: IDragOptions;
/**
* Allow body scroll on content and overlay on touch devices. Changing after mounting has no effect.
* @default false
*/
allowTouchBodyScroll?: boolean;
/**
* Puts aria-hidden=true on all non-ancestors of the current modal, for screen readers
* (unless `isModeless` is true).
* @default true
* @deprecated Setting this to `false` is deprecated since it breaks modal behavior for some screen readers.
* It will not be supported in future versions of the library (except for modeless modals).
*/
enableAriaHiddenSiblings?: boolean;
/**
* Set of props to customize the `FocusTrapZone` inside of the `Modal`.
* @default `{}`
*/
focusTrapZoneProps?: IFocusTrapZoneProps;
/**
* Props to be passed through to Popup
*/
popupProps?: IPopupProps;
}
/**
* {@docCategory Modal}
*/
export type IModalStyleProps = Required<Pick<IModalProps, 'theme'>> & Pick<IModalProps, 'className' | 'containerClassName' | 'scrollableContentClassName' | 'topOffsetFixed' | 'isModeless'> & {
/** Modal open state. */
isOpen?: boolean;
/** Modal visible state. */
isVisible?: boolean;
/** Modal has been opened state. */
hasBeenOpened?: boolean;
/** Positioning of modal on first render */
modalRectangleTop?: number;
/** Classname for layer element */
layerClassName?: string;
/** Whether this modal is draggable and using the default handler */
isDefaultDragHandle?: boolean;
/** The windows inner height */
windowInnerHeight?: number;
};
/**
* {@docCategory Modal}
*/
export interface IModalStyles {
root: IStyle;
main: IStyle;
scrollableContent: IStyle;
layer: IStyle;
keyboardMoveIconContainer: IStyle;
keyboardMoveIcon: IStyle;
}