0.2.0 - Mid migration

This commit is contained in:
Daniel Mason 2022-04-25 14:47:15 +12:00
parent 139e6a915e
commit 7e38fdbd7d
42393 changed files with 5358157 additions and 62 deletions

View file

@ -0,0 +1 @@
export default function capitalize(string: string): string;

20
web/node_modules/@material-ui/core/utils/capitalize.js generated vendored Normal file
View file

@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = capitalize;
var _utils = require("@material-ui/utils");
// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.
//
// A strict capitalization should uppercase the first letter of each word a the sentence.
// We only handle the first word.
function capitalize(string) {
if (typeof string !== 'string') {
throw new Error(process.env.NODE_ENV !== "production" ? "Material-UI: capitalize(string) expects a string argument." : (0, _utils.formatMuiErrorMessage)(7));
}
return string.charAt(0).toUpperCase() + string.slice(1);
}

View file

@ -0,0 +1,5 @@
export type ChainedFunction = ((...args: any[]) => void) | undefined | null;
export default function createChainedFunction(
...funcs: ChainedFunction[]
): (...args: any[]) => never;

View file

@ -0,0 +1,42 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createChainedFunction;
/**
* Safe chained function
*
* Will only create a new function if needed,
* otherwise will pass back existing functions or null.
*
* @param {function} functions to chain
* @returns {function|null}
*/
function createChainedFunction() {
for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {
funcs[_key] = arguments[_key];
}
return funcs.reduce(function (acc, func) {
if (func == null) {
return acc;
}
if (process.env.NODE_ENV !== 'production') {
if (typeof func !== 'function') {
console.error('Material-UI: Invalid Argument Type, must only provide functions, undefined, or null.');
}
}
return function chainedFunction() {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
acc.apply(this, args);
func.apply(this, args);
};
}, function () {});
}

View file

@ -0,0 +1,3 @@
import SvgIcon from '@material-ui/core/SvgIcon';
export default function createSvgIcon(path: React.ReactNode, displayName: string): typeof SvgIcon;

View file

@ -0,0 +1,34 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createSvgIcon;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireDefault(require("react"));
var _SvgIcon = _interopRequireDefault(require("../SvgIcon"));
/**
* Private module reserved for @material-ui/x packages.
*/
function createSvgIcon(path, displayName) {
var Component = function Component(props, ref) {
return /*#__PURE__*/_react.default.createElement(_SvgIcon.default, (0, _extends2.default)({
ref: ref
}, props), path);
};
if (process.env.NODE_ENV !== 'production') {
// Need to set `displayName` on the inner component for React.memo.
// React prior to 16.14 ignores `displayName` on the wrapper.
Component.displayName = "".concat(displayName, "Icon");
}
Component.muiName = _SvgIcon.default.muiName;
return /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.forwardRef(Component));
}

View file

@ -0,0 +1,8 @@
export interface Cancelable {
clear(): void;
}
export default function debounce<T extends (...args: any[]) => any>(
func: T,
wait?: number
): T & Cancelable;

35
web/node_modules/@material-ui/core/utils/debounce.js generated vendored Normal file
View file

