@postenbring/hedwig-react
Version:
React components for [Hedwig Design System](https://github.com/bring/hedwig-design-system).
86 lines (85 loc) • 2.36 kB
JavaScript
// src/utils/utils.ts
import * as React from "react";
import { useCallback, useEffect, useState } from "react";
function useMergeRefs(refs) {
return React.useMemo(() => {
if (refs.every((ref) => ref === null)) {
return null;
}
return (value) => {
refs.forEach((ref) => {
if (typeof ref === "function") {
ref(value);
} else if (ref !== null) {
ref.current = value;
}
});
};
}, refs);
}
function useResize(ref) {
const [width, setWidth] = useState(0);
const [height, setHeight] = useState(0);
const handleResize = useCallback(() => {
var _a, _b, _c, _d;
if ((ref == null ? void 0 : ref.current) !== null) {
setWidth((_b = (_a = ref == null ? void 0 : ref.current) == null ? void 0 : _a.offsetWidth) != null ? _b : 0);
setHeight((_d = (_c = ref == null ? void 0 : ref.current) == null ? void 0 : _c.offsetHeight) != null ? _d : 0);
}
}, [ref]);
useEffect(() => {
window.addEventListener("load", handleResize);
window.addEventListener("resize", handleResize);
return () => {
window.removeEventListener("load", handleResize);
window.removeEventListener("resize", handleResize);
};
}, [ref, handleResize]);
useEffect(() => {
handleResize();
}, []);
return { width, height };
}
function subscribe() {
return () => {
};
}
function useHydrated() {
return React.useSyncExternalStore(
subscribe,
() => true,
() => false
);
}
function focusTrap(element) {
var _a, _b;
if (element === document.body) return () => {
};
let inertElements = [];
for (let el = element; el; el = el.parentElement) {
if (el === document.body) break;
for (const sibling of (_b = (_a = el.parentElement) == null ? void 0 : _a.children) != null ? _b : []) {
if (sibling === el) continue;
if (!(sibling instanceof HTMLElement)) continue;
if (sibling.hasAttribute("inert")) continue;
sibling.setAttribute("inert", "true");
inertElements.push(sibling);
}
}
return () => {
releaseFocusTrap(inertElements);
inertElements = [];
};
}
function releaseFocusTrap(inertElements) {
for (const el of inertElements) {
el.removeAttribute("inert");
}
}
export {
useMergeRefs,
useResize,
useHydrated,
focusTrap
};
//# sourceMappingURL=chunk-ILFK3VKS.mjs.map