update:Dialog替换

This commit is contained in:
xiaozhu
2026-08-26 16:48:19 +08:00
parent d7f3db1cc4
commit e326cc1a93
16 changed files with 738 additions and 675 deletions
@@ -0,0 +1,90 @@
import type { ReactNode } from "react"
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from "~/components/ui/dialog"
import { cn } from "~/lib/utils"
/** 与系统管理弹窗 footer 一致的次要按钮样式 */
export const dialogSecondaryButtonClass =
"h-[37px] gap-[7px] rounded-md border-[#d8e1e9] bg-white px-[15px] text-xs font-[650] text-[#56687c]"
/** 与系统管理弹窗 footer 一致的主按钮样式 */
export const dialogPrimaryButtonClass =
"h-[37px] gap-[7px] rounded-md border border-[#126ac3] bg-gradient-to-br from-[#1881e7] to-[#1268c9] px-[15px] text-xs font-[650] text-white shadow-[0_6px_15px_rgb(20_111_202/18%)] enabled:hover:from-[#1175d8] enabled:hover:to-[#0e5bad]"
const EYEBROW_CLASS =
"text-[9px] font-extrabold tracking-[0.12em] text-[#2d82d4]"
const TITLE_CLASS = "mt-1 text-[19px] font-normal text-[#1c2d42]"
type AppFormDialogProps = {
open: boolean
onOpenChange: (open: boolean) => void
eyebrow?: string
title?: ReactNode
titleId?: string
children: ReactNode
footer?: ReactNode
contentClassName?: string
bodyClassName?: string
showCloseButton?: boolean
size?: "compact" | "panel"
}
function AppFormDialog({
open,
onOpenChange,
eyebrow,
title,
titleId,
children,
footer,
contentClassName,
bodyClassName,
showCloseButton = true,
size = "compact",
}: AppFormDialogProps) {
const maxWidth =
size === "panel"
? "sm:max-w-[min(520px,calc(100vw-40px))]"
: "sm:max-w-[min(480px,calc(100vw-40px))]"
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent
showCloseButton={showCloseButton}
className={cn(
"flex max-h-[80vh] flex-col gap-0 overflow-hidden rounded-[11px] border-[#dce4eb] bg-white p-0 text-[#1c2d42] shadow-[0_24px_70px_rgb(8_27_48/25%)] ring-0",
maxWidth,
contentClassName,
)}
>
{eyebrow || title ? (
<DialogHeader className="shrink-0 space-y-0 border-b border-[#e7ecf1] px-[22px] pb-4 pt-5 text-left">
{eyebrow ? <span className={EYEBROW_CLASS}>{eyebrow}</span> : null}
{title ? (
<DialogTitle id={titleId} className={TITLE_CLASS}>
{title}
</DialogTitle>
) : null}
</DialogHeader>
) : null}
<div className={cn("min-h-0 flex-1 overflow-y-auto", bodyClassName)}>
{children}
</div>
{footer ? (
<DialogFooter className="mt-0 shrink-0 flex-row justify-end gap-2 border-t border-[#e8edf2] bg-white px-[22px] py-3.5 sm:justify-end">
{footer}
</DialogFooter>
) : null}
</DialogContent>
</Dialog>
)
}
export { AppFormDialog }