{"version":3,"sources":["../src/index.ts","../src/react/RetroScreen.tsx","../src/core/terminal/input-encoder.ts","../src/core/terminal/mouse-encoder.ts","../src/core/terminal/paste-encoder.ts","../src/core/geometry/wrap.ts","../src/core/editor/selection.ts","../src/core/ansi/snapshot-contract.ts","../src/core/terminal/ansi-parser.ts","../src/core/terminal/sgr.ts","../src/core/terminal/screen-buffer.ts","../src/react/retro-screen-render-model.ts","../src/react/retro-screen-display-color.ts","../src/react/RetroScreenDisplay.tsx","../src/react/RetroScreenInputOverlay.tsx","../src/react/retro-screen-display-padding.ts","../src/react/retro-screen-display-typography.ts","../src/react/retro-screen-pointer-grid.ts","../src/react/useRetroScreenController.ts","../src/core/terminal/controller.ts","../src/react/useRetroScreenBufferViewport.ts","../src/react/useRetroScreenEditorSession.ts","../src/core/editor/editor-session.ts","../src/react/useRetroScreenGeometry.ts","../src/core/geometry/measure-grid.ts","../src/react/useRetroScreenPromptSession.ts","../src/core/terminal/prompt-session.ts","../src/react/useRetroScreenResizablePanel.ts","../src/react/useRetroScreenTerminalBridge.ts","../src/react/useRetroScreenTerminalRenderModel.ts","../src/react/RetroScreenAnsiPlayer.tsx","../src/react/useRetroScreenAnsiSnapshotPlayer.ts","../src/core/ansi/player.ts","../src/react/useRetroScreenAnsiPlayer.ts","../src/core/terminal/websocket-session.ts"],"sourcesContent":["export { RetroScreen } from \"./react/RetroScreen\";\nexport { RetroScreenAnsiPlayer } from \"./react/RetroScreenAnsiPlayer\";\nexport { useRetroScreenTerminalBridge } from \"./react/useRetroScreenTerminalBridge\";\nexport { useRetroScreenAnsiPlayer } from \"./react/useRetroScreenAnsiPlayer\";\nexport { useRetroScreenAnsiSnapshotPlayer } from \"./react/useRetroScreenAnsiSnapshotPlayer\";\nexport { useRetroScreenController } from \"./react/useRetroScreenController\";\nexport { useRetroScreenEditorSession } from \"./react/useRetroScreenEditorSession\";\nexport { useRetroScreenGeometry } from \"./react/useRetroScreenGeometry\";\nexport { useRetroScreenPromptSession } from \"./react/useRetroScreenPromptSession\";\nexport { ansiSnapshotToRenderModelWindow } from \"./react/retro-screen-render-model\";\nexport type {\n  CursorMode,\n  RetroScreenDisplayColorMode,\n  RetroScreenDisplaySurfaceMode,\n  RetroScreenDisplayPadding,\n  RetroScreenDisplayPaddingValue,\n  RetroScreenResizeMode,\n  RetroScreenController,\n  RetroScreenEditorModeProps,\n  RetroScreenGeometry,\n  RetroScreenPromptCommandResult,\n  RetroScreenProps,\n  RetroScreenSharedProps,\n  RetroScreenTerminalModeProps,\n  RetroScreenWriteChunk,\n  RetroScreenValueModeProps,\n  RetroScreenPromptModeProps\n} from \"./core/types\";\nexport type { RetroScreenAnsiPlayerProps } from \"./react/RetroScreenAnsiPlayer\";\nexport type { RetroScreenAnsiPlayerState } from \"./react/useRetroScreenAnsiPlayer\";\nexport type { RetroScreenAnsiSnapshotPlayerState } from \"./react/useRetroScreenAnsiSnapshotPlayer\";\nexport type { RetroScreenRenderModel } from \"./react/retro-screen-render-model\";\nexport { measureGrid } from \"./core/geometry/measure-grid\";\nexport { wrapTextToColumns } from \"./core/geometry/wrap\";\nexport {\n  createRetroScreenAnsiFrameStream,\n  createRetroScreenAnsiSnapshotStream,\n  decodeRetroScreenAnsiBytes,\n  findRetroScreenAnsiSauceIndex,\n  materializeRetroScreenAnsiFrames,\n  materializeRetroScreenAnsiSnapshots,\n  normalizeRetroScreenAnsiByteChunk,\n  parseRetroScreenAnsiSauce,\n  splitRetroScreenAnsiBytes,\n  stripRetroScreenAnsiSauce\n} from \"./core/ansi/player\";\nexport {\n  DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY,\n  normalizeRetroScreenAnsiViewportWindow,\n  resolveRetroScreenAnsiSourceGeometry\n} from \"./core/ansi/snapshot-contract\";\nexport {\n  collapseRetroScreenTextSelectionToEnd,\n  collapseRetroScreenTextSelectionToStart,\n  clampRetroScreenTextOffset,\n  createRetroScreenTextSelection,\n  deleteRetroScreenSelectedText,\n  findRetroScreenNextWordBoundary,\n  findRetroScreenPreviousWordBoundary,\n  getRetroScreenWordSelectionAtOffset,\n  isRetroScreenTextSelectionCollapsed,\n  normalizeRetroScreenTextSelection,\n  replaceRetroScreenSelectedText\n} from \"./core/editor/selection\";\nexport { createRetroScreenEditorSession } from \"./core/editor/editor-session\";\nexport { createRetroScreenController } from \"./core/terminal/controller\";\nexport { createRetroScreenPromptSession } from \"./core/terminal/prompt-session\";\nexport { createRetroScreenWebSocketSession } from \"./core/terminal/websocket-session\";\nexport { encodeRetroScreenTerminalInput } from \"./core/terminal/input-encoder\";\nexport { encodeRetroScreenTerminalMouse } from \"./core/terminal/mouse-encoder\";\nexport {\n  encodeRetroScreenTerminalPaste,\n  encodeRetroScreenTerminalFocusReport\n} from \"./core/terminal/paste-encoder\";\nexport { RetroScreenAnsiParser } from \"./core/terminal/ansi-parser\";\nexport { RetroScreenScreenBuffer } from \"./core/terminal/screen-buffer\";\nexport type {\n  RetroScreenEditorSession,\n  RetroScreenEditorSessionOptions,\n  RetroScreenEditorSessionState\n} from \"./core/editor/editor-session\";\nexport type {\n  RetroScreenTextSelection\n} from \"./core/editor/selection\";\nexport type {\n  RetroScreenTerminalHostAdapter,\n  RetroScreenTerminalHostKeyEvent,\n  RetroScreenTerminalInputAdapter,\n  RetroScreenTerminalOutputAdapter\n} from \"./core/terminal/host-adapter\";\nexport type {\n  RetroScreenTerminalSession,\n  RetroScreenTerminalSessionEvent,\n  RetroScreenTerminalSessionGeometry,\n  RetroScreenTerminalSessionListener,\n  RetroScreenTerminalSessionState\n} from \"./core/terminal/session-types\";\nexport type {\n  RetroScreenTerminalInputEncodingOptions\n} from \"./core/terminal/input-encoder\";\nexport type {\n  RetroScreenTerminalMouseAction,\n  RetroScreenTerminalMouseButton,\n  RetroScreenTerminalMouseEncodingOptions,\n  RetroScreenTerminalMouseEvent\n} from \"./core/terminal/mouse-encoder\";\nexport type {\n  RetroScreenTerminalPasteEncodingOptions\n} from \"./core/terminal/paste-encoder\";\nexport type {\n  RetroScreenTerminalWebSocketConstructor,\n  RetroScreenTerminalWebSocketLike,\n  RetroScreenTerminalWebSocketSessionOptions\n} from \"./core/terminal/websocket-session\";\nexport type {\n  RetroScreenPromptSession,\n  RetroScreenPromptSessionOptions\n} from \"./core/terminal/prompt-session\";\nexport type {\n  RetroScreenAnsiByteChunk,\n  RetroScreenAnsiFrameStream,\n  RetroScreenAnsiFrameStreamSnapshot,\n  RetroScreenAnsiMetadata,\n  RetroScreenAnsiSnapshotFrame,\n  RetroScreenAnsiSnapshotStream,\n  RetroScreenAnsiSnapshotStreamSnapshot\n} from \"./core/ansi/player\";\nexport type {\n  RetroScreenAnsiFrameSnapshot,\n  RetroScreenAnsiCellSliceAccessor,\n  RetroScreenAnsiGeometryPolicy,\n  RetroScreenAnsiGeometrySource,\n  RetroScreenAnsiLineSliceAccessor,\n  RetroScreenAnsiSnapshotStorageMode,\n  RetroScreenAnsiSourceGeometry,\n  RetroScreenAnsiViewportWindow\n} from \"./core/ansi/snapshot-contract\";\nexport type {\n  RetroScreenCell,\n  RetroScreenCellIntensity,\n  RetroScreenCellStyle,\n  RetroScreenCursorState,\n  RetroScreenTerminalColor,\n  RetroScreenTerminalModes,\n  RetroScreenTerminalMouseTrackingMode,\n  RetroScreenTerminalMouseProtocol,\n  RetroScreenScreenBufferOptions,\n  RetroScreenScreenSnapshot,\n  RetroScreenWriteOptions\n} from \"./core/terminal/types\";\n","import {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ClipboardEvent,\n  type CSSProperties,\n  type FormEvent,\n  type KeyboardEvent,\n  type MouseEvent,\n  type WheelEvent\n} from \"react\";\nimport type { RetroScreenScreenSnapshot } from \"../core/terminal/types\";\nimport type { RetroScreenTerminalHostKeyEvent } from \"../core/terminal/host-adapter\";\nimport { encodeRetroScreenTerminalInput } from \"../core/terminal/input-encoder\";\nimport {\n  encodeRetroScreenTerminalMouse,\n  type RetroScreenTerminalMouseButton,\n  type RetroScreenTerminalMouseEvent\n} from \"../core/terminal/mouse-encoder\";\nimport {\n  encodeRetroScreenTerminalFocusReport,\n  encodeRetroScreenTerminalPaste\n} from \"../core/terminal/paste-encoder\";\nimport type {\n  RetroScreenPromptModeProps,\n  RetroScreenProps,\n  RetroScreenValueModeProps\n} from \"../core/types\";\nimport { RetroScreenDisplay } from \"./RetroScreenDisplay\";\nimport { RetroScreenInputOverlay } from \"./RetroScreenInputOverlay\";\nimport { getDisplayModeRootVars } from \"./retro-screen-display-color\";\nimport { getDisplayPaddingVars } from \"./retro-screen-display-padding\";\nimport { getDisplayTypographyVars } from \"./retro-screen-display-typography\";\nimport {\n  getRetroScreenPointerGridHit,\n  getRetroScreenPointerGridPosition\n} from \"./retro-screen-pointer-grid\";\nimport { useRetroScreenController } from \"./useRetroScreenController\";\nimport { useRetroScreenBufferViewport } from \"./useRetroScreenBufferViewport\";\nimport { useRetroScreenEditorSession } from \"./useRetroScreenEditorSession\";\nimport { useRetroScreenGeometry } from \"./useRetroScreenGeometry\";\nimport { useRetroScreenPromptSession } from \"./useRetroScreenPromptSession\";\nimport { useRetroScreenResizablePanel } from \"./useRetroScreenResizablePanel\";\nimport { useRetroScreenTerminalBridge } from \"./useRetroScreenTerminalBridge\";\nimport {\n  buildStaticCellRenderModel,\n  buildTextRenderModel,\n  getValueDisplayText,\n  type RetroScreenRenderModel\n} from \"./retro-screen-render-model\";\nimport { useRetroScreenTerminalRenderModel } from \"./useRetroScreenTerminalRenderModel\";\n\nconst DEFAULT_ROWS = 9;\nconst DEFAULT_COLS = 46;\n\nconst joinClassNames = (...classNames: Array<string | undefined>) =>\n  classNames.filter(Boolean).join(\" \");\n\nconst clampSelection = (value: number, text: string) =>\n  Math.max(0, Math.min(text.length, Number.isFinite(value) ? Math.floor(value) : text.length));\n\nconst isMouseTrackingActive = (snapshot: RetroScreenScreenSnapshot) =>\n  snapshot.modes.mouseTrackingMode !== \"none\" && snapshot.modes.mouseProtocol === \"sgr\";\n\nconst isEditorWordNavigationModifier = (event: KeyboardEvent<HTMLTextAreaElement>) =>\n  event.altKey || event.ctrlKey || event.metaKey;\n\nconst isEditorSelectAllShortcut = (event: KeyboardEvent<HTMLTextAreaElement>) =>\n  (event.ctrlKey || event.metaKey) &&\n  !event.altKey &&\n  event.key.toLowerCase() === \"a\";\n\nconst toTerminalMouseButton = (button: number): RetroScreenTerminalMouseButton | null => {\n  switch (button) {\n    case 0:\n      return \"left\";\n    case 1:\n      return \"middle\";\n    case 2:\n      return \"right\";\n    default:\n      return null;\n  }\n};\n\nconst toTerminalHostKeyEvent = (\n  event: KeyboardEvent<HTMLDivElement>\n): RetroScreenTerminalHostKeyEvent => ({\n  key: event.key,\n  code: event.code,\n  altKey: event.altKey,\n  ctrlKey: event.ctrlKey,\n  metaKey: event.metaKey,\n  shiftKey: event.shiftKey,\n  repeat: event.repeat\n});\n\nexport function RetroScreen(props: RetroScreenProps) {\n  const displayColorMode = props.displayColorMode ?? \"phosphor-green\";\n  const displaySurfaceMode = props.displaySurfaceMode ?? \"dark\";\n  const focusGlow = props.focusGlow ?? true;\n  const requestedCursorMode = props.cursorMode;\n  const cursorMode = requestedCursorMode ?? \"solid\";\n  const valueProps = props.mode === \"value\" ? props : null;\n  const editorProps = props.mode === \"editor\" ? props : null;\n  const terminalProps = props.mode === \"terminal\" ? props : null;\n  const promptProps = props.mode === \"prompt\" ? props : null;\n  const screenRef = useRef<HTMLDivElement | null>(null);\n  const viewportRef = useRef<HTMLDivElement | null>(null);\n  const probeRef = useRef<HTMLSpanElement | null>(null);\n  const inputRef = useRef<HTMLTextAreaElement | null>(null);\n  const activeMouseButtonRef = useRef<RetroScreenTerminalMouseButton>(\"none\");\n  const lastMouseCellRef = useRef<string | null>(null);\n  const editorSelectionAnchorRef = useRef<number | null>(null);\n  const editorSelectionDraggingRef = useRef(false);\n  const previousEditableValueRef = useRef(valueProps?.value ?? \"\");\n  const internalTerminalController = useRetroScreenController({\n    rows: props.gridMode === \"static\" ? props.rows : undefined,\n    cols: props.gridMode === \"static\" ? props.cols : undefined,\n    scrollback: terminalProps?.bufferSize\n  });\n  const promptSession = useRetroScreenPromptSession({\n    rows: props.gridMode === \"static\" ? props.rows ?? DEFAULT_ROWS : DEFAULT_ROWS,\n    cols: props.gridMode === \"static\" ? props.cols ?? DEFAULT_COLS : DEFAULT_COLS,\n    cursorMode,\n    scrollback: promptProps?.bufferSize,\n    promptChar: promptProps?.promptChar,\n    acceptanceText: promptProps?.acceptanceText,\n    rejectionText: promptProps?.rejectionText,\n    onCommand: promptProps?.onCommand\n  });\n  const editorSession = useRetroScreenEditorSession({\n    value: editorProps?.value,\n    placeholder: editorProps?.placeholder,\n    editable: editorProps?.editable,\n    cursorMode\n  });\n  const [focused, setFocused] = useState(Boolean(props.autoFocus));\n  const [selectionStart, setSelectionStart] = useState(0);\n  const [promptDraft, setPromptDraft] = useState(promptSession.getDraft());\n  const [editorState, setEditorState] = useState(() => editorSession.getState());\n  const [promptSnapshot, setPromptSnapshot] = useState<RetroScreenScreenSnapshot>(() =>\n    promptSession.getSnapshot()\n  );\n  const resizablePanel = useRetroScreenResizablePanel({\n    resizable: props.resizable,\n    resizableLeadingEdges: props.resizableLeadingEdges\n  });\n  const { geometry, cssVars } = useRetroScreenGeometry({\n    screenRef,\n    probeRef,\n    gridMode: props.gridMode,\n    rows: props.rows,\n    cols: props.cols,\n    fontScale: props.displayFontScale,\n    onGeometryChange: props.onGeometryChange\n  });\n  const { snapshot: terminalSnapshot, terminalController } = useRetroScreenTerminalRenderModel({\n    terminalProps,\n    geometry,\n    cursorMode,\n    requestedCursorMode,\n    internalController: internalTerminalController\n  });\n  const {\n    sessionState,\n    sessionTitle,\n    sessionBellCount\n  } = useRetroScreenTerminalBridge({\n    terminalProps,\n    geometry,\n    terminalController\n  });\n  const captureTerminalKeyboard =\n    terminalProps?.captureKeyboard ?? Boolean(terminalProps?.session || terminalProps?.onTerminalData);\n  const captureTerminalMouse =\n    terminalProps?.captureMouse ?? Boolean(terminalProps?.session || terminalProps?.onTerminalData);\n  const captureTerminalPaste =\n    terminalProps?.capturePaste ?? Boolean(terminalProps?.session || terminalProps?.onTerminalData);\n  const captureTerminalFocusReport =\n    terminalProps?.captureFocusReport ?? Boolean(terminalProps?.session || terminalProps?.onTerminalData);\n  const terminalFocusable = terminalProps?.terminalFocusable ?? true;\n  const localScrollbackWhenMouseActive = terminalProps?.localScrollbackWhenMouseActive ?? false;\n  const bufferViewport = useRetroScreenBufferViewport({\n    snapshot: props.mode === \"terminal\" ? terminalSnapshot : promptSnapshot,\n    enabled: props.mode === \"terminal\" || props.mode === \"prompt\",\n    defaultAutoFollow: terminalProps?.defaultAutoFollow ?? promptProps?.defaultAutoFollow ?? true\n  });\n\n  useEffect(() => {\n    if (promptProps?.value !== undefined) {\n      promptSession.setDraft(promptProps.value);\n      promptSession.setSelection(promptProps.value.length);\n    }\n  }, [promptProps?.value, promptSession]);\n\n  useEffect(() => {\n    const syncEditorState = () => {\n      setEditorState(editorSession.getState());\n    };\n\n    syncEditorState();\n    return editorSession.subscribe(syncEditorState);\n  }, [editorSession]);\n\n  useEffect(() => {\n    if (props.autoFocus) {\n      if (props.mode === \"terminal\") {\n        if (terminalFocusable) {\n          viewportRef.current?.focus();\n        }\n        return;\n      }\n\n      inputRef.current?.focus();\n    }\n  }, [props.autoFocus, props.mode, terminalFocusable]);\n\n  useEffect(() => {\n    if (props.mode !== \"value\" || !valueProps) {\n      previousEditableValueRef.current = \"\";\n      return;\n    }\n\n    const nextValue = valueProps.value;\n    const previousValue = previousEditableValueRef.current;\n    previousEditableValueRef.current = nextValue;\n\n    if (!valueProps.editable) {\n      return;\n    }\n\n    const node = inputRef.current;\n    const currentSelection = clampSelection(node?.selectionStart ?? selectionStart, previousValue);\n    const appendedAtEnd =\n      focused && nextValue.length >= previousValue.length && nextValue.startsWith(previousValue);\n    const nextSelection =\n      appendedAtEnd && currentSelection === previousValue.length\n        ? nextValue.length\n        : clampSelection(node?.selectionStart ?? currentSelection, nextValue);\n\n    if (node && document.activeElement === node) {\n      node.setSelectionRange(nextSelection, nextSelection);\n    }\n\n    setSelectionStart((current) => (current === nextSelection ? current : nextSelection));\n  }, [focused, props.mode, selectionStart, valueProps?.editable, valueProps?.value]);\n\n  useEffect(() => {\n    if (!editorProps) {\n      return;\n    }\n\n    const node = inputRef.current;\n    if (!node) {\n      return;\n    }\n\n    if (\n      node.selectionStart !== editorState.selection.start ||\n      node.selectionEnd !== editorState.selection.end\n    ) {\n      node.setSelectionRange(editorState.selection.start, editorState.selection.end);\n    }\n  }, [editorProps, editorState.selection.end, editorState.selection.start]);\n\n  useEffect(() => {\n    if (!editorProps) {\n      return;\n    }\n\n    editorProps.onSelectionChange?.(editorState.selection);\n  }, [editorProps?.onSelectionChange, editorState.selection]);\n\n  useEffect(() => {\n    promptSession.resize(geometry.rows, geometry.cols);\n    if (requestedCursorMode) {\n      promptSession.setCursorMode(requestedCursorMode);\n    }\n  }, [geometry.cols, geometry.rows, promptSession, requestedCursorMode]);\n\n  useEffect(() => {\n    const syncPromptState = () => {\n      setPromptSnapshot(promptSession.getSnapshot());\n      setPromptDraft(promptSession.getDraft());\n    };\n\n    syncPromptState();\n    return promptSession.subscribe(syncPromptState);\n  }, [promptSession]);\n\n  const renderModel = useMemo<RetroScreenRenderModel>(() => {\n    if (props.mode === \"terminal\") {\n      return bufferViewport.renderModel;\n    }\n\n    if (promptProps) {\n      return bufferViewport.renderModel;\n    }\n\n    if (editorProps) {\n      const hasValue = editorState.value.length > 0;\n      const text = hasValue ? editorState.value : !focused ? editorState.placeholder : \"\";\n      return buildTextRenderModel({\n        text,\n        geometry,\n        cursorMode: editorState.cursorMode,\n        cursorVisible: Boolean(editorState.editable && focused),\n        cursorOffset: hasValue || focused ? editorState.selection.end : 0,\n        dimmed: !hasValue && !focused && Boolean(editorState.placeholder),\n        selection: hasValue ? editorState.selection : null,\n        includeSourceOffsets: true\n      });\n    }\n\n    const nextValueProps = valueProps as RetroScreenValueModeProps;\n    const { text, dimmed } = getValueDisplayText(nextValueProps, focused);\n\n    if (nextValueProps.cells && nextValueProps.cells.length > 0 && !nextValueProps.editable) {\n      return buildStaticCellRenderModel({\n        cells: nextValueProps.cells,\n        geometry,\n        dimmed\n      });\n    }\n\n    return buildTextRenderModel({\n      text,\n      geometry,\n      cursorMode,\n      cursorVisible: Boolean(valueProps?.editable && focused),\n      cursorOffset: selectionStart,\n      dimmed\n    });\n  }, [\n    cursorMode,\n    bufferViewport.renderModel,\n    editorProps,\n    editorState,\n    focused,\n    geometry,\n    props.mode,\n    selectionStart,\n    valueProps\n  ]);\n\n  const syncSelection = () => {\n    const node = inputRef.current;\n\n    if (!node) {\n      return;\n    }\n\n    const nextSelection = clampSelection(node.selectionStart ?? node.value.length, node.value);\n    if (promptProps) {\n      promptSession.setSelection(nextSelection);\n      return;\n    }\n\n    if (editorProps) {\n      editorSession.setSelection(\n        clampSelection(node.selectionStart ?? nextSelection, node.value),\n        clampSelection(node.selectionEnd ?? nextSelection, node.value)\n      );\n      return;\n    }\n\n    setSelectionStart(nextSelection);\n  };\n\n  const focusInput = () => {\n    if (props.mode === \"terminal\") {\n      if (terminalFocusable) {\n        viewportRef.current?.focus();\n      }\n      return;\n    }\n\n    inputRef.current?.focus();\n  };\n\n  const handleBufferNavigationKey = (key: string) => {\n    if (props.mode !== \"terminal\" && props.mode !== \"prompt\") {\n      return false;\n    }\n\n    if (props.mode === \"prompt\" && (key === \"Home\" || key === \"End\")) {\n      return false;\n    }\n\n    return bufferViewport.handleNavigationKey(key);\n  };\n\n  const handleValueSubmit = () => {\n    if (valueProps) {\n      valueProps.onSubmit?.(valueProps.value);\n    }\n  };\n\n  const emitEditorValueChange = (nextValue: string) => {\n    editorSession.setValue(nextValue);\n    editorProps?.onChange?.(nextValue);\n  };\n\n  const handlePromptSubmit = async () => {\n    if (!promptProps) {\n      return;\n    }\n\n    await promptSession.submit();\n  };\n\n  const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n    if (handleBufferNavigationKey(event.key)) {\n      event.preventDefault();\n      return;\n    }\n\n    if (editorProps) {\n      if (isEditorSelectAllShortcut(event)) {\n        event.preventDefault();\n        editorSession.selectAll();\n        return;\n      }\n\n      if (\n        event.key === \"ArrowLeft\" ||\n        event.key === \"ArrowRight\" ||\n        event.key === \"Home\" ||\n        event.key === \"End\"\n      ) {\n        const direction = event.key === \"ArrowLeft\" || event.key === \"Home\" ? -1 : 1;\n        const isBoundaryMove = event.key === \"Home\" || event.key === \"End\";\n        const isWordMove =\n          !isBoundaryMove &&\n          (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") &&\n          isEditorWordNavigationModifier(event);\n\n        event.preventDefault();\n\n        if (event.shiftKey) {\n          if (isBoundaryMove) {\n            editorSession.extendSelectionToBoundary(direction);\n            return;\n          }\n\n          if (isWordMove) {\n            editorSession.extendSelectionByWord(direction);\n            return;\n          }\n\n          editorSession.extendSelectionByCharacter(direction);\n          return;\n        }\n\n        if (isBoundaryMove) {\n          editorSession.moveCursorToBoundary(direction);\n          return;\n        }\n\n        if (isWordMove) {\n          editorSession.moveCursorByWord(direction);\n          return;\n        }\n\n        editorSession.moveCursorByCharacter(direction);\n        return;\n      }\n\n      if (event.key === \"Backspace\") {\n        event.preventDefault();\n        if (editorSession.deleteBackward()) {\n          emitEditorValueChange(editorSession.getValue());\n        }\n        return;\n      }\n\n      if (event.key === \"Delete\") {\n        event.preventDefault();\n        if (editorSession.deleteForward()) {\n          emitEditorValueChange(editorSession.getValue());\n        }\n        return;\n      }\n\n      return;\n    }\n\n    if (event.key !== \"Enter\") {\n      return;\n    }\n\n    if (props.mode === \"value\" && event.shiftKey) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (props.mode === \"prompt\") {\n      void handlePromptSubmit();\n      return;\n    }\n\n    handleValueSubmit();\n  };\n\n  const handleEditorCopy = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n    if (!editorProps) {\n      return;\n    }\n\n    const selectedText = editorSession.getSelectedText();\n    if (!selectedText) {\n      return;\n    }\n\n    event.preventDefault();\n    event.clipboardData.setData(\"text/plain\", selectedText);\n  };\n\n  const handleEditorCut = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n    if (!editorProps) {\n      return;\n    }\n\n    const selectedText = editorSession.getSelectedText();\n    if (!selectedText) {\n      return;\n    }\n\n    event.preventDefault();\n    event.clipboardData.setData(\"text/plain\", selectedText);\n\n    if (!editorSession.isEditable()) {\n      return;\n    }\n\n    const result = editorSession.cutSelection();\n    if (result.changed) {\n      emitEditorValueChange(editorSession.getValue());\n    }\n  };\n\n  const handleEditorPaste = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n    if (!editorProps) {\n      return;\n    }\n\n    const pastedText = event.clipboardData.getData(\"text/plain\");\n    if (!pastedText) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (!editorSession.isEditable()) {\n      return;\n    }\n\n    if (editorSession.replaceSelection(pastedText)) {\n      emitEditorValueChange(editorSession.getValue());\n    }\n  };\n\n  const handleValueInput = (event: FormEvent<HTMLTextAreaElement>) => {\n    if (!valueProps) {\n      return;\n    }\n\n    valueProps.onChange?.(event.currentTarget.value);\n    syncSelection();\n  };\n\n  const handleEditorInput = (event: FormEvent<HTMLTextAreaElement>) => {\n    if (!editorProps) {\n      return;\n    }\n\n    if (!editorSession.isEditable()) {\n      event.currentTarget.value = editorState.value;\n      event.currentTarget.setSelectionRange(\n        editorState.selection.start,\n        editorState.selection.end\n      );\n      return;\n    }\n\n    const nextValue = event.currentTarget.value;\n    editorSession.setValue(nextValue);\n    editorSession.setSelection(\n      clampSelection(event.currentTarget.selectionStart ?? nextValue.length, nextValue),\n      clampSelection(event.currentTarget.selectionEnd ?? nextValue.length, nextValue)\n    );\n    editorProps.onChange?.(nextValue);\n  };\n\n  const handlePromptInput = (event: FormEvent<HTMLTextAreaElement>) => {\n    if (!promptProps) {\n      return;\n    }\n\n    promptSession.setDraft(event.currentTarget.value);\n    const nextSelection = clampSelection(\n      event.currentTarget.selectionStart ?? event.currentTarget.value.length,\n      event.currentTarget.value\n    );\n    promptSession.setSelection(nextSelection);\n  };\n\n  const handleViewportKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n    if (props.mode !== \"terminal\") {\n      return;\n    }\n\n    if (event.nativeEvent.isComposing || event.key === \"Process\" || event.key === \"Dead\") {\n      return;\n    }\n\n    const terminalKeyEvent = toTerminalHostKeyEvent(event);\n    terminalProps?.onTerminalKeyDown?.(terminalKeyEvent);\n\n    if (captureTerminalKeyboard) {\n      const encodedInput = encodeRetroScreenTerminalInput(terminalKeyEvent, {\n        applicationCursorKeysMode: terminalSnapshot.modes.applicationCursorKeysMode\n      });\n\n      if (encodedInput !== null) {\n        event.preventDefault();\n        emitTerminalData(encodedInput);\n        return;\n      }\n    }\n\n    if (handleBufferNavigationKey(event.key)) {\n      event.preventDefault();\n    }\n  };\n\n  const handleViewportKeyUp = (event: KeyboardEvent<HTMLDivElement>) => {\n    if (props.mode !== \"terminal\") {\n      return;\n    }\n\n    terminalProps?.onTerminalKeyUp?.(toTerminalHostKeyEvent(event));\n  };\n\n  const emitTerminalData = (data: string | Uint8Array) => {\n    terminalProps?.onTerminalData?.(data);\n    terminalProps?.session?.writeInput(data);\n  };\n\n  const terminalMouseReportingActive =\n    props.mode === \"terminal\" && captureTerminalMouse && isMouseTrackingActive(terminalSnapshot);\n\n  const emitTerminalMouse = (event: RetroScreenTerminalMouseEvent) => {\n    if (props.mode !== \"terminal\") {\n      return false;\n    }\n\n    const encodedData = encodeRetroScreenTerminalMouse(event, {\n      protocol: terminalSnapshot.modes.mouseProtocol,\n      trackingMode: terminalSnapshot.modes.mouseTrackingMode\n    });\n    if (!encodedData) {\n      return false;\n    }\n\n    terminalProps?.onTerminalMouse?.({\n      ...event,\n      encodedData\n    });\n    emitTerminalData(encodedData);\n    return true;\n  };\n\n  const buildTerminalMouseEvent = (\n    event: MouseEvent<HTMLDivElement>,\n    action: RetroScreenTerminalMouseEvent[\"action\"],\n    button: RetroScreenTerminalMouseButton\n  ): RetroScreenTerminalMouseEvent | null => {\n    const screenNode = screenRef.current;\n    if (!screenNode) {\n      return null;\n    }\n\n    const { row, col } = getRetroScreenPointerGridPosition({\n      clientX: event.clientX,\n      clientY: event.clientY,\n      rect: screenNode.getBoundingClientRect(),\n      geometry\n    });\n\n    return {\n      action,\n      button,\n      row,\n      col,\n      altKey: event.altKey,\n      ctrlKey: event.ctrlKey,\n      metaKey: event.metaKey,\n      shiftKey: event.shiftKey\n    };\n  };\n\n  const buildWheelTerminalMouseEvent = (\n    event: WheelEvent<HTMLDivElement>\n  ): RetroScreenTerminalMouseEvent | null => {\n    if (event.deltaY === 0) {\n      return null;\n    }\n\n    const screenNode = screenRef.current;\n    if (!screenNode) {\n      return null;\n    }\n\n    const { row, col } = getRetroScreenPointerGridPosition({\n      clientX: event.clientX,\n      clientY: event.clientY,\n      rect: screenNode.getBoundingClientRect(),\n      geometry\n    });\n\n    return {\n      action: \"wheel\",\n      button: event.deltaY < 0 ? \"wheel-up\" : \"wheel-down\",\n      row,\n      col,\n      altKey: event.altKey,\n      ctrlKey: event.ctrlKey,\n      metaKey: event.metaKey,\n      shiftKey: event.shiftKey\n    };\n  };\n\n  const maybeEmitFocusReport = (focusedState: boolean) => {\n    if (\n      props.mode !== \"terminal\" ||\n      !captureTerminalFocusReport ||\n      !terminalSnapshot.modes.focusReportingMode\n    ) {\n      return;\n    }\n\n    emitTerminalData(encodeRetroScreenTerminalFocusReport(focusedState));\n  };\n\n  const handleViewportPaste = (event: ClipboardEvent<HTMLDivElement>) => {\n    if (props.mode !== \"terminal\" || !captureTerminalPaste) {\n      return;\n    }\n\n    const pastedText = event.clipboardData.getData(\"text/plain\");\n    if (!pastedText) {\n      return;\n    }\n\n    event.preventDefault();\n    emitTerminalData(\n      encodeRetroScreenTerminalPaste(pastedText, {\n        bracketedPasteMode: terminalSnapshot.modes.bracketedPasteMode\n      })\n    );\n  };\n\n  const getEditorSelectionOffset = (event: MouseEvent<HTMLDivElement>) => {\n    if (!editorProps) {\n      return null;\n    }\n\n    if (editorState.value.length === 0) {\n      return 0;\n    }\n\n    const screenNode = screenRef.current;\n    const cellRows = renderModel.cells;\n    if (!screenNode || !cellRows) {\n      return null;\n    }\n\n    const hit = getRetroScreenPointerGridHit({\n      clientX: event.clientX,\n      clientY: event.clientY,\n      rect: screenNode.getBoundingClientRect(),\n      geometry\n    });\n    const rowCells = cellRows[hit.row - 1] ?? [];\n\n    if (rowCells.length === 0) {\n      return editorState.value.length;\n    }\n\n    if (hit.col - 1 >= rowCells.length) {\n      const lastCell = rowCells[rowCells.length - 1];\n      return (lastCell?.sourceOffset ?? editorState.value.length) + 1;\n    }\n\n    const cell = rowCells[hit.col - 1];\n    const baseOffset = cell?.sourceOffset ?? editorState.value.length;\n    return hit.cellRatioX >= 0.5 ? baseOffset + 1 : baseOffset;\n  };\n\n  const handleViewportMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n    if (editorProps) {\n      const nextOffset = getEditorSelectionOffset(event);\n      if (nextOffset === null) {\n        return;\n      }\n\n      editorSelectionDraggingRef.current = true;\n      editorSelectionAnchorRef.current = nextOffset;\n      editorSession.setSelection(nextOffset, nextOffset);\n      focusInput();\n      event.preventDefault();\n      return;\n    }\n\n    if (!terminalMouseReportingActive) {\n      return;\n    }\n\n    const button = toTerminalMouseButton(event.button);\n    if (!button) {\n      return;\n    }\n\n    const mouseEvent = buildTerminalMouseEvent(event, \"press\", button);\n    if (!mouseEvent) {\n      return;\n    }\n\n    activeMouseButtonRef.current = button;\n    lastMouseCellRef.current = `${mouseEvent.row}:${mouseEvent.col}:${button}`;\n    event.preventDefault();\n    emitTerminalMouse(mouseEvent);\n  };\n\n  const handleViewportMouseMove = (event: MouseEvent<HTMLDivElement>) => {\n    if (editorProps) {\n      if (!editorSelectionDraggingRef.current) {\n        return;\n      }\n\n      const anchor = editorSelectionAnchorRef.current;\n      const nextOffset = getEditorSelectionOffset(event);\n      if (anchor === null || nextOffset === null) {\n        return;\n      }\n\n      editorSession.setSelection(anchor, nextOffset);\n      event.preventDefault();\n      return;\n    }\n\n    if (!terminalMouseReportingActive) {\n      return;\n    }\n\n    const activeButton = activeMouseButtonRef.current;\n    const button =\n      activeButton !== \"none\"\n        ? activeButton\n        : terminalSnapshot.modes.mouseTrackingMode === \"any\"\n          ? \"none\"\n          : null;\n    if (!button) {\n      return;\n    }\n\n    const mouseEvent = buildTerminalMouseEvent(event, \"move\", button);\n    if (!mouseEvent) {\n      return;\n    }\n\n    const cellKey = `${mouseEvent.row}:${mouseEvent.col}:${button}`;\n    if (cellKey === lastMouseCellRef.current) {\n      return;\n    }\n\n    lastMouseCellRef.current = cellKey;\n    event.preventDefault();\n    emitTerminalMouse(mouseEvent);\n  };\n\n  const handleViewportMouseUp = (event: MouseEvent<HTMLDivElement>) => {\n    if (editorProps) {\n      if (!editorSelectionDraggingRef.current) {\n        return;\n      }\n\n      const anchor = editorSelectionAnchorRef.current;\n      const nextOffset = getEditorSelectionOffset(event);\n      editorSelectionDraggingRef.current = false;\n      editorSelectionAnchorRef.current = null;\n\n      if (anchor === null || nextOffset === null) {\n        return;\n      }\n\n      editorSession.setSelection(anchor, nextOffset);\n      event.preventDefault();\n      return;\n    }\n\n    if (!terminalMouseReportingActive) {\n      activeMouseButtonRef.current = \"none\";\n      lastMouseCellRef.current = null;\n      return;\n    }\n\n    const button = toTerminalMouseButton(event.button) ?? activeMouseButtonRef.current;\n    if (button === \"none\") {\n      return;\n    }\n\n    const mouseEvent = buildTerminalMouseEvent(event, \"release\", button);\n    activeMouseButtonRef.current = \"none\";\n    lastMouseCellRef.current = null;\n    if (!mouseEvent) {\n      return;\n    }\n\n    event.preventDefault();\n    emitTerminalMouse(mouseEvent);\n  };\n\n  const handleViewportDoubleClick = (event: MouseEvent<HTMLDivElement>) => {\n    if (!editorProps) {\n      return;\n    }\n\n    const nextOffset = getEditorSelectionOffset(event);\n    if (nextOffset === null) {\n      return;\n    }\n\n    editorSelectionDraggingRef.current = false;\n    editorSelectionAnchorRef.current = null;\n    editorSession.selectWordAt(nextOffset);\n    focusInput();\n    event.preventDefault();\n  };\n\n  const handleViewportContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n    if (terminalMouseReportingActive) {\n      event.preventDefault();\n    }\n  };\n\n  const handleViewportWheel = (event: WheelEvent<HTMLDivElement>) => {\n    if (\n      props.mode === \"terminal\" &&\n      terminalMouseReportingActive &&\n      !localScrollbackWhenMouseActive\n    ) {\n      const mouseEvent = buildWheelTerminalMouseEvent(event);\n      if (mouseEvent && emitTerminalMouse(mouseEvent)) {\n        event.preventDefault();\n      }\n      return;\n    }\n\n    if (\n      (props.mode === \"terminal\" || props.mode === \"prompt\") &&\n      bufferViewport.handleWheelDelta(event.deltaY)\n    ) {\n      event.preventDefault();\n    }\n  };\n\n  const inlineStyle = {\n    \"--retro-screen-rows\": `${geometry.rows}`,\n    \"--retro-screen-cols\": `${geometry.cols}`,\n    ...getDisplayModeRootVars(displayColorMode, displaySurfaceMode, props.color),\n    ...getDisplayPaddingVars(props.displayPadding),\n    ...getDisplayTypographyVars(props.displayFontScale, props.displayRowScale),\n    ...cssVars,\n    ...props.style,\n    ...resizablePanel.inlineSizeStyle\n  } as CSSProperties;\n\n  return (\n    <div\n      ref={resizablePanel.rootRef}\n      className={joinClassNames(\"retro-screen\", props.className)}\n      style={inlineStyle}\n      data-mode={props.mode}\n      data-cursor-mode={renderModel.cursor?.mode ?? cursorMode}\n      data-rows={geometry.rows}\n      data-cols={geometry.cols}\n      data-grid-mode={props.gridMode ?? \"auto\"}\n      data-display-color-mode={displayColorMode}\n      data-display-surface-mode={displaySurfaceMode}\n      data-focus-glow={focusGlow ? \"true\" : \"false\"}\n      data-focused={focused ? \"true\" : \"false\"}\n      data-resizable={resizablePanel.isResizable ? \"true\" : undefined}\n      data-resizable-mode={resizablePanel.isResizable ? resizablePanel.resizeMode : undefined}\n      data-resizable-leading-edges={resizablePanel.hasLeadingHandles ? \"true\" : undefined}\n      data-resizing={resizablePanel.isResizing ? \"true\" : undefined}\n      data-placeholder={renderModel.isDimmed ? \"true\" : \"false\"}\n      data-buffer-offset={bufferViewport.viewportState.scrollOffset}\n      data-buffer-max-offset={bufferViewport.viewportState.maxScrollOffset}\n      data-auto-follow={bufferViewport.viewportState.autoFollow ? \"true\" : \"false\"}\n      data-terminal-mouse-tracking={props.mode === \"terminal\" ? terminalSnapshot.modes.mouseTrackingMode : undefined}\n      data-terminal-mouse-protocol={props.mode === \"terminal\" ? terminalSnapshot.modes.mouseProtocol : undefined}\n      data-terminal-alternate-screen={\n        props.mode === \"terminal\" ? (terminalSnapshot.modes.alternateScreenBufferMode ? \"true\" : \"false\") : undefined\n      }\n      data-session-state={props.mode === \"terminal\" ? sessionState : undefined}\n      data-session-title={props.mode === \"terminal\" ? sessionTitle ?? undefined : undefined}\n      data-session-bell-count={props.mode === \"terminal\" ? String(sessionBellCount) : undefined}\n    >\n      <div className=\"retro-screen__bezel\" aria-hidden=\"true\" />\n      <RetroScreenDisplay\n        mode={props.mode}\n        renderModel={renderModel}\n        displayColorMode={displayColorMode}\n        displaySurfaceMode={displaySurfaceMode}\n        screenRef={screenRef}\n        probeRef={probeRef}\n        viewportRef={viewportRef}\n        onViewportClick={focusInput}\n        onViewportFocus={\n          props.mode === \"terminal\"\n            ? () => {\n                setFocused(true);\n                maybeEmitFocusReport(true);\n                props.onFocusChange?.(true);\n              }\n            : undefined\n        }\n        onViewportBlur={\n          props.mode === \"terminal\"\n            ? () => {\n                setFocused(false);\n                maybeEmitFocusReport(false);\n                props.onFocusChange?.(false);\n              }\n            : undefined\n        }\n        onViewportPaste={props.mode === \"terminal\" ? handleViewportPaste : undefined}\n        onViewportKeyDown={handleViewportKeyDown}\n        onViewportKeyUp={handleViewportKeyUp}\n        onViewportMouseDown={\n          props.mode === \"terminal\" || props.mode === \"editor\" ? handleViewportMouseDown : undefined\n        }\n        onViewportMouseMove={\n          props.mode === \"terminal\" || props.mode === \"editor\" ? handleViewportMouseMove : undefined\n        }\n        onViewportMouseUp={\n          props.mode === \"terminal\" || props.mode === \"editor\" ? handleViewportMouseUp : undefined\n        }\n        onViewportDoubleClick={props.mode === \"editor\" ? handleViewportDoubleClick : undefined}\n        onViewportContextMenu={props.mode === \"terminal\" ? handleViewportContextMenu : undefined}\n        onViewportWheel={handleViewportWheel}\n        viewportTabIndex={props.mode === \"terminal\" && terminalFocusable ? 0 : undefined}\n      >\n        <RetroScreenInputOverlay\n          inputRef={inputRef}\n          visible={\n            props.mode === \"prompt\" ||\n            props.mode === \"editor\" ||\n            (props.mode === \"value\" && Boolean(props.editable))\n          }\n          value={\n            promptProps\n              ? promptProps.value ?? promptDraft\n              : editorProps\n                ? editorState.value\n                : valueProps?.value ?? \"\"\n          }\n          style={editorProps ? { pointerEvents: \"none\" } : undefined}\n          onFocus={() => {\n            if (promptProps) {\n              promptSession.setFocused(true);\n              promptSession.setSelection(\n                clampSelection(\n                  inputRef.current?.selectionStart ?? inputRef.current?.value.length ?? 0,\n                  inputRef.current?.value ?? \"\"\n                )\n              );\n            } else if (editorProps) {\n              setFocused(true);\n              if (!editorSelectionDraggingRef.current) {\n                editorSession.setSelection(\n                  clampSelection(\n                    inputRef.current?.selectionStart ?? inputRef.current?.value.length ?? 0,\n                    inputRef.current?.value ?? \"\"\n                  ),\n                  clampSelection(\n                    inputRef.current?.selectionEnd ?? inputRef.current?.value.length ?? 0,\n                    inputRef.current?.value ?? \"\"\n                  )\n                );\n              }\n            } else {\n              setFocused(true);\n              setSelectionStart(\n                clampSelection(\n                  inputRef.current?.selectionStart ?? inputRef.current?.value.length ?? 0,\n                  inputRef.current?.value ?? \"\"\n                )\n              );\n            }\n            props.onFocusChange?.(true);\n          }}\n          onBlur={() => {\n            if (promptProps) {\n              promptSession.setFocused(false);\n            } else if (editorProps) {\n              setFocused(false);\n            } else {\n              setFocused(false);\n            }\n            props.onFocusChange?.(false);\n          }}\n          onSelect={syncSelection}\n          onKeyUp={syncSelection}\n          onMouseUp={syncSelection}\n          onKeyDown={handleKeyDown}\n          onCopy={props.mode === \"editor\" ? handleEditorCopy : undefined}\n          onCut={props.mode === \"editor\" ? handleEditorCut : undefined}\n          onPaste={props.mode === \"editor\" ? handleEditorPaste : undefined}\n          onInput={\n            props.mode === \"prompt\"\n              ? handlePromptInput\n              : props.mode === \"editor\"\n                ? handleEditorInput\n                : handleValueInput\n          }\n          spellCheck={false}\n          readOnly={props.mode === \"editor\" ? !editorProps?.editable : undefined}\n          autoCapitalize=\"off\"\n          autoCorrect=\"off\"\n          aria-label={\n            props.mode === \"prompt\"\n              ? \"RetroScreen prompt\"\n              : props.mode === \"editor\"\n                ? \"RetroScreen editor\"\n                : \"RetroScreen input\"\n          }\n        />\n      </RetroScreenDisplay>\n      {resizablePanel.isResizable ? (\n        <>\n          {resizablePanel.resizeMode === \"width\" || resizablePanel.resizeMode === \"both\" ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--width\"\n              data-resize-handle=\"right\"\n              data-active={resizablePanel.activeHandle === \"right\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"right\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {resizablePanel.resizeMode === \"height\" || resizablePanel.resizeMode === \"both\" ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--height\"\n              data-resize-handle=\"bottom\"\n              data-active={resizablePanel.activeHandle === \"bottom\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"bottom\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {resizablePanel.resizeMode === \"both\" ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--corner\"\n              data-resize-handle=\"bottom-right\"\n              data-active={resizablePanel.activeHandle === \"bottom-right\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"bottom-right\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {resizablePanel.hasLeadingHandles &&\n          (resizablePanel.resizeMode === \"width\" || resizablePanel.resizeMode === \"both\") ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--left\"\n              data-resize-handle=\"left\"\n              data-active={resizablePanel.activeHandle === \"left\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"left\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {resizablePanel.hasLeadingHandles &&\n          (resizablePanel.resizeMode === \"height\" || resizablePanel.resizeMode === \"both\") ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--top\"\n              data-resize-handle=\"top\"\n              data-active={resizablePanel.activeHandle === \"top\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"top\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {resizablePanel.hasLeadingHandles && resizablePanel.resizeMode === \"both\" ? (\n            <div\n              className=\"retro-screen__resize-handle retro-screen__resize-handle--top-left\"\n              data-resize-handle=\"top-left\"\n              data-active={resizablePanel.activeHandle === \"top-left\" ? \"true\" : undefined}\n              onMouseDown={resizablePanel.beginResize(\"top-left\")}\n              aria-hidden=\"true\"\n            />\n          ) : null}\n        </>\n      ) : null}\n    </div>\n  );\n}\n","import type { RetroScreenTerminalHostKeyEvent } from \"./host-adapter\";\n\nconst ESC = \"\\u001b\";\nconst DEL = \"\\u007f\";\n\nexport type RetroScreenTerminalInputEncodingOptions = {\n  applicationCursorKeysMode?: boolean;\n};\n\nconst TILDE_KEY_CODES: Record<string, number> = {\n  Insert: 2,\n  Delete: 3,\n  PageUp: 5,\n  PageDown: 6,\n  F5: 15,\n  F6: 17,\n  F7: 18,\n  F8: 19,\n  F9: 20,\n  F10: 21,\n  F11: 23,\n  F12: 24\n};\n\nconst CSI_CURSOR_KEYS: Record<string, string> = {\n  ArrowUp: \"A\",\n  ArrowDown: \"B\",\n  ArrowRight: \"C\",\n  ArrowLeft: \"D\",\n  Home: \"H\",\n  End: \"F\"\n};\n\nconst SS3_FUNCTION_KEYS: Record<string, string> = {\n  F1: \"P\",\n  F2: \"Q\",\n  F3: \"R\",\n  F4: \"S\"\n};\n\nconst isPrintableKey = (key: string) => key.length === 1;\n\nconst getModifierParameter = (event: RetroScreenTerminalHostKeyEvent) => {\n  let value = 1;\n\n  if (event.shiftKey) {\n    value += 1;\n  }\n\n  if (event.altKey) {\n    value += 2;\n  }\n\n  if (event.ctrlKey) {\n    value += 4;\n  }\n\n  return value;\n};\n\nconst encodeModifiedCursorKey = (final: string, modifier: number) =>\n  `${ESC}[1;${modifier}${final}`;\n\nconst encodeModifiedTildeKey = (code: number, modifier: number) =>\n  `${ESC}[${code};${modifier}~`;\n\nconst normalizeMetaBehavior = (event: RetroScreenTerminalHostKeyEvent) =>\n  event.metaKey && !event.altKey && !event.ctrlKey;\n\nconst encodeCtrlPrintableKey = (key: string) => {\n  const normalized = key.toUpperCase();\n\n  if (normalized >= \"A\" && normalized <= \"Z\") {\n    return String.fromCharCode(normalized.charCodeAt(0) - 64);\n  }\n\n  switch (key) {\n    case \"@\":\n    case \" \":\n      return \"\\u0000\";\n    case \"[\":\n      return ESC;\n    case \"\\\\\":\n      return \"\\u001c\";\n    case \"]\":\n      return \"\\u001d\";\n    case \"^\":\n      return \"\\u001e\";\n    case \"_\":\n    case \"/\":\n      return \"\\u001f\";\n    case \"?\":\n      return DEL;\n    default:\n      return null;\n  }\n};\n\nexport const encodeRetroScreenTerminalInput = (\n  event: RetroScreenTerminalHostKeyEvent,\n  options: RetroScreenTerminalInputEncodingOptions = {}\n): string | null => {\n  if (normalizeMetaBehavior(event)) {\n    return null;\n  }\n\n  const modifier = getModifierParameter(event);\n  const altPrefix = event.altKey && modifier === (event.ctrlKey ? 7 : event.shiftKey ? 4 : 3);\n\n  if (isPrintableKey(event.key)) {\n    const ctrlEncoded = event.ctrlKey ? encodeCtrlPrintableKey(event.key) : event.key;\n\n    if (!ctrlEncoded) {\n      return null;\n    }\n\n    return event.altKey ? `${ESC}${ctrlEncoded}` : ctrlEncoded;\n  }\n\n  switch (event.key) {\n    case \"Enter\":\n      return event.altKey ? `${ESC}\\r` : \"\\r\";\n    case \"Backspace\":\n      return event.altKey ? `${ESC}${DEL}` : DEL;\n    case \"Tab\":\n      if (event.shiftKey || modifier > 1) {\n        return modifier > 1 ? `${ESC}[1;${modifier}Z` : `${ESC}[Z`;\n      }\n      return event.altKey ? `${ESC}\\t` : \"\\t\";\n    case \"Escape\":\n      return `${ESC}${event.altKey ? ESC : \"\"}`;\n    default:\n      break;\n  }\n\n  const cursorFinal = CSI_CURSOR_KEYS[event.key];\n  if (cursorFinal) {\n    if (options.applicationCursorKeysMode && modifier === 1) {\n      return `${ESC}O${cursorFinal}`;\n    }\n\n    return modifier > 1 ? encodeModifiedCursorKey(cursorFinal, modifier) : `${ESC}[${cursorFinal}`;\n  }\n\n  const tildeCode = TILDE_KEY_CODES[event.key];\n  if (tildeCode) {\n    return modifier > 1 ? encodeModifiedTildeKey(tildeCode, modifier) : `${ESC}[${tildeCode}~`;\n  }\n\n  const ss3Key = SS3_FUNCTION_KEYS[event.key];\n  if (ss3Key) {\n    return modifier > 1 ? `${ESC}[1;${modifier}${ss3Key}` : `${ESC}O${ss3Key}`;\n  }\n\n  if (event.ctrlKey) {\n    switch (event.key) {\n      case \"2\":\n        return \"\\u0000\";\n      case \"6\":\n        return \"\\u001e\";\n      case \"-\":\n        return \"\\u001f\";\n      default:\n        break;\n    }\n  }\n\n  return altPrefix ? `${ESC}${event.key}` : null;\n};\n","import type {\n  RetroScreenTerminalMouseProtocol,\n  RetroScreenTerminalMouseTrackingMode\n} from \"./types\";\n\nconst ESC = \"\\u001b\";\nconst SHIFT_MODIFIER = 4;\nconst META_MODIFIER = 8;\nconst CTRL_MODIFIER = 16;\nconst MOTION_MODIFIER = 32;\nconst WHEEL_MODIFIER = 64;\n\nexport type RetroScreenTerminalMouseButton =\n  | \"left\"\n  | \"middle\"\n  | \"right\"\n  | \"wheel-up\"\n  | \"wheel-down\"\n  | \"none\";\n\nexport type RetroScreenTerminalMouseAction = \"press\" | \"release\" | \"move\" | \"wheel\";\n\nexport type RetroScreenTerminalMouseEvent = {\n  action: RetroScreenTerminalMouseAction;\n  button: RetroScreenTerminalMouseButton;\n  row: number;\n  col: number;\n  altKey: boolean;\n  ctrlKey: boolean;\n  metaKey: boolean;\n  shiftKey: boolean;\n};\n\nexport type RetroScreenTerminalMouseEncodingOptions = {\n  protocol?: RetroScreenTerminalMouseProtocol;\n  trackingMode?: RetroScreenTerminalMouseTrackingMode;\n};\n\nconst clampCoordinate = (value: number) =>\n  Math.max(1, Number.isFinite(value) ? Math.floor(value) : 1);\n\nconst getModifierBits = (event: RetroScreenTerminalMouseEvent) =>\n  (event.shiftKey ? SHIFT_MODIFIER : 0) +\n  (event.altKey || event.metaKey ? META_MODIFIER : 0) +\n  (event.ctrlKey ? CTRL_MODIFIER : 0);\n\nconst getButtonCode = (\n  button: RetroScreenTerminalMouseButton,\n  action: RetroScreenTerminalMouseAction\n) => {\n  switch (button) {\n    case \"left\":\n      return 0;\n    case \"middle\":\n      return 1;\n    case \"right\":\n      return 2;\n    case \"none\":\n      return action === \"move\" ? 3 : null;\n    case \"wheel-up\":\n      return WHEEL_MODIFIER;\n    case \"wheel-down\":\n      return WHEEL_MODIFIER + 1;\n    default:\n      return null;\n  }\n};\n\nconst supportsMotion = (trackingMode: RetroScreenTerminalMouseTrackingMode) =>\n  trackingMode === \"drag\" || trackingMode === \"any\";\n\nconst shouldEncodeEvent = (\n  event: RetroScreenTerminalMouseEvent,\n  trackingMode: RetroScreenTerminalMouseTrackingMode\n) => {\n  switch (event.action) {\n    case \"press\":\n    case \"release\":\n      return trackingMode !== \"none\";\n    case \"wheel\":\n      return trackingMode !== \"none\";\n    case \"move\":\n      if (!supportsMotion(trackingMode)) {\n        return false;\n      }\n\n      return trackingMode === \"any\" || event.button !== \"none\";\n    default:\n      return false;\n  }\n};\n\nexport const encodeRetroScreenTerminalMouse = (\n  event: RetroScreenTerminalMouseEvent,\n  options: RetroScreenTerminalMouseEncodingOptions = {}\n): string | null => {\n  const protocol = options.protocol ?? \"none\";\n  const trackingMode = options.trackingMode ?? \"none\";\n\n  if (protocol !== \"sgr\" || !shouldEncodeEvent(event, trackingMode)) {\n    return null;\n  }\n\n  const buttonCode = getButtonCode(event.button, event.action);\n  if (buttonCode === null) {\n    return null;\n  }\n\n  const modifiers = getModifierBits(event);\n  const motion = event.action === \"move\" ? MOTION_MODIFIER : 0;\n  const encodedButton = buttonCode + modifiers + motion;\n  const final =\n    event.action === \"release\" && event.button !== \"wheel-up\" && event.button !== \"wheel-down\"\n      ? \"m\"\n      : \"M\";\n\n  return `${ESC}[<${encodedButton};${clampCoordinate(event.col)};${clampCoordinate(event.row)}${final}`;\n};\n","export type RetroScreenTerminalPasteEncodingOptions = {\n  bracketedPasteMode?: boolean;\n};\n\nexport const encodeRetroScreenTerminalPaste = (\n  text: string,\n  options: RetroScreenTerminalPasteEncodingOptions = {}\n) => {\n  if (!options.bracketedPasteMode) {\n    return text;\n  }\n\n  return `\\u001b[200~${text}\\u001b[201~`;\n};\n\nexport const encodeRetroScreenTerminalFocusReport = (focused: boolean) =>\n  focused ? \"\\u001b[I\" : \"\\u001b[O\";\n","export type WrapTextOptions = {\n  cols: number;\n  tabWidth?: number;\n};\n\nexport type WrappedTextCell = {\n  char: string;\n  sourceOffset: number;\n};\n\nconst clampCols = (cols: number) => Math.max(1, Math.floor(cols) || 1);\n\nexport const wrapTextToCellRows = (text: string, options: WrapTextOptions) => {\n  const cols = clampCols(options.cols);\n  const tabWidth = Math.max(1, Math.floor(options.tabWidth ?? 4) || 4);\n  const rows: WrappedTextCell[][] = [[]];\n  let col = 0;\n  let sourceOffset = 0;\n\n  const pushLine = () => {\n    rows.push([]);\n    col = 0;\n  };\n\n  const appendChar = (character: string, nextSourceOffset: number) => {\n    if (col >= cols) {\n      pushLine();\n    }\n\n    rows[rows.length - 1].push({\n      char: character,\n      sourceOffset: nextSourceOffset\n    });\n    col += 1;\n  };\n\n  for (const character of text) {\n    const characterOffset = sourceOffset;\n    sourceOffset += character.length;\n\n    if (character === \"\\n\") {\n      pushLine();\n      continue;\n    }\n\n    if (character === \"\\r\") {\n      rows[rows.length - 1] = [];\n      col = 0;\n      continue;\n    }\n\n    if (character === \"\\t\") {\n      const spaces = tabWidth - (col % tabWidth || 0);\n\n      for (let index = 0; index < spaces; index += 1) {\n        appendChar(\" \", characterOffset);\n      }\n\n      continue;\n    }\n\n    appendChar(character, characterOffset);\n  }\n\n  return rows;\n};\n\nexport const wrapTextToColumns = (text: string, options: WrapTextOptions) =>\n  wrapTextToCellRows(text, options).map((row) => row.map((cell) => cell.char).join(\"\"));\n","export type RetroScreenTextSelection = {\n  start: number;\n  end: number;\n};\n\nconst WORD_CHARACTER_PATTERN = /[\\p{L}\\p{N}_]/u;\n\nexport const clampRetroScreenTextOffset = (value: number, textLength: number) => {\n  const nextValue = Math.floor(Number.isFinite(value) ? value : 0);\n  return Math.max(0, Math.min(textLength, nextValue));\n};\n\nconst isWordCharacter = (character: string) => WORD_CHARACTER_PATTERN.test(character);\n\nexport const normalizeRetroScreenTextSelection = (\n  selection: RetroScreenTextSelection,\n  textLength: number\n): RetroScreenTextSelection => {\n  const start = clampRetroScreenTextOffset(selection.start, textLength);\n  const end = clampRetroScreenTextOffset(selection.end, textLength);\n\n  if (start <= end) {\n    return { start, end };\n  }\n\n  return {\n    start: end,\n    end: start\n  };\n};\n\nexport const createRetroScreenTextSelection = (\n  start: number,\n  end = start,\n  textLength = Number.MAX_SAFE_INTEGER\n): RetroScreenTextSelection =>\n  normalizeRetroScreenTextSelection(\n    {\n      start,\n      end\n    },\n    textLength\n  );\n\nexport const findRetroScreenPreviousWordBoundary = (value: string, offset: number) => {\n  let index = clampRetroScreenTextOffset(offset, value.length);\n\n  while (index > 0 && !isWordCharacter(value[index - 1] ?? \"\")) {\n    index -= 1;\n  }\n\n  while (index > 0 && isWordCharacter(value[index - 1] ?? \"\")) {\n    index -= 1;\n  }\n\n  return index;\n};\n\nexport const findRetroScreenNextWordBoundary = (value: string, offset: number) => {\n  let index = clampRetroScreenTextOffset(offset, value.length);\n\n  while (index < value.length && !isWordCharacter(value[index] ?? \"\")) {\n    index += 1;\n  }\n\n  while (index < value.length && isWordCharacter(value[index] ?? \"\")) {\n    index += 1;\n  }\n\n  return index;\n};\n\nexport const getRetroScreenWordSelectionAtOffset = (\n  value: string,\n  offset: number\n): RetroScreenTextSelection => {\n  if (value.length === 0) {\n    return {\n      start: 0,\n      end: 0\n    };\n  }\n\n  const clampedOffset = clampRetroScreenTextOffset(offset, value.length);\n  const currentCharacter =\n    clampedOffset < value.length ? value[clampedOffset] ?? \"\" : \"\";\n  const previousCharacter = clampedOffset > 0 ? value[clampedOffset - 1] ?? \"\" : \"\";\n\n  if (!isWordCharacter(currentCharacter) && !isWordCharacter(previousCharacter)) {\n    return {\n      start: clampedOffset,\n      end: clampedOffset\n    };\n  }\n\n  const seedOffset =\n    clampedOffset < value.length && isWordCharacter(currentCharacter)\n      ? clampedOffset\n      : clampedOffset - 1;\n\n  const start = findRetroScreenPreviousWordBoundary(value, seedOffset + 1);\n  const end = findRetroScreenNextWordBoundary(value, seedOffset);\n\n  return {\n    start,\n    end\n  };\n};\n\nexport const isRetroScreenTextSelectionCollapsed = (selection: RetroScreenTextSelection) =>\n  selection.start === selection.end;\n\nexport const collapseRetroScreenTextSelectionToStart = (\n  selection: RetroScreenTextSelection\n): RetroScreenTextSelection => ({\n  start: selection.start,\n  end: selection.start\n});\n\nexport const collapseRetroScreenTextSelectionToEnd = (\n  selection: RetroScreenTextSelection\n): RetroScreenTextSelection => ({\n  start: selection.end,\n  end: selection.end\n});\n\nexport const deleteRetroScreenSelectedText = (\n  value: string,\n  selection: RetroScreenTextSelection\n): {\n  value: string;\n  selection: RetroScreenTextSelection;\n  deletedText: string;\n} => {\n  const normalized = normalizeRetroScreenTextSelection(selection, value.length);\n  const deletedText = value.slice(normalized.start, normalized.end);\n  const nextValue = `${value.slice(0, normalized.start)}${value.slice(normalized.end)}`;\n  const nextSelection = collapseRetroScreenTextSelectionToStart(normalized);\n\n  return {\n    value: nextValue,\n    selection: nextSelection,\n    deletedText\n  };\n};\n\nexport const replaceRetroScreenSelectedText = (\n  value: string,\n  selection: RetroScreenTextSelection,\n  replacement: string\n): {\n  value: string;\n  selection: RetroScreenTextSelection;\n  deletedText: string;\n} => {\n  const normalized = normalizeRetroScreenTextSelection(selection, value.length);\n  const deletedText = value.slice(normalized.start, normalized.end);\n  const nextValue = `${value.slice(0, normalized.start)}${replacement}${value.slice(normalized.end)}`;\n  const nextOffset = normalized.start + replacement.length;\n\n  return {\n    value: nextValue,\n    selection: {\n      start: nextOffset,\n      end: nextOffset\n    },\n    deletedText\n  };\n};\n","import type { RetroScreenCell } from \"../terminal/types\";\nimport type { RetroScreenAnsiMetadata } from \"./player\";\n\nexport type RetroScreenAnsiGeometrySource = \"sauce\" | \"fallback\";\nexport type RetroScreenAnsiSnapshotStorageMode = \"eager\" | \"sparse\";\n\nexport type RetroScreenAnsiGeometryPolicy = {\n  fallbackRows: number;\n  fallbackCols: number;\n  viewportRows: number;\n  viewportCols: number;\n  eagerMaxCells: number;\n  eagerMaxRows: number;\n  eagerMaxCols: number;\n  maxDimension: number;\n};\n\nexport type RetroScreenAnsiSourceGeometry = {\n  rows: number;\n  cols: number;\n  totalCells: number;\n  geometrySource: RetroScreenAnsiGeometrySource;\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n  metadata: RetroScreenAnsiMetadata | null;\n};\n\nexport type RetroScreenAnsiViewportWindow = {\n  rowOffset: number;\n  colOffset: number;\n  rows: number;\n  cols: number;\n  maxRowOffset: number;\n  maxColOffset: number;\n};\n\nexport type RetroScreenAnsiLineSliceAccessor = (\n  rowIndex: number,\n  startCol: number,\n  endCol: number\n) => string;\n\nexport type RetroScreenAnsiCellSliceAccessor = (\n  rowIndex: number,\n  startCol: number,\n  endCol: number\n) => RetroScreenCell[];\n\nexport type RetroScreenAnsiFrameSnapshot = {\n  sourceRows: number;\n  sourceCols: number;\n  frameIndex: number;\n  frameCount: number;\n  isComplete: boolean;\n  isStreaming: boolean;\n  storageMode?: RetroScreenAnsiSnapshotStorageMode;\n  lines: string[];\n  cells?: RetroScreenCell[][];\n  metadata?: RetroScreenAnsiMetadata | null;\n  getLineSlice?: RetroScreenAnsiLineSliceAccessor;\n  getCellSlice?: RetroScreenAnsiCellSliceAccessor;\n};\n\nexport const DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY: Readonly<RetroScreenAnsiGeometryPolicy> =\n  Object.freeze({\n    fallbackRows: 25,\n    fallbackCols: 80,\n    viewportRows: 25,\n    viewportCols: 80,\n    eagerMaxCells: 2_000_000,\n    eagerMaxRows: 4_096,\n    eagerMaxCols: 4_096,\n    maxDimension: 65_535,\n  });\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nconst normalizePositiveInteger = (\n  value: number | null | undefined,\n  fallback: number,\n  max: number,\n) => {\n  const parsed = Math.floor(Number(value ?? Number.NaN));\n\n  if (!Number.isFinite(parsed) || parsed <= 0) {\n    return fallback;\n  }\n\n  return clamp(parsed, 1, max);\n};\n\nconst hasFinitePositiveGeometry = (value: number | null | undefined) => {\n  const parsed = Number(value ?? Number.NaN);\n  return Number.isFinite(parsed) && parsed > 0;\n};\n\nexport const resolveRetroScreenAnsiSourceGeometry = ({\n  metadata,\n  policy = DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY,\n}: {\n  metadata?: RetroScreenAnsiMetadata | null;\n  policy?: RetroScreenAnsiGeometryPolicy;\n} = {}): RetroScreenAnsiSourceGeometry => {\n  const rows = normalizePositiveInteger(metadata?.height, policy.fallbackRows, policy.maxDimension);\n  const cols = normalizePositiveInteger(metadata?.width, policy.fallbackCols, policy.maxDimension);\n  const totalCells = rows * cols;\n  const geometrySource =\n    hasFinitePositiveGeometry(metadata?.height) || hasFinitePositiveGeometry(metadata?.width)\n      ? \"sauce\"\n      : \"fallback\";\n\n  return {\n    rows,\n    cols,\n    totalCells,\n    geometrySource,\n    storageMode:\n      totalCells > policy.eagerMaxCells ||\n      rows > policy.eagerMaxRows ||\n      cols > policy.eagerMaxCols\n        ? \"sparse\"\n        : \"eager\",\n    metadata: metadata ?? null,\n  };\n};\n\nexport const normalizeRetroScreenAnsiViewportWindow = ({\n  sourceRows,\n  sourceCols,\n  rowOffset = 0,\n  colOffset = 0,\n  rows = DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY.viewportRows,\n  cols = DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY.viewportCols,\n}: {\n  sourceRows: number;\n  sourceCols: number;\n  rowOffset?: number;\n  colOffset?: number;\n  rows?: number;\n  cols?: number;\n}): RetroScreenAnsiViewportWindow => {\n  const normalizedRows = Math.max(1, Math.floor(rows || DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY.viewportRows));\n  const normalizedCols = Math.max(1, Math.floor(cols || DEFAULT_RETROSCREEN_ANSI_GEOMETRY_POLICY.viewportCols));\n  const normalizedSourceRows = Math.max(1, Math.floor(sourceRows || normalizedRows));\n  const normalizedSourceCols = Math.max(1, Math.floor(sourceCols || normalizedCols));\n  const maxRowOffset = Math.max(0, normalizedSourceRows - normalizedRows);\n  const maxColOffset = Math.max(0, normalizedSourceCols - normalizedCols);\n\n  return {\n    rowOffset: clamp(Math.floor(rowOffset || 0), 0, maxRowOffset),\n    colOffset: clamp(Math.floor(colOffset || 0), 0, maxColOffset),\n    rows: normalizedRows,\n    cols: normalizedCols,\n    maxRowOffset,\n    maxColOffset,\n  };\n};\n","import type { RetroScreenTerminalCommand } from \"./commands\";\n\nexport type RetroScreenAnsiParserHandlers = {\n  command: (command: RetroScreenTerminalCommand) => void;\n};\n\ntype ParserState = \"text\" | \"escape\" | \"csi\";\n\nconst isCsiPrefixCharacter = (character: string) => /[<=>?]/u.test(character);\n\nconst isCsiParamCharacter = (character: string) => /[0-9;]/u.test(character);\n\nconst isCsiIntermediateCharacter = (character: string) =>\n  character >= \"\\u0020\" && character <= \"\\u002f\";\n\nconst isEscIntermediateCharacter = (character: string) =>\n  character >= \"\\u0020\" && character <= \"\\u002f\";\n\nconst isEscFinalCharacter = (character: string) =>\n  character >= \"\\u0030\" && character <= \"\\u007e\";\n\nconst parseParams = (value: string) => {\n  if (!value) {\n    return [];\n  }\n\n  return value\n    .split(\";\")\n    .map((segment) => {\n      const parsed = Number.parseInt(segment, 10);\n      return Number.isFinite(parsed) ? parsed : 0;\n    });\n};\n\nconst firstParam = (params: number[], fallback = 1) => {\n  const value = params[0];\n  return value && value > 0 ? value : fallback;\n};\n\nexport class RetroScreenAnsiParser {\n  private state: ParserState = \"text\";\n  private escIntermediateBuffer = \"\";\n  private csiPrefixBuffer = \"\";\n  private csiParamBuffer = \"\";\n  private csiIntermediateBuffer = \"\";\n\n  constructor(private readonly handlers: RetroScreenAnsiParserHandlers) {}\n\n  feed(data: string) {\n    for (const character of data) {\n      this.feedCharacter(character);\n    }\n  }\n\n  reset() {\n    this.state = \"text\";\n    this.escIntermediateBuffer = \"\";\n    this.csiPrefixBuffer = \"\";\n    this.csiParamBuffer = \"\";\n    this.csiIntermediateBuffer = \"\";\n  }\n\n  private feedCharacter(character: string) {\n    switch (this.state) {\n      case \"text\":\n        this.feedTextCharacter(character);\n        return;\n      case \"escape\":\n        this.feedEscapeCharacter(character);\n        return;\n      case \"csi\":\n        this.feedCsiCharacter(character);\n        return;\n    }\n  }\n\n  private feedTextCharacter(character: string) {\n    switch (character) {\n      case \"\\u001b\":\n        this.state = \"escape\";\n        this.escIntermediateBuffer = \"\";\n        return;\n      case \"\\n\":\n        this.handlers.command({ type: \"lineFeed\" });\n        return;\n      case \"\\r\":\n        this.handlers.command({ type: \"carriageReturn\" });\n        return;\n      case \"\\b\":\n        this.handlers.command({ type: \"backspace\" });\n        return;\n      case \"\\t\":\n        this.handlers.command({ type: \"tab\" });\n        return;\n      case \"\\f\":\n        this.handlers.command({ type: \"formFeed\" });\n        return;\n      case \"\\u0007\":\n        this.handlers.command({ type: \"bell\" });\n        return;\n      default:\n        this.handlers.command({ type: \"print\", char: character });\n    }\n  }\n\n  private feedEscapeCharacter(character: string) {\n    if (character === \"[\") {\n      this.state = \"csi\";\n      this.csiPrefixBuffer = \"\";\n      this.csiParamBuffer = \"\";\n      this.csiIntermediateBuffer = \"\";\n      return;\n    }\n\n    if (isEscIntermediateCharacter(character)) {\n      this.escIntermediateBuffer += character;\n      return;\n    }\n\n    if (isEscFinalCharacter(character)) {\n      this.dispatchEscape({\n        final: character,\n        intermediates: this.escIntermediateBuffer || undefined\n      });\n      this.state = \"text\";\n      this.escIntermediateBuffer = \"\";\n      return;\n    }\n\n    this.state = \"text\";\n    this.escIntermediateBuffer = \"\";\n  }\n\n  private feedCsiCharacter(character: string) {\n    if (!this.csiPrefixBuffer && !this.csiParamBuffer && isCsiPrefixCharacter(character)) {\n      this.csiPrefixBuffer = character;\n      return;\n    }\n\n    if (isCsiParamCharacter(character)) {\n      this.csiParamBuffer += character;\n      return;\n    }\n\n    if (isCsiIntermediateCharacter(character)) {\n      this.csiIntermediateBuffer += character;\n      return;\n    }\n\n    this.dispatchCsi(\n      {\n        prefix: this.csiPrefixBuffer || undefined,\n        intermediates: this.csiIntermediateBuffer || undefined,\n        final: character\n      },\n      parseParams(this.csiParamBuffer)\n    );\n    this.state = \"text\";\n    this.csiPrefixBuffer = \"\";\n    this.csiParamBuffer = \"\";\n    this.csiIntermediateBuffer = \"\";\n  }\n\n  private dispatchEscape(identifier: { final: string; intermediates?: string }) {\n    switch (identifier.final) {\n      case \"7\":\n        this.handlers.command({ type: \"saveCursor\", source: \"dec\" });\n        return;\n      case \"8\":\n        this.handlers.command({ type: \"restoreCursor\", source: \"dec\" });\n        return;\n      case \"D\":\n        this.handlers.command({ type: \"index\" });\n        return;\n      case \"E\":\n        this.handlers.command({ type: \"nextLine\" });\n        return;\n      case \"M\":\n        this.handlers.command({ type: \"reverseIndex\" });\n        return;\n      case \"c\":\n        this.handlers.command({ type: \"resetToInitialState\" });\n        return;\n      default:\n        this.handlers.command({\n          type: \"unknownEscape\",\n          identifier\n        });\n    }\n  }\n\n  private dispatchCsi(\n    identifier: {\n      prefix?: string;\n      intermediates?: string;\n      final: string;\n    },\n    params: number[]\n  ) {\n    switch (identifier.final) {\n      case \"@\":\n        this.handlers.command({ type: \"insertChars\", count: firstParam(params) });\n        return;\n      case \"A\":\n        this.handlers.command({ type: \"cursorUp\", count: firstParam(params) });\n        return;\n      case \"B\":\n        this.handlers.command({ type: \"cursorDown\", count: firstParam(params) });\n        return;\n      case \"C\":\n        this.handlers.command({ type: \"cursorForward\", count: firstParam(params) });\n        return;\n      case \"D\":\n        this.handlers.command({ type: \"cursorBackward\", count: firstParam(params) });\n        return;\n      case \"L\":\n        this.handlers.command({ type: \"insertLines\", count: firstParam(params) });\n        return;\n      case \"M\":\n        this.handlers.command({ type: \"deleteLines\", count: firstParam(params) });\n        return;\n      case \"P\":\n        this.handlers.command({ type: \"deleteChars\", count: firstParam(params) });\n        return;\n      case \"S\":\n        this.handlers.command({ type: \"scrollUp\", count: firstParam(params) });\n        return;\n      case \"T\":\n        this.handlers.command({ type: \"scrollDown\", count: firstParam(params) });\n        return;\n      case \"H\":\n      case \"f\":\n        this.handlers.command({\n          type: \"cursorPosition\",\n          row: params[0] || 1,\n          col: params[1] || 1\n        });\n        return;\n      case \"r\":\n        this.handlers.command({\n          type: \"setScrollRegion\",\n          top: params[0] || undefined,\n          bottom: params[1] || undefined\n        });\n        return;\n      case \"J\":\n        this.handlers.command({ type: \"eraseInDisplay\", mode: params[0] ?? 0 });\n        return;\n      case \"K\":\n        this.handlers.command({ type: \"eraseInLine\", mode: params[0] ?? 0 });\n        return;\n      case \"s\":\n        this.handlers.command({ type: \"saveCursor\", source: \"ansi\" });\n        return;\n      case \"u\":\n        this.handlers.command({ type: \"restoreCursor\", source: \"ansi\" });\n        return;\n      case \"m\":\n        this.handlers.command({ type: \"setGraphicRendition\", params });\n        return;\n      case \"h\":\n        this.handlers.command({\n          type: \"setMode\",\n          identifier,\n          params\n        });\n        return;\n      case \"l\":\n        this.handlers.command({\n          type: \"resetMode\",\n          identifier,\n          params\n        });\n        return;\n      default:\n        this.handlers.command({\n          type: \"unknownCsi\",\n          identifier,\n          params\n        });\n    }\n  }\n}\n","import type { RetroScreenCellStyle, RetroScreenTerminalColor } from \"./types\";\n\nexport const DEFAULT_TERMINAL_COLOR: RetroScreenTerminalColor = {\n  mode: \"default\",\n  value: 0\n};\n\nexport const cloneColor = (color: RetroScreenTerminalColor): RetroScreenTerminalColor => ({ ...color });\n\nexport const DEFAULT_CELL_STYLE: RetroScreenCellStyle = {\n  intensity: \"normal\",\n  bold: false,\n  faint: false,\n  inverse: false,\n  conceal: false,\n  blink: false,\n  foreground: DEFAULT_TERMINAL_COLOR,\n  background: DEFAULT_TERMINAL_COLOR\n};\n\nexport const cloneStyle = (style: RetroScreenCellStyle): RetroScreenCellStyle => ({\n  ...style,\n  foreground: cloneColor(style.foreground),\n  background: cloneColor(style.background)\n});\n\nconst syncIntensity = (style: RetroScreenCellStyle) => {\n  style.intensity = style.bold ? \"bold\" : style.faint ? \"faint\" : \"normal\";\n};\n\nconst clampColorByte = (value: number) =>\n  Math.max(0, Math.min(255, Number.isFinite(value) ? Math.floor(value) : 0));\n\nconst toRgbColor = (red: number, green: number, blue: number): RetroScreenTerminalColor => ({\n  mode: \"rgb\",\n  value: (clampColorByte(red) << 16) | (clampColorByte(green) << 8) | clampColorByte(blue)\n});\n\nconst toPaletteColor = (value: number): RetroScreenTerminalColor => ({\n  mode: \"palette\",\n  value: Math.max(0, Math.min(255, Number.isFinite(value) ? Math.floor(value) : 0))\n});\n\nconst setExtendedColor = (\n  style: RetroScreenCellStyle,\n  channel: \"foreground\" | \"background\",\n  params: number[],\n  index: number\n) => {\n  const colorMode = params[index + 1];\n\n  if (colorMode === 5) {\n    const paletteIndex = params[index + 2];\n    if (paletteIndex !== undefined) {\n      style[channel] = toPaletteColor(paletteIndex);\n      return index + 2;\n    }\n\n    return index;\n  }\n\n  if (colorMode === 2) {\n    const red = params[index + 2];\n    const green = params[index + 3];\n    const blue = params[index + 4];\n    if (red !== undefined && green !== undefined && blue !== undefined) {\n      style[channel] = toRgbColor(red, green, blue);\n      return index + 4;\n    }\n  }\n\n  return index;\n};\n\nexport const applySgrParameters = (style: RetroScreenCellStyle, params: number[]) => {\n  const nextStyle = cloneStyle(style);\n  const values = params.length > 0 ? params : [0];\n\n  for (let index = 0; index < values.length; index += 1) {\n    const code = values[index];\n\n    switch (code) {\n      case 0:\n        Object.assign(nextStyle, cloneStyle(DEFAULT_CELL_STYLE));\n        break;\n      case 1:\n        nextStyle.bold = true;\n        syncIntensity(nextStyle);\n        break;\n      case 2:\n        nextStyle.faint = true;\n        syncIntensity(nextStyle);\n        break;\n      case 5:\n        nextStyle.blink = true;\n        break;\n      case 7:\n        nextStyle.inverse = true;\n        break;\n      case 8:\n        nextStyle.conceal = true;\n        break;\n      case 22:\n        nextStyle.bold = false;\n        nextStyle.faint = false;\n        syncIntensity(nextStyle);\n        break;\n      case 25:\n        nextStyle.blink = false;\n        break;\n      case 27:\n        nextStyle.inverse = false;\n        break;\n      case 28:\n        nextStyle.conceal = false;\n        break;\n      case 30:\n      case 31:\n      case 32:\n      case 33:\n      case 34:\n      case 35:\n      case 36:\n      case 37:\n        nextStyle.foreground = toPaletteColor(code - 30);\n        break;\n      case 38:\n        index = setExtendedColor(nextStyle, \"foreground\", values, index);\n        break;\n      case 39:\n        nextStyle.foreground = cloneColor(DEFAULT_TERMINAL_COLOR);\n        break;\n      case 40:\n      case 41:\n      case 42:\n      case 43:\n      case 44:\n      case 45:\n      case 46:\n      case 47:\n        nextStyle.background = toPaletteColor(code - 40);\n        break;\n      case 48:\n        index = setExtendedColor(nextStyle, \"background\", values, index);\n        break;\n      case 49:\n        nextStyle.background = cloneColor(DEFAULT_TERMINAL_COLOR);\n        break;\n      case 90:\n      case 91:\n      case 92:\n      case 93:\n      case 94:\n      case 95:\n      case 96:\n      case 97:\n        nextStyle.foreground = toPaletteColor(code - 82);\n        break;\n      case 100:\n      case 101:\n      case 102:\n      case 103:\n      case 104:\n      case 105:\n      case 106:\n      case 107:\n        nextStyle.background = toPaletteColor(code - 92);\n        break;\n      default:\n        break;\n    }\n  }\n\n  return nextStyle;\n};\n","import { RetroScreenAnsiParser } from \"./ansi-parser\";\nimport type { RetroScreenTerminalCommand } from \"./commands\";\nimport {\n  applySgrParameters,\n  cloneStyle,\n  DEFAULT_CELL_STYLE\n} from \"./sgr\";\nimport type { CursorMode } from \"../types\";\nimport type {\n  RetroScreenCell,\n  RetroScreenCellStyle,\n  RetroScreenCursorState,\n  RetroScreenTerminalMouseTrackingMode,\n  RetroScreenTerminalModes,\n  RetroScreenScreenBufferOptions,\n  RetroScreenScreenSnapshot,\n  RetroScreenWriteOptions\n} from \"./types\";\n\nconst clampDimension = (value: number) => Math.max(1, Math.floor(value) || 1);\n\nconst createCell = (character: string, style: RetroScreenCellStyle): RetroScreenCell => ({\n  char: character,\n  style: cloneStyle(style)\n});\n\nconst cloneCell = (cell: RetroScreenCell): RetroScreenCell => createCell(cell.char, cell.style);\n\nconst createBlankLine = (cols: number, style: RetroScreenCellStyle = DEFAULT_CELL_STYLE) =>\n  Array.from({ length: cols }, () => createCell(\" \", style));\n\nconst trimLine = (line: RetroScreenCell[]) =>\n  line\n    .map((cell) => cell.char)\n    .join(\"\")\n    .replace(/\\s+$/u, \"\");\n\nconst cloneGrid = (grid: RetroScreenCell[][]) =>\n  grid.map((line) => line.map((cell) => createCell(cell.char, cell.style)));\n\nconst defaultSavedCursor = () => ({\n  row: 0,\n  col: 0\n});\n\nconst DEFAULT_TERMINAL_MODES: RetroScreenTerminalModes = {\n  insertMode: false,\n  originMode: false,\n  wraparoundMode: true,\n  applicationCursorKeysMode: false,\n  bracketedPasteMode: false,\n  focusReportingMode: false,\n  alternateScreenBufferMode: false,\n  mouseTrackingMode: \"none\",\n  mouseProtocol: \"none\"\n};\n\ntype RetroScreenBufferSurfaceState = {\n  grid: RetroScreenCell[][];\n  scrollbackCells: RetroScreenCell[][];\n  cursorState: RetroScreenCursorState;\n  savedCursorState: {\n    row: number;\n    col: number;\n  };\n  currentStyle: RetroScreenCellStyle;\n  pendingWrap: boolean;\n  scrollRegionTop: number;\n  scrollRegionBottom: number;\n};\n\nexport class RetroScreenScreenBuffer {\n  readonly rows: number;\n  readonly cols: number;\n  readonly scrollbackLimit: number;\n  readonly tabWidth: number;\n  private grid: RetroScreenCell[][];\n  private scrollbackCells: RetroScreenCell[][];\n  private readonly parser: RetroScreenAnsiParser;\n  private cursorState: RetroScreenCursorState;\n  private savedCursorState = defaultSavedCursor();\n  private currentStyle: RetroScreenCellStyle = cloneStyle(DEFAULT_CELL_STYLE);\n  private terminalModes: RetroScreenTerminalModes = { ...DEFAULT_TERMINAL_MODES };\n  private pendingWrap = false;\n  private scrollRegionTop = 0;\n  private scrollRegionBottom: number;\n  private primarySurface: RetroScreenBufferSurfaceState;\n  private alternateSurface: RetroScreenBufferSurfaceState;\n  private activeSurface: \"primary\" | \"alternate\" = \"primary\";\n\n  constructor(options: RetroScreenScreenBufferOptions) {\n    this.rows = clampDimension(options.rows);\n    this.cols = clampDimension(options.cols);\n    this.scrollbackLimit = Math.max(0, Math.floor(options.scrollback ?? 200));\n    this.tabWidth = Math.max(1, Math.floor(options.tabWidth ?? 8));\n    this.primarySurface = this.createSurfaceState({\n      cursorMode: options.cursorMode ?? \"solid\"\n    });\n    this.alternateSurface = this.createSurfaceState({\n      cursorMode: options.cursorMode ?? \"solid\"\n    });\n    this.grid = this.primarySurface.grid;\n    this.scrollbackCells = this.primarySurface.scrollbackCells;\n    this.scrollRegionBottom = this.rows - 1;\n    this.cursorState = { ...this.primarySurface.cursorState };\n    this.savedCursorState = { ...this.primarySurface.savedCursorState };\n    this.currentStyle = cloneStyle(this.primarySurface.currentStyle);\n    this.pendingWrap = this.primarySurface.pendingWrap;\n    this.scrollRegionTop = this.primarySurface.scrollRegionTop;\n    this.scrollRegionBottom = this.primarySurface.scrollRegionBottom;\n    this.parser = new RetroScreenAnsiParser({\n      command: (command) => this.applyCommand(command)\n    });\n  }\n\n  clear() {\n    for (let row = 0; row < this.rows; row += 1) {\n      this.grid[row] = createBlankLine(this.cols, this.currentStyle);\n    }\n\n    this.cursorState = {\n      ...this.cursorState,\n      row: 0,\n      col: 0\n    };\n    this.pendingWrap = false;\n  }\n\n  reset() {\n    this.primarySurface = this.createSurfaceState({\n      cursorMode: \"solid\"\n    });\n    this.alternateSurface = this.createSurfaceState({\n      cursorMode: \"solid\"\n    });\n    this.loadSurface(\"primary\");\n    this.currentStyle = cloneStyle(DEFAULT_CELL_STYLE);\n    this.savedCursorState = defaultSavedCursor();\n    this.terminalModes = { ...DEFAULT_TERMINAL_MODES };\n    this.parser.reset();\n  }\n\n  write(data: string, options?: RetroScreenWriteOptions) {\n    this.parser.feed(data);\n\n    if (options?.appendNewline) {\n      this.carriageReturn();\n      this.lineFeed();\n    }\n  }\n\n  writeln(line: string) {\n    this.write(line);\n    this.carriageReturn();\n    this.lineFeed();\n  }\n\n  moveCursorTo(row: number, col: number) {\n    this.cursorState.row = Math.min(this.rows - 1, Math.max(0, Math.floor(row)));\n    this.cursorState.col = Math.min(this.cols - 1, Math.max(0, Math.floor(col)));\n  }\n\n  setCursorVisible(visible: boolean) {\n    this.cursorState.visible = visible;\n  }\n\n  setCursorMode(mode: CursorMode) {\n    this.cursorState.mode = mode;\n  }\n\n  getCursor() {\n    return { ...this.cursorState };\n  }\n\n  getSnapshot(): RetroScreenScreenSnapshot {\n    const cells = cloneGrid(this.grid);\n    const rawLines = cells.map((line) => line.map((cell) => cell.char).join(\"\"));\n    const scrollbackCells = cloneGrid(this.scrollbackCells);\n\n    return {\n      rows: this.rows,\n      cols: this.cols,\n      rawLines,\n      cells,\n      lines: rawLines.map((line) => line.replace(/\\s+$/u, \"\")),\n      scrollback: scrollbackCells.map((line) => trimLine(line)),\n      scrollbackCells,\n      cursor: this.getCursor(),\n      pendingWrap: this.pendingWrap,\n      modes: { ...this.terminalModes }\n    };\n  }\n\n  private applyCommand(command: RetroScreenTerminalCommand) {\n    switch (command.type) {\n      case \"print\":\n        this.writePrintable(command.char);\n        return;\n      case \"lineFeed\":\n        this.lineFeed();\n        return;\n      case \"carriageReturn\":\n        this.carriageReturn();\n        return;\n      case \"backspace\":\n        this.backspace();\n        return;\n      case \"tab\":\n        this.insertTab();\n        return;\n      case \"formFeed\":\n        this.clear();\n        return;\n      case \"bell\":\n        return;\n      case \"cursorUp\":\n        this.cursorUp(command.count);\n        return;\n      case \"cursorDown\":\n        this.cursorDown(command.count);\n        return;\n      case \"cursorForward\":\n        this.cursorForward(command.count);\n        return;\n      case \"cursorBackward\":\n        this.cursorBackward(command.count);\n        return;\n      case \"cursorPosition\":\n        this.cursorPosition(command.row, command.col);\n        return;\n      case \"insertChars\":\n        this.insertChars(command.count);\n        return;\n      case \"deleteChars\":\n        this.deleteChars(command.count);\n        return;\n      case \"insertLines\":\n        this.insertLines(command.count);\n        return;\n      case \"deleteLines\":\n        this.deleteLines(command.count);\n        return;\n      case \"scrollUp\":\n        this.scrollUp(command.count);\n        return;\n      case \"scrollDown\":\n        this.scrollDown(command.count);\n        return;\n      case \"setScrollRegion\":\n        this.setScrollRegion(command.top, command.bottom);\n        return;\n      case \"eraseInDisplay\":\n        this.eraseInDisplay(command.mode);\n        return;\n      case \"eraseInLine\":\n        this.eraseInLine(command.mode);\n        return;\n      case \"saveCursor\":\n        this.saveCursor();\n        return;\n      case \"restoreCursor\":\n        this.restoreCursor();\n        return;\n      case \"setGraphicRendition\":\n        this.setGraphicRendition(command.params);\n        return;\n      case \"index\":\n        this.index();\n        return;\n      case \"nextLine\":\n        this.nextLine();\n        return;\n      case \"reverseIndex\":\n        this.reverseIndex();\n        return;\n      case \"resetToInitialState\":\n        this.reset();\n        return;\n      case \"setMode\":\n        this.setMode(command.identifier.prefix, command.params, true);\n        return;\n      case \"resetMode\":\n        this.setMode(command.identifier.prefix, command.params, false);\n        return;\n      case \"unknownEscape\":\n      case \"unknownCsi\":\n        return;\n    }\n  }\n\n  private writePrintable(character: string) {\n    this.prepareCursorForPrint();\n\n    const targetCol =\n      this.cursorState.col >= this.cols ? this.cols - 1 : Math.max(0, this.cursorState.col);\n\n    if (this.terminalModes.insertMode) {\n      this.insertBlankCells(this.cursorState.row, targetCol, 1);\n    }\n\n    this.grid[this.cursorState.row][targetCol] = createCell(character, this.currentStyle);\n\n    if (targetCol === this.cols - 1) {\n      this.cursorState.col = this.cols;\n      this.pendingWrap = this.terminalModes.wraparoundMode;\n      return;\n    }\n\n    this.cursorState.col = targetCol + 1;\n    this.pendingWrap = false;\n  }\n\n  private insertTab() {\n    const spaces = this.tabWidth - (this.cursorState.col % this.tabWidth || 0);\n\n    for (let index = 0; index < spaces; index += 1) {\n      this.writePrintable(\" \");\n    }\n  }\n\n  private carriageReturn() {\n    this.pendingWrap = false;\n    this.cursorState.col = 0;\n  }\n\n  private cursorUp(count: number) {\n    this.normalizeCursorForMovement();\n    this.cursorState.row = Math.max(0, this.cursorState.row - Math.max(1, count));\n  }\n\n  private cursorDown(count: number) {\n    this.normalizeCursorForMovement();\n    this.cursorState.row = Math.min(this.rows - 1, this.cursorState.row + Math.max(1, count));\n  }\n\n  private cursorForward(count: number) {\n    this.normalizeCursorForMovement();\n    this.cursorState.col = Math.min(this.cols - 1, this.cursorState.col + Math.max(1, count));\n  }\n\n  private cursorBackward(count: number) {\n    this.normalizeCursorForMovement();\n    this.cursorState.col = Math.max(0, this.cursorState.col - Math.max(1, count));\n  }\n\n  private cursorPosition(row: number, col: number) {\n    this.pendingWrap = false;\n    const targetRow = Math.max(1, row);\n    const targetCol = Math.max(1, col);\n    const resolvedRow = this.terminalModes.originMode\n      ? Math.min(\n          this.scrollRegionBottom,\n          Math.max(this.scrollRegionTop, this.scrollRegionTop + targetRow - 1)\n        )\n      : Math.min(this.rows - 1, Math.max(0, targetRow - 1));\n\n    this.moveCursorTo(resolvedRow, Math.min(this.cols - 1, Math.max(0, targetCol - 1)));\n  }\n\n  private insertChars(count: number) {\n    this.normalizeCursorForMovement();\n    this.insertBlankCells(this.cursorState.row, this.cursorState.col, count);\n  }\n\n  private deleteChars(count: number) {\n    this.normalizeCursorForMovement();\n    this.deleteCells(this.cursorState.row, this.cursorState.col, count);\n  }\n\n  private insertLines(count: number) {\n    this.normalizeCursorForMovement();\n    if (!this.isCursorWithinScrollRegion()) {\n      return;\n    }\n\n    this.shiftLinesDown(this.cursorState.row, this.scrollRegionBottom, count);\n  }\n\n  private deleteLines(count: number) {\n    this.normalizeCursorForMovement();\n    if (!this.isCursorWithinScrollRegion()) {\n      return;\n    }\n\n    this.shiftLinesUp(this.cursorState.row, this.scrollRegionBottom, count);\n  }\n\n  private scrollUp(count: number) {\n    this.normalizeCursorForMovement();\n    this.shiftLinesUp(this.scrollRegionTop, this.scrollRegionBottom, count);\n  }\n\n  private scrollDown(count: number) {\n    this.normalizeCursorForMovement();\n    this.shiftLinesDown(this.scrollRegionTop, this.scrollRegionBottom, count);\n  }\n\n  private setScrollRegion(top?: number, bottom?: number) {\n    const nextTop = Math.max(1, Math.floor(top ?? 1));\n    const nextBottom = Math.max(1, Math.floor(bottom ?? this.rows));\n    const isValid = nextTop < nextBottom && nextBottom <= this.rows;\n\n    this.scrollRegionTop = isValid ? nextTop - 1 : 0;\n    this.scrollRegionBottom = isValid ? nextBottom - 1 : this.rows - 1;\n    this.pendingWrap = false;\n    this.moveCursorHome();\n  }\n\n  private lineFeed() {\n    if (this.pendingWrap || this.cursorState.col >= this.cols) {\n      this.cursorState.col = Math.max(0, this.cols - 1);\n      this.pendingWrap = false;\n    }\n\n    if (this.isCursorWithinScrollRegion()) {\n      if (this.cursorState.row === this.scrollRegionBottom) {\n        this.shiftLinesUp(this.scrollRegionTop, this.scrollRegionBottom, 1, {\n          captureScrollback:\n            !this.terminalModes.alternateScreenBufferMode &&\n            this.scrollRegionTop === 0 &&\n            this.scrollRegionBottom === this.rows - 1\n        });\n        return;\n      }\n\n      this.cursorState.row += 1;\n      return;\n    }\n\n    if (this.cursorState.row < this.rows - 1) {\n      this.cursorState.row += 1;\n      return;\n    }\n  }\n\n  private backspace() {\n    if (this.pendingWrap || this.cursorState.col >= this.cols) {\n      this.pendingWrap = false;\n      this.cursorState.col = Math.max(0, this.cols - 2);\n      return;\n    }\n\n    if (this.cursorState.col > 0) {\n      this.cursorState.col -= 1;\n    }\n  }\n\n  private eraseInLine(mode: number) {\n    const row = this.cursorState.row;\n\n    switch (mode) {\n      case 1:\n        for (let col = 0; col <= this.cursorState.col; col += 1) {\n          this.grid[row][col] = createCell(\" \", this.currentStyle);\n        }\n        return;\n      case 2:\n        this.grid[row] = createBlankLine(this.cols, this.currentStyle);\n        return;\n      default:\n        for (let col = this.cursorState.col; col < this.cols; col += 1) {\n          this.grid[row][col] = createCell(\" \", this.currentStyle);\n        }\n    }\n  }\n\n  private eraseInDisplay(mode: number) {\n    switch (mode) {\n      case 1:\n        for (let row = 0; row < this.cursorState.row; row += 1) {\n          this.grid[row] = createBlankLine(this.cols, this.currentStyle);\n        }\n        for (let col = 0; col <= this.cursorState.col; col += 1) {\n          this.grid[this.cursorState.row][col] = createCell(\" \", this.currentStyle);\n        }\n        return;\n      case 2:\n        for (let row = 0; row < this.rows; row += 1) {\n          this.grid[row] = createBlankLine(this.cols, this.currentStyle);\n        }\n        return;\n      case 3:\n        this.eraseInDisplay(2);\n        this.scrollbackCells.length = 0;\n        return;\n      default:\n        for (let col = this.cursorState.col; col < this.cols; col += 1) {\n          this.grid[this.cursorState.row][col] = createCell(\" \", this.currentStyle);\n        }\n        for (let row = this.cursorState.row + 1; row < this.rows; row += 1) {\n          this.grid[row] = createBlankLine(this.cols, this.currentStyle);\n        }\n    }\n  }\n\n  private saveCursor() {\n    this.savedCursorState = {\n      row: this.cursorState.row,\n      col: this.cursorState.col\n    };\n  }\n\n  private restoreCursor() {\n    this.pendingWrap = false;\n    this.cursorState.row = Math.min(this.rows - 1, Math.max(0, Math.floor(this.savedCursorState.row)));\n    this.cursorState.col = Math.min(this.cols, Math.max(0, Math.floor(this.savedCursorState.col)));\n  }\n\n  private setGraphicRendition(params: number[]) {\n    this.currentStyle = applySgrParameters(this.currentStyle, params);\n  }\n\n  private index() {\n    if (this.pendingWrap || this.cursorState.col >= this.cols) {\n      this.cursorState.col = Math.max(0, this.cols - 1);\n      this.pendingWrap = false;\n    }\n\n    if (!this.isCursorWithinScrollRegion()) {\n      return;\n    }\n\n    if (this.cursorState.row === this.scrollRegionBottom) {\n      this.shiftLinesUp(this.scrollRegionTop, this.scrollRegionBottom, 1);\n      return;\n    }\n\n    this.cursorState.row += 1;\n  }\n\n  private nextLine() {\n    this.carriageReturn();\n    this.lineFeed();\n  }\n\n  private reverseIndex() {\n    if (this.pendingWrap || this.cursorState.col >= this.cols) {\n      this.cursorState.col = Math.max(0, this.cols - 1);\n      this.pendingWrap = false;\n    }\n\n    if (!this.isCursorWithinScrollRegion()) {\n      return;\n    }\n\n    if (this.cursorState.row === this.scrollRegionTop) {\n      this.shiftLinesDown(this.scrollRegionTop, this.scrollRegionBottom, 1);\n      return;\n    }\n\n    this.cursorState.row -= 1;\n  }\n\n  private setMode(prefix: string | undefined, params: number[], enabled: boolean) {\n    const values = params.length > 0 ? params : [0];\n    const nextMouseTrackingMode = (value: number, active: boolean): RetroScreenTerminalMouseTrackingMode => {\n      if (!active) {\n        return \"none\";\n      }\n\n      switch (value) {\n        case 1000:\n          return \"vt200\";\n        case 1002:\n          return \"drag\";\n        case 1003:\n          return \"any\";\n        default:\n          return this.terminalModes.mouseTrackingMode;\n      }\n    };\n\n    for (const value of values) {\n      if (prefix === \"?\") {\n        switch (value) {\n          case 1:\n            this.terminalModes.applicationCursorKeysMode = enabled;\n            break;\n          case 6:\n            this.terminalModes.originMode = enabled;\n            this.pendingWrap = false;\n            this.moveCursorHome();\n            break;\n          case 7:\n            this.terminalModes.wraparoundMode = enabled;\n            if (!enabled) {\n              this.pendingWrap = false;\n            }\n            break;\n          case 25:\n            this.setCursorVisible(enabled);\n            break;\n          case 47:\n          case 1047:\n          case 1049:\n            this.setAlternateScreenMode(enabled);\n            break;\n          case 1000:\n          case 1002:\n          case 1003:\n            this.terminalModes.mouseTrackingMode = nextMouseTrackingMode(value, enabled);\n            break;\n          case 1004:\n            this.terminalModes.focusReportingMode = enabled;\n            break;\n          case 1006:\n            this.terminalModes.mouseProtocol = enabled ? \"sgr\" : \"none\";\n            break;\n          case 2004:\n            this.terminalModes.bracketedPasteMode = enabled;\n            break;\n          default:\n            break;\n        }\n\n        continue;\n      }\n\n      switch (value) {\n        case 4:\n          this.terminalModes.insertMode = enabled;\n          break;\n        default:\n          break;\n      }\n    }\n  }\n\n  private prepareCursorForPrint() {\n    if (this.pendingWrap) {\n      this.carriageReturn();\n      this.lineFeed();\n      this.pendingWrap = false;\n      return;\n    }\n\n    if (this.cursorState.col >= this.cols) {\n      this.cursorState.col = Math.max(0, this.cols - 1);\n    }\n  }\n\n  private normalizeCursorForMovement() {\n    if (this.pendingWrap || this.cursorState.col >= this.cols) {\n      this.cursorState.col = Math.max(0, this.cols - 1);\n      this.pendingWrap = false;\n    }\n  }\n\n  private moveCursorHome() {\n    this.cursorState.row = this.terminalModes.originMode ? this.scrollRegionTop : 0;\n    this.cursorState.col = 0;\n  }\n\n  private isCursorWithinScrollRegion() {\n    return (\n      this.cursorState.row >= this.scrollRegionTop && this.cursorState.row <= this.scrollRegionBottom\n    );\n  }\n\n  private insertBlankCells(row: number, col: number, count: number) {\n    const shiftCount = Math.min(this.cols - col, Math.max(1, Math.floor(count)));\n\n    if (shiftCount <= 0) {\n      return;\n    }\n\n    for (let target = this.cols - 1; target >= col + shiftCount; target -= 1) {\n      this.grid[row][target] = cloneCell(this.grid[row][target - shiftCount]);\n    }\n\n    for (let target = col; target < Math.min(this.cols, col + shiftCount); target += 1) {\n      this.grid[row][target] = createCell(\" \", this.currentStyle);\n    }\n  }\n\n  private deleteCells(row: number, col: number, count: number) {\n    const shiftCount = Math.min(this.cols - col, Math.max(1, Math.floor(count)));\n\n    if (shiftCount <= 0) {\n      return;\n    }\n\n    for (let target = col; target < this.cols - shiftCount; target += 1) {\n      this.grid[row][target] = cloneCell(this.grid[row][target + shiftCount]);\n    }\n\n    for (let target = this.cols - shiftCount; target < this.cols; target += 1) {\n      this.grid[row][target] = createCell(\" \", this.currentStyle);\n    }\n  }\n\n  private shiftLinesUp(\n    top: number,\n    bottom: number,\n    count: number,\n    options?: { captureScrollback?: boolean }\n  ) {\n    const shiftCount = Math.min(bottom - top + 1, Math.max(1, Math.floor(count)));\n\n    for (let index = 0; index < shiftCount; index += 1) {\n      const shifted = this.grid[top];\n\n      if (options?.captureScrollback) {\n        this.scrollbackCells.push(shifted.map((cell) => cloneCell(cell)));\n\n        if (this.scrollbackCells.length > this.scrollbackLimit) {\n          this.scrollbackCells.splice(0, this.scrollbackCells.length - this.scrollbackLimit);\n        }\n      }\n\n      for (let row = top; row < bottom; row += 1) {\n        this.grid[row] = this.grid[row + 1];\n      }\n\n      this.grid[bottom] = createBlankLine(this.cols, this.currentStyle);\n    }\n  }\n\n  private shiftLinesDown(top: number, bottom: number, count: number) {\n    const shiftCount = Math.min(bottom - top + 1, Math.max(1, Math.floor(count)));\n\n    for (let index = 0; index < shiftCount; index += 1) {\n      for (let row = bottom; row > top; row -= 1) {\n        this.grid[row] = this.grid[row - 1];\n      }\n\n      this.grid[top] = createBlankLine(this.cols, this.currentStyle);\n    }\n  }\n\n  private createSurfaceState({\n    cursorMode,\n    cursorVisible = true,\n    currentStyle = DEFAULT_CELL_STYLE\n  }: {\n    cursorMode: CursorMode;\n    cursorVisible?: boolean;\n    currentStyle?: RetroScreenCellStyle;\n  }): RetroScreenBufferSurfaceState {\n    return {\n      grid: Array.from({ length: this.rows }, () => createBlankLine(this.cols)),\n      scrollbackCells: [],\n      cursorState: {\n        row: 0,\n        col: 0,\n        visible: cursorVisible,\n        mode: cursorMode\n      },\n      savedCursorState: defaultSavedCursor(),\n      currentStyle: cloneStyle(currentStyle),\n      pendingWrap: false,\n      scrollRegionTop: 0,\n      scrollRegionBottom: this.rows - 1\n    };\n  }\n\n  private getActiveSurfaceState() {\n    return this.activeSurface === \"primary\" ? this.primarySurface : this.alternateSurface;\n  }\n\n  private storeSurface() {\n    const surface = this.getActiveSurfaceState();\n    surface.grid = this.grid;\n    surface.scrollbackCells = this.scrollbackCells;\n    surface.cursorState = { ...this.cursorState };\n    surface.savedCursorState = { ...this.savedCursorState };\n    surface.currentStyle = cloneStyle(this.currentStyle);\n    surface.pendingWrap = this.pendingWrap;\n    surface.scrollRegionTop = this.scrollRegionTop;\n    surface.scrollRegionBottom = this.scrollRegionBottom;\n  }\n\n  private loadSurface(name: \"primary\" | \"alternate\") {\n    const surface = name === \"primary\" ? this.primarySurface : this.alternateSurface;\n    this.activeSurface = name;\n    this.grid = surface.grid;\n    this.scrollbackCells = surface.scrollbackCells;\n    this.cursorState = { ...surface.cursorState };\n    this.savedCursorState = { ...surface.savedCursorState };\n    this.currentStyle = cloneStyle(surface.currentStyle);\n    this.pendingWrap = surface.pendingWrap;\n    this.scrollRegionTop = surface.scrollRegionTop;\n    this.scrollRegionBottom = surface.scrollRegionBottom;\n  }\n\n  private setAlternateScreenMode(enabled: boolean) {\n    if (enabled) {\n      if (this.terminalModes.alternateScreenBufferMode) {\n        return;\n      }\n\n      this.storeSurface();\n      this.alternateSurface = this.createSurfaceState({\n        cursorMode: this.cursorState.mode,\n        cursorVisible: this.cursorState.visible,\n        currentStyle: this.currentStyle\n      });\n      this.terminalModes.alternateScreenBufferMode = true;\n      this.loadSurface(\"alternate\");\n      return;\n    }\n\n    if (!this.terminalModes.alternateScreenBufferMode) {\n      return;\n    }\n\n    this.storeSurface();\n    this.terminalModes.alternateScreenBufferMode = false;\n    this.loadSurface(\"primary\");\n    this.alternateSurface = this.createSurfaceState({\n      cursorMode: this.cursorState.mode,\n      cursorVisible: this.cursorState.visible,\n      currentStyle: this.currentStyle\n    });\n  }\n}\n","import {\n  wrapTextToCellRows,\n  wrapTextToColumns\n} from \"../core/geometry/wrap\";\nimport { normalizeRetroScreenTextSelection, type RetroScreenTextSelection } from \"../core/editor/selection\";\nimport {\n  normalizeRetroScreenAnsiViewportWindow,\n  type RetroScreenAnsiFrameSnapshot\n} from \"../core/ansi/snapshot-contract\";\nimport { RetroScreenScreenBuffer } from \"../core/terminal/screen-buffer\";\nimport type { RetroScreenCell, RetroScreenCellStyle, RetroScreenScreenSnapshot } from \"../core/terminal/types\";\nimport type { CursorMode, RetroScreenGeometry, RetroScreenValueModeProps } from \"../core/types\";\n\nexport type RetroScreenCursorRenderState = {\n  row: number;\n  col: number;\n  mode: CursorMode;\n};\n\nexport type RetroScreenRenderCell = RetroScreenCell & {\n  sourceOffset: number | null;\n  isSelected: boolean;\n};\n\nexport type RetroScreenRenderModel = {\n  lines: string[];\n  cells?: RetroScreenRenderCell[][];\n  cursor: RetroScreenCursorRenderState | null;\n  isDimmed: boolean;\n};\n\nconst DEFAULT_RENDER_CELL_STYLE: RetroScreenCellStyle = {\n  intensity: \"normal\",\n  bold: false,\n  faint: false,\n  inverse: false,\n  conceal: false,\n  blink: false,\n  foreground: {\n    mode: \"default\",\n    value: 0\n  },\n  background: {\n    mode: \"default\",\n    value: 0\n  }\n};\n\nconst createRenderCell = (\n  char: string,\n  options: {\n    sourceOffset: number | null;\n    isSelected?: boolean;\n    style?: RetroScreenCellStyle;\n  }\n): RetroScreenRenderCell => ({\n  char,\n  style: options.style ?? DEFAULT_RENDER_CELL_STYLE,\n  sourceOffset: options.sourceOffset,\n  isSelected: Boolean(options.isSelected)\n});\n\nexport const normalizeLines = (lines: string[], rows: number) => {\n  const nextLines = [...lines];\n\n  while (nextLines.length < rows) {\n    nextLines.push(\"\");\n  }\n\n  return nextLines.slice(0, rows);\n};\n\nconst normalizeCellRows = <T,>(rowsValue: T[][], rows: number) => {\n  const nextRows = [...rowsValue];\n\n  while (nextRows.length < rows) {\n    nextRows.push([]);\n  }\n\n  return nextRows.slice(0, rows);\n};\n\nexport const buildStaticCellRenderModel = ({\n  cells,\n  geometry,\n  dimmed\n}: {\n  cells: RetroScreenCell[][];\n  geometry: RetroScreenGeometry;\n  dimmed?: boolean;\n}): RetroScreenRenderModel => {\n  const normalizedCells = normalizeCellRows(\n    cells.map((row) => row.slice(0, geometry.cols)),\n    geometry.rows\n  ).map((row) =>\n    Array.from({ length: geometry.cols }, (_, colIndex) => {\n      const sourceCell = row[colIndex];\n\n      if (sourceCell) {\n        return createRenderCell(sourceCell.char, {\n          sourceOffset: null,\n          style: sourceCell.style\n        });\n      }\n\n      return createRenderCell(\" \", {\n        sourceOffset: null\n      });\n    })\n  );\n\n  return {\n    lines: normalizedCells.map((row) => row.map((cell) => cell.char).join(\"\")),\n    cells: normalizedCells,\n    cursor: null,\n    isDimmed: Boolean(dimmed)\n  };\n};\n\nconst padLineToColumns = (line: string, cols: number) =>\n  line.length >= cols ? line : line.padEnd(cols, \" \");\n\nconst getSnapshotViewportLine = ({\n  snapshot,\n  rowIndex,\n  startCol,\n  endCol\n}: {\n  snapshot: RetroScreenAnsiFrameSnapshot;\n  rowIndex: number;\n  startCol: number;\n  endCol: number;\n}) => {\n  const sliceLength = Math.max(0, endCol - startCol);\n\n  if (snapshot.getLineSlice) {\n    return padLineToColumns(snapshot.getLineSlice(rowIndex, startCol, endCol), sliceLength);\n  }\n\n  if (snapshot.lines.length > 0) {\n    return padLineToColumns(\n      (snapshot.lines[rowIndex] ?? \"\").slice(startCol, endCol),\n      sliceLength\n    );\n  }\n\n  if (snapshot.cells?.length) {\n    const sourceCellRow = snapshot.cells[rowIndex] ?? [];\n\n    return padLineToColumns(\n      sourceCellRow\n        .slice(startCol, endCol)\n        .map((cell) => cell.char)\n        .join(\"\"),\n      sliceLength\n    );\n  }\n\n  return \" \".repeat(sliceLength);\n};\n\nexport const buildTextRenderModel = ({\n  text,\n  geometry,\n  cursorMode,\n  cursorOffset,\n  cursorVisible,\n  dimmed,\n  selection,\n  includeSourceOffsets\n}: {\n  text: string;\n  geometry: RetroScreenGeometry;\n  cursorMode: CursorMode;\n  cursorOffset?: number;\n  cursorVisible?: boolean;\n  dimmed?: boolean;\n  selection?: RetroScreenTextSelection | null;\n  includeSourceOffsets?: boolean;\n}): RetroScreenRenderModel => {\n  const normalizedSelection = selection\n    ? normalizeRetroScreenTextSelection(selection, text.length)\n    : null;\n  const wrappedCellRows = wrapTextToCellRows(text, { cols: geometry.cols });\n  const totalCells = wrappedCellRows.map((row) =>\n    row.map((cell) =>\n      createRenderCell(cell.char, {\n        sourceOffset: cell.sourceOffset,\n        isSelected: normalizedSelection\n          ? cell.sourceOffset >= normalizedSelection.start &&\n            cell.sourceOffset < normalizedSelection.end\n          : false\n      })\n    )\n  );\n  const totalLines = totalCells.map((line) => line.map((cell) => cell.char).join(\"\"));\n  const shouldExposeCells = Boolean(includeSourceOffsets || normalizedSelection);\n\n  let cursor: RetroScreenCursorRenderState | null = null;\n  let windowStart = 0;\n\n  if (cursorVisible) {\n    const cursorRows = wrapTextToCellRows(text.slice(0, cursorOffset ?? text.length), {\n      cols: geometry.cols\n    });\n    let cursorRow = cursorRows.length - 1;\n    let cursorCol = cursorRows[cursorRow]?.length ?? 0;\n\n    if (cursorCol >= geometry.cols) {\n      cursorRow += 1;\n      cursorCol = 0;\n    }\n\n    while (totalCells.length <= cursorRow) {\n      totalCells.push([]);\n      totalLines.push(\"\");\n    }\n\n    windowStart = Math.min(\n      Math.max(0, cursorRow - geometry.rows + 1),\n      Math.max(0, totalLines.length - geometry.rows)\n    );\n\n    if (cursorRow >= windowStart && cursorRow < windowStart + geometry.rows) {\n      cursor = {\n        row: cursorRow - windowStart,\n        col: cursorCol,\n        mode: cursorMode\n      };\n    }\n  } else if (totalLines.length > geometry.rows) {\n    windowStart = Math.max(0, totalLines.length - geometry.rows);\n  }\n\n  return {\n    lines: normalizeLines(totalLines.slice(windowStart, windowStart + geometry.rows), geometry.rows),\n    cells: shouldExposeCells\n      ? normalizeCellRows(totalCells.slice(windowStart, windowStart + geometry.rows), geometry.rows)\n      : undefined,\n    cursor,\n    isDimmed: Boolean(dimmed)\n  };\n};\n\nexport const buildTerminalSnapshot = ({\n  text,\n  rows,\n  cols,\n  cursorMode,\n  scrollback\n}: {\n  text: string;\n  rows: number;\n  cols: number;\n  cursorMode: CursorMode;\n  scrollback?: number;\n}): RetroScreenScreenSnapshot => {\n  const buffer = new RetroScreenScreenBuffer({\n    rows,\n    cols,\n    cursorMode,\n    scrollback\n  });\n\n  if (text) {\n    buffer.write(text);\n  }\n\n  return buffer.getSnapshot();\n};\n\nconst trimRenderedLine = (line: RetroScreenCell[]) =>\n  line\n    .map((cell) => cell.char)\n    .join(\"\")\n    .replace(/\\s+$/u, \"\");\n\nexport const getSnapshotMaxScrollOffset = (snapshot: RetroScreenScreenSnapshot) =>\n  Math.max(0, snapshot.scrollbackCells.length);\n\nexport const clampSnapshotScrollOffset = (\n  snapshot: RetroScreenScreenSnapshot,\n  scrollOffset: number\n) => Math.max(0, Math.min(getSnapshotMaxScrollOffset(snapshot), Math.floor(scrollOffset) || 0));\n\nexport const snapshotToRenderModel = (\n  snapshot: RetroScreenScreenSnapshot,\n  options: {\n    scrollOffset?: number;\n  } = {}\n): RetroScreenRenderModel => {\n  const scrollOffset = clampSnapshotScrollOffset(snapshot, options.scrollOffset ?? 0);\n  const bufferCells = [...snapshot.scrollbackCells, ...snapshot.cells];\n  const windowStart = Math.max(0, bufferCells.length - snapshot.rows - scrollOffset);\n  const viewportCells = bufferCells.slice(windowStart, windowStart + snapshot.rows);\n  const cursorAbsoluteRow = snapshot.scrollbackCells.length + snapshot.cursor.row;\n  const cursorVisible =\n    snapshot.cursor.visible &&\n    cursorAbsoluteRow >= windowStart &&\n    cursorAbsoluteRow < windowStart + snapshot.rows;\n\n  return {\n    lines: normalizeLines(viewportCells.map((line) => trimRenderedLine(line)), snapshot.rows),\n    cells: viewportCells.map((line) =>\n      line.map((cell) =>\n        createRenderCell(cell.char, {\n          sourceOffset: null,\n          style: cell.style\n        })\n      )\n    ),\n    cursor: cursorVisible\n      ? {\n          row: cursorAbsoluteRow - windowStart,\n          col: snapshot.cursor.col,\n          mode: snapshot.cursor.mode\n        }\n      : null,\n    isDimmed: false\n  };\n};\n\nexport const ansiSnapshotToRenderModelWindow = (\n  snapshot: RetroScreenAnsiFrameSnapshot,\n  options: {\n    rowOffset?: number;\n    colOffset?: number;\n    rows?: number;\n    cols?: number;\n  } = {}\n): RetroScreenRenderModel => {\n  const viewport = normalizeRetroScreenAnsiViewportWindow({\n    sourceRows: snapshot.sourceRows,\n    sourceCols: snapshot.sourceCols,\n    rowOffset: options.rowOffset,\n    colOffset: options.colOffset,\n    rows: options.rows,\n    cols: options.cols\n  });\n  const viewportLines = Array.from({ length: viewport.rows }, (_, viewportRowIndex) => {\n    const sourceRowIndex = viewport.rowOffset + viewportRowIndex;\n\n    return getSnapshotViewportLine({\n      snapshot,\n      rowIndex: sourceRowIndex,\n      startCol: viewport.colOffset,\n      endCol: viewport.colOffset + viewport.cols\n    });\n  });\n  const viewportCells = snapshot.getCellSlice\n      ? Array.from({ length: viewport.rows }, (_, viewportRowIndex) => {\n          const sourceRowIndex = viewport.rowOffset + viewportRowIndex;\n          const sourceCellRow = snapshot.getCellSlice?.(\n            sourceRowIndex,\n            viewport.colOffset,\n            viewport.colOffset + viewport.cols\n          ) ?? [];\n\n          return Array.from({ length: viewport.cols }, (_, viewportColIndex) => {\n            const sourceCell = sourceCellRow[viewportColIndex];\n\n            if (sourceCell) {\n              return createRenderCell(sourceCell.char, {\n                sourceOffset: null,\n                style: sourceCell.style\n              });\n            }\n\n            return createRenderCell(\" \", {\n              sourceOffset: null\n            });\n          });\n        })\n    : snapshot.cells\n      ? Array.from({ length: viewport.rows }, (_, viewportRowIndex) => {\n          const sourceRowIndex = viewport.rowOffset + viewportRowIndex;\n          const sourceCellRow = snapshot.cells?.[sourceRowIndex] ?? [];\n\n          return Array.from({ length: viewport.cols }, (_, viewportColIndex) => {\n            const sourceCell = sourceCellRow[viewport.colOffset + viewportColIndex];\n\n            if (sourceCell) {\n              return createRenderCell(sourceCell.char, {\n                sourceOffset: null,\n                style: sourceCell.style\n              });\n            }\n\n            return createRenderCell(\" \", {\n              sourceOffset: null\n            });\n          });\n        })\n    : undefined;\n\n  return {\n    lines: viewportLines,\n    cells: viewportCells,\n    cursor: null,\n    isDimmed: false\n  };\n};\n\nexport const getValueDisplayText = (props: RetroScreenValueModeProps, focused: boolean) => {\n  if (props.value.length > 0) {\n    return {\n      text: props.value,\n      dimmed: false\n    };\n  }\n\n  return {\n    text: props.placeholder && !focused ? props.placeholder : \"\",\n    dimmed: Boolean(props.placeholder && !focused)\n  };\n};\n\nexport const getLineDisplayText = (line: string) => (line.length > 0 ? line : \"\\u00a0\");\n\nexport const getCellCharacter = (cell: RetroScreenCell) => {\n  if (cell.style.conceal) {\n    return \"\\u00a0\";\n  }\n\n  return cell.char === \" \" ? \"\\u00a0\" : cell.char;\n};\n","import type { CSSProperties } from \"react\";\nimport type { RetroScreenCell, RetroScreenTerminalColor } from \"../core/terminal/types\";\nimport type { RetroScreenDisplayColorMode, RetroScreenDisplaySurfaceMode } from \"../core/types\";\n\nconst DISPLAY_MODE_ACCENTS: Record<RetroScreenDisplayColorMode, string> = {\n  \"phosphor-green\": \"#97ff9b\",\n  \"phosphor-amber\": \"#ffc96b\",\n  \"phosphor-ice\": \"#b8f1ff\",\n  \"ansi-classic\": \"#d7dde8\",\n  \"ansi-extended\": \"#d7dde8\"\n};\n\nconst LIGHT_SURFACE_BACKGROUNDS: Record<\n  RetroScreenDisplayColorMode,\n  {\n    top: string;\n    bottom: string;\n  }\n> = {\n  \"phosphor-green\": {\n    top: \"#fbfdf7\",\n    bottom: \"#edf5e7\"\n  },\n  \"phosphor-amber\": {\n    top: \"#fffaf2\",\n    bottom: \"#f7efdf\"\n  },\n  \"phosphor-ice\": {\n    top: \"#f7fcff\",\n    bottom: \"#e8f3f8\"\n  },\n  \"ansi-classic\": {\n    top: \"#f8f9fd\",\n    bottom: \"#e8edf5\"\n  },\n  \"ansi-extended\": {\n    top: \"#f8f9fd\",\n    bottom: \"#e8edf5\"\n  }\n};\n\nconst ANSI_CLASSIC_DEFAULT_FOREGROUND = \"#d7dde8\";\nconst ANSI_CLASSIC_DEFAULT_BACKGROUND = \"#090d12\";\nconst ANSI_CLASSIC_PALETTE = [\n  \"#1d232c\",\n  \"#d16d68\",\n  \"#8ec07c\",\n  \"#d8b05d\",\n  \"#78a5f5\",\n  \"#c58af9\",\n  \"#6fd1d7\",\n  \"#d7dde8\",\n  \"#5b6472\",\n  \"#ff8a80\",\n  \"#b6f67d\",\n  \"#ffe082\",\n  \"#8cb8ff\",\n  \"#d4a1ff\",\n  \"#8ce6ee\",\n  \"#ffffff\"\n];\n\nconst XTERM_BASE_PALETTE = [\n  \"#000000\",\n  \"#cd0000\",\n  \"#00cd00\",\n  \"#cdcd00\",\n  \"#0000ee\",\n  \"#cd00cd\",\n  \"#00cdcd\",\n  \"#e5e5e5\",\n  \"#7f7f7f\",\n  \"#ff0000\",\n  \"#00ff00\",\n  \"#ffff00\",\n  \"#5c5cff\",\n  \"#ff00ff\",\n  \"#00ffff\",\n  \"#ffffff\"\n];\n\nconst EXTENDED_PALETTE_STEPS = [0, 95, 135, 175, 215, 255];\n\ntype RgbColor = {\n  red: number;\n  green: number;\n  blue: number;\n};\n\nconst normalizeRgbColor = (value: number) => `#${value.toString(16).padStart(6, \"0\")}`;\n\nconst clampByte = (value: number) => Math.max(0, Math.min(255, Math.round(value)));\n\nconst parseHexColor = (value: string): RgbColor => {\n  const normalized = value.replace(\"#\", \"\");\n  const expanded =\n    normalized.length === 3\n      ? normalized\n          .split(\"\")\n          .map((segment) => `${segment}${segment}`)\n          .join(\"\")\n      : normalized;\n\n  return {\n    red: Number.parseInt(expanded.slice(0, 2), 16),\n    green: Number.parseInt(expanded.slice(2, 4), 16),\n    blue: Number.parseInt(expanded.slice(4, 6), 16)\n  };\n};\n\nconst toHexColor = ({ red, green, blue }: RgbColor) =>\n  `#${clampByte(red).toString(16).padStart(2, \"0\")}${clampByte(green)\n    .toString(16)\n    .padStart(2, \"0\")}${clampByte(blue).toString(16).padStart(2, \"0\")}`;\n\nconst toRgbaColor = ({ red, green, blue }: RgbColor, alpha: number) =>\n  `rgba(${clampByte(red)}, ${clampByte(green)}, ${clampByte(blue)}, ${Math.max(0, Math.min(1, alpha))})`;\n\nconst mixColors = (left: string, right: string, ratio: number) => {\n  const leftColor = parseHexColor(left);\n  const rightColor = parseHexColor(right);\n  const clampedRatio = Math.max(0, Math.min(1, ratio));\n\n  return toHexColor({\n    red: leftColor.red + (rightColor.red - leftColor.red) * clampedRatio,\n    green: leftColor.green + (rightColor.green - leftColor.green) * clampedRatio,\n    blue: leftColor.blue + (rightColor.blue - leftColor.blue) * clampedRatio\n  });\n};\n\nconst toLuminanceChannel = (value: number) => {\n  const normalized = value / 255;\n  return normalized <= 0.03928\n    ? normalized / 12.92\n    : ((normalized + 0.055) / 1.055) ** 2.4;\n};\n\nconst getRelativeLuminance = (value: string) => {\n  const { red, green, blue } = parseHexColor(value);\n  return (\n    0.2126 * toLuminanceChannel(red) +\n    0.7152 * toLuminanceChannel(green) +\n    0.0722 * toLuminanceChannel(blue)\n  );\n};\n\nconst getContrastRatio = (left: string, right: string) => {\n  const leftLuminance = getRelativeLuminance(left);\n  const rightLuminance = getRelativeLuminance(right);\n  const brighter = Math.max(leftLuminance, rightLuminance);\n  const darker = Math.min(leftLuminance, rightLuminance);\n\n  return (brighter + 0.05) / (darker + 0.05);\n};\n\nconst ensureContrast = (value: string, background: string, minimumRatio: number) => {\n  if (getContrastRatio(value, background) >= minimumRatio) {\n    return value;\n  }\n\n  const backgroundIsLight = getRelativeLuminance(background) >= 0.55;\n  const target = backgroundIsLight ? \"#111111\" : \"#ffffff\";\n\n  let bestColor = value;\n  for (let step = 1; step <= 20; step += 1) {\n    const candidate = mixColors(value, target, step / 20);\n    bestColor = candidate;\n\n    if (getContrastRatio(candidate, background) >= minimumRatio) {\n      return candidate;\n    }\n  }\n\n  return bestColor;\n};\n\nconst ensureBackgroundContrast = (\n  value: string,\n  foreground: string,\n  surface: string,\n  minimumRatio: number\n) => {\n  if (getContrastRatio(value, foreground) >= minimumRatio) {\n    return value;\n  }\n\n  let bestColor = value;\n  for (let step = 1; step <= 20; step += 1) {\n    const surfaceCandidate = mixColors(value, surface, step / 20);\n    bestColor = surfaceCandidate;\n\n    if (getContrastRatio(surfaceCandidate, foreground) >= minimumRatio) {\n      return surfaceCandidate;\n    }\n\n    const whiteCandidate = mixColors(surfaceCandidate, \"#ffffff\", step / 24);\n    bestColor = whiteCandidate;\n\n    if (getContrastRatio(whiteCandidate, foreground) >= minimumRatio) {\n      return whiteCandidate;\n    }\n  }\n\n  return bestColor;\n};\n\nconst buildTextGlow = (color: string, displaySurfaceMode: RetroScreenDisplaySurfaceMode) => {\n  const rgbColor = parseHexColor(color);\n\n  if (displaySurfaceMode === \"light\") {\n    return `0 0 3px ${toRgbaColor(rgbColor, 0.1)}, 0 0 8px ${toRgbaColor(rgbColor, 0.06)}`;\n  }\n\n  return `0 0 8px ${toRgbaColor(rgbColor, 0.18)}, 0 0 18px ${toRgbaColor(rgbColor, 0.08)}`;\n};\n\nconst buildXtermPalette = () => {\n  const palette = [...XTERM_BASE_PALETTE];\n\n  for (let red = 0; red < 6; red += 1) {\n    for (let green = 0; green < 6; green += 1) {\n      for (let blue = 0; blue < 6; blue += 1) {\n        palette.push(\n          normalizeRgbColor(\n            (EXTENDED_PALETTE_STEPS[red] << 16) |\n              (EXTENDED_PALETTE_STEPS[green] << 8) |\n              EXTENDED_PALETTE_STEPS[blue]\n          )\n        );\n      }\n    }\n  }\n\n  for (let value = 0; value < 24; value += 1) {\n    const shade = 8 + value * 10;\n    palette.push(normalizeRgbColor((shade << 16) | (shade << 8) | shade));\n  }\n\n  return palette;\n};\n\nconst XTERM_256_PALETTE = buildXtermPalette();\n\nconst getSurfaceBackground = (\n  displayColorMode: RetroScreenDisplayColorMode,\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode\n) =>\n  displaySurfaceMode === \"light\"\n    ? LIGHT_SURFACE_BACKGROUNDS[displayColorMode]\n    : {\n        top:\n          displayColorMode === \"ansi-classic\" || displayColorMode === \"ansi-extended\"\n            ? \"#141a24\"\n            : \"#071008\",\n        bottom:\n          displayColorMode === \"ansi-classic\" || displayColorMode === \"ansi-extended\"\n            ? ANSI_CLASSIC_DEFAULT_BACKGROUND\n            : \"#071008\"\n      };\n\nconst getDefaultAnsiForeground = (\n  displayColorMode: RetroScreenDisplayColorMode,\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode\n) => {\n  if (displaySurfaceMode === \"dark\") {\n    return ANSI_CLASSIC_DEFAULT_FOREGROUND;\n  }\n\n  return ensureContrast(\n    ANSI_CLASSIC_DEFAULT_FOREGROUND,\n    getSurfaceBackground(displayColorMode, displaySurfaceMode).bottom,\n    7\n  );\n};\n\nconst resolveAnsiColor = (\n  color: RetroScreenTerminalColor,\n  role: \"foreground\" | \"background\",\n  palette: string[],\n  displayColorMode: RetroScreenDisplayColorMode,\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode\n) => {\n  const surfaceBackground = getSurfaceBackground(displayColorMode, displaySurfaceMode).bottom;\n  const defaultForeground = getDefaultAnsiForeground(displayColorMode, displaySurfaceMode);\n  const baseColor =\n    color.mode === \"rgb\"\n      ? normalizeRgbColor(color.value)\n      : color.mode === \"palette\"\n        ? palette[color.value] ?? ANSI_CLASSIC_DEFAULT_FOREGROUND\n        : role === \"foreground\"\n          ? ANSI_CLASSIC_DEFAULT_FOREGROUND\n          : ANSI_CLASSIC_DEFAULT_BACKGROUND;\n\n  if (displaySurfaceMode === \"dark\") {\n    return role === \"foreground\" || color.mode !== \"default\"\n      ? baseColor\n      : ANSI_CLASSIC_DEFAULT_BACKGROUND;\n  }\n\n  if (role === \"foreground\") {\n    if (color.mode === \"default\") {\n      return defaultForeground;\n    }\n\n    return ensureContrast(baseColor, surfaceBackground, 4.8);\n  }\n\n  if (color.mode === \"default\") {\n    return surfaceBackground;\n  }\n\n  const tintedColor = mixColors(baseColor, surfaceBackground, 0.76);\n  return ensureBackgroundContrast(tintedColor, defaultForeground, surfaceBackground, 5);\n};\n\nexport const getDisplayModeRootVars = (\n  displayColorMode: RetroScreenDisplayColorMode,\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode,\n  colorOverride?: string\n): CSSProperties => {\n  const surface = getSurfaceBackground(displayColorMode, displaySurfaceMode);\n  const baseAccent = colorOverride ?? DISPLAY_MODE_ACCENTS[displayColorMode];\n  const nextColor =\n    displaySurfaceMode === \"light\" ? ensureContrast(baseAccent, surface.bottom, 6) : baseAccent;\n\n  return {\n    \"--retro-screen-color\": nextColor,\n    \"--retro-screen-color-soft\": mixColors(nextColor, surface.bottom, 0.18),\n    \"--retro-screen-color-dim\": mixColors(\n      nextColor,\n      surface.bottom,\n      displaySurfaceMode === \"light\" ? 0.42 : 0.5\n    ),\n    \"--retro-screen-bg-top\": surface.top,\n    \"--retro-screen-bg-bottom\": surface.bottom,\n    \"--retro-screen-inverse-foreground\": displaySurfaceMode === \"light\" ? surface.bottom : \"#071008\",\n    \"--retro-screen-inverse-background\": nextColor\n  } as CSSProperties;\n};\n\nexport const getCellPresentationStyle = (\n  cell: RetroScreenCell,\n  displayColorMode: RetroScreenDisplayColorMode,\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode\n): CSSProperties | undefined => {\n  if (displayColorMode !== \"ansi-classic\" && displayColorMode !== \"ansi-extended\") {\n    return undefined;\n  }\n\n  const palette = displayColorMode === \"ansi-extended\" ? XTERM_256_PALETTE : ANSI_CLASSIC_PALETTE;\n  const resolvedForeground = resolveAnsiColor(\n    cell.style.foreground,\n    \"foreground\",\n    palette,\n    displayColorMode,\n    displaySurfaceMode\n  );\n  const resolvedBackground = resolveAnsiColor(\n    cell.style.background,\n    \"background\",\n    palette,\n    displayColorMode,\n    displaySurfaceMode\n  );\n  let [color, backgroundColor] = cell.style.inverse\n    ? [resolvedBackground, resolvedForeground]\n    : [resolvedForeground, resolvedBackground];\n  const showBackground = cell.style.inverse || cell.style.background.mode !== \"default\";\n  const surfaceBackground = getSurfaceBackground(displayColorMode, displaySurfaceMode).bottom;\n\n  if (displaySurfaceMode === \"light\" && showBackground) {\n    backgroundColor = ensureBackgroundContrast(backgroundColor, color, surfaceBackground, 4.8);\n    color = ensureContrast(color, backgroundColor, 4.8);\n  }\n\n  return {\n    color: cell.style.conceal ? \"transparent\" : color,\n    backgroundColor: showBackground ? backgroundColor : \"transparent\",\n    textShadow: cell.style.conceal ? \"none\" : buildTextGlow(color, displaySurfaceMode)\n  };\n};\n","import type {\n  ClipboardEventHandler,\n  FocusEventHandler,\n  CSSProperties,\n  KeyboardEventHandler,\n  MouseEventHandler,\n  ReactNode,\n  RefObject,\n  WheelEventHandler\n} from \"react\";\nimport type { RetroScreenCell } from \"../core/terminal/types\";\nimport type {\n  RetroScreenDisplayColorMode,\n  RetroScreenDisplaySurfaceMode,\n  RetroScreenProps\n} from \"../core/types\";\nimport {\n  getCellCharacter,\n  getLineDisplayText,\n  type RetroScreenRenderCell,\n  type RetroScreenRenderModel\n} from \"./retro-screen-render-model\";\nimport { getCellPresentationStyle } from \"./retro-screen-display-color\";\n\nconst joinClassNames = (...classNames: Array<string | undefined>) =>\n  classNames.filter(Boolean).join(\" \");\n\nconst getCellClassName = (cell: RetroScreenRenderCell) =>\n  joinClassNames(\n    \"retro-screen__cell\",\n    cell.style.bold ? \"retro-screen__cell--bold\" : undefined,\n    cell.style.faint ? \"retro-screen__cell--faint\" : undefined,\n    cell.style.inverse ? \"retro-screen__cell--inverse\" : undefined,\n    cell.style.conceal ? \"retro-screen__cell--conceal\" : undefined,\n    cell.style.blink ? \"retro-screen__cell--blink\" : undefined,\n    cell.isSelected ? \"retro-screen__cell--selected\" : undefined\n  );\n\ntype RetroScreenDisplayProps = {\n  mode: RetroScreenProps[\"mode\"];\n  renderModel: RetroScreenRenderModel;\n  displayColorMode: RetroScreenDisplayColorMode;\n  displaySurfaceMode: RetroScreenDisplaySurfaceMode;\n  screenRef: RefObject<HTMLDivElement | null>;\n  probeRef: RefObject<HTMLSpanElement | null>;\n  viewportRef?: RefObject<HTMLDivElement | null>;\n  onViewportClick: () => void;\n  onViewportFocus?: FocusEventHandler<HTMLDivElement>;\n  onViewportBlur?: FocusEventHandler<HTMLDivElement>;\n  onViewportPaste?: ClipboardEventHandler<HTMLDivElement>;\n  onViewportKeyDown?: KeyboardEventHandler<HTMLDivElement>;\n  onViewportKeyUp?: KeyboardEventHandler<HTMLDivElement>;\n  onViewportMouseDown?: MouseEventHandler<HTMLDivElement>;\n  onViewportMouseMove?: MouseEventHandler<HTMLDivElement>;\n  onViewportMouseUp?: MouseEventHandler<HTMLDivElement>;\n  onViewportDoubleClick?: MouseEventHandler<HTMLDivElement>;\n  onViewportContextMenu?: MouseEventHandler<HTMLDivElement>;\n  onViewportWheel?: WheelEventHandler<HTMLDivElement>;\n  viewportTabIndex?: number;\n  children?: ReactNode;\n};\n\nexport function RetroScreenDisplay({\n  mode,\n  renderModel,\n  displayColorMode,\n  displaySurfaceMode,\n  screenRef,\n  probeRef,\n  viewportRef,\n  onViewportClick,\n  onViewportFocus,\n  onViewportBlur,\n  onViewportPaste,\n  onViewportKeyDown,\n  onViewportKeyUp,\n  onViewportMouseDown,\n  onViewportMouseMove,\n  onViewportMouseUp,\n  onViewportDoubleClick,\n  onViewportContextMenu,\n  onViewportWheel,\n  viewportTabIndex,\n  children\n}: RetroScreenDisplayProps) {\n  return (\n    <div className=\"retro-screen__screen\">\n      <div\n        ref={viewportRef}\n        className=\"retro-screen__viewport\"\n        onClick={onViewportClick}\n        onFocus={onViewportFocus}\n        onBlur={onViewportBlur}\n        onPaste={onViewportPaste}\n        onKeyDown={onViewportKeyDown}\n        onKeyUp={onViewportKeyUp}\n        onMouseDown={onViewportMouseDown}\n        onMouseMove={onViewportMouseMove}\n        onMouseUp={onViewportMouseUp}\n        onDoubleClick={onViewportDoubleClick}\n        onContextMenu={onViewportContextMenu}\n        onWheel={onViewportWheel}\n        tabIndex={viewportTabIndex}\n      >\n        <div\n          ref={screenRef}\n          className={joinClassNames(\n            \"retro-screen__grid\",\n            renderModel.isDimmed ? \"retro-screen__grid--dimmed\" : undefined\n          )}\n        >\n          <span ref={probeRef} className=\"retro-screen__probe\" aria-hidden=\"true\">\n            M\n          </span>\n          <div className=\"retro-screen__body\" aria-live={mode === \"terminal\" ? \"polite\" : undefined}>\n            {renderModel.cells\n              ? renderModel.cells.map((line, rowIndex) => (\n                  <div\n                    className={joinClassNames(\"retro-screen__line\", \"retro-screen__line--cells\")}\n                    key={`cells-${rowIndex}`}\n                  >\n                    {line.map((cell, colIndex) => (\n                      <span\n                        className={getCellClassName(cell)}\n                        key={`${rowIndex}-${colIndex}-${cell.char}`}\n                        data-source-offset={cell.sourceOffset ?? undefined}\n                        style={getCellPresentationStyle(cell, displayColorMode, displaySurfaceMode)}\n                      >\n                        {getCellCharacter(cell)}\n                      </span>\n                    ))}\n                  </div>\n                ))\n              : renderModel.lines.map((line, index) => (\n                  <div className=\"retro-screen__line\" key={`${index}-${line}`}>\n                    {getLineDisplayText(line)}\n                  </div>\n                ))}\n          </div>\n          {renderModel.cursor ? (\n            <div\n              className=\"retro-screen__cursor\"\n              data-cursor-mode={renderModel.cursor.mode}\n              style={\n                {\n                  \"--retro-screen-cursor-row\": renderModel.cursor.row,\n                  \"--retro-screen-cursor-col\": renderModel.cursor.col\n                } as CSSProperties\n              }\n              aria-hidden=\"true\"\n            />\n          ) : null}\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import type { RefObject, TextareaHTMLAttributes } from \"react\";\n\ntype RetroScreenInputOverlayProps = {\n  inputRef: RefObject<HTMLTextAreaElement | null>;\n  visible: boolean;\n} & TextareaHTMLAttributes<HTMLTextAreaElement>;\n\nexport function RetroScreenInputOverlay({\n  inputRef,\n  visible,\n  ...props\n}: RetroScreenInputOverlayProps) {\n  if (!visible) {\n    return null;\n  }\n\n  return <textarea ref={inputRef} className=\"retro-screen__input\" rows={1} {...props} />;\n}\n","import type { CSSProperties } from \"react\";\nimport type {\n  RetroScreenDisplayPadding,\n  RetroScreenDisplayPaddingValue\n} from \"../core/types\";\n\nconst toCssLength = (value?: RetroScreenDisplayPaddingValue) => {\n  if (value === undefined) {\n    return undefined;\n  }\n\n  return typeof value === \"number\" ? `${value}px` : value;\n};\n\nconst setVar = (\n  vars: CSSProperties,\n  name: string,\n  value?: RetroScreenDisplayPaddingValue\n) => {\n  const resolved = toCssLength(value);\n\n  if (resolved !== undefined) {\n    vars[name] = resolved;\n  }\n};\n\nexport const getDisplayPaddingVars = (\n  displayPadding?: RetroScreenDisplayPadding\n): CSSProperties => {\n  if (displayPadding === undefined) {\n    return {};\n  }\n\n  if (typeof displayPadding === \"number\" || typeof displayPadding === \"string\") {\n    const resolved = toCssLength(displayPadding) as string;\n\n    return {\n      \"--retro-screen-padding-top\": resolved,\n      \"--retro-screen-padding-right\": resolved,\n      \"--retro-screen-padding-bottom\": resolved,\n      \"--retro-screen-padding-left\": resolved\n    } as CSSProperties;\n  }\n\n  const vars = {} as CSSProperties;\n  const block = displayPadding.block;\n  const inline = displayPadding.inline;\n\n  setVar(vars, \"--retro-screen-padding-top\", displayPadding.top ?? block);\n  setVar(vars, \"--retro-screen-padding-right\", displayPadding.right ?? inline);\n  setVar(vars, \"--retro-screen-padding-bottom\", displayPadding.bottom ?? block);\n  setVar(vars, \"--retro-screen-padding-left\", displayPadding.left ?? inline);\n\n  return vars;\n};\n","import type { CSSProperties } from \"react\";\n\nexport const getDisplayTypographyVars = (\n  displayFontScale?: number,\n  displayRowScale?: number\n): CSSProperties => {\n  const vars = {} as CSSProperties;\n\n  if (Number.isFinite(displayFontScale) && displayFontScale !== undefined) {\n    vars[\"--retro-screen-font-scale\"] = String(Math.max(0.1, displayFontScale));\n  }\n\n  if (Number.isFinite(displayRowScale) && displayRowScale !== undefined) {\n    vars[\"--retro-screen-row-scale\"] = String(Math.max(0.1, displayRowScale));\n  }\n\n  return vars;\n};\n","import type { RetroScreenGeometry } from \"../core/types\";\n\nexport type RetroScreenPointerGridPosition = {\n  row: number;\n  col: number;\n};\n\nexport type RetroScreenPointerGridHit = RetroScreenPointerGridPosition & {\n  cellOffsetX: number;\n  cellOffsetY: number;\n  cellRatioX: number;\n  cellRatioY: number;\n};\n\nconst clampCoordinate = (value: number, limit: number) =>\n  Math.min(limit, Math.max(1, Number.isFinite(value) ? Math.floor(value) : 1));\n\nexport const getRetroScreenPointerGridHit = ({\n  clientX,\n  clientY,\n  rect,\n  geometry\n}: {\n  clientX: number;\n  clientY: number;\n  rect: Pick<DOMRectReadOnly, \"left\" | \"top\" | \"width\" | \"height\">;\n  geometry: RetroScreenGeometry;\n}): RetroScreenPointerGridHit => {\n  const width = Math.max(1, rect.width || geometry.innerWidth);\n  const height = Math.max(1, rect.height || geometry.innerHeight);\n  const cellWidth = Math.max(1, width / Math.max(1, geometry.cols));\n  const cellHeight = Math.max(1, height / Math.max(1, geometry.rows));\n  const x = Math.min(Math.max(clientX - rect.left, 0), Math.max(0, width - 1));\n  const y = Math.min(Math.max(clientY - rect.top, 0), Math.max(0, height - 1));\n  const cellOffsetX = x % cellWidth;\n  const cellOffsetY = y % cellHeight;\n\n  return {\n    col: clampCoordinate(Math.floor(x / cellWidth) + 1, geometry.cols),\n    row: clampCoordinate(Math.floor(y / cellHeight) + 1, geometry.rows),\n    cellOffsetX,\n    cellOffsetY,\n    cellRatioX: Math.min(1, Math.max(0, cellOffsetX / cellWidth)),\n    cellRatioY: Math.min(1, Math.max(0, cellOffsetY / cellHeight))\n  };\n};\n\nexport const getRetroScreenPointerGridPosition = (\n  args: Parameters<typeof getRetroScreenPointerGridHit>[0]\n): RetroScreenPointerGridPosition => {\n  const { row, col } = getRetroScreenPointerGridHit(args);\n  return { row, col };\n};\n","import { useEffect, useMemo } from \"react\";\nimport { createRetroScreenController } from \"../core/terminal/controller\";\nimport type { RetroScreenController } from \"../core/types\";\nimport type { RetroScreenScreenBufferOptions } from \"../core/terminal/types\";\n\nexport const useRetroScreenController = (\n  options: Partial<RetroScreenScreenBufferOptions> = {}\n): RetroScreenController => {\n  const controller = useMemo(\n    () =>\n      createRetroScreenController({\n        scrollback: options.scrollback,\n        tabWidth: options.tabWidth\n      }),\n    [options.scrollback, options.tabWidth]\n  );\n\n  useEffect(() => {\n    controller.resize(options.rows ?? 9, options.cols ?? 46);\n  }, [controller, options.cols, options.rows]);\n\n  useEffect(() => {\n    if (options.cursorMode) {\n      controller.setCursorMode(options.cursorMode);\n    }\n  }, [controller, options.cursorMode]);\n\n  return controller;\n};\n","import type {\n  CursorMode,\n  RetroScreenController,\n  RetroScreenWriteChunk\n} from \"../types\";\nimport { RetroScreenScreenBuffer } from \"./screen-buffer\";\nimport type {\n  RetroScreenScreenBufferOptions,\n  RetroScreenScreenSnapshot,\n  RetroScreenWriteOptions\n} from \"./types\";\n\ntype ControllerOperation =\n  | { type: \"write\"; data: string; options?: RetroScreenWriteOptions }\n  | { type: \"writeMany\"; chunks: RetroScreenWriteChunk[] }\n  | { type: \"writeln\"; line: string }\n  | { type: \"clear\" }\n  | { type: \"reset\" }\n  | { type: \"moveCursorTo\"; row: number; col: number }\n  | { type: \"setCursorVisible\"; visible: boolean }\n  | { type: \"setCursorMode\"; mode: CursorMode };\n\nconst clampDimension = (value: number, fallback: number) => {\n  const nextValue = Math.floor(value);\n  return Number.isFinite(nextValue) && nextValue > 0 ? nextValue : fallback;\n};\n\nconst normalizeWriteChunk = (\n  chunk: RetroScreenWriteChunk\n): {\n  data: string;\n  options?: RetroScreenWriteOptions;\n} =>\n  typeof chunk === \"string\"\n    ? {\n        data: chunk\n      }\n    : {\n        data: chunk.data,\n        options: chunk.options\n      };\n\nclass RetroScreenControllerStore implements RetroScreenController {\n  private readonly listeners = new Set<() => void>();\n  private readonly history: ControllerOperation[] = [];\n  private readonly options: Pick<RetroScreenScreenBufferOptions, \"scrollback\" | \"tabWidth\">;\n  private rows: number;\n  private cols: number;\n  private buffer: RetroScreenScreenBuffer;\n  private cachedSnapshot: RetroScreenScreenSnapshot | null = null;\n  private notificationSuspendDepth = 0;\n  private hasPendingNotification = false;\n\n  constructor(options: Partial<RetroScreenScreenBufferOptions> = {}) {\n    this.rows = clampDimension(options.rows ?? 9, 9);\n    this.cols = clampDimension(options.cols ?? 46, 46);\n    this.options = {\n      scrollback: options.scrollback,\n      tabWidth: options.tabWidth\n    };\n    this.buffer = new RetroScreenScreenBuffer({\n      rows: this.rows,\n      cols: this.cols,\n      scrollback: options.scrollback,\n      tabWidth: options.tabWidth,\n      cursorMode: options.cursorMode\n    });\n\n    if (options.cursorMode && options.cursorMode !== \"solid\") {\n      this.history.push({\n        type: \"setCursorMode\",\n        mode: options.cursorMode\n      });\n    }\n  }\n\n  write(data: string, options?: RetroScreenWriteOptions) {\n    this.buffer.write(data, options);\n    this.history.push({\n      type: \"write\",\n      data,\n      options\n    });\n    this.markDirtyAndEmit();\n  }\n\n  writeMany(chunks: readonly RetroScreenWriteChunk[]) {\n    if (chunks.length === 0) {\n      return;\n    }\n\n    this.batch(() => {\n      for (const chunk of chunks) {\n        const normalized = normalizeWriteChunk(chunk);\n        this.buffer.write(normalized.data, normalized.options);\n      }\n\n      this.history.push({\n        type: \"writeMany\",\n        chunks: chunks.map((chunk) =>\n          typeof chunk === \"string\"\n            ? chunk\n            : {\n                data: chunk.data,\n                options: chunk.options\n              }\n        )\n      });\n      this.markDirtyAndEmit();\n    });\n  }\n\n  writeln(line: string) {\n    this.buffer.writeln(line);\n    this.history.push({\n      type: \"writeln\",\n      line\n    });\n    this.markDirtyAndEmit();\n  }\n\n  clear() {\n    this.buffer.clear();\n    this.history.push({ type: \"clear\" });\n    this.markDirtyAndEmit();\n  }\n\n  reset() {\n    this.buffer.reset();\n    this.history.length = 0;\n    this.history.push({ type: \"reset\" });\n    this.markDirtyAndEmit();\n  }\n\n  batch<T>(fn: () => T) {\n    this.suspendNotifications();\n\n    try {\n      return fn();\n    } finally {\n      this.resumeNotifications();\n    }\n  }\n\n  suspendNotifications() {\n    this.notificationSuspendDepth += 1;\n  }\n\n  resumeNotifications() {\n    if (this.notificationSuspendDepth === 0) {\n      return;\n    }\n\n    this.notificationSuspendDepth -= 1;\n    if (this.notificationSuspendDepth === 0 && this.hasPendingNotification) {\n      this.hasPendingNotification = false;\n      this.emitNow();\n    }\n  }\n\n  moveCursorTo(row: number, col: number) {\n    this.buffer.moveCursorTo(row, col);\n    this.history.push({\n      type: \"moveCursorTo\",\n      row,\n      col\n    });\n    this.markDirtyAndEmit();\n  }\n\n  resize(rows: number, cols: number) {\n    const nextRows = clampDimension(rows, this.rows);\n    const nextCols = clampDimension(cols, this.cols);\n\n    if (nextRows === this.rows && nextCols === this.cols) {\n      return;\n    }\n\n    this.rows = nextRows;\n    this.cols = nextCols;\n    this.buffer = new RetroScreenScreenBuffer({\n      rows: this.rows,\n      cols: this.cols,\n      scrollback: this.options.scrollback,\n      tabWidth: this.options.tabWidth\n    });\n    this.replay();\n    this.markDirtyAndEmit();\n  }\n\n  setCursorVisible(visible: boolean) {\n    this.buffer.setCursorVisible(visible);\n    this.history.push({\n      type: \"setCursorVisible\",\n      visible\n    });\n    this.markDirtyAndEmit();\n  }\n\n  setCursorMode(mode: CursorMode) {\n    this.buffer.setCursorMode(mode);\n    this.history.push({\n      type: \"setCursorMode\",\n      mode\n    });\n    this.markDirtyAndEmit();\n  }\n\n  getSnapshot(): RetroScreenScreenSnapshot {\n    if (!this.cachedSnapshot) {\n      this.cachedSnapshot = this.buffer.getSnapshot();\n    }\n\n    return this.cachedSnapshot;\n  }\n\n  subscribe(listener: () => void) {\n    this.listeners.add(listener);\n\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  private replay() {\n    for (const operation of this.history) {\n      switch (operation.type) {\n        case \"write\":\n          this.buffer.write(operation.data, operation.options);\n          break;\n        case \"writeMany\":\n          for (const chunk of operation.chunks) {\n            const normalized = normalizeWriteChunk(chunk);\n            this.buffer.write(normalized.data, normalized.options);\n          }\n          break;\n        case \"writeln\":\n          this.buffer.writeln(operation.line);\n          break;\n        case \"clear\":\n          this.buffer.clear();\n          break;\n        case \"reset\":\n          this.buffer.reset();\n          break;\n        case \"moveCursorTo\":\n          this.buffer.moveCursorTo(operation.row, operation.col);\n          break;\n        case \"setCursorVisible\":\n          this.buffer.setCursorVisible(operation.visible);\n          break;\n        case \"setCursorMode\":\n          this.buffer.setCursorMode(operation.mode);\n          break;\n      }\n    }\n  }\n\n  private markDirtyAndEmit() {\n    this.cachedSnapshot = null;\n    this.emit();\n  }\n\n  private emit() {\n    if (this.notificationSuspendDepth > 0) {\n      this.hasPendingNotification = true;\n      return;\n    }\n\n    this.emitNow();\n  }\n\n  private emitNow() {\n    for (const listener of this.listeners) {\n      listener();\n    }\n  }\n}\n\nexport const createRetroScreenController = (\n  options: Partial<RetroScreenScreenBufferOptions> = {}\n): RetroScreenController => new RetroScreenControllerStore(options);\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { RetroScreenScreenSnapshot } from \"../core/terminal/types\";\nimport {\n  clampSnapshotScrollOffset,\n  getSnapshotMaxScrollOffset,\n  snapshotToRenderModel,\n  type RetroScreenRenderModel\n} from \"./retro-screen-render-model\";\n\nexport type RetroScreenBufferViewportState = {\n  autoFollow: boolean;\n  scrollOffset: number;\n  maxScrollOffset: number;\n  totalLines: number;\n};\n\nconst clampDelta = (value: number) => (Number.isFinite(value) ? Math.abs(value) : 0);\n\nexport const useRetroScreenBufferViewport = ({\n  snapshot,\n  enabled,\n  defaultAutoFollow = true\n}: {\n  snapshot: RetroScreenScreenSnapshot;\n  enabled: boolean;\n  defaultAutoFollow?: boolean;\n}): {\n  renderModel: RetroScreenRenderModel;\n  viewportState: RetroScreenBufferViewportState;\n  handleNavigationKey: (key: string) => boolean;\n  handleWheelDelta: (deltaY: number) => boolean;\n} => {\n  const maxScrollOffset = getSnapshotMaxScrollOffset(snapshot);\n  const previousMaxScrollOffsetRef = useRef(maxScrollOffset);\n  const [viewportState, setViewportState] = useState<RetroScreenBufferViewportState>(() => ({\n    autoFollow: defaultAutoFollow,\n    scrollOffset: 0,\n    maxScrollOffset,\n    totalLines: snapshot.scrollbackCells.length + snapshot.cells.length\n  }));\n\n  useEffect(() => {\n    previousMaxScrollOffsetRef.current = maxScrollOffset;\n    setViewportState({\n      autoFollow: defaultAutoFollow,\n      scrollOffset: 0,\n      maxScrollOffset,\n      totalLines: snapshot.scrollbackCells.length + snapshot.cells.length\n    });\n  }, [defaultAutoFollow, enabled]);\n\n  useEffect(() => {\n    const previousMaxScrollOffset = previousMaxScrollOffsetRef.current;\n    previousMaxScrollOffsetRef.current = maxScrollOffset;\n\n    setViewportState((current) => {\n      const totalLines = snapshot.scrollbackCells.length + snapshot.cells.length;\n\n      if (!enabled) {\n        return current.maxScrollOffset === maxScrollOffset &&\n          current.totalLines === totalLines &&\n          current.scrollOffset === 0 &&\n          current.autoFollow === defaultAutoFollow\n          ? current\n          : {\n              autoFollow: defaultAutoFollow,\n              scrollOffset: 0,\n              maxScrollOffset,\n              totalLines\n            };\n      }\n\n      if (current.autoFollow) {\n        return current.maxScrollOffset === maxScrollOffset &&\n          current.totalLines === totalLines &&\n          current.scrollOffset === 0\n          ? current\n          : {\n              autoFollow: true,\n              scrollOffset: 0,\n              maxScrollOffset,\n              totalLines\n            };\n      }\n\n      const growth = Math.max(0, maxScrollOffset - previousMaxScrollOffset);\n      const nextScrollOffset = clampSnapshotScrollOffset(snapshot, current.scrollOffset + growth);\n\n      return current.maxScrollOffset === maxScrollOffset &&\n        current.totalLines === totalLines &&\n        current.scrollOffset === nextScrollOffset\n        ? current\n        : {\n            ...current,\n            scrollOffset: nextScrollOffset,\n            maxScrollOffset,\n            totalLines\n          };\n    });\n  }, [\n    defaultAutoFollow,\n    enabled,\n    maxScrollOffset,\n    snapshot.cells.length,\n    snapshot.scrollbackCells.length,\n    snapshot\n  ]);\n\n  const adjustScrollOffset = (delta: number) => {\n    if (!enabled || maxScrollOffset === 0 || delta === 0) {\n      return false;\n    }\n\n    let changed = false;\n    setViewportState((current) => {\n      const nextScrollOffset = clampSnapshotScrollOffset(snapshot, current.scrollOffset + delta);\n      const nextAutoFollow = nextScrollOffset === 0;\n\n      if (\n        nextScrollOffset === current.scrollOffset &&\n        nextAutoFollow === current.autoFollow &&\n        current.maxScrollOffset === maxScrollOffset\n      ) {\n        return current;\n      }\n\n      changed = true;\n      return {\n        autoFollow: nextAutoFollow,\n        scrollOffset: nextScrollOffset,\n        maxScrollOffset,\n        totalLines: snapshot.scrollbackCells.length + snapshot.cells.length\n      };\n    });\n\n    return changed;\n  };\n\n  const pageStep = Math.max(1, snapshot.rows - 1);\n\n  const handleNavigationKey = (key: string) => {\n    switch (key) {\n      case \"PageUp\":\n        return adjustScrollOffset(pageStep);\n      case \"PageDown\":\n        return adjustScrollOffset(-pageStep);\n      case \"Home\":\n        return adjustScrollOffset(maxScrollOffset - viewportState.scrollOffset);\n      case \"End\":\n        return adjustScrollOffset(-viewportState.scrollOffset);\n      default:\n        return false;\n    }\n  };\n\n  const handleWheelDelta = (deltaY: number) => {\n    if (!enabled || deltaY === 0) {\n      return false;\n    }\n\n    const lineDelta = Math.max(1, Math.ceil(clampDelta(deltaY) / 48));\n    return adjustScrollOffset(deltaY < 0 ? lineDelta : -lineDelta);\n  };\n\n  const renderModel = useMemo(\n    () =>\n      snapshotToRenderModel(snapshot, {\n        scrollOffset: enabled ? viewportState.scrollOffset : 0\n      }),\n    [enabled, snapshot, viewportState.scrollOffset]\n  );\n\n  return {\n    renderModel,\n    viewportState: {\n      ...viewportState,\n      maxScrollOffset,\n      totalLines: snapshot.scrollbackCells.length + snapshot.cells.length\n    },\n    handleNavigationKey,\n    handleWheelDelta\n  };\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n  createRetroScreenEditorSession,\n  type RetroScreenEditorSession,\n  type RetroScreenEditorSessionOptions\n} from \"../core/editor/editor-session\";\n\nexport const useRetroScreenEditorSession = (\n  options: RetroScreenEditorSessionOptions = {}\n): RetroScreenEditorSession => {\n  const sessionRef = useRef<RetroScreenEditorSession | null>(null);\n\n  if (!sessionRef.current) {\n    sessionRef.current = createRetroScreenEditorSession(options);\n  }\n\n  useEffect(() => {\n    sessionRef.current?.setValue(options.value ?? \"\");\n  }, [options.value]);\n\n  useEffect(() => {\n    sessionRef.current?.setPlaceholder(options.placeholder ?? \"\");\n  }, [options.placeholder]);\n\n  useEffect(() => {\n    sessionRef.current?.setEditable(options.editable ?? true);\n  }, [options.editable]);\n\n  useEffect(() => {\n    if (options.cursorMode) {\n      sessionRef.current?.setCursorMode(options.cursorMode);\n    }\n  }, [options.cursorMode]);\n\n  return sessionRef.current;\n};\n","import type { CursorMode } from \"../types\";\nimport {\n  findRetroScreenNextWordBoundary,\n  findRetroScreenPreviousWordBoundary,\n  getRetroScreenWordSelectionAtOffset,\n  collapseRetroScreenTextSelectionToEnd,\n  collapseRetroScreenTextSelectionToStart,\n  clampRetroScreenTextOffset,\n  createRetroScreenTextSelection,\n  deleteRetroScreenSelectedText,\n  isRetroScreenTextSelectionCollapsed,\n  normalizeRetroScreenTextSelection,\n  replaceRetroScreenSelectedText,\n  type RetroScreenTextSelection\n} from \"./selection\";\n\nexport type RetroScreenEditorSessionOptions = {\n  value?: string;\n  placeholder?: string;\n  editable?: boolean;\n  cursorMode?: CursorMode;\n  selectionStart?: number;\n  selectionEnd?: number;\n};\n\nexport type RetroScreenEditorSessionState = {\n  value: string;\n  placeholder: string;\n  editable: boolean;\n  cursorMode: CursorMode;\n  selection: RetroScreenTextSelection;\n};\n\nexport type RetroScreenEditorSession = {\n  setValue: (value: string) => void;\n  getValue: () => string;\n  setSelection: (start: number, end?: number) => void;\n  getSelection: () => RetroScreenTextSelection;\n  getSelectedText: () => string;\n  moveCursorTo: (offset: number) => void;\n  moveCursorByCharacter: (direction: -1 | 1) => void;\n  moveCursorByWord: (direction: -1 | 1) => void;\n  moveCursorToBoundary: (direction: -1 | 1) => void;\n  selectAll: () => void;\n  selectWordAt: (offset: number) => void;\n  extendSelectionByCharacter: (direction: -1 | 1) => void;\n  extendSelectionByWord: (direction: -1 | 1) => void;\n  extendSelectionToBoundary: (direction: -1 | 1) => void;\n  collapseSelectionToStart: () => void;\n  collapseSelectionToEnd: () => void;\n  replaceSelection: (text: string) => boolean;\n  cutSelection: () => {\n    changed: boolean;\n    text: string;\n  };\n  deleteBackward: () => boolean;\n  deleteForward: () => boolean;\n  setEditable: (editable: boolean) => void;\n  isEditable: () => boolean;\n  setPlaceholder: (placeholder: string) => void;\n  getPlaceholder: () => string;\n  setCursorMode: (mode: CursorMode) => void;\n  getCursorMode: () => CursorMode;\n  getState: () => RetroScreenEditorSessionState;\n  subscribe: (listener: () => void) => () => void;\n};\n\nconst DEFAULT_CURSOR_MODE: CursorMode = \"solid\";\n\nclass RetroScreenEditorSessionStore implements RetroScreenEditorSession {\n  private readonly listeners = new Set<() => void>();\n  private value: string;\n  private placeholder: string;\n  private editable: boolean;\n  private cursorMode: CursorMode;\n  private selectionAnchor: number;\n  private selectionFocus: number;\n\n  constructor(options: RetroScreenEditorSessionOptions = {}) {\n    this.value = options.value ?? \"\";\n    this.placeholder = options.placeholder ?? \"\";\n    this.editable = options.editable ?? true;\n    this.cursorMode = options.cursorMode ?? DEFAULT_CURSOR_MODE;\n    const initialSelection = createRetroScreenTextSelection(\n      options.selectionStart ?? this.value.length,\n      options.selectionEnd ?? options.selectionStart ?? this.value.length,\n      this.value.length\n    );\n    this.selectionAnchor = initialSelection.start;\n    this.selectionFocus = initialSelection.end;\n  }\n\n  setValue(value: string) {\n    if (this.value === value) {\n      return;\n    }\n\n    this.value = value;\n    this.selectionAnchor = clampRetroScreenTextOffset(this.selectionAnchor, this.value.length);\n    this.selectionFocus = clampRetroScreenTextOffset(this.selectionFocus, this.value.length);\n    this.emit();\n  }\n\n  getValue() {\n    return this.value;\n  }\n\n  setSelection(start: number, end = start) {\n    const nextAnchor = clampRetroScreenTextOffset(start, this.value.length);\n    const nextFocus = clampRetroScreenTextOffset(end, this.value.length);\n    const current = this.getSelection();\n    const nextSelection = createRetroScreenTextSelection(nextAnchor, nextFocus, this.value.length);\n\n    if (\n      nextSelection.start === current.start &&\n      nextSelection.end === current.end &&\n      nextAnchor === this.selectionAnchor &&\n      nextFocus === this.selectionFocus\n    ) {\n      return;\n    }\n\n    this.selectionAnchor = nextAnchor;\n    this.selectionFocus = nextFocus;\n    this.emit();\n  }\n\n  getSelection() {\n    return normalizeRetroScreenTextSelection(\n      {\n        start: this.selectionAnchor,\n        end: this.selectionFocus\n      },\n      this.value.length\n    );\n  }\n\n  getSelectedText() {\n    const selection = this.getSelection();\n    return this.value.slice(selection.start, selection.end);\n  }\n\n  moveCursorTo(offset: number) {\n    this.setSelection(offset, offset);\n  }\n\n  moveCursorByCharacter(direction: -1 | 1) {\n    const selection = this.getSelection();\n    const nextOffset =\n      direction < 0\n        ? isRetroScreenTextSelectionCollapsed(selection)\n          ? selection.start - 1\n          : selection.start\n        : isRetroScreenTextSelectionCollapsed(selection)\n          ? selection.end + 1\n          : selection.end;\n    this.moveCursorTo(nextOffset);\n  }\n\n  moveCursorByWord(direction: -1 | 1) {\n    const selection = this.getSelection();\n    const referenceOffset =\n      direction < 0\n        ? isRetroScreenTextSelectionCollapsed(selection)\n          ? selection.start\n          : selection.start\n        : isRetroScreenTextSelectionCollapsed(selection)\n          ? selection.end\n          : selection.end;\n    const nextOffset =\n      direction < 0\n        ? findRetroScreenPreviousWordBoundary(this.value, referenceOffset)\n        : findRetroScreenNextWordBoundary(this.value, referenceOffset);\n    this.moveCursorTo(nextOffset);\n  }\n\n  moveCursorToBoundary(direction: -1 | 1) {\n    this.moveCursorTo(direction < 0 ? 0 : this.value.length);\n  }\n\n  selectAll() {\n    this.setSelection(0, this.value.length);\n  }\n\n  selectWordAt(offset: number) {\n    const selection = getRetroScreenWordSelectionAtOffset(this.value, offset);\n    this.setSelection(selection.start, selection.end);\n  }\n\n  extendSelectionByCharacter(direction: -1 | 1) {\n    const nextFocus = clampRetroScreenTextOffset(this.selectionFocus + direction, this.value.length);\n    this.setSelection(this.selectionAnchor, nextFocus);\n  }\n\n  extendSelectionByWord(direction: -1 | 1) {\n    const nextFocus =\n      direction < 0\n        ? findRetroScreenPreviousWordBoundary(this.value, this.selectionFocus)\n        : findRetroScreenNextWordBoundary(this.value, this.selectionFocus);\n    this.setSelection(this.selectionAnchor, nextFocus);\n  }\n\n  extendSelectionToBoundary(direction: -1 | 1) {\n    this.setSelection(this.selectionAnchor, direction < 0 ? 0 : this.value.length);\n  }\n\n  collapseSelectionToStart() {\n    const nextSelection = collapseRetroScreenTextSelectionToStart(this.getSelection());\n\n    if (\n      nextSelection.start === this.selectionAnchor &&\n      nextSelection.end === this.selectionFocus\n    ) {\n      return;\n    }\n\n    this.selectionAnchor = nextSelection.start;\n    this.selectionFocus = nextSelection.end;\n    this.emit();\n  }\n\n  collapseSelectionToEnd() {\n    const nextSelection = collapseRetroScreenTextSelectionToEnd(this.getSelection());\n\n    if (\n      nextSelection.start === this.selectionAnchor &&\n      nextSelection.end === this.selectionFocus\n    ) {\n      return;\n    }\n\n    this.selectionAnchor = nextSelection.start;\n    this.selectionFocus = nextSelection.end;\n    this.emit();\n  }\n\n  replaceSelection(text: string) {\n    if (!this.editable) {\n      return false;\n    }\n\n    const nextState = replaceRetroScreenSelectedText(this.value, this.getSelection(), text);\n    this.value = nextState.value;\n    this.selectionAnchor = nextState.selection.start;\n    this.selectionFocus = nextState.selection.end;\n    this.emit();\n    return true;\n  }\n\n  cutSelection() {\n    const text = this.getSelectedText();\n\n    if (!this.editable || text.length === 0) {\n      return {\n        changed: false,\n        text\n      };\n    }\n\n    const nextState = deleteRetroScreenSelectedText(this.value, this.getSelection());\n    this.value = nextState.value;\n    this.selectionAnchor = nextState.selection.start;\n    this.selectionFocus = nextState.selection.end;\n    this.emit();\n\n    return {\n      changed: true,\n      text\n    };\n  }\n\n  deleteBackward() {\n    if (!this.editable) {\n      return false;\n    }\n\n    if (!isRetroScreenTextSelectionCollapsed(this.getSelection())) {\n      const nextState = deleteRetroScreenSelectedText(this.value, this.getSelection());\n      this.value = nextState.value;\n      this.selectionAnchor = nextState.selection.start;\n      this.selectionFocus = nextState.selection.end;\n      this.emit();\n      return true;\n    }\n\n    if (this.selectionFocus === 0) {\n      return false;\n    }\n\n    return this.replaceSelectionAtOffsets(this.selectionFocus - 1, this.selectionFocus, \"\");\n  }\n\n  deleteForward() {\n    if (!this.editable) {\n      return false;\n    }\n\n    if (!isRetroScreenTextSelectionCollapsed(this.getSelection())) {\n      const nextState = deleteRetroScreenSelectedText(this.value, this.getSelection());\n      this.value = nextState.value;\n      this.selectionAnchor = nextState.selection.start;\n      this.selectionFocus = nextState.selection.end;\n      this.emit();\n      return true;\n    }\n\n    if (this.selectionFocus >= this.value.length) {\n      return false;\n    }\n\n    return this.replaceSelectionAtOffsets(this.selectionFocus, this.selectionFocus + 1, \"\");\n  }\n\n  setEditable(editable: boolean) {\n    if (this.editable === editable) {\n      return;\n    }\n\n    this.editable = editable;\n    this.emit();\n  }\n\n  isEditable() {\n    return this.editable;\n  }\n\n  setPlaceholder(placeholder: string) {\n    if (this.placeholder === placeholder) {\n      return;\n    }\n\n    this.placeholder = placeholder;\n    this.emit();\n  }\n\n  getPlaceholder() {\n    return this.placeholder;\n  }\n\n  setCursorMode(mode: CursorMode) {\n    if (this.cursorMode === mode) {\n      return;\n    }\n\n    this.cursorMode = mode;\n    this.emit();\n  }\n\n  getCursorMode() {\n    return this.cursorMode;\n  }\n\n  getState(): RetroScreenEditorSessionState {\n    return {\n      value: this.value,\n      placeholder: this.placeholder,\n      editable: this.editable,\n      cursorMode: this.cursorMode,\n      selection: this.getSelection()\n    };\n  }\n\n  subscribe(listener: () => void) {\n    this.listeners.add(listener);\n\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  private replaceSelectionAtOffsets(start: number, end: number, replacement: string) {\n    const nextState = replaceRetroScreenSelectedText(\n      this.value,\n      {\n        start,\n        end\n      },\n      replacement\n    );\n    this.value = nextState.value;\n    this.selectionAnchor = nextState.selection.start;\n    this.selectionFocus = nextState.selection.end;\n    this.emit();\n    return true;\n  }\n\n  private emit() {\n    for (const listener of this.listeners) {\n      listener();\n    }\n  }\n}\n\nexport const createRetroScreenEditorSession = (\n  options: RetroScreenEditorSessionOptions = {}\n): RetroScreenEditorSession => new RetroScreenEditorSessionStore(options);\n","import {\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useState,\n  type CSSProperties,\n  type RefObject\n} from \"react\";\nimport { measureGrid, measureStaticGrid } from \"../core/geometry/measure-grid\";\nimport type { RetroScreenGeometry, RetroScreenGridMode } from \"../core/types\";\n\nconst DEFAULT_GEOMETRY = measureGrid({\n  innerWidth: 560,\n  innerHeight: 220,\n  cellWidth: 12,\n  cellHeight: 24,\n  fontSize: 24\n});\n\nconst buildStaticFallbackGeometry = (rows?: number, cols?: number) =>\n  measureStaticGrid({\n    innerWidth: DEFAULT_GEOMETRY.innerWidth,\n    innerHeight: DEFAULT_GEOMETRY.innerHeight,\n    rows: rows ?? 9,\n    cols: cols ?? 46,\n    fontWidthRatio: DEFAULT_GEOMETRY.cellWidth / DEFAULT_GEOMETRY.fontSize,\n    fontHeightRatio: DEFAULT_GEOMETRY.cellHeight / DEFAULT_GEOMETRY.fontSize\n  });\n\ntype UseRetroScreenGeometryOptions = {\n  screenRef: RefObject<HTMLElement | null>;\n  probeRef: RefObject<HTMLElement | null>;\n  gridMode?: RetroScreenGridMode;\n  rows?: number;\n  cols?: number;\n  fontScale?: number;\n  onGeometryChange?: (geometry: RetroScreenGeometry) => void;\n};\n\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nconst measureCurrentGeometry = ({\n  screenRef,\n  probeRef,\n  gridMode,\n  rows,\n  cols\n}: Pick<\n  UseRetroScreenGeometryOptions,\n  \"screenRef\" | \"probeRef\" | \"gridMode\" | \"rows\" | \"cols\" | \"fontScale\"\n>): RetroScreenGeometry => {\n  const screenNode = screenRef.current;\n  const probeNode = probeRef.current;\n\n  if (!screenNode || !probeNode) {\n    if (gridMode === \"static\") {\n      return buildStaticFallbackGeometry(rows, cols);\n    }\n\n    return DEFAULT_GEOMETRY;\n  }\n\n  const screenRect = screenNode.getBoundingClientRect();\n  const probeRect = probeNode.getBoundingClientRect();\n\n  if (screenRect.width <= 0 || screenRect.height <= 0) {\n    if (gridMode === \"static\") {\n      return buildStaticFallbackGeometry(rows, cols);\n    }\n\n    return DEFAULT_GEOMETRY;\n  }\n\n  const cellWidth = probeRect.width > 0 ? probeRect.width : DEFAULT_GEOMETRY.cellWidth;\n  const cellHeight = probeRect.height > 0 ? probeRect.height : DEFAULT_GEOMETRY.cellHeight;\n  const computedFontSize = Number.parseFloat(window.getComputedStyle(probeNode).fontSize);\n  const fontSize = Number.isFinite(computedFontSize) && computedFontSize > 0\n    ? computedFontSize\n    : DEFAULT_GEOMETRY.fontSize;\n\n  if (gridMode === \"static\") {\n    return measureStaticGrid({\n      innerWidth: Math.max(0, screenRect.width),\n      innerHeight: Math.max(0, screenRect.height),\n      rows: rows ?? 9,\n      cols: cols ?? 46,\n      fontWidthRatio: cellWidth / fontSize,\n      fontHeightRatio: cellHeight / fontSize\n    });\n  }\n\n  return measureGrid({\n    innerWidth: Math.max(0, screenRect.width),\n    innerHeight: Math.max(0, screenRect.height),\n    cellWidth,\n    cellHeight,\n    fontSize\n  });\n};\n\nexport const useRetroScreenGeometry = ({\n  screenRef,\n  probeRef,\n  gridMode,\n  rows,\n  cols,\n  fontScale,\n  onGeometryChange\n}: UseRetroScreenGeometryOptions) => {\n  const [geometry, setGeometry] = useState(() =>\n    measureCurrentGeometry({ screenRef, probeRef, gridMode, rows, cols, fontScale })\n  );\n\n  useIsomorphicLayoutEffect(() => {\n    setGeometry(measureCurrentGeometry({ screenRef, probeRef, gridMode, rows, cols, fontScale }));\n  }, [cols, fontScale, gridMode, probeRef, rows, screenRef]);\n\n  useEffect(() => {\n    const screenNode = screenRef.current;\n\n    if (!screenNode || typeof ResizeObserver === \"undefined\") {\n      return;\n    }\n\n    const observer = new ResizeObserver(() => {\n      setGeometry(measureCurrentGeometry({ screenRef, probeRef, gridMode, rows, cols, fontScale }));\n    });\n\n    observer.observe(screenNode);\n    return () => observer.disconnect();\n  }, [cols, fontScale, gridMode, probeRef, rows, screenRef]);\n\n  useEffect(() => {\n    if (typeof document === \"undefined\" || !(\"fonts\" in document) || !document.fonts?.ready) {\n      return;\n    }\n\n    let cancelled = false;\n    const syncGeometry = () => {\n      if (!cancelled) {\n        setGeometry(\n          measureCurrentGeometry({ screenRef, probeRef, gridMode, rows, cols, fontScale })\n        );\n      }\n    };\n\n    void document.fonts.ready.then(syncGeometry);\n\n    return () => {\n      cancelled = true;\n    };\n  }, [cols, fontScale, gridMode, probeRef, rows, screenRef]);\n\n  useEffect(() => {\n    onGeometryChange?.(geometry);\n  }, [geometry, onGeometryChange]);\n\n  const cssVars = useMemo(\n    () =>\n      ({\n        \"--retro-screen-cell-width\": `${geometry.cellWidth}px`,\n        \"--retro-screen-cell-height\": `${geometry.cellHeight}px`,\n        \"--retro-screen-font-size\": `${geometry.fontSize}px`\n      }) as CSSProperties,\n    [geometry.cellHeight, geometry.cellWidth, geometry.fontSize]\n  );\n\n  return {\n    geometry,\n    cssVars\n  };\n};\n","import type { RetroScreenGeometry } from \"../types\";\n\nexport type MeasureGridInput = {\n  innerWidth: number;\n  innerHeight: number;\n  cellWidth: number;\n  cellHeight: number;\n  fontSize?: number;\n};\n\nexport type MeasureStaticGridInput = {\n  innerWidth: number;\n  innerHeight: number;\n  rows: number;\n  cols: number;\n  fontWidthRatio: number;\n  fontHeightRatio: number;\n};\n\nexport const measureGrid = ({\n  innerWidth,\n  innerHeight,\n  cellWidth,\n  cellHeight,\n  fontSize\n}: MeasureGridInput): RetroScreenGeometry => ({\n  rows: Math.max(1, Math.floor(innerHeight / Math.max(1, cellHeight))),\n  cols: Math.max(1, Math.floor(innerWidth / Math.max(1, cellWidth))),\n  cellWidth,\n  cellHeight,\n  innerWidth,\n  innerHeight,\n  fontSize: Math.max(1, fontSize ?? cellHeight)\n});\n\nexport const measureStaticGrid = ({\n  innerWidth,\n  innerHeight,\n  rows,\n  cols,\n  fontWidthRatio,\n  fontHeightRatio\n}: MeasureStaticGridInput): RetroScreenGeometry => {\n  const resolvedRows = Math.max(1, Math.floor(rows));\n  const resolvedCols = Math.max(1, Math.floor(cols));\n  const cellWidth = Math.max(1, innerWidth / resolvedCols);\n  const cellHeight = Math.max(1, innerHeight / resolvedRows);\n  const widthRatio = Math.max(0.01, fontWidthRatio);\n  const heightRatio = Math.max(0.01, fontHeightRatio);\n  const fontSize = Math.max(1, Math.min(cellWidth / widthRatio, cellHeight / heightRatio));\n\n  return {\n    rows: resolvedRows,\n    cols: resolvedCols,\n    cellWidth,\n    cellHeight,\n    innerWidth,\n    innerHeight,\n    fontSize\n  };\n};\n","import { useEffect, useRef } from \"react\";\nimport { createRetroScreenPromptSession } from \"../core/terminal/prompt-session\";\nimport type { RetroScreenPromptSessionOptions, RetroScreenPromptSession } from \"../core/terminal/prompt-session\";\n\nexport const useRetroScreenPromptSession = (\n  options: RetroScreenPromptSessionOptions = {}\n): RetroScreenPromptSession => {\n  const sessionRef = useRef<RetroScreenPromptSession | null>(null);\n\n  if (!sessionRef.current) {\n    sessionRef.current = createRetroScreenPromptSession(options);\n  }\n\n  useEffect(() => {\n    sessionRef.current?.updateOptions(options);\n  }, [\n    options.acceptanceText,\n    options.cursorMode,\n    options.onCommand,\n    options.promptChar,\n    options.rejectionText,\n    options.scrollback,\n    options.tabWidth\n  ]);\n\n  useEffect(() => {\n    sessionRef.current?.resize(options.rows ?? 9, options.cols ?? 46);\n  }, [options.cols, options.rows]);\n\n  return sessionRef.current;\n};\n","import type {\n  CursorMode,\n  RetroScreenPromptCommandResult\n} from \"../types\";\nimport { RetroScreenScreenBuffer } from \"./screen-buffer\";\nimport type {\n  RetroScreenScreenBufferOptions,\n  RetroScreenScreenSnapshot,\n  RetroScreenWriteOptions\n} from \"./types\";\n\ntype PromptTranscriptOperation = {\n  data: string;\n  options?: RetroScreenWriteOptions;\n};\n\nexport type RetroScreenPromptSessionOptions = Partial<RetroScreenScreenBufferOptions> & {\n  promptChar?: string;\n  acceptanceText?: string;\n  rejectionText?: string;\n  onCommand?: (\n    command: string\n  ) => RetroScreenPromptCommandResult | Promise<RetroScreenPromptCommandResult>;\n};\n\nexport type RetroScreenPromptSession = {\n  setDraft: (draft: string) => void;\n  getDraft: () => string;\n  setSelection: (offset: number) => void;\n  setFocused: (focused: boolean) => void;\n  isAwaitingResponse: () => boolean;\n  resize: (rows: number, cols: number) => void;\n  setCursorMode: (mode: CursorMode) => void;\n  updateOptions: (options: Partial<RetroScreenPromptSessionOptions>) => void;\n  clear: () => void;\n  reset: () => void;\n  submit: (command?: string) => Promise<RetroScreenPromptCommandResult>;\n  getSnapshot: () => RetroScreenScreenSnapshot;\n  subscribe: (listener: () => void) => () => void;\n};\n\nconst DEFAULT_ROWS = 9;\nconst DEFAULT_COLS = 46;\nconst DEFAULT_ACCEPTANCE_TEXT = \"OK\";\nconst DEFAULT_REJECTION_TEXT = \"ERROR\";\n\nconst clampDimension = (value: number, fallback: number) => {\n  const nextValue = Math.floor(value);\n  return Number.isFinite(nextValue) && nextValue > 0 ? nextValue : fallback;\n};\n\nconst clampSelection = (value: number, draft: string) =>\n  Math.max(0, Math.min(draft.length, Math.floor(value) || 0));\n\nconst normalizeResponseLines = (response?: string | string[]) => {\n  if (!response) {\n    return [];\n  }\n\n  const values = Array.isArray(response) ? response : [response];\n  return values.flatMap((value) => value.split(/\\r?\\n/u));\n};\n\nclass RetroScreenPromptSessionStore implements RetroScreenPromptSession {\n  private readonly listeners = new Set<() => void>();\n  private readonly transcript: PromptTranscriptOperation[] = [];\n  private rows: number;\n  private cols: number;\n  private scrollback?: number;\n  private tabWidth?: number;\n  private cursorMode: CursorMode;\n  private promptChar: string;\n  private acceptanceText: string;\n  private rejectionText: string;\n  private onCommand?: RetroScreenPromptSessionOptions[\"onCommand\"];\n  private draft = \"\";\n  private selection = 0;\n  private focused = false;\n  private awaitingResponse = false;\n\n  constructor(options: RetroScreenPromptSessionOptions = {}) {\n    this.rows = clampDimension(options.rows ?? DEFAULT_ROWS, DEFAULT_ROWS);\n    this.cols = clampDimension(options.cols ?? DEFAULT_COLS, DEFAULT_COLS);\n    this.scrollback = options.scrollback;\n    this.tabWidth = options.tabWidth;\n    this.cursorMode = options.cursorMode ?? \"solid\";\n    this.promptChar = options.promptChar ?? \">\";\n    this.acceptanceText = options.acceptanceText ?? DEFAULT_ACCEPTANCE_TEXT;\n    this.rejectionText = options.rejectionText ?? DEFAULT_REJECTION_TEXT;\n    this.onCommand = options.onCommand;\n  }\n\n  setDraft(draft: string) {\n    this.draft = draft;\n    this.selection = clampSelection(this.selection, this.draft);\n    this.emit();\n  }\n\n  getDraft() {\n    return this.draft;\n  }\n\n  setSelection(offset: number) {\n    this.selection = clampSelection(offset, this.draft);\n    this.emit();\n  }\n\n  setFocused(focused: boolean) {\n    this.focused = focused;\n    this.emit();\n  }\n\n  isAwaitingResponse() {\n    return this.awaitingResponse;\n  }\n\n  resize(rows: number, cols: number) {\n    const nextRows = clampDimension(rows, this.rows);\n    const nextCols = clampDimension(cols, this.cols);\n\n    if (nextRows === this.rows && nextCols === this.cols) {\n      return;\n    }\n\n    this.rows = nextRows;\n    this.cols = nextCols;\n    this.emit();\n  }\n\n  setCursorMode(mode: CursorMode) {\n    this.cursorMode = mode;\n    this.emit();\n  }\n\n  updateOptions(options: Partial<RetroScreenPromptSessionOptions>) {\n    if (options.promptChar !== undefined) {\n      this.promptChar = options.promptChar || \">\";\n    }\n\n    if (options.acceptanceText !== undefined) {\n      this.acceptanceText = options.acceptanceText || DEFAULT_ACCEPTANCE_TEXT;\n    }\n\n    if (options.rejectionText !== undefined) {\n      this.rejectionText = options.rejectionText || DEFAULT_REJECTION_TEXT;\n    }\n\n    if (options.onCommand !== undefined) {\n      this.onCommand = options.onCommand;\n    }\n\n    if (options.scrollback !== undefined) {\n      this.scrollback = options.scrollback;\n    }\n\n    if (options.tabWidth !== undefined) {\n      this.tabWidth = options.tabWidth;\n    }\n\n    if (options.rows !== undefined || options.cols !== undefined) {\n      this.resize(options.rows ?? this.rows, options.cols ?? this.cols);\n      return;\n    }\n\n    if (options.cursorMode !== undefined) {\n      this.setCursorMode(options.cursorMode);\n      return;\n    }\n\n    this.emit();\n  }\n\n  clear() {\n    this.transcript.length = 0;\n    this.awaitingResponse = false;\n    this.emit();\n  }\n\n  reset() {\n    this.clear();\n    this.draft = \"\";\n    this.selection = 0;\n    this.focused = false;\n    this.cursorMode = \"solid\";\n    this.emit();\n  }\n\n  async submit(command = this.draft): Promise<RetroScreenPromptCommandResult> {\n    if (this.awaitingResponse) {\n      return { accepted: false, response: [this.rejectionText] };\n    }\n\n    this.appendTranscript(`${this.promptChar} ${command}`, { appendNewline: true });\n    this.draft = \"\";\n    this.selection = 0;\n    this.awaitingResponse = true;\n    this.emit();\n\n    let result: RetroScreenPromptCommandResult;\n\n    try {\n      result = (await this.onCommand?.(command)) ?? { accepted: true };\n    } catch {\n      result = { accepted: false };\n    }\n\n    const statusLine = result.accepted ? this.acceptanceText : this.rejectionText;\n    this.appendTranscript(statusLine, { appendNewline: true });\n\n    for (const line of normalizeResponseLines(result.response)) {\n      this.appendTranscript(line, { appendNewline: true });\n    }\n\n    this.awaitingResponse = false;\n    this.emit();\n    return result;\n  }\n\n  getSnapshot(): RetroScreenScreenSnapshot {\n    const renderBuffer = this.createBuffer();\n\n    if (!this.awaitingResponse) {\n      const prefix = `${this.promptChar} `;\n      const fullPrompt = `${prefix}${this.draft}`;\n      renderBuffer.write(fullPrompt);\n\n      if (this.focused) {\n        const cursorBuffer = this.createBuffer();\n        cursorBuffer.write(`${prefix}${this.draft.slice(0, this.selection)}`);\n        const cursor = cursorBuffer.getCursor();\n        renderBuffer.moveCursorTo(cursor.row, cursor.col);\n        renderBuffer.setCursorVisible(true);\n      } else {\n        renderBuffer.setCursorVisible(false);\n      }\n    } else {\n      renderBuffer.setCursorVisible(false);\n    }\n\n    renderBuffer.setCursorMode(this.cursorMode);\n    return renderBuffer.getSnapshot();\n  }\n\n  subscribe(listener: () => void) {\n    this.listeners.add(listener);\n\n    return () => {\n      this.listeners.delete(listener);\n    };\n  }\n\n  private createBuffer() {\n    const buffer = new RetroScreenScreenBuffer({\n      rows: this.rows,\n      cols: this.cols,\n      scrollback: this.scrollback,\n      tabWidth: this.tabWidth,\n      cursorMode: this.cursorMode\n    });\n\n    for (const operation of this.transcript) {\n      buffer.write(operation.data, operation.options);\n    }\n\n    return buffer;\n  }\n\n  private appendTranscript(data: string, options?: RetroScreenWriteOptions) {\n    this.transcript.push({\n      data,\n      options\n    });\n  }\n\n  private emit() {\n    for (const listener of this.listeners) {\n      listener();\n    }\n  }\n}\n\nexport const createRetroScreenPromptSession = (\n  options: RetroScreenPromptSessionOptions = {}\n): RetroScreenPromptSession => new RetroScreenPromptSessionStore(options);\n","import {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type CSSProperties,\n  type MouseEventHandler\n} from \"react\";\nimport type { RetroScreenResizeMode, RetroScreenSharedProps } from \"../core/types\";\n\ntype ResolvedResizeMode = RetroScreenResizeMode | \"none\";\ntype ResizeHandle = \"right\" | \"bottom\" | \"bottom-right\" | \"left\" | \"top\" | \"top-left\";\ntype ResizeState = {\n  width: number | null;\n  height: number | null;\n};\n\ntype ActiveResize = {\n  width: boolean;\n  height: boolean;\n  widthDirection: 1 | -1;\n  heightDirection: 1 | -1;\n  startX: number;\n  startY: number;\n  startWidth: number;\n  startHeight: number;\n};\n\nconst DEFAULT_MIN_WIDTH = 280;\nconst DEFAULT_MIN_HEIGHT = 220;\n\nconst normalizeResizeMode = (\n  resizable: RetroScreenSharedProps[\"resizable\"]\n): ResolvedResizeMode => {\n  if (resizable === true) {\n    return \"both\";\n  }\n\n  if (!resizable) {\n    return \"none\";\n  }\n\n  return resizable;\n};\n\nconst getHandleCursor = (handle: ResizeHandle) => {\n  switch (handle) {\n    case \"right\":\n    case \"left\":\n      return \"ew-resize\";\n    case \"bottom\":\n    case \"top\":\n      return \"ns-resize\";\n    default:\n      return \"nwse-resize\";\n  }\n};\n\nconst getHandleAxes = (handle: ResizeHandle) => {\n  switch (handle) {\n    case \"right\":\n      return { width: true, height: false, widthDirection: 1, heightDirection: 1 };\n    case \"left\":\n      return { width: true, height: false, widthDirection: -1, heightDirection: 1 };\n    case \"bottom\":\n      return { width: false, height: true, widthDirection: 1, heightDirection: 1 };\n    case \"top\":\n      return { width: false, height: true, widthDirection: 1, heightDirection: -1 };\n    case \"top-left\":\n      return { width: true, height: true, widthDirection: -1, heightDirection: -1 };\n    default:\n      return { width: true, height: true, widthDirection: 1, heightDirection: 1 };\n  }\n};\n\nexport const useRetroScreenResizablePanel = ({\n  resizable,\n  resizableLeadingEdges\n}: Pick<RetroScreenSharedProps, \"resizable\" | \"resizableLeadingEdges\">) => {\n  const rootRef = useRef<HTMLDivElement | null>(null);\n  const listenersRef = useRef<{\n    move: (event: MouseEvent) => void;\n    end: () => void;\n  } | null>(null);\n  const activeResizeRef = useRef<ActiveResize | null>(null);\n  const bodyCursorRef = useRef<string | null>(null);\n  const bodyUserSelectRef = useRef<string | null>(null);\n  const [size, setSize] = useState<ResizeState>({\n    width: null,\n    height: null\n  });\n  const [activeHandle, setActiveHandle] = useState<ResizeHandle | null>(null);\n  const resizeMode = normalizeResizeMode(resizable);\n\n  const stopResize = () => {\n    if (typeof window !== \"undefined\" && listenersRef.current) {\n      window.removeEventListener(\"mousemove\", listenersRef.current.move);\n      window.removeEventListener(\"mouseup\", listenersRef.current.end);\n      window.removeEventListener(\"blur\", listenersRef.current.end);\n      listenersRef.current = null;\n    }\n\n    activeResizeRef.current = null;\n    setActiveHandle(null);\n\n    if (typeof document !== \"undefined\") {\n      if (bodyCursorRef.current !== null) {\n        document.body.style.cursor = bodyCursorRef.current;\n      }\n\n      if (bodyUserSelectRef.current !== null) {\n        document.body.style.userSelect = bodyUserSelectRef.current;\n      }\n    }\n\n    bodyCursorRef.current = null;\n    bodyUserSelectRef.current = null;\n  };\n\n  useEffect(() => stopResize, []);\n\n  useEffect(() => {\n    if (resizeMode === \"none\") {\n      stopResize();\n    }\n  }, [resizeMode]);\n\n  const beginResize =\n    (handle: ResizeHandle): MouseEventHandler<HTMLDivElement> =>\n    (event) => {\n      if (resizeMode === \"none\" || event.button !== 0) {\n        return;\n      }\n\n      const node = rootRef.current;\n      if (!node || typeof window === \"undefined\") {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      stopResize();\n\n      const rect = node.getBoundingClientRect();\n      const axes = getHandleAxes(handle);\n\n      activeResizeRef.current = {\n        ...axes,\n        startX: event.clientX,\n        startY: event.clientY,\n        startWidth: rect.width,\n        startHeight: rect.height\n      };\n      setActiveHandle(handle);\n\n      if (typeof document !== \"undefined\") {\n        bodyCursorRef.current = document.body.style.cursor;\n        bodyUserSelectRef.current = document.body.style.userSelect;\n        document.body.style.cursor = getHandleCursor(handle);\n        document.body.style.userSelect = \"none\";\n      }\n\n      const move = (moveEvent: MouseEvent) => {\n        const activeResize = activeResizeRef.current;\n        if (!activeResize) {\n          return;\n        }\n\n        const deltaX = moveEvent.clientX - activeResize.startX;\n        const deltaY = moveEvent.clientY - activeResize.startY;\n\n        setSize((current) => ({\n          width: activeResize.width\n            ? Math.max(\n                DEFAULT_MIN_WIDTH,\n                Math.round(activeResize.startWidth + deltaX * activeResize.widthDirection)\n              )\n            : current.width,\n          height: activeResize.height\n            ? Math.max(\n                DEFAULT_MIN_HEIGHT,\n                Math.round(activeResize.startHeight + deltaY * activeResize.heightDirection)\n              )\n            : current.height\n        }));\n      };\n\n      const end = () => {\n        stopResize();\n      };\n\n      listenersRef.current = {\n        move,\n        end\n      };\n\n      window.addEventListener(\"mousemove\", move);\n      window.addEventListener(\"mouseup\", end);\n      window.addEventListener(\"blur\", end);\n    };\n\n  const inlineSizeStyle = useMemo(\n    () => {\n      const style: CSSProperties = {};\n\n      if (size.width !== null) {\n        style.width = `${size.width}px`;\n      }\n\n      if (size.height !== null) {\n        style.height = `${size.height}px`;\n      }\n\n      return style;\n    },\n    [size.height, size.width]\n  );\n\n  return {\n    rootRef,\n    resizeMode,\n    activeHandle,\n    isResizable: resizeMode !== \"none\",\n    isResizing: activeHandle !== null,\n    hasLeadingHandles: Boolean(resizableLeadingEdges),\n    inlineSizeStyle,\n    beginResize\n  };\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n  RetroScreenController,\n  RetroScreenGeometry,\n  RetroScreenTerminalModeProps\n} from \"../core/types\";\nimport type { RetroScreenTerminalSessionState } from \"../core/terminal/session-types\";\n\ntype UseRetroScreenTerminalBridgeArgs = {\n  terminalProps: RetroScreenTerminalModeProps | null;\n  geometry: RetroScreenGeometry;\n  terminalController: RetroScreenController | null;\n};\n\nconst getGeometrySignature = (rows: number, cols: number) => `${rows}x${cols}`;\n\nexport const useRetroScreenTerminalBridge = ({\n  terminalProps,\n  geometry,\n  terminalController\n}: UseRetroScreenTerminalBridgeArgs): {\n  sessionState: RetroScreenTerminalSessionState;\n  sessionTitle: string | null;\n  sessionBellCount: number;\n} => {\n  const session = terminalProps?.session ?? null;\n  const onSessionEvent = terminalProps?.onSessionEvent;\n  const onSessionStateChange = terminalProps?.onSessionStateChange;\n  const closeSessionOnUnmount = terminalProps?.closeSessionOnUnmount ?? true;\n  const [sessionState, setSessionState] = useState<RetroScreenTerminalSessionState>(\n    session?.getState() ?? \"idle\"\n  );\n  const [sessionTitle, setSessionTitle] = useState<string | null>(null);\n  const [sessionBellCount, setSessionBellCount] = useState(0);\n  const lastSentGeometryRef = useRef<string | null>(null);\n  const queuedDataChunksRef = useRef<string[]>([]);\n  const flushScheduledRef = useRef(false);\n\n  const scheduleQueuedWriteFlush = () => {\n    if (!terminalController || flushScheduledRef.current) {\n      return;\n    }\n\n    flushScheduledRef.current = true;\n    queueMicrotask(() => {\n      flushScheduledRef.current = false;\n      if (!terminalController || queuedDataChunksRef.current.length === 0) {\n        return;\n      }\n\n      const chunks = queuedDataChunksRef.current;\n      queuedDataChunksRef.current = [];\n      terminalController.writeMany(chunks);\n    });\n  };\n\n  useEffect(() => {\n    if (!session || !terminalController) {\n      setSessionState(\"idle\");\n      setSessionTitle(null);\n      setSessionBellCount(0);\n      lastSentGeometryRef.current = null;\n      return;\n    }\n\n    const handleStateChange = (nextState: RetroScreenTerminalSessionState) => {\n      setSessionState((currentState) => (currentState === nextState ? currentState : nextState));\n      onSessionStateChange?.(nextState);\n    };\n\n    handleStateChange(session.getState());\n    const unsubscribe = session.subscribe((event) => {\n      if (event.type === \"data\") {\n        queuedDataChunksRef.current.push(event.data);\n        scheduleQueuedWriteFlush();\n      } else if (event.type === \"title\") {\n        setSessionTitle((currentTitle) => (currentTitle === event.title ? currentTitle : event.title));\n      } else if (event.type === \"bell\") {\n        setSessionBellCount((count) => count + 1);\n      }\n\n      if (event.type === \"connecting\") {\n        handleStateChange(\"connecting\");\n      } else if (event.type === \"open\" || event.type === \"ready\") {\n        handleStateChange(\"open\");\n      } else if (event.type === \"close\" || event.type === \"exit\") {\n        handleStateChange(\"closed\");\n      } else if (event.type === \"error\") {\n        handleStateChange(\"error\");\n      }\n\n      onSessionEvent?.(event);\n    });\n\n    session.connect({\n      rows: geometry.rows,\n      cols: geometry.cols\n    });\n    lastSentGeometryRef.current = getGeometrySignature(geometry.rows, geometry.cols);\n\n    return () => {\n      queuedDataChunksRef.current = [];\n      flushScheduledRef.current = false;\n      unsubscribe();\n      lastSentGeometryRef.current = null;\n    };\n  }, [\n    onSessionEvent,\n    onSessionStateChange,\n    session,\n    terminalController\n  ]);\n\n  useEffect(() => {\n    if (!session || !terminalController) {\n      return;\n    }\n\n    const geometrySignature = getGeometrySignature(geometry.rows, geometry.cols);\n    if (lastSentGeometryRef.current === geometrySignature) {\n      return;\n    }\n\n    lastSentGeometryRef.current = geometrySignature;\n    session.resize(geometry.rows, geometry.cols);\n  }, [geometry.cols, geometry.rows, session, terminalController]);\n\n  useEffect(() => {\n    if (!session || !terminalController || !closeSessionOnUnmount) {\n      return;\n    }\n\n    return () => {\n      session.close();\n    };\n  }, [closeSessionOnUnmount, session, terminalController]);\n\n  return {\n    sessionState,\n    sessionTitle,\n    sessionBellCount\n  };\n};\n","import { startTransition, useEffect, useMemo, useState } from \"react\";\nimport type {\n  CursorMode,\n  RetroScreenController,\n  RetroScreenGeometry,\n  RetroScreenTerminalModeProps\n} from \"../core/types\";\nimport { buildTerminalSnapshot } from \"./retro-screen-render-model\";\nimport type { RetroScreenScreenSnapshot } from \"../core/terminal/types\";\n\ntype UseRetroScreenTerminalRenderModelArgs = {\n  terminalProps: RetroScreenTerminalModeProps | null;\n  geometry: RetroScreenGeometry;\n  cursorMode: CursorMode;\n  requestedCursorMode?: CursorMode;\n  internalController: RetroScreenController;\n};\n\nexport const useRetroScreenTerminalRenderModel = ({\n  terminalProps,\n  geometry,\n  cursorMode,\n  requestedCursorMode,\n  internalController\n  }: UseRetroScreenTerminalRenderModelArgs): {\n  snapshot: RetroScreenScreenSnapshot;\n  terminalController: RetroScreenController | null;\n} => {\n  const terminalController =\n    terminalProps?.controller ?? (terminalProps ? internalController : null);\n  const initialText = terminalProps?.session\n    ? \"\"\n    : terminalProps?.value ?? terminalProps?.initialBuffer ?? \"\";\n  const [snapshot, setSnapshot] = useState<RetroScreenScreenSnapshot>(() =>\n    buildTerminalSnapshot({\n      text: initialText,\n      rows: geometry.rows,\n      cols: geometry.cols,\n      cursorMode,\n      scrollback: terminalProps?.bufferSize\n    })\n  );\n\n  useEffect(() => {\n    if (!terminalController) {\n      return;\n    }\n\n    terminalController.batch(() => {\n      terminalController.resize(geometry.rows, geometry.cols);\n      if (requestedCursorMode) {\n        terminalController.setCursorMode(requestedCursorMode);\n      }\n    });\n  }, [geometry.cols, geometry.rows, requestedCursorMode, terminalController]);\n\n  useEffect(() => {\n    if (!terminalProps || terminalProps.controller || terminalProps.session) {\n      return;\n    }\n\n    internalController.batch(() => {\n      internalController.reset();\n      internalController.setCursorMode(cursorMode);\n\n      const initialText = terminalProps.value ?? terminalProps.initialBuffer ?? \"\";\n      if (initialText) {\n        internalController.write(initialText);\n      }\n    });\n  }, [\n    cursorMode,\n    internalController,\n    terminalProps?.controller,\n    terminalProps?.initialBuffer,\n    terminalProps?.value\n  ]);\n\n  useEffect(() => {\n    if (terminalController) {\n      const syncSnapshot = () => {\n        const nextSnapshot = terminalController.getSnapshot();\n        startTransition(() => {\n          setSnapshot(nextSnapshot);\n        });\n      };\n\n      syncSnapshot();\n      return terminalController.subscribe(syncSnapshot);\n    }\n\n    setSnapshot(\n      buildTerminalSnapshot({\n        text: terminalProps?.session ? \"\" : terminalProps?.value ?? terminalProps?.initialBuffer ?? \"\",\n        rows: geometry.rows,\n        cols: geometry.cols,\n        cursorMode,\n        scrollback: terminalProps?.bufferSize\n      })\n    );\n  }, [\n    cursorMode,\n    geometry.cols,\n    geometry.rows,\n    terminalProps?.bufferSize,\n    terminalController,\n    terminalProps?.initialBuffer,\n    terminalProps?.session,\n    terminalProps?.value\n  ]);\n\n  return useMemo(\n    () => ({\n      snapshot,\n      terminalController\n    }),\n    [snapshot, terminalController]\n  );\n};\n","import { useEffect, useRef, type ComponentProps } from \"react\";\nimport { RetroScreen } from \"./RetroScreen\";\nimport {\n  type RetroScreenAnsiPlayerState\n} from \"./useRetroScreenAnsiPlayer\";\nimport { useRetroScreenAnsiSnapshotPlayer } from \"./useRetroScreenAnsiSnapshotPlayer\";\nimport type { RetroScreenAnsiByteChunk } from \"../core/ansi/player\";\n\nexport type RetroScreenAnsiPlayerProps = Omit<\n  ComponentProps<typeof RetroScreen>,\n  \"mode\" | \"value\" | \"gridMode\" | \"rows\" | \"cols\"\n> & {\n  byteStream?: readonly RetroScreenAnsiByteChunk[];\n  rows: number;\n  cols: number;\n  frameDelayMs?: number;\n  loop?: boolean;\n  complete?: boolean;\n  loadingValue?: string;\n  onPlaybackStateChange?: (state: RetroScreenAnsiPlayerState) => void;\n};\n\nexport function RetroScreenAnsiPlayer({\n  byteStream = [],\n  rows,\n  cols,\n  frameDelayMs,\n  loop,\n  complete,\n  loadingValue,\n  onPlaybackStateChange,\n  ...screenProps\n}: RetroScreenAnsiPlayerProps) {\n  const playbackState = useRetroScreenAnsiSnapshotPlayer({\n    byteStream,\n    metadata: {\n      title: \"ANSI Stream\",\n      author: \"Unknown\",\n      group: \"Unknown\",\n      font: \"IBM VGA\",\n      width: cols,\n      height: rows\n    },\n    frameDelayMs,\n    loop,\n    complete,\n    loadingValue\n  });\n  const notifiedPlaybackStateRef = useRef<RetroScreenAnsiPlayerState | null>(null);\n\n  useEffect(() => {\n    const previousPlaybackState = notifiedPlaybackStateRef.current;\n    const changed =\n      previousPlaybackState === null ||\n      previousPlaybackState.displayValue !== playbackState.displayValue ||\n      previousPlaybackState.frameIndex !== playbackState.frameIndex ||\n      previousPlaybackState.frameCount !== playbackState.frameCount ||\n      previousPlaybackState.isComplete !== playbackState.isComplete ||\n      previousPlaybackState.isStreaming !== playbackState.isStreaming;\n\n    if (!changed) {\n      return;\n    }\n\n    const nextPlaybackState: RetroScreenAnsiPlayerState = {\n      displayValue: playbackState.displayValue,\n      frameIndex: playbackState.frameIndex,\n      frameCount: playbackState.frameCount,\n      isComplete: playbackState.isComplete,\n      isStreaming: playbackState.isStreaming\n    };\n\n    notifiedPlaybackStateRef.current = nextPlaybackState;\n    onPlaybackStateChange?.(nextPlaybackState);\n  }, [onPlaybackStateChange, playbackState]);\n\n  const hasFullCellFrame =\n    Boolean(playbackState.frameSnapshot.cells) &&\n    playbackState.frameSnapshot.cells?.length === rows &&\n    playbackState.frameSnapshot.cells?.every((line) => line.length === cols);\n\n  return (\n    <RetroScreen\n      {...screenProps}\n      cells={hasFullCellFrame ? playbackState.frameSnapshot.cells : undefined}\n      mode=\"value\"\n      value={playbackState.displayValue}\n      gridMode=\"static\"\n      rows={rows}\n      cols={cols}\n    />\n  );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n  createRetroScreenAnsiSnapshotStream,\n  type RetroScreenAnsiByteChunk,\n  type RetroScreenAnsiMetadata,\n  type RetroScreenAnsiSnapshotFrame,\n  type RetroScreenAnsiSnapshotStreamSnapshot\n} from \"../core/ansi/player\";\nimport {\n  resolveRetroScreenAnsiSourceGeometry,\n  type RetroScreenAnsiFrameSnapshot,\n  type RetroScreenAnsiGeometryPolicy,\n  type RetroScreenAnsiSnapshotStorageMode\n} from \"../core/ansi/snapshot-contract\";\n\nexport type RetroScreenAnsiSnapshotPlayerState = {\n  displayValue: string;\n  frameIndex: number;\n  frameCount: number;\n  isComplete: boolean;\n  isStreaming: boolean;\n  sourceRows: number;\n  sourceCols: number;\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n  lines: readonly string[];\n  metadata: RetroScreenAnsiMetadata | null;\n  frameSnapshot: RetroScreenAnsiFrameSnapshot;\n};\n\ntype UseRetroScreenAnsiSnapshotPlayerArgs = {\n  byteStream?: readonly RetroScreenAnsiByteChunk[];\n  metadata?: RetroScreenAnsiMetadata | null;\n  policy?: RetroScreenAnsiGeometryPolicy;\n  frameDelayMs?: number;\n  loop?: boolean;\n  complete?: boolean;\n  loadingValue?: string;\n};\n\nconst PREVIEW_ROWS = 25;\nconst PREVIEW_COLS = 80;\nconst EMPTY_FRAME: RetroScreenAnsiSnapshotFrame = {\n  lines: [],\n  text: \"\",\n  storageMode: \"eager\",\n  getLineSlice() {\n    return \"\";\n  },\n  getCellSlice() {\n    return [];\n  }\n};\n\nconst createLoadingFrameSnapshot = ({\n  loadingValue,\n  sourceRows,\n  sourceCols,\n  frameCount,\n  isComplete,\n  isStreaming,\n  storageMode,\n  metadata\n}: {\n  loadingValue: string;\n  sourceRows: number;\n  sourceCols: number;\n  frameCount: number;\n  isComplete: boolean;\n  isStreaming: boolean;\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n  metadata: RetroScreenAnsiMetadata | null;\n}): RetroScreenAnsiFrameSnapshot => {\n  const loadingLines = loadingValue.split(\"\\n\");\n\n  return {\n    sourceRows,\n    sourceCols,\n    frameIndex: 0,\n    frameCount,\n    isComplete,\n    isStreaming,\n    storageMode,\n    lines: loadingLines,\n    metadata,\n    getLineSlice(rowIndex, startCol, endCol) {\n      const sourceLine = loadingLines[rowIndex] ?? \"\";\n      const normalizedStart = Math.max(0, Math.floor(startCol || 0));\n      const normalizedEnd = Math.max(\n        normalizedStart,\n        Math.floor(endCol || normalizedStart)\n      );\n      const sliceLength = Math.max(0, normalizedEnd - normalizedStart);\n\n      return sourceLine.slice(normalizedStart, normalizedEnd).padEnd(sliceLength, \" \");\n    },\n    getCellSlice(rowIndex, startCol, endCol) {\n      const normalizedStart = Math.max(0, Math.floor(startCol || 0));\n      const normalizedEnd = Math.max(\n        normalizedStart,\n        Math.floor(endCol || normalizedStart)\n      );\n\n      return Array.from(\n        { length: Math.max(0, normalizedEnd - normalizedStart) },\n        (_, cellIndex) => ({\n          char: loadingLines[rowIndex]?.[normalizedStart + cellIndex] ?? \" \",\n          style: {\n            intensity: \"normal\",\n            bold: false,\n            faint: false,\n            inverse: false,\n            conceal: false,\n            blink: false,\n            foreground: {\n              mode: \"default\",\n              value: 0\n            },\n            background: {\n              mode: \"default\",\n              value: 0\n            }\n          }\n        })\n      );\n    }\n  };\n};\n\nconst createEmptySnapshot = ({\n  sourceRows,\n  sourceCols,\n  metadata,\n  storageMode\n}: {\n  sourceRows: number;\n  sourceCols: number;\n  metadata: RetroScreenAnsiMetadata | null;\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n}): RetroScreenAnsiSnapshotStreamSnapshot => ({\n  completedFrames: [],\n  currentFrame: EMPTY_FRAME,\n  sourceRows,\n  sourceCols,\n  metadata,\n  storageMode\n});\n\nconst buildPlayerFrameSnapshot = ({\n  frame,\n  sourceRows,\n  sourceCols,\n  frameIndex,\n  frameCount,\n  isComplete,\n  isStreaming,\n  metadata\n}: {\n  frame: RetroScreenAnsiSnapshotFrame;\n  sourceRows: number;\n  sourceCols: number;\n  frameIndex: number;\n  frameCount: number;\n  isComplete: boolean;\n  isStreaming: boolean;\n  metadata: RetroScreenAnsiMetadata | null;\n}): RetroScreenAnsiFrameSnapshot => ({\n  sourceRows,\n  sourceCols,\n  frameIndex,\n  frameCount,\n  isComplete,\n  isStreaming,\n  storageMode: frame.storageMode,\n  lines: [...frame.lines],\n  cells: frame.cells ? frame.cells.map((row) => row.map((cell) => ({ char: cell.char, style: cell.style }))) : undefined,\n  metadata,\n  getLineSlice: frame.getLineSlice,\n  getCellSlice: frame.getCellSlice\n});\n\nconst buildFramePreviewLines = ({\n  frame,\n  sourceRows,\n  sourceCols,\n  previewRows = PREVIEW_ROWS,\n  previewCols = PREVIEW_COLS\n}: {\n  frame: RetroScreenAnsiSnapshotFrame;\n  sourceRows: number;\n  sourceCols: number;\n  previewRows?: number;\n  previewCols?: number;\n}) => {\n  if (frame.lines.length > 0) {\n    return [...frame.lines];\n  }\n\n  const resolvedRows = Math.min(sourceRows, Math.max(1, Math.floor(previewRows || PREVIEW_ROWS)));\n  const resolvedCols = Math.min(sourceCols, Math.max(1, Math.floor(previewCols || PREVIEW_COLS)));\n\n  return Array.from({ length: resolvedRows }, (_, rowIndex) =>\n    frame.getLineSlice(rowIndex, 0, resolvedCols)\n  );\n};\n\nexport const useRetroScreenAnsiSnapshotPlayer = ({\n  byteStream = [],\n  metadata = null,\n  policy,\n  frameDelayMs = 72,\n  loop = false,\n  complete = false,\n  loadingValue = \"Loading ANSI stream...\"\n}: UseRetroScreenAnsiSnapshotPlayerArgs): RetroScreenAnsiSnapshotPlayerState => {\n  const normalizedMetadata = useMemo(\n    () =>\n      metadata\n        ? {\n            title: metadata.title,\n            author: metadata.author,\n            group: metadata.group,\n            font: metadata.font,\n            width: metadata.width,\n            height: metadata.height\n          }\n        : null,\n    [\n      metadata?.author,\n      metadata?.font,\n      metadata?.group,\n      metadata?.height,\n      metadata?.title,\n      metadata?.width\n    ]\n  );\n  const sourceGeometry = useMemo(\n    () => resolveRetroScreenAnsiSourceGeometry({ metadata: normalizedMetadata, policy }),\n    [normalizedMetadata, policy]\n  );\n  const decoderRef = useRef(\n    createRetroScreenAnsiSnapshotStream({\n      rows: sourceGeometry.rows,\n      cols: sourceGeometry.cols,\n      metadata: normalizedMetadata,\n      storageMode: sourceGeometry.storageMode\n    })\n  );\n  const processedChunkCountRef = useRef(0);\n  const playbackStartedAtRef = useRef(0);\n  const playbackSnapshotRef = useRef<RetroScreenAnsiSnapshotStreamSnapshot>(\n    createEmptySnapshot({\n      sourceRows: sourceGeometry.rows,\n      sourceCols: sourceGeometry.cols,\n      metadata: normalizedMetadata,\n      storageMode: sourceGeometry.storageMode\n    })\n  );\n  const [playbackTick, setPlaybackTick] = useState(0);\n  const [snapshotVersion, setSnapshotVersion] = useState(0);\n  const [resetVersion, setResetVersion] = useState(0);\n\n  useEffect(() => {\n    decoderRef.current = createRetroScreenAnsiSnapshotStream({\n      rows: sourceGeometry.rows,\n      cols: sourceGeometry.cols,\n      metadata: normalizedMetadata,\n      storageMode: sourceGeometry.storageMode\n    });\n    processedChunkCountRef.current = 0;\n    playbackStartedAtRef.current = performance.now();\n    playbackSnapshotRef.current = createEmptySnapshot({\n      sourceRows: sourceGeometry.rows,\n      sourceCols: sourceGeometry.cols,\n      metadata: normalizedMetadata,\n      storageMode: sourceGeometry.storageMode\n    });\n    setPlaybackTick(0);\n    setSnapshotVersion((current) => current + 1);\n    setResetVersion((current) => current + 1);\n  }, [\n    normalizedMetadata,\n    sourceGeometry.cols,\n    sourceGeometry.rows,\n    sourceGeometry.storageMode\n  ]);\n\n  useEffect(() => {\n    const previousProcessedChunkCount = processedChunkCountRef.current;\n    let didReset = false;\n\n    if (byteStream.length < processedChunkCountRef.current) {\n      decoderRef.current.reset();\n      processedChunkCountRef.current = 0;\n      playbackStartedAtRef.current = performance.now();\n      playbackSnapshotRef.current = createEmptySnapshot({\n        sourceRows: sourceGeometry.rows,\n        sourceCols: sourceGeometry.cols,\n        metadata: normalizedMetadata,\n        storageMode: sourceGeometry.storageMode\n      });\n      setPlaybackTick(0);\n      setSnapshotVersion((current) => current + 1);\n      setResetVersion((current) => current + 1);\n      didReset = true;\n    }\n\n    const decoder = decoderRef.current;\n\n    for (let index = processedChunkCountRef.current; index < byteStream.length; index += 1) {\n      decoder.appendChunk(byteStream[index]!);\n    }\n\n    const didProcessChunks = byteStream.length !== previousProcessedChunkCount;\n    processedChunkCountRef.current = byteStream.length;\n    if (didReset || didProcessChunks) {\n      playbackSnapshotRef.current = decoder.getSnapshot();\n      setSnapshotVersion((current) => current + 1);\n    }\n  }, [\n    byteStream,\n    normalizedMetadata,\n    sourceGeometry.cols,\n    sourceGeometry.rows,\n    sourceGeometry.storageMode\n  ]);\n\n  useEffect(() => {\n    const playbackSnapshot = playbackSnapshotRef.current;\n    const hasPlayableFrames = playbackSnapshot.completedFrames.length > 0;\n    const hasCurrentFrame = playbackSnapshot.currentFrame.text.trim().length > 0;\n\n    if (!hasPlayableFrames && !hasCurrentFrame) {\n      return;\n    }\n\n    let active = true;\n    let rafId = 0;\n\n    const tick = () => {\n      if (!active) {\n        return;\n      }\n\n      const elapsed = performance.now() - playbackStartedAtRef.current;\n      const nextTick = Math.max(0, Math.floor(elapsed / Math.max(1, frameDelayMs)));\n\n      setPlaybackTick((current) => (current === nextTick ? current : nextTick));\n      rafId = window.requestAnimationFrame(tick);\n    };\n\n    tick();\n\n    return () => {\n      active = false;\n      window.cancelAnimationFrame(rafId);\n    };\n  }, [frameDelayMs, resetVersion, snapshotVersion]);\n\n  return useMemo(() => {\n    const playbackSnapshot = playbackSnapshotRef.current;\n    const finalFrameIncluded = complete && playbackSnapshot.currentFrame.text.length > 0;\n    const frameCount =\n      playbackSnapshot.completedFrames.length + (finalFrameIncluded ? 1 : 0);\n\n    if (frameCount === 0) {\n      const hasCurrentFrame = playbackSnapshot.currentFrame.text.trim().length > 0;\n      const frameSnapshot = hasCurrentFrame\n        ? buildPlayerFrameSnapshot({\n            frame: playbackSnapshot.currentFrame,\n            sourceRows: playbackSnapshot.sourceRows,\n            sourceCols: playbackSnapshot.sourceCols,\n            frameIndex: 0,\n            frameCount,\n            isComplete: complete,\n            isStreaming: !complete,\n            metadata: playbackSnapshot.metadata\n          })\n        : createLoadingFrameSnapshot({\n            loadingValue,\n            sourceRows: sourceGeometry.rows,\n            sourceCols: sourceGeometry.cols,\n            frameCount,\n            isComplete: complete,\n            isStreaming: !complete,\n            storageMode: sourceGeometry.storageMode,\n            metadata: normalizedMetadata\n          });\n\n      return {\n        displayValue: hasCurrentFrame ? playbackSnapshot.currentFrame.text : loadingValue,\n        frameIndex: 0,\n        frameCount,\n        isComplete: complete,\n        isStreaming: !complete,\n        sourceRows: hasCurrentFrame ? playbackSnapshot.sourceRows : sourceGeometry.rows,\n        sourceCols: hasCurrentFrame ? playbackSnapshot.sourceCols : sourceGeometry.cols,\n        storageMode: hasCurrentFrame ? playbackSnapshot.storageMode : sourceGeometry.storageMode,\n        lines: frameSnapshot.lines,\n        metadata: hasCurrentFrame ? playbackSnapshot.metadata : normalizedMetadata,\n        frameSnapshot\n      } satisfies RetroScreenAnsiSnapshotPlayerState;\n    }\n\n    const boundedFrameIndex =\n      complete && loop\n        ? playbackTick % frameCount\n        : Math.min(playbackTick, frameCount - 1);\n\n    const displayFrame =\n      !complete && playbackTick >= frameCount\n        ? playbackSnapshot.currentFrame\n        : finalFrameIncluded && boundedFrameIndex === playbackSnapshot.completedFrames.length\n          ? playbackSnapshot.currentFrame\n          : playbackSnapshot.completedFrames[boundedFrameIndex] ?? playbackSnapshot.currentFrame;\n    const previewLines = buildFramePreviewLines({\n      frame: displayFrame,\n      sourceRows: playbackSnapshot.sourceRows,\n      sourceCols: playbackSnapshot.sourceCols\n    });\n\n    return {\n      displayValue: displayFrame.text || previewLines.join(\"\\n\") || loadingValue,\n      frameIndex: boundedFrameIndex,\n      frameCount,\n      isComplete: complete,\n      isStreaming: !complete,\n      sourceRows: playbackSnapshot.sourceRows,\n      sourceCols: playbackSnapshot.sourceCols,\n      storageMode: playbackSnapshot.storageMode,\n      lines: previewLines,\n      metadata: playbackSnapshot.metadata,\n      frameSnapshot: buildPlayerFrameSnapshot({\n        frame: displayFrame,\n        sourceRows: playbackSnapshot.sourceRows,\n        sourceCols: playbackSnapshot.sourceCols,\n        frameIndex: boundedFrameIndex,\n        frameCount,\n        isComplete: complete,\n        isStreaming: !complete,\n        metadata: playbackSnapshot.metadata\n      })\n    } satisfies RetroScreenAnsiSnapshotPlayerState;\n  }, [\n    complete,\n    loadingValue,\n    loop,\n    normalizedMetadata,\n    playbackTick,\n    snapshotVersion,\n    sourceGeometry.cols,\n    sourceGeometry.rows,\n    sourceGeometry.storageMode\n  ]);\n};\n","import type {\n  RetroScreenAnsiCellSliceAccessor,\n  RetroScreenAnsiLineSliceAccessor,\n  RetroScreenAnsiSnapshotStorageMode\n} from \"./snapshot-contract\";\nimport type { RetroScreenCell, RetroScreenCellStyle } from \"../terminal/types\";\nimport {\n  applySgrParameters,\n  cloneStyle,\n  DEFAULT_CELL_STYLE\n} from \"../terminal/sgr\";\n\nexport type RetroScreenAnsiByteChunk = Uint8Array | ArrayBuffer | ArrayLike<number>;\n\nexport type RetroScreenAnsiMetadata = {\n  title: string;\n  author: string;\n  group: string;\n  font: string;\n  width: number;\n  height: number;\n};\n\nexport type RetroScreenAnsiFrameStreamSnapshot = {\n  completedFrames: readonly string[];\n  currentFrame: string;\n};\n\nexport type RetroScreenAnsiSnapshotFrame = {\n  lines: readonly string[];\n  text: string;\n  cells?: readonly RetroScreenCell[][];\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n  getLineSlice: RetroScreenAnsiLineSliceAccessor;\n  getCellSlice: RetroScreenAnsiCellSliceAccessor;\n};\n\nexport type RetroScreenAnsiSnapshotStreamSnapshot = {\n  completedFrames: readonly RetroScreenAnsiSnapshotFrame[];\n  currentFrame: RetroScreenAnsiSnapshotFrame;\n  sourceRows: number;\n  sourceCols: number;\n  metadata: RetroScreenAnsiMetadata | null;\n  storageMode: RetroScreenAnsiSnapshotStorageMode;\n};\n\nexport type RetroScreenAnsiFrameStream = {\n  appendChunk: (chunk: RetroScreenAnsiByteChunk) => RetroScreenAnsiFrameStreamSnapshot;\n  appendText: (text: string) => RetroScreenAnsiFrameStreamSnapshot;\n  getSnapshot: () => RetroScreenAnsiFrameStreamSnapshot;\n  reset: () => void;\n};\n\nexport type RetroScreenAnsiSnapshotStream = {\n  appendChunk: (chunk: RetroScreenAnsiByteChunk) => RetroScreenAnsiSnapshotStreamSnapshot;\n  appendText: (text: string) => RetroScreenAnsiSnapshotStreamSnapshot;\n  getSnapshot: () => RetroScreenAnsiSnapshotStreamSnapshot;\n  reset: () => void;\n};\n\nconst CP437_CODE_POINTS = [\n  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n  22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,\n  79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,\n  98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,\n  114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199,\n  252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197,\n  201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 8359,\n  402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161,\n  171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553,\n  9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567,\n  9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560,\n  9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223,\n  915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801,\n  177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632,\n  160\n] as const;\n\nconst SAUCE_RECORD_SIZE = 128;\nconst SAUCE_SIGNATURE = \"SAUCE00\";\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nconst stringifyGrid = (grid: readonly RetroScreenCell[][]) =>\n  grid.map((row) => row.map((cell) => cell.char).join(\"\")).join(\"\\n\");\nconst stringifyGridLines = (grid: readonly RetroScreenCell[][]) =>\n  grid.map((row) => row.map((cell) => cell.char).join(\"\"));\nconst EMPTY_CELL_CHARACTER = \" \";\nconst PREVIEW_ROWS = 25;\nconst PREVIEW_COLS = 80;\n\ntype RetroScreenAnsiDenseGrid = RetroScreenCell[][];\ntype RetroScreenAnsiSparseGrid = Map<number, Map<number, RetroScreenCell>>;\n\nconst padSlice = (value: string, length: number) =>\n  value.length >= length ? value.slice(0, length) : value.padEnd(length, EMPTY_CELL_CHARACTER);\n\nconst createAnsiCell = (\n  char: string = EMPTY_CELL_CHARACTER,\n  style: RetroScreenCellStyle = DEFAULT_CELL_STYLE\n): RetroScreenCell => ({\n  char,\n  style: cloneStyle(style)\n});\n\nconst cloneAnsiCell = (cell: RetroScreenCell): RetroScreenCell => ({\n  char: cell.char,\n  style: cloneStyle(cell.style)\n});\n\nconst cloneAnsiCellRow = (row: readonly RetroScreenCell[]) => row.map((cell) => cloneAnsiCell(cell));\n\nconst normalizeLineSliceRange = (\n  startCol: number,\n  endCol: number,\n  totalCols: number\n) => {\n  const normalizedStart = clamp(Math.floor(startCol || 0), 0, totalCols);\n  const normalizedEnd = clamp(\n    Math.max(normalizedStart, Math.floor(endCol || normalizedStart)),\n    normalizedStart,\n    totalCols\n  );\n\n  return {\n    startCol: normalizedStart,\n    endCol: normalizedEnd,\n    length: Math.max(0, normalizedEnd - normalizedStart)\n  };\n};\n\nconst sliceDenseLine = (\n  line: string,\n  startCol: number,\n  endCol: number,\n  totalCols: number\n) => {\n  const range = normalizeLineSliceRange(startCol, endCol, totalCols);\n\n  return padSlice(line.slice(range.startCol, range.endCol), range.length);\n};\n\nconst padCellSlice = (cells: RetroScreenCell[], length: number) =>\n  cells.length >= length\n    ? cells.slice(0, length).map((cell) => cloneAnsiCell(cell))\n    : [\n        ...cells.map((cell) => cloneAnsiCell(cell)),\n        ...Array.from({ length: length - cells.length }, () => createAnsiCell())\n      ];\n\nconst sliceDenseCellLine = (\n  line: readonly RetroScreenCell[],\n  startCol: number,\n  endCol: number,\n  totalCols: number\n) => {\n  const range = normalizeLineSliceRange(startCol, endCol, totalCols);\n\n  return padCellSlice(line.slice(range.startCol, range.endCol).map((cell) => cloneAnsiCell(cell)), range.length);\n};\n\nconst getSparseRow = (grid: RetroScreenAnsiSparseGrid, rowIndex: number) => grid.get(rowIndex);\n\nconst buildSparseLineSlice = ({\n  grid,\n  rowIndex,\n  startCol,\n  endCol,\n  totalCols\n}: {\n  grid: RetroScreenAnsiSparseGrid;\n  rowIndex: number;\n  startCol: number;\n  endCol: number;\n  totalCols: number;\n}) => {\n  const range = normalizeLineSliceRange(startCol, endCol, totalCols);\n\n  if (range.length <= 0) {\n    return \"\";\n  }\n\n  const row = getSparseRow(grid, rowIndex);\n\n  if (!row || row.size === 0) {\n    return EMPTY_CELL_CHARACTER.repeat(range.length);\n  }\n\n  const slice = Array.from({ length: range.length }, () => EMPTY_CELL_CHARACTER);\n\n  for (const [colIndex, cell] of row) {\n    if (colIndex < range.startCol || colIndex >= range.endCol) {\n      continue;\n    }\n\n    slice[colIndex - range.startCol] = cell.char;\n  }\n\n  return slice.join(\"\");\n};\n\nconst buildSparseCellSlice = ({\n  grid,\n  rowIndex,\n  startCol,\n  endCol,\n  totalCols\n}: {\n  grid: RetroScreenAnsiSparseGrid;\n  rowIndex: number;\n  startCol: number;\n  endCol: number;\n  totalCols: number;\n}) => {\n  const range = normalizeLineSliceRange(startCol, endCol, totalCols);\n\n  if (range.length <= 0) {\n    return [];\n  }\n\n  const row = getSparseRow(grid, rowIndex);\n  const slice = Array.from({ length: range.length }, () => createAnsiCell());\n\n  if (!row || row.size === 0) {\n    return slice;\n  }\n\n  for (const [colIndex, cell] of row) {\n    if (colIndex < range.startCol || colIndex >= range.endCol) {\n      continue;\n    }\n\n    slice[colIndex - range.startCol] = cloneAnsiCell(cell);\n  }\n\n  return slice;\n};\n\nconst cloneDenseGrid = (grid: readonly RetroScreenCell[][]): RetroScreenAnsiDenseGrid =>\n  grid.map((row) => cloneAnsiCellRow(row));\n\nconst cloneSparseGrid = (grid: RetroScreenAnsiSparseGrid): RetroScreenAnsiSparseGrid =>\n  new Map(\n    Array.from(grid, ([rowIndex, row]) => [\n      rowIndex,\n      new Map(Array.from(row, ([colIndex, cell]) => [colIndex, cloneAnsiCell(cell)]))\n    ])\n  );\n\nconst buildPreviewLinesFromSliceAccessor = ({\n  rows,\n  cols,\n  getLineSlice\n}: {\n  rows: number;\n  cols: number;\n  getLineSlice: RetroScreenAnsiLineSliceAccessor;\n}) => {\n  const previewRows = Math.min(rows, PREVIEW_ROWS);\n  const previewCols = Math.min(cols, PREVIEW_COLS);\n\n  return Array.from({ length: previewRows }, (_, rowIndex) =>\n    getLineSlice(rowIndex, 0, previewCols)\n  );\n};\n\nconst buildPreviewCellsFromSliceAccessor = ({\n  rows,\n  cols,\n  getCellSlice\n}: {\n  rows: number;\n  cols: number;\n  getCellSlice: RetroScreenAnsiCellSliceAccessor;\n}) => {\n  const previewRows = Math.min(rows, PREVIEW_ROWS);\n  const previewCols = Math.min(cols, PREVIEW_COLS);\n\n  return Array.from({ length: previewRows }, (_, rowIndex) =>\n    getCellSlice(rowIndex, 0, previewCols)\n  );\n};\n\nconst isDefaultColor = (color: RetroScreenCellStyle[\"foreground\"]) =>\n  color.mode === \"default\" && color.value === 0;\n\nconst isDefaultStyle = (style: RetroScreenCellStyle) =>\n  style.intensity === \"normal\" &&\n  !style.bold &&\n  !style.faint &&\n  !style.inverse &&\n  !style.conceal &&\n  !style.blink &&\n  isDefaultColor(style.foreground) &&\n  isDefaultColor(style.background);\n\nconst shouldPersistSparseCell = (cell: RetroScreenCell) =>\n  cell.char !== EMPTY_CELL_CHARACTER || !isDefaultStyle(cell.style);\n\nconst createDenseFrame = ({\n  grid,\n  lines,\n  text,\n  cols\n}: {\n  grid: RetroScreenAnsiDenseGrid;\n  lines?: readonly string[];\n  text?: string;\n  cols: number;\n}): RetroScreenAnsiSnapshotFrame => ({\n  lines: lines ? [...lines] : stringifyGridLines(grid),\n  text: text ?? stringifyGrid(grid),\n  cells: grid,\n  storageMode: \"eager\",\n  getLineSlice(rowIndex, startCol, endCol) {\n    return sliceDenseLine((grid[rowIndex] ?? []).map((cell) => cell.char).join(\"\"), startCol, endCol, cols);\n  },\n  getCellSlice(rowIndex, startCol, endCol) {\n    return sliceDenseCellLine(grid[rowIndex] ?? [], startCol, endCol, cols);\n  }\n});\n\nconst createSparseFrame = ({\n  grid,\n  rows,\n  cols\n}: {\n  grid: RetroScreenAnsiSparseGrid;\n  rows: number;\n  cols: number;\n}): RetroScreenAnsiSnapshotFrame => {\n  const getLineSlice: RetroScreenAnsiLineSliceAccessor = (rowIndex, startCol, endCol) =>\n    buildSparseLineSlice({\n      grid,\n      rowIndex,\n      startCol,\n      endCol,\n      totalCols: cols\n    });\n  const getCellSlice: RetroScreenAnsiCellSliceAccessor = (rowIndex, startCol, endCol) =>\n    buildSparseCellSlice({\n      grid,\n      rowIndex,\n      startCol,\n      endCol,\n      totalCols: cols\n    });\n  const lines = buildPreviewLinesFromSliceAccessor({\n    rows,\n    cols,\n    getLineSlice\n  });\n  const cells = buildPreviewCellsFromSliceAccessor({\n    rows,\n    cols,\n    getCellSlice\n  });\n\n  return {\n    lines,\n    cells,\n    text: lines.join(\"\\n\"),\n    storageMode: \"sparse\",\n    getLineSlice,\n    getCellSlice\n  };\n};\n\nconst decodeCp437Byte = (value: number) =>\n  String.fromCodePoint(CP437_CODE_POINTS[value] ?? 32);\n\nconst readSauceText = (bytes: Uint8Array, start: number, length: number) =>\n  decodeRetroScreenAnsiBytes(bytes.slice(start, start + length)).replace(/\\0+$/u, \"\").trimEnd();\n\nexport const normalizeRetroScreenAnsiByteChunk = (\n  chunk: RetroScreenAnsiByteChunk\n): Uint8Array => {\n  if (chunk instanceof Uint8Array) {\n    return chunk;\n  }\n\n  if (chunk instanceof ArrayBuffer) {\n    return new Uint8Array(chunk);\n  }\n\n  return Uint8Array.from(chunk);\n};\n\nexport const decodeRetroScreenAnsiBytes = (bytes: Uint8Array) => {\n  const decoded = new Array<string>(bytes.length);\n\n  for (let index = 0; index < bytes.length; index += 1) {\n    decoded[index] = decodeCp437Byte(bytes[index] ?? 32);\n  }\n\n  return decoded.join(\"\");\n};\n\nexport const findRetroScreenAnsiSauceIndex = (bytes: Uint8Array) => {\n  const signatureBytes = Array.from(SAUCE_SIGNATURE, (char) => char.codePointAt(0) ?? 0);\n\n  for (let index = bytes.length - SAUCE_RECORD_SIZE; index >= 0; index -= 1) {\n    let matched = true;\n\n    for (let offset = 0; offset < signatureBytes.length; offset += 1) {\n      if (bytes[index + offset] !== signatureBytes[offset]) {\n        matched = false;\n        break;\n      }\n    }\n\n    if (matched) {\n      return index;\n    }\n  }\n\n  return -1;\n};\n\nexport const stripRetroScreenAnsiSauce = (bytes: Uint8Array) => {\n  const sauceIndex = findRetroScreenAnsiSauceIndex(bytes);\n\n  if (sauceIndex < 0) {\n    return bytes;\n  }\n\n  const payloadEnd =\n    sauceIndex > 0 && bytes[sauceIndex - 1] === 0x1a ? sauceIndex - 1 : sauceIndex;\n\n  return bytes.slice(0, payloadEnd);\n};\n\nexport const parseRetroScreenAnsiSauce = (bytes: Uint8Array): RetroScreenAnsiMetadata => {\n  const sauceIndex = findRetroScreenAnsiSauceIndex(bytes);\n\n  if (sauceIndex < 0) {\n    return {\n      title: \"ANSI Stream\",\n      author: \"Unknown\",\n      group: \"Unknown\",\n      font: \"IBM VGA\",\n      width: 80,\n      height: 25\n    };\n  }\n\n  const view = new DataView(bytes.buffer, bytes.byteOffset + sauceIndex, SAUCE_RECORD_SIZE);\n\n  return {\n    title: readSauceText(bytes, sauceIndex + 7, 35) || \"ANSI Stream\",\n    author: readSauceText(bytes, sauceIndex + 42, 20) || \"Unknown\",\n    group: readSauceText(bytes, sauceIndex + 62, 20) || \"Unknown\",\n    width: view.getUint16(96, true) || 80,\n    height: view.getUint16(98, true) || 25,\n    font: readSauceText(bytes, sauceIndex + 106, 22) || \"IBM VGA\"\n  };\n};\n\nexport const splitRetroScreenAnsiBytes = (bytes: Uint8Array, chunkSize = 16384) => {\n  const size = Math.max(1, Math.floor(chunkSize));\n  const chunks: Uint8Array[] = [];\n\n  for (let index = 0; index < bytes.length; index += size) {\n    chunks.push(bytes.slice(index, index + size));\n  }\n\n  return chunks;\n};\n\nexport const createRetroScreenAnsiSnapshotStream = ({\n  rows,\n  cols,\n  metadata = null,\n  storageMode = \"eager\"\n}: {\n  rows: number;\n  cols: number;\n  metadata?: RetroScreenAnsiMetadata | null;\n  storageMode?: RetroScreenAnsiSnapshotStorageMode;\n}): RetroScreenAnsiSnapshotStream => {\n  const normalizedRows = Math.max(1, Math.floor(rows));\n  const normalizedCols = Math.max(1, Math.floor(cols));\n  const normalizedStorageMode = storageMode;\n  const createEmptyDenseGrid = () =>\n    Array.from({ length: normalizedRows }, () =>\n      Array.from({ length: normalizedCols }, () => createAnsiCell())\n    );\n  let grid =\n    normalizedStorageMode === \"eager\"\n      ? createEmptyDenseGrid()\n      : null;\n  let sparseGrid: RetroScreenAnsiSparseGrid =\n    normalizedStorageMode === \"sparse\" ? new Map() : new Map();\n  let completedFrames: RetroScreenAnsiSnapshotFrame[] = [];\n  let currentFrameLinesCache =\n    normalizedStorageMode === \"eager\" && grid ? stringifyGridLines(grid) : [];\n  let currentFrameTextCache = currentFrameLinesCache.join(\"\\n\");\n  let frameDirty = false;\n  let cursorRow = 0;\n  let cursorCol = 0;\n  let previousAbsoluteRow: number | null = null;\n  let previousAbsoluteCol: number | null = null;\n  let pendingEscape: string | null = null;\n  let currentStyle = cloneStyle(DEFAULT_CELL_STYLE);\n\n  const markFrameDirty = () => {\n    frameDirty = true;\n  };\n\n  const getCurrentFrame = (): RetroScreenAnsiSnapshotFrame => {\n    if (normalizedStorageMode === \"sparse\") {\n      return createSparseFrame({\n        grid: sparseGrid,\n        rows: normalizedRows,\n        cols: normalizedCols\n      });\n    }\n\n    if (frameDirty && grid) {\n      currentFrameLinesCache = stringifyGridLines(grid);\n      currentFrameTextCache = currentFrameLinesCache.join(\"\\n\");\n      frameDirty = false;\n    }\n\n    return createDenseFrame({\n      grid: grid ?? createEmptyDenseGrid(),\n      lines: currentFrameLinesCache,\n      text: currentFrameTextCache,\n      cols: normalizedCols\n    });\n  };\n\n  const getSnapshot = (): RetroScreenAnsiSnapshotStreamSnapshot => ({\n    completedFrames,\n    currentFrame: getCurrentFrame(),\n    sourceRows: normalizedRows,\n    sourceCols: normalizedCols,\n    metadata,\n    storageMode: normalizedStorageMode\n  });\n\n  const pushCompletedFrame = () => {\n    if (normalizedStorageMode === \"sparse\") {\n      completedFrames.push(\n        createSparseFrame({\n          grid: cloneSparseGrid(sparseGrid),\n          rows: normalizedRows,\n          cols: normalizedCols\n        })\n      );\n      return;\n    }\n\n    const currentFrame = getCurrentFrame();\n\n    completedFrames.push(\n      createDenseFrame({\n        grid: cloneDenseGrid(currentFrame.cells ?? []),\n        lines: currentFrame.lines,\n        text: currentFrame.text,\n        cols: normalizedCols\n      })\n    );\n  };\n\n  const newLine = () => {\n    cursorCol = 0;\n    cursorRow = clamp(cursorRow + 1, 0, normalizedRows - 1);\n  };\n\n  const handleCsiSequence = (sequence: string) => {\n    const finalByte = sequence.at(-1) ?? \"\";\n    const rawParams = sequence.slice(2, -1);\n    const params =\n      rawParams.length === 0\n        ? []\n        : rawParams\n            .split(\";\")\n            .map((value) => (value.length === 0 ? 0 : Number.parseInt(value, 10)))\n            .filter((value) => Number.isFinite(value));\n    const getCursorParam = (index: number, fallback: number) => {\n      const value = params[index];\n      return Number.isFinite(value) && value! > 0 ? value! : fallback;\n    };\n\n    if (finalByte === \"H\" || finalByte === \"f\") {\n      const nextAbsoluteRow = clamp(getCursorParam(0, 1) - 1, 0, normalizedRows - 1);\n      const nextAbsoluteCol = clamp(getCursorParam(1, 1) - 1, 0, normalizedCols - 1);\n\n      if (\n        previousAbsoluteRow !== null &&\n        (nextAbsoluteRow < previousAbsoluteRow ||\n          (nextAbsoluteRow === previousAbsoluteRow && nextAbsoluteCol < previousAbsoluteCol!))\n      ) {\n        pushCompletedFrame();\n      }\n\n      cursorRow = nextAbsoluteRow;\n      cursorCol = nextAbsoluteCol;\n      previousAbsoluteRow = nextAbsoluteRow;\n      previousAbsoluteCol = nextAbsoluteCol;\n      return;\n    }\n\n    if (finalByte === \"m\") {\n      currentStyle = applySgrParameters(currentStyle, params);\n      return;\n    }\n\n    if (finalByte === \"C\") {\n      if (cursorCol === normalizedCols - 1) {\n        newLine();\n      }\n\n      cursorCol = clamp(cursorCol + getCursorParam(0, 1), 0, normalizedCols - 1);\n    }\n  };\n\n  const appendText = (text: string) => {\n    for (const character of text) {\n      if (pendingEscape !== null) {\n        pendingEscape += character;\n\n        if (pendingEscape.length === 1) {\n          continue;\n        }\n\n        if (pendingEscape.length === 2 && character !== \"[\") {\n          pendingEscape = null;\n          continue;\n        }\n\n        if (pendingEscape.length >= 3 && character >= \"@\" && character <= \"~\") {\n          handleCsiSequence(pendingEscape);\n          pendingEscape = null;\n        }\n\n        continue;\n      }\n\n      if (character === \"\\u001b\") {\n        pendingEscape = character;\n        continue;\n      }\n\n      if (character === \"\\r\") {\n        cursorCol = 0;\n        continue;\n      }\n\n      if (character === \"\\n\") {\n        newLine();\n        continue;\n      }\n\n      const nextCell = createAnsiCell(character, currentStyle);\n\n      if (normalizedStorageMode === \"sparse\") {\n        const currentRow = sparseGrid.get(cursorRow) ?? new Map<number, RetroScreenCell>();\n\n        if (!shouldPersistSparseCell(nextCell)) {\n          currentRow.delete(cursorCol);\n        } else {\n          currentRow.set(cursorCol, nextCell);\n        }\n\n        if (currentRow.size === 0) {\n          sparseGrid.delete(cursorRow);\n        } else {\n          sparseGrid.set(cursorRow, currentRow);\n        }\n      } else if (grid) {\n        grid[cursorRow]![cursorCol] = nextCell;\n      }\n\n      markFrameDirty();\n\n      if (cursorCol === normalizedCols - 1) {\n        newLine();\n      } else {\n        cursorCol += 1;\n      }\n    }\n\n    return getSnapshot();\n  };\n\n  return {\n    appendChunk(chunk) {\n      return appendText(decodeRetroScreenAnsiBytes(normalizeRetroScreenAnsiByteChunk(chunk)));\n    },\n    appendText,\n    getSnapshot,\n    reset() {\n      grid =\n        normalizedStorageMode === \"eager\"\n          ? createEmptyDenseGrid()\n          : null;\n      sparseGrid = new Map();\n      completedFrames = [];\n      currentFrameLinesCache =\n        normalizedStorageMode === \"eager\" && grid ? stringifyGridLines(grid) : [];\n      currentFrameTextCache = currentFrameLinesCache.join(\"\\n\");\n      frameDirty = false;\n      cursorRow = 0;\n      cursorCol = 0;\n      previousAbsoluteRow = null;\n      previousAbsoluteCol = null;\n      pendingEscape = null;\n      currentStyle = cloneStyle(DEFAULT_CELL_STYLE);\n    }\n  };\n};\n\nconst toRetroScreenAnsiFrameStreamSnapshot = (\n  snapshot: RetroScreenAnsiSnapshotStreamSnapshot\n): RetroScreenAnsiFrameStreamSnapshot => ({\n  completedFrames: snapshot.completedFrames.map((frame) => frame.text),\n  currentFrame: snapshot.currentFrame.text\n});\n\nexport const createRetroScreenAnsiFrameStream = ({\n  rows,\n  cols\n}: {\n  rows: number;\n  cols: number;\n}): RetroScreenAnsiFrameStream => {\n  const snapshotStream = createRetroScreenAnsiSnapshotStream({ rows, cols });\n\n  return {\n    appendChunk(chunk) {\n      return toRetroScreenAnsiFrameStreamSnapshot(snapshotStream.appendChunk(chunk));\n    },\n    appendText(text) {\n      return toRetroScreenAnsiFrameStreamSnapshot(snapshotStream.appendText(text));\n    },\n    getSnapshot() {\n      return toRetroScreenAnsiFrameStreamSnapshot(snapshotStream.getSnapshot());\n    },\n    reset() {\n      snapshotStream.reset();\n    }\n  };\n};\n\nexport const materializeRetroScreenAnsiFrames = (\n  bytesOrText: Uint8Array | string,\n  rows: number,\n  cols: number\n) => {\n  const stream = createRetroScreenAnsiFrameStream({ rows, cols });\n  const snapshot =\n    typeof bytesOrText === \"string\" ? stream.appendText(bytesOrText) : stream.appendChunk(bytesOrText);\n\n  return [...snapshot.completedFrames, snapshot.currentFrame];\n};\n\nexport const materializeRetroScreenAnsiSnapshots = (\n  bytesOrText: Uint8Array | string,\n  rows: number,\n  cols: number,\n  metadata: RetroScreenAnsiMetadata | null = null\n) => {\n  const stream = createRetroScreenAnsiSnapshotStream({ rows, cols, metadata });\n  const snapshot =\n    typeof bytesOrText === \"string\" ? stream.appendText(bytesOrText) : stream.appendChunk(bytesOrText);\n\n  return [...snapshot.completedFrames, snapshot.currentFrame];\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n  createRetroScreenAnsiFrameStream,\n  type RetroScreenAnsiByteChunk\n} from \"../core/ansi/player\";\n\nexport type RetroScreenAnsiPlayerState = {\n  displayValue: string;\n  frameIndex: number;\n  frameCount: number;\n  isComplete: boolean;\n  isStreaming: boolean;\n};\n\ntype UseRetroScreenAnsiPlayerArgs = {\n  byteStream?: readonly RetroScreenAnsiByteChunk[];\n  rows: number;\n  cols: number;\n  frameDelayMs?: number;\n  loop?: boolean;\n  complete?: boolean;\n  loadingValue?: string;\n};\n\ntype PlaybackSnapshot = {\n  completedFrames: readonly string[];\n  currentFrame: string;\n};\n\nconst EMPTY_SNAPSHOT: PlaybackSnapshot = {\n  completedFrames: [],\n  currentFrame: \"\"\n};\n\nexport const useRetroScreenAnsiPlayer = ({\n  byteStream = [],\n  rows,\n  cols,\n  frameDelayMs = 72,\n  loop = false,\n  complete = false,\n  loadingValue = \"Loading ANSI stream...\"\n}: UseRetroScreenAnsiPlayerArgs): RetroScreenAnsiPlayerState => {\n  const normalizedRows = Math.max(1, Math.floor(rows));\n  const normalizedCols = Math.max(1, Math.floor(cols));\n  const decoderRef = useRef(\n    createRetroScreenAnsiFrameStream({\n      rows: normalizedRows,\n      cols: normalizedCols\n    })\n  );\n  const processedChunkCountRef = useRef(0);\n  const playbackStartedAtRef = useRef(0);\n  const playbackSnapshotRef = useRef<PlaybackSnapshot>(EMPTY_SNAPSHOT);\n  const [playbackTick, setPlaybackTick] = useState(0);\n  const [snapshotVersion, setSnapshotVersion] = useState(0);\n  const [resetVersion, setResetVersion] = useState(0);\n\n  useEffect(() => {\n    decoderRef.current = createRetroScreenAnsiFrameStream({\n      rows: normalizedRows,\n      cols: normalizedCols\n    });\n    processedChunkCountRef.current = 0;\n    playbackStartedAtRef.current = performance.now();\n    playbackSnapshotRef.current = EMPTY_SNAPSHOT;\n    setPlaybackTick(0);\n    setSnapshotVersion((current) => current + 1);\n    setResetVersion((current) => current + 1);\n  }, [normalizedCols, normalizedRows]);\n\n  useEffect(() => {\n    if (byteStream.length < processedChunkCountRef.current) {\n      decoderRef.current.reset();\n      processedChunkCountRef.current = 0;\n      playbackStartedAtRef.current = performance.now();\n      playbackSnapshotRef.current = EMPTY_SNAPSHOT;\n      setPlaybackTick(0);\n      setSnapshotVersion((current) => current + 1);\n      setResetVersion((current) => current + 1);\n    }\n\n    const decoder = decoderRef.current;\n\n    for (let index = processedChunkCountRef.current; index < byteStream.length; index += 1) {\n      decoder.appendChunk(byteStream[index]!);\n    }\n\n    processedChunkCountRef.current = byteStream.length;\n    playbackSnapshotRef.current = decoder.getSnapshot();\n    setSnapshotVersion((current) => current + 1);\n  }, [byteStream]);\n\n  useEffect(() => {\n    const playbackSnapshot = playbackSnapshotRef.current;\n    const hasPlayableFrames = playbackSnapshot.completedFrames.length > 0;\n    const hasCurrentFrame = playbackSnapshot.currentFrame.trim().length > 0;\n\n    if (!hasPlayableFrames && !hasCurrentFrame) {\n      return;\n    }\n\n    let active = true;\n    let rafId = 0;\n\n    const tick = () => {\n      if (!active) {\n        return;\n      }\n\n      const elapsed = performance.now() - playbackStartedAtRef.current;\n      const nextTick = Math.max(0, Math.floor(elapsed / Math.max(1, frameDelayMs)));\n\n      setPlaybackTick((current) => (current === nextTick ? current : nextTick));\n      rafId = window.requestAnimationFrame(tick);\n    };\n\n    tick();\n\n    return () => {\n      active = false;\n      window.cancelAnimationFrame(rafId);\n    };\n  }, [frameDelayMs, resetVersion, snapshotVersion]);\n\n  return useMemo(() => {\n    const playbackSnapshot = playbackSnapshotRef.current;\n    const finalFrameIncluded = complete && playbackSnapshot.currentFrame.length > 0;\n    const frameCount =\n      playbackSnapshot.completedFrames.length + (finalFrameIncluded ? 1 : 0);\n\n    if (frameCount === 0) {\n      return {\n        displayValue:\n          playbackSnapshot.currentFrame.trim().length > 0\n            ? playbackSnapshot.currentFrame\n            : loadingValue,\n        frameIndex: 0,\n        frameCount,\n        isComplete: complete,\n        isStreaming: !complete\n      } satisfies RetroScreenAnsiPlayerState;\n    }\n\n    const boundedFrameIndex =\n      complete && loop\n        ? playbackTick % frameCount\n        : Math.min(playbackTick, frameCount - 1);\n\n    const displayValue =\n      !complete && playbackTick >= frameCount\n        ? playbackSnapshot.currentFrame || playbackSnapshot.completedFrames[frameCount - 1]!\n        : finalFrameIncluded && boundedFrameIndex === playbackSnapshot.completedFrames.length\n          ? playbackSnapshot.currentFrame\n          : playbackSnapshot.completedFrames[boundedFrameIndex] ??\n            playbackSnapshot.currentFrame ??\n            loadingValue;\n\n    return {\n      displayValue,\n      frameIndex: boundedFrameIndex,\n      frameCount,\n      isComplete: complete,\n      isStreaming: !complete\n    } satisfies RetroScreenAnsiPlayerState;\n  }, [complete, loadingValue, loop, playbackTick, snapshotVersion]);\n};\n","import type {\n  RetroScreenTerminalSession,\n  RetroScreenTerminalSessionEvent,\n  RetroScreenTerminalSessionGeometry,\n  RetroScreenTerminalSessionListener,\n  RetroScreenTerminalSessionState\n} from \"./session-types\";\n\ntype RetroScreenTerminalClientMessage =\n  | {\n      type: \"open\";\n      rows: number;\n      cols: number;\n      cwd?: string;\n      env?: Record<string, string>;\n      command?: string;\n      args?: string[];\n      term?: string;\n    }\n  | {\n      type: \"input\";\n      data: string;\n      encoding: \"utf8\" | \"base64\";\n    }\n  | {\n      type: \"resize\";\n      rows: number;\n      cols: number;\n    }\n  | {\n      type: \"close\";\n    };\n\ntype RetroScreenTerminalServerMessage =\n  | { type: \"ready\"; pid?: number | null }\n  | { type: \"data\"; data: string }\n  | { type: \"title\"; title: string }\n  | { type: \"bell\" }\n  | { type: \"exit\"; exitCode: number | null; signal: string | null }\n  | { type: \"error\"; message: string };\n\nexport type RetroScreenTerminalWebSocketLike = {\n  readyState: number;\n  onopen: ((event: Event) => void) | null;\n  onmessage: ((event: MessageEvent<string>) => void) | null;\n  onerror: ((event: Event) => void) | null;\n  onclose: ((event: CloseEvent) => void) | null;\n  send: (data: string) => void;\n  close: (code?: number, reason?: string) => void;\n};\n\nexport type RetroScreenTerminalWebSocketConstructor = new (\n  url: string,\n  protocols?: string | string[]\n) => RetroScreenTerminalWebSocketLike;\n\nexport type RetroScreenTerminalWebSocketSessionOptions = {\n  url: string | URL;\n  protocols?: string | string[];\n  WebSocket?: RetroScreenTerminalWebSocketConstructor;\n  openPayload?:\n    | Omit<Extract<RetroScreenTerminalClientMessage, { type: \"open\" }>, \"type\" | \"rows\" | \"cols\">\n    | ((\n        geometry: RetroScreenTerminalSessionGeometry\n      ) => Omit<Extract<RetroScreenTerminalClientMessage, { type: \"open\" }>, \"type\" | \"rows\" | \"cols\">);\n};\n\nconst SOCKET_CONNECTING = 0;\nconst SOCKET_OPEN = 1;\nconst SOCKET_CLOSING = 2;\nconst SOCKET_CLOSED = 3;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  typeof value === \"object\" && value !== null;\n\nconst asBase64 = (value: Uint8Array) => {\n  const nodeBuffer = (\n    globalThis as typeof globalThis & {\n      Buffer?: {\n        from: (data: Uint8Array) => { toString: (encoding: \"base64\") => string };\n      };\n    }\n  ).Buffer;\n\n  if (nodeBuffer) {\n    return nodeBuffer.from(value).toString(\"base64\");\n  }\n\n  if (typeof globalThis.btoa === \"function\") {\n    let binary = \"\";\n    for (const byte of value) {\n      binary += String.fromCharCode(byte);\n    }\n    return globalThis.btoa(binary);\n  }\n\n  throw new Error(\"Base64 encoding is not available in this environment.\");\n};\n\nconst resolveWebSocketConstructor = (\n  override?: RetroScreenTerminalWebSocketConstructor\n): RetroScreenTerminalWebSocketConstructor => {\n  if (override) {\n    return override;\n  }\n\n  const WebSocketConstructor = (globalThis as typeof globalThis & {\n    WebSocket?: RetroScreenTerminalWebSocketConstructor;\n  }).WebSocket;\n\n  if (!WebSocketConstructor) {\n    throw new Error(\"WebSocket is not available in this environment.\");\n  }\n\n  return WebSocketConstructor;\n};\n\nconst stringifyClientMessage = (message: RetroScreenTerminalClientMessage) => JSON.stringify(message);\n\nconst toErrorEvent = (message: string, error?: unknown): RetroScreenTerminalSessionEvent => ({\n  type: \"error\",\n  message,\n  error\n});\n\nexport const createRetroScreenWebSocketSession = (\n  options: RetroScreenTerminalWebSocketSessionOptions\n): RetroScreenTerminalSession => {\n  const listeners = new Set<RetroScreenTerminalSessionListener>();\n  const WebSocketConstructor = resolveWebSocketConstructor(options.WebSocket);\n  const socketUrl = String(options.url);\n  let socket: RetroScreenTerminalWebSocketLike | null = null;\n  let state: RetroScreenTerminalSessionState = \"idle\";\n  let lastGeometry: RetroScreenTerminalSessionGeometry | null = null;\n  let openPayloadSent = false;\n  const queuedMessages: string[] = [];\n\n  const emit = (event: RetroScreenTerminalSessionEvent) => {\n    if (event.type === \"connecting\") {\n      state = \"connecting\";\n    } else if (event.type === \"open\" || event.type === \"ready\") {\n      state = \"open\";\n    } else if (event.type === \"close\" || event.type === \"exit\") {\n      state = \"closed\";\n    } else if (event.type === \"error\") {\n      state = \"error\";\n    }\n\n    for (const listener of listeners) {\n      listener(event);\n    }\n  };\n\n  const sendOrQueue = (message: RetroScreenTerminalClientMessage) => {\n    const serialized = stringifyClientMessage(message);\n\n    if (message.type === \"resize\" && (!socket || socket.readyState === SOCKET_CONNECTING)) {\n      return;\n    }\n\n    if (!socket || socket.readyState === SOCKET_CONNECTING) {\n      queuedMessages.push(serialized);\n      return;\n    }\n\n    if (socket.readyState === SOCKET_OPEN) {\n      socket.send(serialized);\n    }\n  };\n\n  const flushQueuedMessages = () => {\n    if (!socket || socket.readyState !== SOCKET_OPEN) {\n      return;\n    }\n\n    while (queuedMessages.length > 0) {\n      const nextMessage = queuedMessages.shift();\n      if (nextMessage) {\n        socket.send(nextMessage);\n      }\n    }\n  };\n\n  const sendOpenPayload = () => {\n    if (!socket || socket.readyState !== SOCKET_OPEN || !lastGeometry || openPayloadSent) {\n      return;\n    }\n\n    const extraOpenPayload =\n      typeof options.openPayload === \"function\" ? options.openPayload(lastGeometry) : options.openPayload;\n\n    socket.send(\n      stringifyClientMessage({\n        type: \"open\",\n        rows: lastGeometry.rows,\n        cols: lastGeometry.cols,\n        ...extraOpenPayload\n      })\n    );\n    openPayloadSent = true;\n    flushQueuedMessages();\n  };\n\n  const connect = (geometry: RetroScreenTerminalSessionGeometry) => {\n    lastGeometry = geometry;\n\n    if (socket && (socket.readyState === SOCKET_CONNECTING || socket.readyState === SOCKET_OPEN)) {\n      return;\n    }\n\n    openPayloadSent = false;\n    socket = new WebSocketConstructor(socketUrl, options.protocols);\n    emit({ type: \"connecting\" });\n\n    socket.onopen = () => {\n      emit({ type: \"open\" });\n      sendOpenPayload();\n    };\n\n    socket.onmessage = (event) => {\n      try {\n        const payload = JSON.parse(event.data) as RetroScreenTerminalServerMessage | Record<string, unknown>;\n\n        if (!isRecord(payload) || typeof payload.type !== \"string\") {\n          emit(toErrorEvent(\"Received an invalid terminal session payload.\", payload));\n          return;\n        }\n\n        switch (payload.type) {\n          case \"ready\":\n            emit({\n              type: \"ready\",\n              pid: typeof payload.pid === \"number\" ? payload.pid : null\n            });\n            break;\n          case \"data\":\n            emit({\n              type: \"data\",\n              data: typeof payload.data === \"string\" ? payload.data : \"\"\n            });\n            break;\n          case \"title\":\n            emit({\n              type: \"title\",\n              title: typeof payload.title === \"string\" ? payload.title : \"\"\n            });\n            break;\n          case \"bell\":\n            emit({ type: \"bell\" });\n            break;\n          case \"exit\":\n            emit({\n              type: \"exit\",\n              exitCode: typeof payload.exitCode === \"number\" ? payload.exitCode : null,\n              signal: typeof payload.signal === \"string\" ? payload.signal : null\n            });\n            break;\n          case \"error\":\n            emit({\n              type: \"error\",\n              message:\n                typeof payload.message === \"string\"\n                  ? payload.message\n                  : \"Terminal session reported an unknown error.\"\n            });\n            break;\n          default:\n            emit(toErrorEvent(`Received an unknown terminal session event: ${payload.type}`, payload));\n        }\n      } catch (error) {\n        emit(toErrorEvent(\"Failed to parse a terminal session message.\", error));\n      }\n    };\n\n    socket.onerror = (event) => {\n      emit(toErrorEvent(\"The terminal session websocket encountered an error.\", event));\n    };\n\n    socket.onclose = (event) => {\n      emit({\n        type: \"close\",\n        code: event.code,\n        reason: event.reason,\n        wasClean: event.wasClean\n      });\n      socket = null;\n      openPayloadSent = false;\n      queuedMessages.length = 0;\n    };\n  };\n\n  return {\n    connect,\n    writeInput(data) {\n      const payload =\n        typeof data === \"string\"\n          ? {\n              type: \"input\" as const,\n              data,\n              encoding: \"utf8\" as const\n            }\n          : {\n              type: \"input\" as const,\n              data: asBase64(data),\n              encoding: \"base64\" as const\n            };\n\n      sendOrQueue(payload);\n    },\n    resize(rows, cols) {\n      lastGeometry = { rows, cols };\n      sendOrQueue({\n        type: \"resize\",\n        rows,\n        cols\n      });\n    },\n    subscribe(listener) {\n      listeners.add(listener);\n      return () => {\n        listeners.delete(listener);\n      };\n    },\n    close() {\n      if (!socket || socket.readyState === SOCKET_CLOSED || socket.readyState === SOCKET_CLOSING) {\n        return;\n      }\n\n      sendOrQueue({ type: \"close\" });\n      socket.close(1000, \"Terminal session closed by client.\");\n    },\n    getState() {\n      return state;\n    }\n  };\n};\n"],"mappings":"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AI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACxE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACzE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACvE;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACtE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM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","names":["import_react","ESC","_","import_jsx_runtime","clampCoordinate","clampDimension","import_react","import_react","import_react","import_react","clampDimension","import_react","import_react","import_react","initialText","import_jsx_runtime","DEFAULT_ROWS","DEFAULT_COLS","joinClassNames","clampSelection","text","import_react","import_react","clamp","PREVIEW_ROWS","PREVIEW_COLS","import_jsx_runtime","import_react"]}