DOM manipulation utilities for Material Components providing cross-browser compatibility, focus management, and accessibility features.
npx @tessl/cli install tessl/npm-material--dom@14.0.0Material DOM provides essential DOM manipulation utilities specifically designed for Material Components for the Web ecosystem. It offers commonly-used functions for inspecting, traversing, and manipulating DOM elements, including ponyfill functions for cross-browser compatibility, event handling utilities, focus management, accessibility features, and keyboard event normalization.
npm install @material/domimport * as events from '@material/dom/events';
import * as focusTrap from '@material/dom/focus-trap';
import * as keyboard from '@material/dom/keyboard';
import * as ponyfill from '@material/dom/ponyfill';For CommonJS:
const events = require('@material/dom/events');
const focusTrap = require('@material/dom/focus-trap');
const keyboard = require('@material/dom/keyboard');
const ponyfill = require('@material/dom/ponyfill');Direct module imports (announce module not exported in main index):
import { announce, AnnouncerPriority } from '@material/dom/announce';import * as ponyfill from '@material/dom/ponyfill';
import * as keyboard from '@material/dom/keyboard';
import { FocusTrap } from '@material/dom/focus-trap';
// Cross-browser DOM operations
const parentElement = ponyfill.closest(element, '.parent-selector');
const isMatch = ponyfill.matches(element, '.active');
// Keyboard event normalization
document.addEventListener('keydown', (event) => {
const normalizedKey = keyboard.normalizeKey(event);
if (keyboard.isNavigationEvent(event)) {
// Handle navigation
}
});
// Focus management for modals
const focusTrap = new FocusTrap(modalElement, {
initialFocusEl: firstInput
});
focusTrap.trapFocus();Material DOM is built around several key components:
Ponyfill functions for DOM operations that work consistently across browsers without modifying global prototypes.
function closest(element: Element, selector: string): Element | null;
function matches(element: Element, selector: string): boolean;
function estimateScrollWidth(element: Element): number;Utilities for detecting and configuring passive event listeners for improved performance.
function applyPassive(globalObj?: Window): boolean | EventListenerOptions;FocusTrap class for managing focus within modal components like dialogs and drawers.
class FocusTrap {
constructor(root: HTMLElement, options?: FocusOptions);
trapFocus(): void;
releaseFocus(): void;
}
interface FocusOptions {
initialFocusEl?: HTMLElement;
skipInitialFocus?: boolean;
skipRestoreFocus?: boolean;
}Cross-browser keyboard event normalization with standard key constants.
const KEY: {
UNKNOWN: 'Unknown';
BACKSPACE: 'Backspace';
ENTER: 'Enter';
SPACEBAR: 'Spacebar';
PAGE_UP: 'PageUp';
PAGE_DOWN: 'PageDown';
END: 'End';
HOME: 'Home';
ARROW_LEFT: 'ArrowLeft';
ARROW_UP: 'ArrowUp';
ARROW_RIGHT: 'ArrowRight';
ARROW_DOWN: 'ArrowDown';
DELETE: 'Delete';
ESCAPE: 'Escape';
TAB: 'Tab';
};
function normalizeKey(evt: KeyboardEvent): string;
function isNavigationEvent(evt: KeyboardEvent): boolean;ARIA-live region announcements for screen reader accessibility.
enum AnnouncerPriority {
POLITE = 'polite',
ASSERTIVE = 'assertive'
}
interface AnnouncerMessageOptions {
priority?: AnnouncerPriority;
ownerDocument?: Document;
}
function announce(message: string, options?: AnnouncerMessageOptions): void;Material DOM also provides SCSS mixins for enhanced accessibility and high-contrast mode support:
@use '@material/dom';
// Transparent border visible in high-contrast mode
@include dom.transparent-border($border-width: 1px, $border-style: solid, $query: feature-targeting.all());
// Visually hide content (screen readers only)
@include dom.visually-hidden($query: feature-targeting.all());
// Target forced-colors mode
@include dom.forced-colors-mode($exclude-ie11: false) {
// High contrast styles
}
// Target IE11 support
@include dom.ie11-support {
// IE11 specific styles
}Legacy import (deprecated):
@use '@material/dom/mixins';
// Same mixins available through deprecated path
@include mixins.transparent-border();
@include mixins.visually-hidden();
@include mixins.forced-colors-mode();