import { TouchGuard } from '@sigx/lynx-gestures'; import { component, compound, type Define } from '@sigx/lynx'; export type ModalProps = & Define.Prop<'open', boolean, false> & Define.Prop<'onClose', () => void, false> & Define.Prop<'class', string, false> & Define.Slot<'default'>; const _Modal = component(({ props, slots }) => { return () => { // Closed state renders a zero-size, out-of-flow placeholder (not // display:none — Lynx can leak unstyled text paint through display:none // overlays in some builds; zero-size + absolute is the safer shape, same // as StatusBarSync). The modal content itself is fully unmounted. if (!props.open) { return ; } return ( { props.onClose?.(); }} > {}} > {slots.default?.()} ); }; }); type SectionProps = Define.Prop<'class', string, false> & Define.Slot<'default'>; const ModalHeader = component(({ props, slots }) => { return () => ( {slots.default?.()} ); }); const ModalBody = component(({ props, slots }) => { return () => ( {slots.default?.()} ); }); const ModalActions = component(({ props, slots }) => { return () => ( {slots.default?.()} ); }); export const Modal = compound(_Modal, { Header: ModalHeader, Body: ModalBody, Actions: ModalActions, });