Scroll a page whose children can all stay mounted. Use it for an article, form or a small set of sections.

Read a page of paragraphs

tsx
import { Scroll, Text } from 'kuito';

const paragraphs = ['The tide came in.', 'It went out again.', 'Nobody noticed.'];

export default function Article() {
  return (
    <Scroll flex={1} padding={16} gap={12}>
      {paragraphs.map((paragraph) => (
        <Text key={paragraph}>{paragraph}</Text>
      ))}
    </Scroll>
  );
}

Behavior

Give the scroll view a bounded height, often with flex={1}. All children are rendered. Use List for large collections. Vertical scroll views can keep focused fields clear of the keyboard.

Props

Prop Meaning
horizontal Scroll sideways. Changing it remounts the view.
onScroll, scrollInterval { x, y, contentWidth, contentHeight, layoutWidth, layoutHeight } in points, at most once per throttle (50 ms by default).
onScrollEnd HTML's scrollend: the same fields, where it came to rest after a fling, a drag or a scrollTo, once per rest.
onReachEnd, reachEndThreshold Once each time the end comes within the threshold, in visible lengths (0.5 by default).
onRefresh, refreshing Pull-to-refresh (vertical only).
scrollbar Shows or hides the scrollbar.
motion scrollMotion(): its offset, velocity and overscroll move with the view every frame, on the UI thread (follow scrolling).
paging, snapOffsets Where a drag comes to rest: whole pages, or the offsets given.
keyboard { dismiss, persistTaps, inset, avoid }: when dragging dismisses the keyboard, what a tap outside the field does, whether content stays clear of it (true by default) (keyboard).

Continue

Read Keyboard for a complete workflow. See the complete prop reference for types and documented defaults.

Reference

Signatures

ts
(props: ScrollProps): KuitoElement

Parameters

NameTypeRequiredDescription
propsScrollPropsYes—

Returns

KuitoElement

Props: ScrollProps

Props (including inherited props) 108