@ -0,0 +1,35 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = debounce;
// Corresponds to 10 frames at 60 Hz.
// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.
function debounce(func) {
var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 166;
var timeout;
function debounced() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
// eslint-disable-next-line consistent-this
var that = this;
var later = function later() {
func.apply(that, args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
}
debounced.clear = function () {
clearTimeout(timeout);
};
return debounced;
}

View file

@ -0,0 +1 @@
export default function deprecatedPropType<T>(validator: T, reason: string): T;

View file

@ -0,0 +1,25 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = deprecatedPropType;
function deprecatedPropType(validator, reason) {
if (process.env.NODE_ENV === 'production') {
return function () {
return null;
};
}
return function (props, propName, componentName, location, propFullName) {
var componentNameSafe = componentName || '<<anonymous>>';
var propFullNameSafe = propFullName || propName;
if (typeof props[propName] !== 'undefined') {
return new Error("The ".concat(location, " `").concat(propFullNameSafe, "` of ") + "`".concat(componentNameSafe, "` is deprecated. ").concat(reason));
}
return null;
};
}

View file

@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = getScrollbarSize;
// A change of the browser zoom change the scrollbar size.
// Credit https://github.com/twbs/bootstrap/blob/3ffe3a5d82f6f561b82ff78d82b32a7d14aed558/js/src/modal.js#L512-L519
function getScrollbarSize() {
var scrollDiv = document.createElement('div');
scrollDiv.style.width = '99px';
scrollDiv.style.height = '99px';
scrollDiv.style.position = 'absolute';
scrollDiv.style.top = '-9999px';
scrollDiv.style.overflow = 'scroll';
document.body.appendChild(scrollDiv);
var scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
return scrollbarSize;
}

15
web/node_modules/@material-ui/core/utils/index.d.ts generated vendored Normal file
View file

@ -0,0 +1,15 @@
export { default as capitalize } from './capitalize';
export { default as createChainedFunction } from './createChainedFunction';
export { default as createSvgIcon } from './createSvgIcon';
export { default as debounce } from './debounce';
export { default as deprecatedPropType } from './deprecatedPropType';
export { default as isMuiElement } from './isMuiElement';
export { default as ownerDocument } from './ownerDocument';
export { default as ownerWindow } from './ownerWindow';
export { default as requirePropFactory } from './requirePropFactory';
export { default as setRef } from './setRef';
export { default as unsupportedProp } from './unsupportedProp';
export { default as useControlled } from './useControlled';
export { default as useEventCallback } from './useEventCallback';
export { default as useForkRef } from './useForkRef';
export { default as useIsFocusVisible } from './useIsFocusVisible';

135
web/node_modules/@material-ui/core/utils/index.js generated vendored Normal file
View file

@ -0,0 +1,135 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "capitalize", {
enumerable: true,
get: function get() {
return _capitalize.default;
}
});
Object.defineProperty(exports, "createChainedFunction", {
enumerable: true,
get: function get() {
return _createChainedFunction.default;
}
});
Object.defineProperty(exports, "createSvgIcon", {
enumerable: true,
get: function get() {
return _createSvgIcon.default;
}
});
Object.defineProperty(exports, "debounce", {
enumerable: true,
get: function get() {
return _debounce.default;
}
});
Object.defineProperty(exports, "deprecatedPropType", {
enumerable: true,
get: function get() {
return _deprecatedPropType.default;
}
});
Object.defineProperty(exports, "isMuiElement", {
enumerable: true,
get: function get() {
return _isMuiElement.default;
}
});
Object.defineProperty(exports, "ownerDocument", {
enumerable: true,
get: function get() {
return _ownerDocument.default;
}
});
Object.defineProperty(exports, "ownerWindow", {
enumerable: true,
get: function get() {
return _ownerWindow.default;
}
});
Object.defineProperty(exports, "requirePropFactory", {
enumerable: true,
get: function get() {
return _requirePropFactory.default;
}
});
Object.defineProperty(exports, "setRef", {
enumerable: true,
get: function get() {
return _setRef.default;
}
});
Object.defineProperty(exports, "unsupportedProp", {
enumerable: true,
get: function get() {
return _unsupportedProp.default;
}
});
Object.defineProperty(exports, "useControlled", {
enumerable: true,
get: function get() {
return _useControlled.default;
}
});
Object.defineProperty(exports, "useEventCallback", {
enumerable: true,
get: function get() {
return _useEventCallback.default;
}
});
Object.defineProperty(exports, "useForkRef", {
enumerable: true,
get: function get() {
return _useForkRef.default;
}
});
Object.defineProperty(exports, "unstable_useId", {
enumerable: true,
get: function get() {
return _unstable_useId.default;
}
});
Object.defineProperty(exports, "useIsFocusVisible", {
enumerable: true,
get: function get() {
return _useIsFocusVisible.default;
}
});
var _capitalize = _interopRequireDefault(require("./capitalize"));
var _createChainedFunction = _interopRequireDefault(require("./createChainedFunction"));
var _createSvgIcon = _interopRequireDefault(require("./createSvgIcon"));
var _debounce = _interopRequireDefault(require("./debounce"));
var _deprecatedPropType = _interopRequireDefault(require("./deprecatedPropType"));
var _isMuiElement = _interopRequireDefault(require("./isMuiElement"));
var _ownerDocument = _interopRequireDefault(require("./ownerDocument"));
var _ownerWindow = _interopRequireDefault(require("./ownerWindow"));
var _requirePropFactory = _interopRequireDefault(require("./requirePropFactory"));
var _setRef = _interopRequireDefault(require("./setRef"));
var _unsupportedProp = _interopRequireDefault(require("./unsupportedProp"));
var _useControlled = _interopRequireDefault(require("./useControlled"));
var _useEventCallback = _interopRequireDefault(require("./useEventCallback"));
var _useForkRef = _interopRequireDefault(require("./useForkRef"));
var _unstable_useId = _interopRequireDefault(require("./unstable_useId"));
var _useIsFocusVisible = _interopRequireDefault(require("./useIsFocusVisible"));

