Scroller
patchui/scrollerFreeComponent
patchui publishes no description for this item.
Install it
npx shadcn@latest add https://ui.hotfix.jobs/r/scroller.jsonSource
1"use client";23import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";4import {5 useCallback,6 useEffect,7 useLayoutEffect,8 useRef,9 useState,10} from "react";11import type * as React from "react";12import { cn } from "@/lib/utils";13import { selectionFocus } from "@/lib/recipes";1415const useIsoLayoutEffect =16 typeof window !== "undefined" ? useLayoutEffect : useEffect;1718type RtlScrollType = "default" | "negative" | "reverse";1920let rtlScrollType: RtlScrollType | undefined;2122// Browsers expose three different coordinate models for RTL scrollLeft.23function detectRtlScrollType(): RtlScrollType {24 if (rtlScrollType) return rtlScrollType;2526 const viewport = document.createElement("div");27 const content = document.createElement("div");28 viewport.dir = "rtl";29 viewport.style.cssText =30 "position:absolute;top:-1000px;width:4px;height:1px;overflow:scroll";31 content.style.width = "8px";32 viewport.append(content);33 document.body.append(viewport);3435 if (viewport.scrollLeft > 0) {36 rtlScrollType = "default";37 } else {38 viewport.scrollLeft = 1;39 rtlScrollType = viewport.scrollLeft === 0 ? "negative" : "reverse";40 }4142 viewport.remove();43 return rtlScrollType;44}4546function getLogicalScrollOffset(47 element: HTMLElement,48 isRtl: boolean,49): number {50 const maxOffset = Math.max(0, element.scrollWidth - element.clientWidth);51 if (!isRtl) {52 return Math.min(maxOffset, Math.max(0, element.scrollLeft));53 }5455 const scrollType = detectRtlScrollType();56 const offset =57 scrollType === "default"58 ? maxOffset - element.scrollLeft59 : scrollType === "negative"60 ? -element.scrollLeft61 : element.scrollLeft;6263 return Math.min(maxOffset, Math.max(0, offset));64}6566export type ScrollerOverflow = "x" | "y" | "both";6768export interface ScrollerProps69 extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {70 /** Scroll axis. `x` for horizontal rails, `y` for stacked feeds, `both` for a grid canvas. */71 overflow?: ScrollerOverflow;72 /**73 * Fade the edge of the scroll region when there's more content in that74 * direction (via `mask-image`). Default `true`. Only meaningful for75 * `overflow="x"` and `overflow="y"`.76 */77 fade?: boolean;78 /** Fade width in pixels. Default 32. */79 fadeWidth?: number;80 /** Class on the inner content wrapper: apply gap here for rail spacing. */81 childrenContainerClassName?: string;82 /** Accessible name applied while the viewport is scrollable. */83// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from patchui
All 51 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | patchui | Components | Free | 2 deps | |
| Avataravatar | patchui | Components | Free | 3 deps | |
| Badgebadge | patchui | Components | Free | 2 deps | |
| Breadcrumbbreadcrumb | patchui | Components | Free | 1 dep | |
| Buttonbutton | patchui | Components | Free | 2 deps | |
| Calendarcalendar | patchui | Components | Free | 1 dep | |
| Cardcard | patchui | Components | Free | 1 dep | |
| Checkboxcheckbox | patchui | Components | Free | 2 deps |
