browser-device-orientation

Wraps DeviceOrientationEvent as global atoms, exposing the raw tilt snapshot plus alpha / beta / gamma and a compass-heading selector.

Permission
iOS requires a user gesture: call requestOrientationPermission() from a click handler before subscribing. Other browsers grant on subscribe.

Install

bun add @valdres/browser-device-orientation

Live example

Loading demo…

Usage

import { Component } from "@angular/core"
import { injectValue } from "valdres-angular"
import { compassHeadingSelector } from "@valdres/browser-device-orientation"

@Component({
    selector: "compass-view",
    template: `{{ heading() == null ? "—" : (heading() | number: "1.0-0") + "°" }}`,
})
export class CompassView {
    heading = injectValue(compassHeadingSelector) // Signal<number | null>
}

Exports

ExportKindType
orientationAtomatom (read-only)OrientationSnapshot | null
permissionAtomatom (settable)PermissionValue
orientationStatusAtomatom (read-only)OrientationStatus
alphaSelectorselectornumber | null
betaSelectorselectornumber | null
gammaSelectorselectornumber | null
absoluteSelectorselectorboolean | null
compassHeadingSelectorselectornumber | null
requestOrientationPermissionutil fn() => Promise<PermissionValue>
OrientationSnapshottype{ alpha, beta, gamma: number | null; absolute: boolean; webkitCompassHeading, webkitCompassAccuracy: number | null; timeStamp: number }
OrientationStatustype"unsupported" | "idle" | "active"
PermissionValuetype"granted" | "denied" | "prompt" | "unsupported"

Cross-framework

Global atoms/selectors — works in every framework, only the read primitive differs. The deviceorientation listener starts on the first subscriber and stops on the last.