shineout
Version:
Shein 前端组件库
293 lines (255 loc) • 6.57 kB
text/typescript
import { ReactNode } from 'react'
import { StandardProps } from '../@types/common'
export type GetZIndexConsumerProps<Props> = Props
export type Methods = 'success' | 'info' | 'warning' | 'error' | 'confirm' | 'normal'
/**
* @title Modal
*/
export interface ModalProps extends StandardProps {
/**
* @en Whether to hide mask
* @cn 是否隐藏遮罩
* @default false
*/
hideMask?: boolean
/**
* @en Whether to force the mask transparency (in multi-layer Modal, the transparency of other Modal masks except the first layer will be adjusted to 0.01)
* @cn 是否强制设置遮罩透明度(多层Modal中,除第一层外的其他弹出层遮罩透明度会被调整为0.01)
* @default false
*/
forceMask?: boolean
/**
* @en Distance from top
* @cn 弹框距离顶部距离
* @default 10vh
*/
top?: number | string
/**
* @en display with full screen
* @cn 是否全屏展示
* @default false
*/
fullScreen?: boolean
/**
* @en Extend pop-up body style
* @cn 扩展弹出层 body 的样式
*/
bodyStyle?: React.CSSProperties
/**
* @en The content at the bottom
* @cn 底部内容
*/
footer?: ReactNode
/**
* @en Whether to close the mask when the mask is clicked
* @cn 点击遮罩层是否关闭对话框, 设置为 null 右上角关闭图标会保留
* @default true
*/
maskCloseAble?: null | boolean
/**
* @en The opacity of the mask
* @cn 遮罩层透明度
* @default 0.25
*/
maskOpacity?: number
/**
* @en Padding style of the content
* @cn 内容内边距
*/
padding?: number | string
/**
* @en Pop-up position
* @cn 弹出位置
*/
position?: 'top' | 'right' | 'bottom' | 'left'
/**
* @en the title of the pop-up layer
* @cn 弹出层的标题
*/
title?: ReactNode
/**
* @en When the usePortal is true, use ReactDOM.createPortal to create the pop-up layer, otherwise use ReactDOM.render. Use ReactDOM.render while func call.
* @cn 为 true 时,使用 ReactDOM.createPortal 创建弹出层,为 false 时,使用 ReactDOM.render。函数式调用时使用 ReactDOM.render。
* @default true
*/
usePortal?: boolean
/**
* @en visible
* @cn 是否显示
* @default false
*/
visible?: boolean
/**
* @en the width of the pop-up (not work after setting position)
* @cn 弹出层宽度 (设置 position 后无效)
* @default 500
*/
width?: number | string
/**
* @en the height of the Modal (not work after setting position)
* @cn 对话框高度 (设置 position 后无效)
*/
height?: string | number
/**
* @en pop-up z-index
* @cn 弹出层 z-index 值,注意:如果嵌套 Select 组件,并且 Select 组件含有 absolute 字段,需要修改 Select 的 z-index 的值
* @default 1050
*/
zIndex?: number
/**
* @en the root element of pop-up, the mask parent element
* @cn 弹出层的根元素类名, 为遮罩层的父元素
*/
rootClassName?: string
/**
* @en target element
* @cn 渲染的目标节点
* @default document.body
*/
container?: (() => HTMLElement) | HTMLElement
/**
* @en pop-up support move
* @cn 是否可移动
* @default false
*/
moveable?: boolean
/**
* @en mask background
* @cn 遮罩背景色,设置后透明度将失效
*/
maskBackground?: string
/**
* @en pop-up close callback
* @cn 弹出层关闭回调
*/
onClose?: () => void
/**
* @en Whether to destroy elements when it is closed
* @cn 关闭时是否销毁元素
* @default false
*/
destroy?: boolean
/**
* @en hide the close button
* @cn 是否隐藏关闭按钮
*/
hideClose?: boolean
/**
* @en pop-up Title show status icon
* @cn 弹出层 title 显示状态 icon
*/
type?: 'info' | 'success' | 'warning' | 'error' | 'normal' | 'default'
/**
* @en toggle zoom animation
* @cn 是否开启 zoom 动画效果
* @default false
*/
zoom?: boolean
/**
* @en press 'esc' to close
* @cn 是否支持 esc 键关闭
* @default true
*/
esc?: boolean
/**
* @en events list of container element
* @cn 外层元素所接受的事件列表,可用于在 createPortal 场景中阻止冒泡
* @default {}
*/
events?: object
/**
* @en can resize
* @cn 是否可调整大小
* @default false
*/
resizable?: boolean
/**
* @en When the theme is antd, Set the content style padding to 0
* @cn 当 Sheinout 采用 antd 主题时,取消内容区域的 padding
*/
noPadding?: boolean
/**
* @inner 内部属性
*/
drawer?: boolean
/**
* @en pop-up children
* @cn 弹出层内容
*/
children?: ReactNode
}
export interface ModalPanelProps
extends StandardProps,
Pick<
ModalProps,
| 'children'
| 'footer'
| 'maskCloseAble'
| 'noPadding'
| 'onClose'
| 'padding'
| 'position'
| 'title'
| 'type'
| 'width'
| 'moveable'
| 'resizable'
| 'hideClose'
| 'zoom'
| 'events'
| 'fullScreen'
| 'top'
| 'bodyStyle'
| 'hideMask'
> {
id?: string
from?: string
container?: Element
drawer?: boolean
autoFocusButton?: string
height?: string | number
}
/**
* @title ModalMethods
*/
interface ModalFunctionExternalOptions {
/**
* @en Content body
* @cn 提示内容主体
*/
content?: ReactNode
/**
* @en The event is triggered when the cancel button is clicked.
* @cn 点击取消按钮时触发事件,仅在 confirm 方法中有效
*/
onCancel?: () => void
/**
* @en The event is triggered when the modal is closed.
* @cn 关闭 Modal 时触发
*/
onClose?: () => void
/**
* @en The event is triggered when the ok button is clicked.
* @cn 点击确定按钮时触发事件,返回 Promise 时,会在 Promise resolve 后关闭Modal
*/
onOk?: () => void | Promise<any>
/**
* @en The text of button
* @cn 按钮文字
* @default { ok: 'Ok', cancel: 'Cancel' }
*/
text?: { ok?: string; cancel?: string }
/**
* @en auto focus button
* @cn 默认聚焦的按钮
*/
autoFocusButton?: 'ok' | 'cancel'
}
export interface ModalFunctionOptions extends Omit<ModalProps, 'usePortal' | 'destroy'>, ModalFunctionExternalOptions {}
// innerOptions
export type Options = ModalFunctionOptions & {
id: string
from?: string
usePortal?: ModalProps['usePortal']
destroy?: ModalProps['destroy']
}