BetaBeta pública — Consulta las notas de lanzamiento
Documentación

Scroll Area

Ejemplo básico de scroll area demostrando el comportamiento principal.

Paquete
@solidiom/scroll-area
Versión
0.0.1-next.0
Estado
stable

Ejemplos

import * as ScrollArea from "@solidiom/scroll-area"

;<ScrollArea.Root>Contenido de Scroll Area</ScrollArea.Root>
Elemento 1
Elemento 2
Elemento 3
Elemento 4
Elemento 5
Elemento 6
Elemento 7
Elemento 8
Elemento 9
Elemento 10
Elemento 11
Elemento 12
Elemento 13
Elemento 14
Elemento 15
Elemento 16
Elemento 17
Elemento 18
Elemento 19
Elemento 20
Ver código fuente
        export function Root(props: ScrollAreaRootProps) {
  const type = props.type ?? "hover"
  const scrollHideDelay = props.scrollHideDelay ?? 600

  const [viewportRef, setViewportRef] = createSignal<HTMLDivElement | undefined>(undefined)
  const [scrollHeight, setScrollHeight] = createSignal(0)
  const [scrollWidth, setScrollWidth] = createSignal(0)
  const [viewportHeight, setViewportHeight] = createSignal(0)
  const [viewportWidth, setViewportWidth] = createSignal(0)
  const [scrollTop, setScrollTop] = createSignal(0)
  const [scrollLeft, setScrollLeft] = createSignal(0)
  const [isHovered, setIsHovered] = createSignal(false)
  const [isScrolling, setIsScrolling] = createSignal(false)

  let scrollTimer: ReturnType<typeof setTimeout> | undefined

  const updateMeasurements = () => {
    const el = viewportRef()
    if (!el) return
    setScrollHeight(el.scrollHeight)
    setScrollWidth(el.scrollWidth)
    setViewportHeight(el.clientHeight)
    setViewportWidth(el.clientWidth)
  }

  const updateScrollPosition = () => {
    const el = viewportRef()
    if (!el) return
    setScrollTop(el.scrollTop)
    setScrollLeft(el.scrollLeft)
  }

  const notifyScrollStart = () => {
    setIsScrolling(true)
    if (scrollTimer !== undefined) clearTimeout(scrollTimer)
    scrollTimer = setTimeout(() => {
      setIsScrolling(false)
    }, scrollHideDelay)
  }

  return (
    <ScrollAreaContext
      value={{
        viewportRef,
        setViewportRef,
        scrollHeight,
        scrollWidth,
        viewportHeight,
        viewportWidth,
        scrollTop,
        scrollLeft,
        type,
        isHovered,
        isScrolling,
        scrollHideDelay,
        updateMeasurements,
        updateScrollPosition,
        notifyScrollStart,
      }}
    >
      <div
        class={props.class}
        style={{
          position: "relative",
          overflow: "hidden",
          ...(typeof props.style === "object" ? props.style : {}),
        }}
        onPointerEnter={() => setIsHovered(true)}
        onPointerLeave={() => setIsHovered(false)}
        {...applySemanticAttrs({
          scope: "scroll-area",
          part: "root",
        })}
      >
        {props.children}
      </div>
    </ScrollAreaContext>
  )
}