1- import React , {
2- useEffect ,
3- useMemo ,
4- useRef ,
5- CSSProperties ,
6- useState ,
7- } from "react" ;
1+ import React , { useEffect , useRef , CSSProperties , useState } from "react" ;
82import { ReactNextElement , wrapBrick } from "@next-core/react-element" ;
93import { createDecorators , type EventEmitter } from "@next-core/element" ;
104import type {
@@ -36,6 +30,7 @@ export interface DrawerMapEvents {
3630export interface DrawerProps {
3731 curElement ?: HTMLElement ;
3832 customTitle ?: string ;
33+ subTitle ?: string ;
3934 width ?: number | string ;
4035 height ?: number ;
4136 closable ?: boolean ;
@@ -48,6 +43,7 @@ export interface DrawerProps {
4843 stackable ?: boolean ;
4944 maskStyle ?: CSSProperties ;
5045 keyboard ?: boolean ;
46+ themeVariant ?: "default" | "elevo" ;
5147}
5248
5349const { defineElement, property, event, method } = createDecorators ( ) ;
@@ -57,8 +53,8 @@ const WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>("eo-icon");
5753 * 通用抽屉构件
5854 * @author sailor
5955 * @slot - 抽屉内容插槽
60- * @slot headerLeft - 头部左上角
61- * @slot extra - 头部右上角
56+ * @slot headerLeft - 头部左上角(标题右侧)
57+ * @slot extra - 头部右上角(关闭按钮左侧)
6258 * @slot footer - 抽屉底部插槽
6359 * @category container-display
6460 */
@@ -72,6 +68,11 @@ class Drawer extends ReactNextElement implements DrawerProps {
7268 */
7369 @property ( ) accessor customTitle : string | undefined ;
7470
71+ /**
72+ * 副标题
73+ */
74+ @property ( ) accessor subTitle : string | undefined ;
75+
7576 /**
7677 * 宽度(placement为left,right时生效)
7778 */
@@ -150,6 +151,10 @@ class Drawer extends ReactNextElement implements DrawerProps {
150151 @property ( { type : Boolean } )
151152 accessor keyboard : boolean | undefined ;
152153
154+ /** 主题变体 */
155+ @property ( { render : false } )
156+ accessor themeVariant : "default" | "elevo" | undefined ;
157+
153158 /**
154159 * 是否可堆叠,开启后每次打开抽屉会将新的抽屉置于上层(zIndex ++)
155160 *
@@ -214,6 +219,7 @@ class Drawer extends ReactNextElement implements DrawerProps {
214219 return (
215220 < DrawerComponent
216221 customTitle = { this . customTitle }
222+ subTitle = { this . subTitle }
217223 width = { this . width }
218224 height = { this . height }
219225 closable = { this . closable }
@@ -227,6 +233,7 @@ class Drawer extends ReactNextElement implements DrawerProps {
227233 scrollToTopWhenOpen = { this . scrollToTopWhenOpen }
228234 curElement = { this }
229235 keyboard = { this . keyboard }
236+ themeVariant = { this . themeVariant }
230237 stackable = { this . stackable }
231238 stack = { this . #stack}
232239 />
@@ -241,6 +248,7 @@ interface DrawerComponentProps extends DrawerProps {
241248
242249export function DrawerComponent ( {
243250 customTitle,
251+ subTitle,
244252 width = 500 ,
245253 height = 378 ,
246254 closable = true ,
@@ -259,29 +267,6 @@ export function DrawerComponent({
259267} : DrawerComponentProps ) {
260268 const containerRef = useRef < HTMLDivElement > ( null ) ;
261269 const contentRef = useRef < HTMLDivElement > ( ) ;
262- const header = useMemo (
263- ( ) => (
264- < div className = "drawer-header" >
265- < div className = "drawer-header-left" >
266- < span className = "drawer-title" > { customTitle } </ span >
267- < slot name = "headerLeft" > </ slot >
268- </ div >
269- < div className = "drawer-header-right" >
270- < slot name = "extra" > </ slot >
271- { closable && (
272- < WrappedIcon
273- className = "close-btn"
274- lib = "antd"
275- theme = "outlined"
276- icon = "close"
277- onClick = { onDrawerClose }
278- />
279- ) }
280- </ div >
281- </ div >
282- ) ,
283- [ closable , customTitle , onDrawerClose ]
284- ) ;
285270
286271 const mergeMaskStyle = {
287272 backgroundColor : "var(--antd-modal-mask-bg)" ,
@@ -371,7 +356,27 @@ export function DrawerComponent({
371356 } }
372357 >
373358 < div className = "drawer-content" tabIndex = { - 1 } ref = { containerRef } >
374- { header }
359+ < div className = "drawer-header" >
360+ < div className = "drawer-header-left" >
361+ { subTitle ? < div className = "sub-title" > { subTitle } </ div > : null }
362+ < div className = "title-wrapper" >
363+ < span className = "drawer-title" > { customTitle } </ span >
364+ < slot name = "headerLeft" > </ slot >
365+ </ div >
366+ </ div >
367+ < div className = "drawer-header-right" >
368+ < slot name = "extra" > </ slot >
369+ { closable && (
370+ < WrappedIcon
371+ className = "close-btn"
372+ lib = "antd"
373+ theme = "outlined"
374+ icon = "close"
375+ onClick = { onDrawerClose }
376+ />
377+ ) }
378+ </ div >
379+ </ div >
375380 < div className = "drawer-body" ref = { contentRef } >
376381 < slot > </ slot >
377382 </ div >
0 commit comments