View file

@ -0,0 +1,12 @@
import * as React from 'react';
import { StandardProps } from '../';
export type NamedMuiComponent = React.ComponentType & { muiName: string };
export interface NamedMuiElement {
type: NamedMuiComponent;
props: StandardProps<{}, never>;
key: string | number | null;
}
export default function isMuiElement(element: any, muiNames: string[]): element is NamedMuiElement;

View file

@ -0,0 +1,14 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = isMuiElement;
var React = _interopRequireWildcard(require("react"));
function isMuiElement(element, muiNames) {
return /*#__PURE__*/React.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1;
}

View file

@ -0,0 +1 @@
export default function ownerDocument(node?: Node): Document;

View file

@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = ownerDocument;
function ownerDocument(node) {
return node && node.ownerDocument || document;
}

View file

@ -0,0 +1 @@
export default function ownerWindow(node?: Node): Window;

View file

@ -0,0 +1,15 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = ownerWindow;
var _ownerDocument = _interopRequireDefault(require("./ownerDocument"));
function ownerWindow(node) {
var doc = (0, _ownerDocument.default)(node);
return doc.defaultView || window;
}

View file

@ -0,0 +1,5 @@
{
"sideEffects": false,
"module": "../esm/utils/index.js",
"typings": "./index.d.ts"
}

View file

@ -0,0 +1 @@
export default function requirePropFactory(componentNameInError: string): any;

View file

@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = requirePropFactory;
function requirePropFactory(componentNameInError) {
if (process.env.NODE_ENV === 'production') {
return function () {
return null;
};
}
var requireProp = function requireProp(requiredProp) {
return function (props, propName, componentName, location, propFullName) {
var propFullNameSafe = propFullName || propName;
if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {
return new Error("The prop `".concat(propFullNameSafe, "` of ") + "`".concat(componentNameInError, "` must be used on `").concat(requiredProp, "`."));
}
return null;
};
};
return requireProp;
}

84
web/node_modules/@material-ui/core/utils/scrollLeft.js generated vendored Normal file
View file

