fix(ui): 表单弹窗溢出(#11) + LLM 配置弹窗点外部误关闭(#13)

#11 Textarea(field-sizing-content 自动增高)加 max-h-[45vh]+overflow-auto 到顶改内部滚动,DialogContent 加 max-h-[90dvh]+overflow-y-auto 兜底;#13 新建 Profile 弹窗加 onInteractOutside preventDefault,点外部不再关闭。

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Autumn-27andClaude Opus 5 committed 2026-08-07 12:20:15 -04:00
1 parent 5000aadd8f
commit e86657cfd1
3 files changed
+10 -3

No files matched your search

+5 -1
View File
@@ -141,7 +141,11 @@ function NewProfileDialog({ onCreated }: { onCreated: (id: string) => void }) {
<PlusIcon /> 新建
</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-lg">
<DialogContent
className="sm:max-w-lg"
// don't dismiss a half-filled form on an outside click (Esc / ✕ still close).
onInteractOutside={(e) => e.preventDefault()}
>
<DialogHeader>
<DialogTitle>新建 Profile</DialogTitle>
<DialogDescription>新建后不会自动激活,请在列表中「设为激活」以启用。</DialogDescription>
+1 -1
View File
@@ -61,7 +61,7 @@ function DialogContent({
<DialogPrimitive.Content
data-slot="dialog-content"
className={cn(
"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
"fixed top-1/2 left-1/2 z-50 grid max-h-[90dvh] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
className
)}
{...props}
+4 -1
View File
@@ -7,7 +7,10 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
<textarea
data-slot="textarea"
className={cn(
"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
// field-sizing-content auto-grows the textarea to its content; cap the
// growth (and scroll past it) so a large paste can't blow a dialog past the
// viewport. Call sites can override via a max-h-* class (twMerge wins).
"flex field-sizing-content max-h-[45vh] min-h-16 w-full overflow-auto rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
className
)}
{...props}