import { c as _c } from "react-compiler-runtime"; import { createContext, type RefObject, useContext } from 'react'; import type { ScrollBoxHandle } from '../ink/components/ScrollBox.js'; /** * Set by FullscreenLayout when rendering content in its `modal` slot — * the absolute-positioned bottom-anchored pane for slash-command dialogs. * Consumers use this to: * * - Suppress top-level framing — `Pane` skips its full-terminal-width * `Divider` (FullscreenLayout already draws the ▔ divider). * - Size Select pagination to the available rows — the modal's inner * area is smaller than the terminal (rows minus transcript peek minus * divider), so components that cap their visible option count from * `useTerminalSize().rows` would overflow without this context. * - Reset scroll on tab switch — Tabs keys its ScrollBox by * `selectedTabIndex`, remounting on tab switch so scrollTop resets to 0 * without scrollTo() timing games. * * null = not inside the modal slot. */ type ModalCtx = { rows: number; columns: number; scrollRef: RefObject | null; }; export const ModalContext = createContext(null); export function useIsInsideModal() { return useContext(ModalContext) !== null; } /** * Available content rows/columns when inside a Modal, else falls back to * the provided terminal size. Use instead of `useTerminalSize()` when a * component caps its visible content height — the modal's inner area is * smaller than the terminal. */ export function useModalOrTerminalSize(fallback) { const $ = _c(3); const ctx = useContext(ModalContext); let t0; if ($[0] !== ctx || $[1] !== fallback) { t0 = ctx ? { rows: ctx.rows, columns: ctx.columns } : fallback; $[0] = ctx; $[1] = fallback; $[2] = t0; } else { t0 = $[2]; } return t0; } export function useModalScrollRef() { return useContext(ModalContext)?.scrollRef ?? null; }