
Security News
Agent Baseline Publishes Security Reference Architecture for Software Factories
Agent Baseline’s new reference architecture shows how to secure software factories with four boundaries enforced outside the AI agent.
ink-scroll-view
Advanced tools
A robust, performance-optimized ScrollView component for Ink CLI applications.
overflow and offsets, ensuring correct layout without layout thrashing.npm install ink-scroll-view
# Peer dependencies
npm install ink react
ScrollView is a layout primitive. It does not capture user input automatically. You must control it programmatically using React refs and Ink's useInput.
import React, { useRef, useEffect } from "react";
import { render, Text, Box, useInput, useStdout } from "ink";
import { ScrollView, ScrollViewRef } from "ink-scroll-view";
const App = () => {
const scrollRef = useRef<ScrollViewRef>(null);
const { stdout } = useStdout();
// 1. Handle Terminal Resizing due to manual window change
useEffect(() => {
const handleResize = () => scrollRef.current?.remeasure();
stdout?.on("resize", handleResize);
return () => {
stdout?.off("resize", handleResize);
};
}, [stdout]);
// 2. Handle Keyboard Input
useInput((input, key) => {
if (key.upArrow) {
scrollRef.current?.scrollBy(-1); // Scroll up 1 line
}
if (key.downArrow) {
scrollRef.current?.scrollBy(1); // Scroll down 1 line
}
if (key.pageUp) {
// Scroll up by viewport height
const height = scrollRef.current?.getViewportHeight() || 1;
scrollRef.current?.scrollBy(-height);
}
if (key.pageDown) {
const height = scrollRef.current?.getViewportHeight() || 1;
scrollRef.current?.scrollBy(height);
}
});
return (
<Box
height={10}
width="100%"
borderStyle="single"
borderColor="green"
flexDirection="column"
>
<ScrollView ref={scrollRef}>
{Array.from({ length: 50 }).map((_, i) => (
<Text key={i}>Item {i + 1} - content with variable length...</Text>
))}
</ScrollView>
</Box>
);
};
render(<App />);
The component renders all children into a container but shifts the content vertically using marginTop. The parent box with overflow="hidden" acts as the "viewport".
┌─────────────────────────┐
│ (hidden content) │ ← Content above viewport
│ ... │
├─────────────────────────┤ ← scrollOffset (distance from top)
│ ┌───────────────────┐ │
│ │ Visible Viewport │ │ ← What user sees
│ │ │ │
│ └───────────────────┘ │
├─────────────────────────┤
│ (hidden content) │ ← Content below viewport
│ ... │
└─────────────────────────┘
For detailed API documentation, see API Reference.
ScrollViewProps)Inherits standard BoxProps from Ink.
| Prop | Type | Description |
|---|---|---|
children | ReactElement[] | Required. List of child elements. Must use unique keys (strings/numbers). |
onScroll | (offset: number) => void | Called when scroll position changes. |
onViewportSizeChange | (layout: { width, height }) => void | Called when the viewport dimensions change. |
onContentHeightChange | (height: number) => void | Called when the total content height changes. |
onItemHeightChange | (index: number, height: number) => void | Called when an individual item's height changes. |
| ... | BoxProps | Any other prop accepted by Ink's Box. |
ScrollViewRef)Access these via ref.current.
| Method | Signature | Description |
|---|---|---|
scrollTo | (offset: number) => void | Scrolls to an absolute Y offset from the top. |
scrollBy | (delta: number) => void | Scrolls by a relative amount (negative = up, positive = down). |
scrollToTop | () => void | Helper to scroll to offset 0. |
scrollToBottom | () => void | Helper to scroll to the maximum possible offset (contentHeight - viewportHeight). |
getScrollOffset | () => number | Returns the current scroll offset. |
getContentHeight | () => number | Returns the total height of all content items. |
getViewportHeight | () => number | Returns the current height of the visible area. |
getBottomOffset | () => number | Returns the scroll offset when scrolled to the bottom (contentHeight - viewportHeight). |
getItemHeight | (index: number) => number | Returns the measured height of a specific item by its index. |
getItemPosition | (index: number) => { top, height } | Returns the position (top offset) and height of a specific item. |
remeasure | () => void | Re-checks viewport dimensions. Must call this on terminal resize. |
remeasureItem | (index: number) => void | Forces a specific child to re-measure. Useful for dynamic content (expand/collapse) that doesn't trigger a full re-render. |
key props (strings or numbers) to your children. This allows ScrollView to accurately track height changes even when items are re-ordered or removed.process.stdout's resize event and call remeasure() on the ref.remeasureItem(index) is more efficient than forcing a full update.This package is part of a family of Ink scroll components:
| Package | Description |
|---|---|
| ink-scroll-view | Core scroll container component (this package) |
| ink-scroll-list | A scrollable list component built on top of ink-scroll-view with focus management and item selection |
| ink-scroll-bar | A standalone scrollbar component that can be used with any scroll container |
MIT
FAQs
A ScrollView component for Ink CLI applications
The npm package ink-scroll-view receives a total of 309,722 weekly downloads. As such, ink-scroll-view popularity was classified as popular.
We found that ink-scroll-view demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Agent Baseline’s new reference architecture shows how to secure software factories with four boundaries enforced outside the AI agent.

Security News
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.

Research
/Security News
A new GhostAction wave hits hundreds of GitHub repos, expanding CI/CD secret theft to cloud and AI credentials in source code and git history.