NameTypeRequiredDescription
horizontalProp<boolean>NoScrolls sideways; changing it remounts the view, as the native axis is fixed.
refElementRef<ScrollHandle>No—
motionScrollMotionNoMoves with the view every frame on the UI thread: scrollMotion(), given to one view.
onScroll(event: ScrollEvent) => voidNo—
onScrollEnd(event: ScrollEndEvent) => voidNoWhere it came to rest: after a fling, a drag or a scrollTo, once per rest.
onReachEnd(event: KuitoEvent<"reachend">) => voidNoCalled once each time the content end comes within the threshold.
onRefresh(event: KuitoEvent<"refresh">) => voidNoEnables pull-to-refresh.
opacityAnimatable<number>No—
backgroundColorAnimatable<string>No—
borderRadiusAnimatable<number>No—
borderColorAnimatable<string>No—
widthAnimatable<SizeValue>No—
heightAnimatable<SizeValue>No—
translateXAnimatable<number>No—
translateYAnimatable<number>No—
scaleAnimatable<number>No—
scaleXAnimatable<number>No—
scaleYAnimatable<number>No—
rotateAnimatable<number>NoDegrees.
shadowColorAnimatable<string>No—
shadowRadiusAnimatable<number>No—
shadowOffsetXAnimatable<number>No—
shadowOffsetYAnimatable<number>No—
hiddenProp<boolean>NoTakes the view out of layout and off screen, as CSS display: none.
paddingProp<LengthPercentage>No—
positionProp<"relative" | "absolute">No—
childrenKuitoNodeNo—
idstringNo—
classProp<ClassNames>NoClass names from a .css import or styles(): a string, or a list with falsy entries skipped, following the signals it reads.
styleStyleDeclarationsNoStyles of this view alone, compiled at build time: CSS properties in camelCase. A value that changes must set a native prop (opacity).
onPress(event: PressEvent) => voidNo—
onPressCapture(event: PressEvent) => voidNo—
keystring | numberNo—
paddingTopProp<LengthPercentage>No—
paddingRightProp<LengthPercentage>No—
paddingBottomProp<LengthPercentage>No—
paddingLeftProp<LengthPercentage>No—
minWidthProp<SizeValue>No—
maxWidthProp<SizeValue>No—
minHeightProp<SizeValue>No—
maxHeightProp<SizeValue>No—
aspectRatioProp<number>NoWidth divided by height; sizes the missing side from the other.
topProp<LengthPercentageAuto>No—
rightProp<LengthPercentageAuto>No—
bottomProp<LengthPercentageAuto>No—
leftProp<LengthPercentageAuto>No—
marginProp<LengthPercentageAuto>No—
marginTopProp<LengthPercentageAuto>No—
marginRightProp<LengthPercentageAuto>No—
marginBottomProp<LengthPercentageAuto>No—
marginLeftProp<LengthPercentageAuto>No—
flexGrowProp<number>No—
flexShrinkProp<number>No—
flexBasisProp<SizeValue | "content">No—
flexProp<number>NoA grow factor from a zero basis, as CSS flex: n; 0 is inflexible.
alignSelfProp<"auto" | SelfAlignment>No—
directionProp<"ltr" | "rtl">NoThe way lines run; unset, the parent's, and the app's first language's at the root.
boxSizingProp<"border-box" | "content-box">No—
paddingInlineStartProp<LengthPercentage>NoPadding on the side lines start from: the left in ltr, the right in rtl.
paddingInlineEndProp<LengthPercentage>NoPadding on the side lines end at: the right in ltr, the left in rtl.
marginInlineStartProp<LengthPercentageAuto>NoMargin on the side lines start from: the left in ltr, the right in rtl.
marginInlineEndProp<LengthPercentageAuto>NoMargin on the side lines end at: the right in ltr, the left in rtl.
insetInlineStartProp<LengthPercentageAuto>Noleft in ltr, right in rtl.
insetInlineEndProp<LengthPercentageAuto>Noright in ltr, left in rtl.
roleProp<Role>No—
onAction(event: AccessibilityActionEvent) => voidNoThe screen reader action taken, by name.
accessibleProp<boolean>NoMakes the view one screen reader element, read as its label or its children's text.
labelProp<string>NoWhat a screen reader says for the view.
hintProp<string>NoWhat happens when the view is activated, read after the label.
aria-hiddenProp<boolean>NoScreen readers skip the view and its subtree.
actionsProp<readonly AccessibilityAction[]>NoActions a screen reader offers; onAction receives the one taken.
liveProp<"off" | "polite" | "assertive">NoARIA's aria-live: announces changes to the view's content, on iOS too.
aria-disabledProp<boolean>No—
aria-selectedProp<boolean>No—
aria-checkedProp<boolean | "mixed">No—
aria-busyProp<boolean>No—
aria-expandedProp<boolean>No—
aria-valueminProp<number>No—
aria-valuemaxProp<number>No—
aria-valuenowProp<number>No—
aria-valuetextProp<string>No—
gesturesreadonly Composable[]NoThe view's gestures; several race unless composed with together or orElse.
transitionPartial<Record<"opacity" | "backgroundColor" | "transform" | "borderRadius" | "borderColor" | "shadow" | "width" | "height" | "all", Animation<unknown> | AnimationSpec>>NoHow the animatable props move when they change, enter or leave, by group; a CSS transition compiles to it.
animatePartial<Record<AnimatableProps, string | number>>NoAnimatable props whose every change moves as transition says; the first value applies at once.
enterEffectNoWhere the view enters from: fade.and(slide.up(12)).
exitProp<Effect>NoWhere the view leaves to; it stays on screen until it is there. The renderer gets true, and keeps the view until exited.
layoutAnimation<number>NoHow the view moves to a new frame the layout gives it: layout={spring()}.
overflowProp<"visible" | "hidden" | "clip" | "scroll">Nohidden and scroll clip; as in CSS, either lets a flex item shrink below its content.
borderWidthProp<number>No—
backgroundGradient{ angle: number; colors: string[];}No—
colorProp<string>No—
sharedIdProp<string>NoA view the navigation stack flies to the view with the same sharedId on the screen it pushes or pops to (docs/navigation.md#shared-elements).
alignItemsProp<SelfAlignment>No—
justifyContentProp<ContentAlignment>No—
gapProp<LengthPercentage>No—
rowGapProp<LengthPercentage>No—
columnGapProp<LengthPercentage>No—
flexDirectionProp<"row" | "column" | "row-reverse" | "column-reverse">No—
flexWrapProp<"nowrap" | "wrap" | "wrap-reverse" | "balance">No—
flexLineCountProp<number>NoThe minimum number of lines a wrapping container breaks into (CSS Flexbox 2).
alignContentProp<ContentAlignment>No—
scrollIntervalProp<number>NoAt most one scroll event per this many milliseconds; 50 by default.
reachEndThresholdProp<number>NoDistance from the end, in visible lengths, that counts as the end; 0.5 by default.
refreshingBound<boolean>NoShows the pull-to-refresh spinner while true.
scrollbarProp<boolean>NoShows the scrollbar while scrolling; true by default.
pagingProp<boolean>NoComes to rest a whole view length at a time; false by default.
snapOffsetsProp<readonly number[]>NoOffsets in points where a drag comes to rest, besides the start and the end; ignored while paging.
keyboardProp<{ dismiss?: "none" | "on-drag" | "interactive"; persistTaps?: "never" | "always" | "handled"; inset?: boolean; avoid?: "none" | "padding" | "position";}>No—
onScroll — method signatures

Signatures

ts
(event: ScrollEvent): void

Parameters

NameTypeRequiredDescription
eventScrollEventYes—

Returns

void

onScrollEnd — method signatures

Signatures

ts
(event: ScrollEndEvent): void

Parameters

NameTypeRequiredDescription
eventScrollEndEventYes—

Returns

void

onReachEnd — method signatures

Signatures

ts
(event: KuitoEvent<"reachend">): void

Parameters

NameTypeRequiredDescription
eventKuitoEvent<"reachend">Yes—

Returns

void

onRefresh — method signatures

Signatures

ts
(event: KuitoEvent<"refresh">): void

Parameters

NameTypeRequiredDescription
eventKuitoEvent<"refresh">Yes—

Returns

void

onPress — method signatures

Signatures

ts
(event: PressEvent): void

Parameters

NameTypeRequiredDescription
eventPressEventYes—

Returns

void

onPressCapture — method signatures

Signatures

ts
(event: PressEvent): void

Parameters

NameTypeRequiredDescription
eventPressEventYes—

Returns

void

onAction — method signatures

Signatures

ts
(event: AccessibilityActionEvent): void

Parameters

NameTypeRequiredDescription
eventAccessibilityActionEventYes—

Returns

void

backgroundGradient — nested fields

backgroundGradient fields

NameTypeRequiredDescription
anglenumberYes—
colorsstring[]Yes—
Generated from the public TypeScript declarations: signatures, props and defaults come from the checked source, descriptions from its JSDoc. No defaults are invented.