Device Orientation

This controller uses the Device Orientation API to listen to changes in the physical orientation of a device (phone, tablet, etc.). It emits an updated event at a throttled rate containing the current rotation angles.

⚠️ Notes

  • This API is available only on mobile and tablet devices equipped with motion sensors.

  • On iOS (Safari), users must grant permission via a dialog triggered by a user gesture:

    if (typeof DeviceOrientationEvent.requestPermission === 'function') {
      await DeviceOrientationEvent.requestPermission();
    }
  • On desktop browsers, events may never fire or return null values.

  • For performance reasons, events are throttled by default (see throttleValue).

Usage


<div {{ stimulus_controller('@pwa/device-orientation', {throttle: 25}) }}>
  <p id="orientation-status">Waiting for orientation data…</p>
</div>

<script type="module">
  const el = document.querySelector('[data-controller="pwa__device-orientation"]');

  el.addEventListener('device-orientation:updated', (e) => {
    const { alpha, beta, gamma } = e.detail;
    document.getElementById('orientation-status').textContent =
      `α: ${alpha?.toFixed(1)}°, β: ${beta?.toFixed(1)}°, γ: ${gamma?.toFixed(1)}°`;
  });
</script>

Parameters

throttleValue: Intended to control how often updated events are dispatched to avoid spamming the UI.

Actions

None

Targets

None

Events

updated: Emitted each time the device orientation changes (subject to the throttle delay).

Contains an object with the information (values are in degrees):

  • absolute: boolean,

  • alpha: number | null,

  • beta: number | null,

  • gamma: number | null

Last updated

Was this helpful?