Kosorikōsori alpha

Scroll Area

Augments native scroll functionality for custom, cross-browser styling.

Tags

v1.2.0-beta.50
v1.2.0-beta.49
v1.2.0-beta.48
v1.2.0-beta.47
v1.2.0-beta.46
v1.2.0-beta.45
v1.2.0-beta.44
v1.2.0-beta.43
v1.2.0-beta.42
v1.2.0-beta.41
v1.2.0-beta.40
v1.2.0-beta.39
v1.2.0-beta.38
v1.2.0-beta.37
v1.2.0-beta.36
v1.2.0-beta.35
v1.2.0-beta.34
v1.2.0-beta.33
v1.2.0-beta.32
v1.2.0-beta.31
v1.2.0-beta.30
v1.2.0-beta.29
v1.2.0-beta.28
v1.2.0-beta.27
v1.2.0-beta.26
v1.2.0-beta.25
v1.2.0-beta.24
v1.2.0-beta.23
v1.2.0-beta.22
v1.2.0-beta.21
v1.2.0-beta.20
v1.2.0-beta.19
v1.2.0-beta.18
v1.2.0-beta.17
v1.2.0-beta.16
v1.2.0-beta.15
v1.2.0-beta.14
v1.2.0-beta.13
v1.2.0-beta.12
v1.2.0-beta.11
v1.2.0-beta.10
v1.2.0-beta.9
v1.2.0-beta.8
v1.2.0-beta.7
v1.2.0-beta.6
v1.2.0-beta.5
v1.2.0-beta.4
v1.2.0-beta.3
v1.2.0-beta.2
v1.2.0-beta.1

Installation

Install the primitive

Install the @radix-ui/react-scroll-area package.

npm install @radix-ui/react-scroll-area

Copy-paste the component

Copy and paste the component code in a .tsx file.

'use client';
 
import { forwardRef } from 'react';
import {
  Corner,
  Root,
  ScrollAreaThumb,
  ScrollAreaScrollbar as Scrollbar,
  Viewport,
} from '@radix-ui/react-scroll-area';
import { tv } from 'tailwind-variants';
 
const scrollAreaStyles = tv({
  slots: {
    base: 'relative overflow-hidden',
    viewport: 'size-full rounded-[inherit]',
    scrollbar: 'flex touch-none select-none transition-colors',
    thumb: 'relative flex-1 rounded-full bg-grey-line',
  },
  variants: {
    orientation: {
      vertical: {
        scrollbar: 'h-full w-2.5 border-l border-l-transparent p-px',
      },
      horizontal: {
        scrollbar: 'h-2.5 w-full border-t border-t-transparent p-px',
      },
    },
  },
});
 
const { base, viewport, scrollbar, thumb } = scrollAreaStyles();
 
type ScrollAreaRef = React.ElementRef<typeof Root>;
type ScrollAreaProps = React.ComponentPropsWithoutRef<typeof Root>;
 
/**
 * ScrollArea component that provides a scrollable area for content.
 *
 * @param {ScrollAreaProps} props - The props for the ScrollArea component.
 *
 * @example
 * <ScrollArea className='h-[200px] w-[350px] rounded-md border p-4'>
 *   Jokester began sneaking into the castle in the middle of the night and leaving
 *   jokes all over the place: under the king's pillow, in his soup, even in the
 *   royal toilet. The king was furious, but he couldn't seem to stop Jokester. And
 *   then, one day, the people of the kingdom discovered that the jokes left by
 *   Jokester were so funny that they couldn't help but laugh. And once they
 *   started laughing, they couldn't stop.
 * </ScrollArea>
 *
 * @see {@link https://dub.sh/ui-scroll-area ScrollArea Docs} for further information.
 */
/**
 * ScrollAreaScrollbar component that represents the scrollbar within the scroll area.
 *
 * @param {ScrollAreaScrollbarProps} props - The props for the ScrollAreaScrollbar component.
 *
 * @example
 * <ScrollAreaScrollbar orientation='vertical' />
 */
export const ScrollArea = forwardRef<ScrollAreaRef, ScrollAreaProps>(
  ({ className, children, ...props }, ref) => (
    <Root ref={ref} className={base({ className })} {...props}>
      <Viewport className={viewport()}>{children}</Viewport>
      <ScrollAreaScrollbar />
      <Corner />
    </Root>
  ),
);
 
ScrollArea.displayName = Root.displayName;
 
type ScrollAreaScrollbarRef = React.ElementRef<typeof Scrollbar>;
type ScrollAreaScrollbarProps = React.ComponentPropsWithoutRef<
  typeof Scrollbar
>;
 
/**
 * ScrollAreaScrollbar component that represents the scrollbar within the scroll area.
 *
 * @param {ScrollAreaScrollbarProps} props - The props for the ScrollAreaScrollbar component.
 *
 * @example
 * <ScrollAreaScrollbar orientation='vertical' />
 */
export const ScrollAreaScrollbar = forwardRef<
  ScrollAreaScrollbarRef,
  ScrollAreaScrollbarProps
>(({ className, orientation = 'vertical', ...props }, ref) => (
  <Scrollbar
    ref={ref}
    className={scrollbar({ className, orientation })}
    orientation={orientation}
    {...props}
  >
    <ScrollAreaThumb className={thumb()} />
  </Scrollbar>
));
 
ScrollAreaScrollbar.displayName = Scrollbar.displayName;

Update import paths

Update the @kosori/ui import paths to fit your project structure, for example, using ~/components/ui.

Usage

import { ScrollArea } from '~/components/ui/scroll-area';
<ScrollArea className='h-[200px] w-[350px] rounded-md border p-4'>
  Jokester began sneaking into the castle in the middle of the night and leaving
  jokes all over the place: under the king's pillow, in his soup, even in the
  royal toilet. The king was furious, but he couldn't seem to stop Jokester. And
  then, one day, the people of the kingdom discovered that the jokes left by
  Jokester were so funny that they couldn't help but laugh. And once they
  started laughing, they couldn't stop.
</ScrollArea>

Examples

Horizontal Scrolling

Photo by Ornella Binni
Photo by Ornella Binni
Photo by Tom Byrom
Photo by Tom Byrom
Photo by Vladimir Malyavko
Photo by Vladimir Malyavko

On this page