Command Palette

Search for a command...

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
import { styled } from "styled-system/jsx";
import { ScrollArea } from "@/components/ui/scroll-area";

const tags = Array.from({ length: 50 }).map((_, i, a) => `v1.2.0-beta.${a.length - i}`);

export default function ScrollAreaDemo() {
  return (
    <ScrollArea css={{ w: "48", h: "72", rounded: "md", borderWidth: "1px" }}>
      <styled.div css={{ p: "4" }}>
        <styled.h4 css={{ mb: "4", textStyle: "sm", fontWeight: "medium", lineHeight: "none" }}>
          Tags
        </styled.h4>
        <styled.div css={{ divideY: "1px" }}>
          {tags.map((tag) => (
            <styled.div
              key={tag}
              css={{ py: "2", textStyle: "sm", _first: { pt: "0" }, _last: { pb: "0" } }}
            >
              {tag}
            </styled.div>
          ))}
        </styled.div>
      </styled.div>
    </ScrollArea>
  );
}

Installation

npx nore-ui-cli@latest add scroll-area

Usage

import { ScrollArea } from "@/components/ui/scroll-area";
<ScrollArea css={{ h: "200px", w: "350px", rounded: "md", borderWidth: "1px", 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 Scroll

Photo by Ornella Binni
Photo by Ornella Binni
Photo by Tom Byrom
Photo by Tom Byrom
Photo by Vladimir Malyavko
Photo by Vladimir Malyavko
import Image from "next/image";
import { css } from "styled-system/css";
import { styled } from "styled-system/jsx";
import { ScrollArea, Scrollbar } from "@/components/ui/scroll-area";

interface Artwork {
  artist: string;
  art: string;
}

export const works: Artwork[] = [
  {
    artist: "Ornella Binni",
    art: "https://images.unsplash.com/photo-1465869185982-5a1a7522cbcb?auto=format&fit=crop&w=300&q=80",
  },
  {
    artist: "Tom Byrom",
    art: "https://images.unsplash.com/photo-1548516173-3cabfa4607e9?auto=format&fit=crop&w=300&q=80",
  },
  {
    artist: "Vladimir Malyavko",
    art: "https://images.unsplash.com/photo-1494337480532-3725c85fd2ab?auto=format&fit=crop&w=300&q=80",
  },
];

export default function ScrollAreaHorizontal() {
  return (
    <ScrollArea css={{ w: "96", whiteSpace: "nowrap", rounded: "md", borderWidth: "1px" }}>
      <styled.div css={{ display: "flex", w: "max", spaceX: "4", p: "4" }}>
        {works.map((artwork) => (
          <styled.figure key={artwork.artist} css={{ flexShrink: "0" }}>
            <styled.div css={{ overflow: "hidden", rounded: "md" }}>
              <Image
                src={artwork.art}
                alt={`Photo by ${artwork.artist}`}
                className={css({ aspectRatio: "3/4", w: "fit", h: "fit", objectFit: "cover" })}
                width={300}
                height={400}
              />
            </styled.div>
            <styled.figcaption css={{ pt: "2", textStyle: "xs", color: "muted.fg" }}>
              Photo by{" "}
              <styled.span css={{ fontWeight: "semibold", color: "fg" }}>
                {artwork.artist}
              </styled.span>
            </styled.figcaption>
          </styled.figure>
        ))}
      </styled.div>
      <Scrollbar orientation="horizontal" />
    </ScrollArea>
  );
}