MotionRailState
Current state of the carousel.
Type Definition
ts
type MotionRailState = {
totalItems: number;
visibleItemIndexes: number[];
isFirstItemVisible: boolean;
isLastItemVisible: boolean;
}Properties
totalItems
Total number of items in the carousel.
- Type:
number
ts
const state = carousel.getState();
console.log(state.totalItems); // 10visibleItemIndexes
Array of currently visible item indexes (0-based).
- Type:
number[]
ts
const state = carousel.getState();
console.log(state.visibleItemIndexes); // [0, 1, 2]This array updates as the user scrolls and items enter/exit the viewport.
isFirstItemVisible
Whether the first item is currently visible.
- Type:
boolean
ts
const state = carousel.getState();
console.log(state.isFirstItemVisible); // true
// Use for disabling "previous" button
const prevButton = document.querySelector('.prev-button');
prevButton.disabled = state.isFirstItemVisible;isLastItemVisible
Whether the last item is currently visible.
- Type:
boolean
ts
const state = carousel.getState();
console.log(state.isLastItemVisible); // false
// Use for disabling "next" button
const nextButton = document.querySelector('.next-button');
nextButton.disabled = state.isLastItemVisible;Usage
Getting Current State
Use the getState() method to retrieve the current state:
ts
const state = carousel.getState();
console.log(state);
// {
// totalItems: 10,
// visibleItemIndexes: [0, 1, 2],
// isFirstItemVisible: true,
// isLastItemVisible: false
// }Listening to State Changes
Use the onChange option to receive state updates:
ts
const carousel = new MotionRail(element, {
onChange: (state) => {
console.log('Total:', state.totalItems);
console.log('Visible:', state.visibleItemIndexes);
console.log('At start:', state.isFirstItemVisible);
console.log('At end:', state.isLastItemVisible);
}
});Common Patterns
Disable Navigation at Boundaries
ts
const prevButton = document.querySelector('.prev');
const nextButton = document.querySelector('.next');
const carousel = new MotionRail(element, {
onChange: (state) => {
prevButton.disabled = state.isFirstItemVisible;
nextButton.disabled = state.isLastItemVisible;
}
});Update Pagination Counter
ts
const counter = document.querySelector('.counter');
const carousel = new MotionRail(element, {
onChange: (state) => {
const currentPage = state.visibleItemIndexes[0] + 1;
counter.textContent = `${currentPage} / ${state.totalItems}`;
}
});Custom Dot Indicators
ts
const dotsContainer = document.querySelector('.dots');
const carousel = new MotionRail(element, {
onChange: (state) => {
// Update active dot based on first visible item
const firstVisibleIndex = state.visibleItemIndexes[0];
document.querySelectorAll('.dot').forEach((dot, index) => {
dot.classList.toggle('active', index === firstVisibleIndex);
});
}
});Conditional Auto-Pause
ts
const carousel = new MotionRail(element, {
autoplay: true,
onChange: (state) => {
// Pause when reaching the last item
if (state.isLastItemVisible) {
carousel.pause();
}
}
});