UNPKG

react-horizontal-scrolling-menu

Version:

Horizontal scrolling menu component for React with per-item visibility tracking. Supports mouse and touch devices, SSR-safe.

131 lines (119 loc) 4.36 kB
import './styles.css'; import React from 'react'; import * as constants from './constants'; import { VisibilityContext } from './context'; import { type publicApiType } from './createApi'; import getItemsPos from './getItemsPos'; import { observerOptions as defaultObserverOptions } from './settings'; import { slidingWindow } from './slidingWindow'; import type { ItemChild, ItemId, RefType, ScrollBehaviorArg } from './types'; type ComponentType = React.ReactNode | React.JSX.Element | React.FC; export interface Props { /** Header component on top, can contain Arrows */ Header?: ComponentType; /** Footer component on bottom, can contain Arrows */ Footer?: ComponentType; /** Component for left arrow e.g. LeftArrow={Arrow} or LeftArrow={<Arrow {...props />}} */ LeftArrow?: ComponentType; /** Component for right arrow e.g. RightArrow={Arrow} or RightArrow={<Arrow {...props />}} */ RightArrow?: ComponentType; /** Every child should has unique `itemId` prop */ children: ItemChild | ItemChild[]; /** Duration of transition */ transitionDuration?: number; /** Transition behavior can be 'smooth', 'auto' or custom function Example: (instructions) => { const [{ el, left }] = instructions; const styler = Styler(el); animate({ from: el.scrollLeft, to: left, ease: easingFunctions.easeInOutCubic, duration: 500, onUpdate: (left) => styler.set('scrollLeft', left), }); } */ transitionBehavior?: ScrollBehaviorArg; /** Callback that fire once on init */ onInit?: (api: publicApiType) => void; /** Callback that fire every time when visibility of items change */ onUpdate?: (api: publicApiType) => void; /** Callback that fire on scroll event */ onScroll?: (api: publicApiType, ev: React.UIEvent) => void; /** Handler for mouse wheel */ onWheel?: (api: publicApiType, ev: React.WheelEvent) => void; /** Options for intersection observer */ options?: Partial<typeof defaultObserverOptions>; onMouseDown?: (arg0: publicApiType) => React.MouseEventHandler; onMouseLeave?: (arg0: publicApiType) => React.MouseEventHandler; onMouseUp?: (arg0: publicApiType) => React.MouseEventHandler; onMouseMove?: (arg0: publicApiType) => React.MouseEventHandler; onTouchMove?: (arg0: publicApiType) => React.TouchEventHandler; onTouchStart?: (arg0: publicApiType) => React.TouchEventHandler; onTouchEnd?: (arg0: publicApiType) => React.TouchEventHandler; /** Ref object that will be passed to ScrollContainer, immediate parent of items It receives the scroll container element itself, so it can also read or set scrollLeft before paint (see the InfiniteLoop example) Usable for animations with formkit/auto-animate */ containerRef?: RefType<Element | null>; /** For add custom className for item */ itemClassName?: string; /** For add custom className for scroll container */ scrollContainerClassName?: string; /** For add custom className for wrapper */ wrapperClassName?: string; /** Ref object for access VisibilityContextApi outside of context e.g. apiRef.current?.scrollToItem(...) */ apiRef?: React.MutableRefObject<publicApiType> | React.RefObject<publicApiType | null> | React.RefCallback<publicApiType>; RTL?: boolean; /** Disable scrollIntoView polyfill */ noPolyfill?: boolean; } /** See docs and examples at https://github.com/asmyshlyaev177/react-horizontal-scrolling-menu */ declare function ScrollMenu({ LeftArrow: _LeftArrow, RightArrow: _RightArrow, children, Header: _Header, Footer: _Footer, transitionDuration, transitionBehavior, onInit, onUpdate, onMouseDown, onMouseLeave, onMouseUp, onMouseMove, onScroll, onTouchMove, onTouchStart, onTouchEnd, onWheel, options, scrollContainerClassName, containerRef, itemClassName, wrapperClassName, apiRef, RTL, noPolyfill, }: Props): React.JSX.Element; export { constants, getItemsPos, ScrollMenu, slidingWindow, VisibilityContext }; export type { ItemId, publicApiType };