Getting Started
App Providerglobal.d.tsThemesTypes
cn(...args)Text ParserUnits Converters
AnchorAvatarBreadcrumbBurgerButtonCardCarouselCheckerCodeColor PickerCommandConfettiCopyButtonDouble Helix WordsFloating IndicatorGroupHighlight TextIndicatorInputKbdLabelLoaderPaginationPassword RequirementPolymorphic SlotProgressProseRatingRunning AreaScroll AreaSheetsSkeletonSliderStackSvgTableTabsTextareaTimelineTimesToasterTooltipTyping WordsTypography
useClickOutsideuseClipboarduseDeviceInfouseDialoguseDidUpdateuseDirectionuseDisclosureuseDocumentTitleuseDocumentVisibilityuseElementInfouseEyeDropperuseFetchuseFullscreenuseGeoLocationuseHotkeysuseHoveruseIduseImagePopupuseInputStateuseIntersectionuseIntervaluseIsomorphicEffectuseListStateuseLocalStorageuseMeasureScrollbaruseMediaQueryuseMergedRefuseMouseuseMoveuseMutationObserveruseNetworkuseOpenStateuseOrientationuseOSusePaginationusePWAInstalleruseRandomColorsuseReducedMotionuseReloaduseResizeObserveruseScrollIntoViewuseStateHistoryuseTimeoutuseTouchuseTriggeruseUncontrolleduseValidatedStateuseViewportSizeuseWindowEventuseWindowScroll
Docs
Web
Hooks
useMeasureScrollbar
useLocalStorage

Persistent state synced with localStorage.

useMediaQuery

Reactively matches CSS media queries in JavaScript.


Edit this page on GitHub
  • Started
  • Utilities
  • Configuration
  • Components
  • Hooks
  • Examples
  • Github
  • Contributing
⌘+J

© 2025 oeri rights MIT


Designed in Earth-616

Built by oeri

useMeasureScrollbar

Measures the scrollbar size (width/height), useful for layout adjustments in scrollable containers.

Usage

Basic usage example to quickly see how the useMeasureScrollbar works.

browser scrollbar: 0px

"use client";
import { useState } from "react";
import { Button } from "@/ui/button";
import { Typography } from "@/ui/typography";
import { useMeasureScrollbar } from "@/hooks/use-measure-scrollbar";

export function UseMeasureScrollbarDemo() {
  const [open, setOpen] = useState<boolean>(false);
  const [, scrollbarWidth] = useMeasureScrollbar(open);

  return (
    <>
      <Button data-state={open ? "open" : "closed"} onClick={() => setOpen(o => !o)} className="w-24">
        {open ? "Close" : "Open"}
      </Button>
      {open && (
        <div
          data-state={open ? "open" : "closed"}
          className="absolute top-[calc(50%+20px)] rounded-md border bg-background p-4 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-100 data-[state=open]:zoom-in-100"
        >
          <Typography prose="muted">Scroll body removed</Typography>
        </div>
      )}
      <Typography el="p" prose="h4" className="absolute left-0 top-0">
        browser scrollbar: {scrollbarWidth}px
      </Typography>
    </>
  );
}

API

APITypeDefaultAnnotation
render?booleanfalsestate action isOpen value
has?boolean{ has: true }set attributes data-has-scroll for some element
modal?boolean{ modal: true }remove scroll bar when isOpen = true

Source Codes

Full working code example, including necessary markup and styles. You can copy and paste this code directly to start using the component immediately.

use-measure-scrollbar.ts