01 · Modal / drawer state
useDisclosure · useDisclosureData
Typed payload + delayed clear so exit anims still see data. Without bagon you’re wiring timers by hand.
bagon-hooks
const [data, isOpen, { open, close }] = useDisclosureData<Item>( null, false, { dataDisappearDelay: 250, onOpen, onClose, }, ); open({ id: "42" }); close(); // data survives exit anim
solid-primitives · roll your own
const [opened, setOpened] = createSignal(false); const [data, setData] = createSignal<Item | null>(null); let clearTimer: ReturnType<typeof setTimeout>; const open = (item: Item | null) => { clearTimeout(clearTimer); // cancel pending clear setData(() => item); setOpened(true); onOpen?.(); }; const close = () => { setOpened(false); onClose?.(); clearTimer = setTimeout( () => setData(null), 250, // must match exit anim ms ); }; // reimplement per modal · easy to // desync delay, leak timers, drop data