@ -0,0 +1,84 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.detectScrollType = detectScrollType;
exports.getNormalizedScrollLeft = getNormalizedScrollLeft;
// Source from https://github.com/alitaheri/normalize-scroll-left
var cachedType;
/**
* Based on the jquery plugin https://github.com/othree/jquery.rtl-scroll-type
*
* Types of scrollLeft, assuming scrollWidth=100 and direction is rtl.
*
* Type | <- Most Left | Most Right -> | Initial
* ---------------- | ------------ | ------------- | -------
* default | 0 | 100 | 100
* negative (spec*) | -100 | 0 | 0
* reverse | 100 | 0 | 0
*
* Edge 85: default
* Safari 14: negative
* Chrome 85: negative
* Firefox 81: negative
* IE 11: reverse
*
* spec* https://drafts.csswg.org/cssom-view/#dom-window-scroll
*/
function detectScrollType() {
if (cachedType) {
return cachedType;
}
var dummy = document.createElement('div');
var container = document.createElement('div');
container.style.width = '10px';
container.style.height = '1px';
dummy.appendChild(container);
dummy.dir = 'rtl';
dummy.style.fontSize = '14px';
dummy.style.width = '4px';
dummy.style.height = '1px';
dummy.style.position = 'absolute';
dummy.style.top = '-1000px';
dummy.style.overflow = 'scroll';
document.body.appendChild(dummy);
cachedType = 'reverse';
if (dummy.scrollLeft > 0) {
cachedType = 'default';
} else {
dummy.scrollLeft = 1;
if (dummy.scrollLeft === 0) {
cachedType = 'negative';
}
}
document.body.removeChild(dummy);
return cachedType;
} // Based on https://stackoverflow.com/a/24394376
function getNormalizedScrollLeft(element, direction) {
var scrollLeft = element.scrollLeft; // Perform the calculations only when direction is rtl to avoid messing up the ltr bahavior
if (direction !== 'rtl') {
return scrollLeft;
}
var type = detectScrollType();
switch (type) {
case 'negative':
return element.scrollWidth - element.clientWidth + scrollLeft;
case 'reverse':
return element.scrollWidth - element.clientWidth - scrollLeft;
default:
return scrollLeft;
}
}

16
web/node_modules/@material-ui/core/utils/setRef.d.ts generated vendored Normal file
View file

@ -0,0 +1,16 @@
/**
* passes {value} to {ref}
*
* WARNING: Be sure to only call this inside a callback that is passed as a ref.
* Otherwise make sure to cleanup previous {ref} if it changes. See
* https://github.com/mui-org/material-ui/issues/13539
*
* useful if you want to expose the ref of an inner component to the public api
* while still using it inside the component
*
* @param ref a ref callback or ref object if anything falsy this is a no-op
*/
export default function setRef<T>(
ref: React.RefObject<T> | ((instance: T | null) => void) | null | undefined,
value: T | null
): void;

15
web/node_modules/@material-ui/core/utils/setRef.js generated vendored Normal file
View file

@ -0,0 +1,15 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = setRef;
// TODO v5: consider to make it private
function setRef(ref, value) {
if (typeof ref === 'function') {
ref(value);
} else if (ref) {
ref.current = value;
}
}

View file

@ -0,0 +1,30 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useId;
var React = _interopRequireWildcard(require("react"));
/**
* Private module reserved for @material-ui/x packages.
*/
function useId(idOverride) {
var _React$useState = React.useState(idOverride),
defaultId = _React$useState[0],
setDefaultId = _React$useState[1];
var id = idOverride || defaultId;
React.useEffect(function () {
if (defaultId == null) {
// Fallback to this default id when possible.
// Use the random value for client-side rendering only.
// We can't use it server-side.
setDefaultId("mui-".concat(Math.round(Math.random() * 1e5)));
}
}, [defaultId]);
return id;
}

View file

@ -0,0 +1,7 @@
export default function unsupportedProp(
props: { [key: string]: any },
propName: string,
componentName: string,
location: string,
propFullName: string
): Error | null;

View file

@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = unsupportedProp;
function unsupportedProp(props, propName, componentName, location, propFullName) {
if (process.env.NODE_ENV === 'production') {
return null;
}
var propFullNameSafe = propFullName || propName;
if (typeof props[propName] !== 'undefined') {
return new Error("The prop `".concat(propFullNameSafe, "` is not supported. Please remove it."));
}
return null;
}

View file

@ -0,0 +1,22 @@
export interface UseControlledProps<T = unknown> {
/**
* This prop contains the component value when it's controlled.
*/
controlled: T | undefined;
/**
* The default value when uncontrolled.
*/
default: T | undefined;
/**
* The component name displayed in warnings.
*/
name: string;
/**
* The name of the state variable displayed in warnings.
*/
state?: string;
}
export default function useControlled<T = unknown>(
props: UseControlledProps<T>
): [T, (newValue: T) => void];

