overlapping-cards-scroll
v0.1.8
Published
Overlapping cards scroll component for React, React Native, and React Native Web.
Maintainers
Readme
overlapping-cards-scroll
Reusable overlapping-cards scroll component for React, React Native, and React Native Web.
Install
npm install overlapping-cards-scrollPeer dependencies:
react^18 || ^19react-dom^18 || ^19(optional)react-native>=0.73(optional)react-native-web>=0.19(optional)
Web Usage
import "overlapping-cards-scroll/styles.css";
import {
OverlappingCardsScroll,
OverlappingCardsScrollFocusTrigger,
} from "overlapping-cards-scroll";
export function Example({ cards }) {
return (
<OverlappingCardsScroll
cardHeight={280}
showPageDots
pageDotsPosition="below"
>
{cards.map((card) => (
<article key={card.id}>
<h3>{card.title}</h3>
<OverlappingCardsScrollFocusTrigger>
Make principal
</OverlappingCardsScrollFocusTrigger>
</article>
))}
</OverlappingCardsScroll>
);
}React Native Usage
import {
OverlappingCardsScrollRN,
OverlappingCardsScrollRNFocusTrigger,
} from "overlapping-cards-scroll/react-native";/react-native resolves to:
- native build for React Native runtimes
- web adapter build for non-native runtimes
You can also target explicit builds:
overlapping-cards-scroll/react-native/nativeoverlapping-cards-scroll/react-native/web
For web adapter usage, import package styles:
import "overlapping-cards-scroll/styles.css";Props
children: card nodesitems({ id: string | number; name: string; jsx: ReactElement }[]) optional alternative tochildren; required for named tabs (showTabs)cardHeight(number | string, default300)cardWidth(number | string) accepts px number (e.g.250) or percent string (e.g.'50%')cardWidthRatio(number, default1 / 3)basePeek(number, default64)minPeek(number, default10)maxPeek(number, default84)cardContainerStyle(web:CSSProperties, RN native:StyleProp<ViewStyle>) applied to each positioned card containershowPageDots(boolean, defaultfalse) renders clickable page dotspageDotsPosition('above' | 'below' | 'overlay', default'below')pageDotsOffset(number | string, default10) distance from stagepageDotsBehavior('smooth' | 'auto', web only, default'smooth')showTabs(boolean, defaultfalse) renders card-name tabs whenitemsis providedtabsPosition('above' | 'below', default'above')tabsOffset(number | string, default10)tabsBehavior('smooth' | 'auto', web only, default'smooth')tabsComponent(custom tab renderer; supported on web and RN native)tabsContainerComponent(custom tab container renderer; supported on web and RN native)snapToCardOnRelease(boolean, defaulttrue) web/RN-web uses idle + mousemove snap, RN native usessnapToIntervalon iOSsnapReleaseDelay(number, default800) web/RN-web debounce before auto-snapsnapDecelerationRate('normal' | 'fast' | number, RN native only, default'normal') controls fling feel while snappingsnapDisableIntervalMomentum(boolean, RN native only, defaultfalse) keepfalsefor stronger momentum across multiple cardsfocusTransitionDuration(number, default420) duration for click-triggered "single swoop" focus transitionsclassName(string)ariaLabel(string)
Local Development
npm install
npm run devVite demos:
#basicfoundation demo#contentrich-content demo#stressmany-card stress demo#rnwebReact Native Web demo
Expo development:
npm run dev:expoThe Expo app shell lives in expo-demo/ and imports the demo screen from the package root via ../App.
You can also run it directly with:
cd expo-demo
npm run devBuild package artifacts:
npm run buildBuild demo site:
npm run build:demo