UNPKG

@reusable-ui/accessibilities

Version:

An accessibility management system for react web components.

113 lines (112 loc) 3.8 kB
// react: import { // react: default as React, // hooks: useMemo, // contexts: createContext, useContext, } from 'react'; // defaults: const _defaultEnabled = true; // enabled const _defaultReadOnly = false; // mutable const _defaultActive = false; // normal state const _defaultInheritEnabled = true; // if ancestor is disabled => all descendants are forced to disabled const _defaultInheritReadOnly = true; // if ancestor is readonly => all descendants are forced to readonly const _defaultInheritActive = false; // all descendants are independent normal/active state /** * A react context for accessibility stuff. */ export const AccessibilityContext = createContext(/*defaultValue :*/ { enabled: _defaultEnabled, readOnly: _defaultReadOnly, active: _defaultActive, }); AccessibilityContext.displayName = 'Accessibility'; // hooks: export const usePropAccessibility = (props, defaultEnabled = _defaultEnabled, defaultReadOnly = _defaultReadOnly, defaultActive = _defaultActive) => { // contexts: const accessContext = useContext(AccessibilityContext); const inheritEnabled = props.inheritEnabled ?? _defaultInheritEnabled; const inheritReadOnly = props.inheritReadOnly ?? _defaultInheritReadOnly; const inheritActive = props.inheritActive ?? _defaultInheritActive; const enabled = ((inheritEnabled ? accessContext.enabled // inherit : true // independent ) && (props.enabled ?? defaultEnabled)); const readOnly = ((inheritReadOnly ? accessContext.readOnly // inherit : false // independent ) || (props.readOnly ?? defaultReadOnly)); const active = ((inheritActive ? accessContext.active // inherit : false // independent ) || (props.active ?? defaultActive)); return useMemo(() => ({ // accessibilities: enabled, readOnly, active, // mutable value }), [ // accessibilities: enabled, readOnly, active, ]); }; export const usePropEnabled = (props, defaultEnabled = _defaultEnabled) => { // contexts: const accessContext = useContext(AccessibilityContext); const inheritEnabled = props.inheritEnabled ?? _defaultInheritEnabled; return ((inheritEnabled ? accessContext.enabled // inherit : true // independent ) && (props.enabled ?? defaultEnabled)); }; export const usePropReadOnly = (props, defaultReadOnly = _defaultReadOnly) => { // contexts: const accessContext = useContext(AccessibilityContext); const inheritReadOnly = props.inheritReadOnly ?? _defaultInheritReadOnly; return ((inheritReadOnly ? accessContext.readOnly // inherit : false // independent ) || (props.readOnly ?? defaultReadOnly)); }; export const usePropActive = (props, defaultActive = _defaultActive) => { // contexts: const accessContext = useContext(AccessibilityContext); const inheritActive = props.inheritActive ?? _defaultInheritActive; return ((inheritActive ? accessContext.active // inherit : false // independent ) || (props.active ?? defaultActive)); }; const AccessibilityProvider = (props) => { // fn props: const propAccess = usePropAccessibility(props); return (React.createElement(AccessibilityContext.Provider, { value: propAccess }, props.children)); }; export { AccessibilityProvider, AccessibilityProvider as default, };