View file

@ -0,0 +1,52 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useControlled;
var React = _interopRequireWildcard(require("react"));
/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */
function useControlled(_ref) {
var controlled = _ref.controlled,
defaultProp = _ref.default,
name = _ref.name,
_ref$state = _ref.state,
state = _ref$state === void 0 ? 'value' : _ref$state;
var _React$useRef = React.useRef(controlled !== undefined),
isControlled = _React$useRef.current;
var _React$useState = React.useState(defaultProp),
valueState = _React$useState[0],
setValue = _React$useState[1];
var value = isControlled ? controlled : valueState;
if (process.env.NODE_ENV !== 'production') {
React.useEffect(function () {
if (isControlled !== (controlled !== undefined)) {
console.error(["Material-UI: A component is changing the ".concat(isControlled ? '' : 'un', "controlled ").concat(state, " state of ").concat(name, " to be ").concat(isControlled ? 'un' : '', "controlled."), 'Elements should not switch from uncontrolled to controlled (or vice versa).', "Decide between using a controlled or uncontrolled ".concat(name, " ") + 'element for the lifetime of the component.', "The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.", 'More info: https://fb.me/react-controlled-components'].join('\n'));
}
}, [controlled]);
var _React$useRef2 = React.useRef(defaultProp),
defaultValue = _React$useRef2.current;
React.useEffect(function () {
if (!isControlled && defaultValue !== defaultProp) {
console.error(["Material-UI: A component is changing the default ".concat(state, " state of an uncontrolled ").concat(name, " after being initialized. ") + "To suppress this warning opt to use a controlled ".concat(name, ".")].join('\n'));
}
}, [JSON.stringify(defaultProp)]);
}
var setValueIfUncontrolled = React.useCallback(function (newValue) {
if (!isControlled) {
setValue(newValue);
}
}, []);
return [value, setValueIfUncontrolled];
}

View file

@ -0,0 +1,5 @@
export interface Cancelable {
clear(): void;
}
export default function useEventCallback(...args: any[]): void;

View file

@ -0,0 +1,27 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useEventCallback;
var React = _interopRequireWildcard(require("react"));
var useEnhancedEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
/**
* https://github.com/facebook/react/issues/14099#issuecomment-440013892
*
* @param {function} fn
*/
function useEventCallback(fn) {
var ref = React.useRef(fn);
useEnhancedEffect(function () {
ref.current = fn;
});
return React.useCallback(function () {
return (0, ref.current).apply(void 0, arguments);
}, []);
}

View file

@ -0,0 +1 @@
export default function useForkRef<T>(refA: React.Ref<T>, refB: React.Ref<T>): React.Ref<T>;

32
web/node_modules/@material-ui/core/utils/useForkRef.js generated vendored Normal file
View file

@ -0,0 +1,32 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useForkRef;
var React = _interopRequireWildcard(require("react"));
var _setRef = _interopRequireDefault(require("./setRef"));
function useForkRef(refA, refB) {
/**
* This will create a new function if the ref props change and are defined.
* This means react will call the old forkRef with `null` and the new forkRef
* with the ref. Cleanup naturally emerges from this behavior
*/
return React.useMemo(function () {
if (refA == null && refB == null) {
return null;
}
return function (refValue) {
(0, _setRef.default)(refA, refValue);
(0, _setRef.default)(refB, refValue);
};
}, [refA, refB]);
}

View file

@ -0,0 +1,5 @@
export default function useIsFocusVisible(): {
isFocusVisible: (event: React.ChangeEvent) => boolean;
onBlurVisible: () => void;
ref: React.Ref<unknown>;
};

View file

