diff --git a/packages/web/src/components/ui/Modal.tsx b/packages/web/src/components/ui/Modal.tsx index 28b7f31e..5f3a3e3f 100644 --- a/packages/web/src/components/ui/Modal.tsx +++ b/packages/web/src/components/ui/Modal.tsx @@ -7,11 +7,12 @@ interface ModalProps { title?: string; children: React.ReactNode; maxWidth?: string; + size?: 'settings'; /** Mobile display style: 'fullscreen' fills the screen, 'sheet' anchors to bottom, 'default' stays centered */ mobileStyle?: 'fullscreen' | 'sheet' | 'default'; } -export function Modal({ isOpen, onClose, title, children, maxWidth = 'max-w-md', mobileStyle = 'default' }: ModalProps) { +export function Modal({ isOpen, onClose, title, children, maxWidth = 'max-w-md', size, mobileStyle = 'default' }: ModalProps) { const isMobile = useUIStore((s) => s.isMobile); const handleKeyDown = useCallback((e: KeyboardEvent) => { @@ -33,12 +34,13 @@ export function Modal({ isOpen, onClose, title, children, maxWidth = 'max-w-md', if (isMobile && mobileStyle === 'fullscreen') { return (
- {title && ( + {(title || size === 'settings') && (
-

{title}

+ {title ?

{title}

:
}
)} -
+
{children}
@@ -83,6 +85,31 @@ export function Modal({ isOpen, onClose, title, children, maxWidth = 'max-w-md', ); } + // Settings size variant — large glass overlay for settings screens + if (size === 'settings') { + return ( +
+
+
+ {/* Floating close button */} + + {children} +
+
+ ); + } + // Default centered dialog (desktop and mobile default) return (