Skip to content
Elements

useDocumentVisibility

Tracks the browser tab's visibility state ('visible' or 'hidden') as a reactive Observable<DocumentVisibilityState>. Updates automatically when the user switches tabs or minimizes the window. SSR-safe: returns 'visible' when document is not available.

Document Visibility

Switch to another tab and come back — the 2s delay row stays "hidden" long enough to confirm the transition.

Instant
visible
2s delay
visible
import {
const useDocumentVisibility: () => Observable<DocumentVisibilityState>
useDocumentVisibility
} from "@usels/web";
function
function Component(): JSX.Element
Component
() {
const
const visibility$: any
visibility$
=
function useDocumentVisibility(): Observable<DocumentVisibilityState>

Framework-agnostic reactive document visibility state.

Tracks the browser tab's visibility state ('visible' or 'hidden'). Returns a writable Observable<DocumentVisibilityState> that updates automatically when the user switches tabs or minimizes the window.

SSR-safe: returns 'visible' when document is not available.

@returnsObservable<DocumentVisibilityState> — reflects current tab visibility.

useDocumentVisibility
();
return <
JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>
p
>Tab is {
const visibility$: any
visibility$
.
any
get
()}</
JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>
p
>;
}
import { useDocumentVisibility } from "@usels/web";
import { useObserve } from "@usels/core";
function Component() {
const visibility$ = useDocumentVisibility();
useObserve(() => {
if (visibility$.get() === "hidden") pausePolling();
else resumePolling();
});
}
import { useDocumentVisibility } from "@usels/web";
import { useObservable, useObserve } from "@usels/core";
function Component() {
const visibility$ = useDocumentVisibility();
const visibleSince = useObservable(Date.now());
useObserve(() => {
if (visibility$.get() === "visible") {
visibleSince.set(Date.now());
} else {
const elapsed = Date.now() - visibleSince.get();
trackVisibleTime(elapsed);
}
});
}

ObservablePrimitive<DocumentVisibilityState>

NameTypeDescription
peek{ (): DocumentVisibilityState; (): DocumentVisibilityState; }-
get(trackingType?: TrackingType | GetOptions) => DocumentVisibilityState-
onChange(cb: ListenerFn<DocumentVisibilityState>, options?: { trackingType?: TrackingType; initial?: boolean | undefined; immediate?: boolean | undefined; noArgs?: boolean | undefined; } | undefined) => () => void-
set{ (value: (prev: DocumentVisibilityState) => DocumentVisibilityState): void; (value: ObservablePrimitive<DocumentVisibilityState>): void; (value: "hidden" | ... 6 more ... | (() => "visible" | ... 1 more ... | ImmutableObservableBase<...>)): void; (value: Promise<...>): void; (value: DocumentVisibilityState): void; }-
delete() => void-

View on GitHub