@ -0,0 +1,168 @@
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.teardown = teardown;
exports.default = useIsFocusVisible;
var React = _interopRequireWildcard(require("react"));
var ReactDOM = _interopRequireWildcard(require("react-dom"));
// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js
var hadKeyboardEvent = true;
var hadFocusVisibleRecently = false;
var hadFocusVisibleRecentlyTimeout = null;
var inputTypesWhitelist = {
text: true,
search: true,
url: true,
tel: true,
email: true,
password: true,
number: true,
date: true,
month: true,
week: true,
time: true,
datetime: true,
'datetime-local': true
};
/**
* Computes whether the given element should automatically trigger the
* `focus-visible` class being added, i.e. whether it should always match
* `:focus-visible` when focused.
* @param {Element} node
* @return {boolean}
*/
function focusTriggersKeyboardModality(node) {
var type = node.type,
tagName = node.tagName;
if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {
return true;
}
if (tagName === 'TEXTAREA' && !node.readOnly) {
return true;
}
if (node.isContentEditable) {
return true;
}
return false;
}
/**
* Keep track of our keyboard modality state with `hadKeyboardEvent`.
* If the most recent user interaction was via the keyboard;
* and the key press did not include a meta, alt/option, or control key;
* then the modality is keyboard. Otherwise, the modality is not keyboard.
* @param {KeyboardEvent} event
*/
function handleKeyDown(event) {
if (event.metaKey || event.altKey || event.ctrlKey) {
return;
}
hadKeyboardEvent = true;
}
/**
* If at any point a user clicks with a pointing device, ensure that we change
* the modality away from keyboard.
* This avoids the situation where a user presses a key on an already focused
* element, and then clicks on a different element, focusing it with a
* pointing device, while we still think we're in keyboard modality.
*/
function handlePointerDown() {
hadKeyboardEvent = false;
}
function handleVisibilityChange() {
if (this.visibilityState === 'hidden') {
// If the tab becomes active again, the browser will handle calling focus
// on the element (Safari actually calls it twice).
// If this tab change caused a blur on an element with focus-visible,
// re-apply the class when the user switches back to the tab.
if (hadFocusVisibleRecently) {
hadKeyboardEvent = true;
}
}
}
function prepare(doc) {
doc.addEventListener('keydown', handleKeyDown, true);
doc.addEventListener('mousedown', handlePointerDown, true);
doc.addEventListener('pointerdown', handlePointerDown, true);
doc.addEventListener('touchstart', handlePointerDown, true);
doc.addEventListener('visibilitychange', handleVisibilityChange, true);
}
function teardown(doc) {
doc.removeEventListener('keydown', handleKeyDown, true);
doc.removeEventListener('mousedown', handlePointerDown, true);
doc.removeEventListener('pointerdown', handlePointerDown, true);
doc.removeEventListener('touchstart', handlePointerDown, true);
doc.removeEventListener('visibilitychange', handleVisibilityChange, true);
}
function isFocusVisible(event) {
var target = event.target;
try {
return target.matches(':focus-visible');
} catch (error) {} // browsers not implementing :focus-visible will throw a SyntaxError
// we use our own heuristic for those browsers
// rethrow might be better if it's not the expected error but do we really
// want to crash if focus-visible malfunctioned?
// no need for validFocusTarget check. the user does that by attaching it to
// focusable events only
return hadKeyboardEvent || focusTriggersKeyboardModality(target);
}
/**
* Should be called if a blur event is fired on a focus-visible element
*/
function handleBlurVisible() {
// To detect a tab/window switch, we look for a blur event followed
// rapidly by a visibility change.
// If we don't see a visibility change within 100ms, it's probably a
// regular focus change.
hadFocusVisibleRecently = true;
window.clearTimeout(hadFocusVisibleRecentlyTimeout);
hadFocusVisibleRecentlyTimeout = window.setTimeout(function () {
hadFocusVisibleRecently = false;
}, 100);
}
function useIsFocusVisible() {
var ref = React.useCallback(function (instance) {
var node = ReactDOM.findDOMNode(instance);
if (node != null) {
prepare(node.ownerDocument);
}
}, []);
if (process.env.NODE_ENV !== 'production') {
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useDebugValue(isFocusVisible);
}
return {
isFocusVisible: isFocusVisible,
onBlurVisible: handleBlurVisible,
ref: ref
};
}