@mantine/hooks
Advanced tools
Comparing version 1.3.0-alpha.0 to 1.3.0-alpha.1
@@ -1,594 +0,2 @@ | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) : | ||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['@mantine/hooks'] = {}, global.React)); | ||
}(this, (function (exports, react) { 'use strict'; | ||
function randomId() { | ||
return `mantine-${Math.random().toString(36).substr(2, 9)}`; | ||
} | ||
function upperFirst(value) { | ||
return typeof value !== "string" ? "" : value.charAt(0).toUpperCase() + value.slice(1); | ||
} | ||
function useClickOutside(handler, events = ["mousedown", "touchstart"]) { | ||
const ref = react.useRef(); | ||
react.useEffect(() => { | ||
const listener = (event) => { | ||
if (ref.current && !ref.current.contains(event.target)) { | ||
handler(); | ||
} | ||
}; | ||
events.forEach((fn) => document.addEventListener(fn, listener)); | ||
return () => { | ||
events.forEach((fn) => document.removeEventListener(fn, listener)); | ||
}; | ||
}, [ref, handler]); | ||
return ref; | ||
} | ||
function useClipboard({ timeout = 2e3 } = {}) { | ||
const [error, setError] = react.useState(null); | ||
const [copied, setCopied] = react.useState(false); | ||
const [copyTimeout, setCopyTimeout] = react.useState(null); | ||
const handleCopyResult = (value) => { | ||
clearTimeout(copyTimeout); | ||
setCopyTimeout(setTimeout(() => setCopied(false), timeout)); | ||
setCopied(value); | ||
}; | ||
const copy = (valueToCopy) => { | ||
if ("clipboard" in navigator) { | ||
navigator.clipboard.writeText(valueToCopy).then(() => handleCopyResult(true)).catch((err) => setError(err)); | ||
} else { | ||
setError(new Error("useClipboard: navigator.clipboard is not supported")); | ||
} | ||
}; | ||
const reset = () => { | ||
setCopied(false); | ||
setError(null); | ||
clearTimeout(copyTimeout); | ||
}; | ||
return { copy, reset, error, copied }; | ||
} | ||
function attachMediaListener(query, callback) { | ||
try { | ||
query.addEventListener("change", callback); | ||
return () => query.removeEventListener("change", callback); | ||
} catch (e) { | ||
query.addListener(callback); | ||
return () => query.removeListener(callback); | ||
} | ||
} | ||
function getInitialValue(query) { | ||
if (typeof window !== "undefined" && "matchMedia" in window) { | ||
return window.matchMedia(query).matches; | ||
} | ||
return false; | ||
} | ||
function useMediaQuery(query) { | ||
const [matches, setMatches] = react.useState(getInitialValue(query)); | ||
const queryRef = react.useRef(); | ||
react.useEffect(() => { | ||
if ("matchMedia" in window) { | ||
queryRef.current = window.matchMedia(query); | ||
setMatches(queryRef.current.matches); | ||
return attachMediaListener(queryRef.current, (event) => setMatches(event.matches)); | ||
} | ||
}, [query]); | ||
return matches; | ||
} | ||
function useColorScheme() { | ||
return useMediaQuery("(prefers-color-scheme: dark)") ? "dark" : "light"; | ||
} | ||
function useDebouncedValue(value, wait, options = { leading: false }) { | ||
const [_value, setValue] = react.useState(value); | ||
const mountedRef = react.useRef(false); | ||
const timeoutRef = react.useRef(null); | ||
const cooldownRef = react.useRef(false); | ||
const cancel = () => window.clearTimeout(timeoutRef.current); | ||
react.useEffect(() => { | ||
if (mountedRef.current) { | ||
if (!cooldownRef.current && options.leading) { | ||
cooldownRef.current = true; | ||
setValue(value); | ||
} else { | ||
cancel(); | ||
timeoutRef.current = window.setTimeout(() => { | ||
cooldownRef.current = false; | ||
setValue(value); | ||
}, wait); | ||
} | ||
} | ||
}, [value, options.leading]); | ||
react.useEffect(() => { | ||
mountedRef.current = true; | ||
return cancel; | ||
}, []); | ||
return [_value, cancel]; | ||
} | ||
function useDocumentTitle(title) { | ||
react.useLayoutEffect(() => { | ||
if (typeof title === "string" && title.trim().length > 0) { | ||
document.title = title.trim(); | ||
} | ||
}, [title]); | ||
} | ||
const TABBABLE_NODES = /input|select|textarea|button|object/; | ||
const FOCUS_SELECTOR = "a, input, select, textarea, button, object, [tabindex]"; | ||
function hidden(element) { | ||
if (process.env.NODE_ENV === "test") { | ||
return false; | ||
} | ||
return element.offsetWidth <= 0 && element.offsetHeight <= 0 || element.style.display === "none"; | ||
} | ||
function visible(element) { | ||
let parentElement = element; | ||
while (parentElement) { | ||
if (parentElement === document.body) { | ||
break; | ||
} | ||
if (hidden(parentElement)) { | ||
return false; | ||
} | ||
parentElement = parentElement.parentNode; | ||
} | ||
return true; | ||
} | ||
function getElementTabIndex(element) { | ||
let tabIndex = element.getAttribute("tabindex"); | ||
if (tabIndex === null) { | ||
tabIndex = void 0; | ||
} | ||
return parseInt(tabIndex, 10); | ||
} | ||
function focusable(element) { | ||
const nodeName = element.nodeName.toLowerCase(); | ||
const isTabIndexNotNaN = !Number.isNaN(getElementTabIndex(element)); | ||
const res = TABBABLE_NODES.test(nodeName) && !element.disabled || (element instanceof HTMLAnchorElement ? element.href || isTabIndexNotNaN : isTabIndexNotNaN); | ||
return res && visible(element); | ||
} | ||
function tabbable(element) { | ||
const tabIndex = getElementTabIndex(element); | ||
const isTabIndexNaN = Number.isNaN(tabIndex); | ||
return (isTabIndexNaN || tabIndex >= 0) && focusable(element); | ||
} | ||
function findTabbableDescendants(element) { | ||
return Array.from(element.querySelectorAll(FOCUS_SELECTOR)).filter(tabbable); | ||
} | ||
const focusLaterElements = []; | ||
let focusElement = null; | ||
let needToFocus = false; | ||
function handleBlur() { | ||
needToFocus = true; | ||
} | ||
function handleFocus() { | ||
if (needToFocus) { | ||
needToFocus = false; | ||
if (!focusElement) { | ||
return; | ||
} | ||
if (!focusElement) { | ||
return; | ||
} | ||
if (focusElement.contains(document.activeElement)) { | ||
return; | ||
} | ||
const el = findTabbableDescendants(focusElement)[0] || focusElement; | ||
el.focus(); | ||
} | ||
} | ||
function markForFocusLater() { | ||
focusLaterElements.push(document.activeElement); | ||
} | ||
function returnFocus() { | ||
let toFocus = null; | ||
try { | ||
toFocus = focusLaterElements.pop(); | ||
if (toFocus) | ||
toFocus.focus(); | ||
} catch (e) { | ||
console.warn([ | ||
"[@mantine/hooks/use-focus-trap] Focus was returned to", | ||
toFocus, | ||
"but dom node does not exist" | ||
].join(" ")); | ||
} | ||
} | ||
function setupScopedFocus(element) { | ||
focusElement = element; | ||
document.addEventListener("focusout", handleBlur, false); | ||
document.addEventListener("focusin", handleFocus, true); | ||
} | ||
function teardownScopedFocus() { | ||
focusElement = null; | ||
document.removeEventListener("focusout", handleBlur); | ||
document.removeEventListener("focusin", handleFocus); | ||
} | ||
function scopeTab(node, event) { | ||
const tabbable = findTabbableDescendants(node); | ||
if (!tabbable.length) { | ||
event.preventDefault(); | ||
return; | ||
} | ||
const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1]; | ||
const leavingFinalTabbable = finalTabbable === document.activeElement || node === document.activeElement; | ||
if (!leavingFinalTabbable) { | ||
return; | ||
} | ||
event.preventDefault(); | ||
const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0]; | ||
if (target) { | ||
target.focus(); | ||
} | ||
} | ||
function createAriaHider(containerNode, selector = "body > :not(script)") { | ||
const rootNodes = Array.from(document.querySelectorAll(selector)).map((node) => { | ||
if (node.contains(containerNode)) { | ||
return void 0; | ||
} | ||
const ariaHidden = node.getAttribute("aria-hidden"); | ||
if (ariaHidden === null || ariaHidden === "false") { | ||
node.setAttribute("aria-hidden", "true"); | ||
} | ||
return { node, ariaHidden }; | ||
}); | ||
return () => { | ||
rootNodes.forEach((item) => { | ||
if (!item) { | ||
return; | ||
} | ||
if (item.ariaHidden === null) { | ||
item.node.removeAttribute("aria-hidden"); | ||
} else { | ||
item.node.setAttribute("aria-hidden", item.ariaHidden); | ||
} | ||
}); | ||
}; | ||
} | ||
function useFocusTrap(active = true) { | ||
const ref = react.useRef(); | ||
const restoreAria = react.useRef(null); | ||
const setRef = react.useCallback((node) => { | ||
if (restoreAria.current) { | ||
restoreAria.current(); | ||
} | ||
if (ref.current) { | ||
returnFocus(); | ||
teardownScopedFocus(); | ||
} | ||
if (active && node) { | ||
setupScopedFocus(node); | ||
markForFocusLater(); | ||
const processNode = (_node) => { | ||
restoreAria.current = createAriaHider(_node); | ||
let focusElement = node.querySelector("[data-autofocus]"); | ||
if (!focusElement) { | ||
const children = Array.from(node.querySelectorAll(FOCUS_SELECTOR)); | ||
focusElement = children.find(tabbable) || children.find(focusable) || null; | ||
if (!focusElement && focusable(node)) | ||
focusElement = node; | ||
} | ||
if (focusElement) { | ||
focusElement.focus(); | ||
} else if (process.env.NODE_ENV === "development") { | ||
console.warn("[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node", node); | ||
} | ||
}; | ||
setTimeout(() => { | ||
if (node.ownerDocument) { | ||
processNode(node); | ||
} else if (process.env.NODE_ENV === "development") { | ||
console.warn("[@mantine/hooks/use-focus-trap] Ref node is not part of the dom", node); | ||
} | ||
}); | ||
ref.current = node; | ||
} else { | ||
ref.current = null; | ||
} | ||
}, [active]); | ||
react.useEffect(() => { | ||
if (!active) | ||
return void 0; | ||
const handleKeyDown = (event) => { | ||
if (event.key === "Tab" && ref.current) { | ||
scopeTab(ref.current, event); | ||
} | ||
}; | ||
document.addEventListener("keydown", handleKeyDown); | ||
return () => { | ||
document.removeEventListener("keydown", handleKeyDown); | ||
}; | ||
}, [active]); | ||
return setRef; | ||
} | ||
var __defProp$1 = Object.defineProperty; | ||
var __defProps$1 = Object.defineProperties; | ||
var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors; | ||
var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols; | ||
var __hasOwnProp$1 = Object.prototype.hasOwnProperty; | ||
var __propIsEnum$1 = Object.prototype.propertyIsEnumerable; | ||
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
var __spreadValues$1 = (a, b) => { | ||
for (var prop in b || (b = {})) | ||
if (__hasOwnProp$1.call(b, prop)) | ||
__defNormalProp$1(a, prop, b[prop]); | ||
if (__getOwnPropSymbols$1) | ||
for (var prop of __getOwnPropSymbols$1(b)) { | ||
if (__propIsEnum$1.call(b, prop)) | ||
__defNormalProp$1(a, prop, b[prop]); | ||
} | ||
return a; | ||
}; | ||
var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b)); | ||
function useForm({ | ||
initialValues, | ||
validationRules = {} | ||
}) { | ||
const initialErrors = Object.keys(initialValues).reduce((acc, field) => { | ||
acc[field] = false; | ||
return acc; | ||
}, {}); | ||
const [errors, setErrors] = react.useState(initialErrors); | ||
const [values, setValues] = react.useState(initialValues); | ||
const resetErrors = () => setErrors(initialErrors); | ||
const reset = () => { | ||
setValues(initialValues); | ||
resetErrors(); | ||
}; | ||
const validate = () => { | ||
let isValid = true; | ||
const validationErrors = Object.keys(values).reduce((acc, field) => { | ||
if (validationRules && typeof validationRules[field] === "function" && !validationRules[field](values[field])) { | ||
acc[field] = true; | ||
isValid = false; | ||
} else { | ||
acc[field] = false; | ||
} | ||
return acc; | ||
}, {}); | ||
setErrors(validationErrors); | ||
return isValid; | ||
}; | ||
const validateField = (field) => setErrors((currentErrors) => __spreadProps$1(__spreadValues$1({}, currentErrors), { | ||
[field]: typeof validationRules[field] === "function" ? !validationRules[field](values[field]) : false | ||
})); | ||
const setFieldError = (field, error) => setErrors((currentErrors) => __spreadProps$1(__spreadValues$1({}, currentErrors), { [field]: error })); | ||
const setFieldValue = (field, value) => { | ||
setValues((currentValues) => __spreadProps$1(__spreadValues$1({}, currentValues), { [field]: value })); | ||
setFieldError(field, false); | ||
}; | ||
const onSubmit = (handleSubmit) => (event) => { | ||
event && event.preventDefault(); | ||
validate() && handleSubmit(values); | ||
}; | ||
return { | ||
values, | ||
errors, | ||
validate, | ||
reset, | ||
setErrors, | ||
setValues, | ||
setFieldValue, | ||
setFieldError, | ||
validateField, | ||
resetErrors, | ||
onSubmit | ||
}; | ||
} | ||
function useId(id, generateId = randomId) { | ||
const generatedId = react.useRef(generateId()); | ||
return id || generatedId.current; | ||
} | ||
const useIsomorphicEffect = typeof document !== "undefined" ? react.useLayoutEffect : react.useEffect; | ||
var __defProp = Object.defineProperty; | ||
var __defProps = Object.defineProperties; | ||
var __getOwnPropDescs = Object.getOwnPropertyDescriptors; | ||
var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
var __spreadValues = (a, b) => { | ||
for (var prop in b || (b = {})) | ||
if (__hasOwnProp.call(b, prop)) | ||
__defNormalProp(a, prop, b[prop]); | ||
if (__getOwnPropSymbols) | ||
for (var prop of __getOwnPropSymbols(b)) { | ||
if (__propIsEnum.call(b, prop)) | ||
__defNormalProp(a, prop, b[prop]); | ||
} | ||
return a; | ||
}; | ||
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); | ||
function useListState(initialValue = []) { | ||
const [state, setState] = react.useState(initialValue); | ||
const append = (...items) => setState((current) => [...current, ...items]); | ||
const prepend = (...items) => setState((current) => [...items, ...current]); | ||
const insert = (index, ...items) => setState((current) => [...current.slice(0, index), ...items, ...current.slice(index)]); | ||
const apply = (fn) => setState((current) => current.map((item, index) => fn(item, index))); | ||
const remove = (...indices) => setState((current) => current.filter((_, index) => !indices.includes(index))); | ||
const reorder = ({ from, to }) => setState((current) => { | ||
const cloned = [...current]; | ||
const item = current[from]; | ||
cloned.splice(from, 1); | ||
cloned.splice(to, 0, item); | ||
return cloned; | ||
}); | ||
const setItem = (index, item) => setState((current) => { | ||
const cloned = [...current]; | ||
cloned[index] = item; | ||
return cloned; | ||
}); | ||
const setItemProp = (index, prop, value) => setState((current) => { | ||
const cloned = [...current]; | ||
cloned[index] = __spreadProps(__spreadValues({}, cloned[index]), { [prop]: value }); | ||
return cloned; | ||
}); | ||
return [ | ||
state, | ||
{ | ||
setState, | ||
append, | ||
prepend, | ||
insert, | ||
apply, | ||
remove, | ||
reorder, | ||
setItem, | ||
setItemProp | ||
} | ||
]; | ||
} | ||
function useWindowEvent(type, listener, options) { | ||
react.useEffect(() => { | ||
window.addEventListener(type, listener, options); | ||
return () => window.removeEventListener(type, listener, options); | ||
}, []); | ||
} | ||
function useLocalStorageValue({ | ||
key, | ||
defaultValue = void 0 | ||
}) { | ||
const [value, setValue] = react.useState(typeof window !== "undefined" && "localStorage" in window ? window.localStorage.getItem(key) : defaultValue != null ? defaultValue : ""); | ||
const setLocalStorageValue = react.useCallback((val) => { | ||
if (typeof val === "function") { | ||
setValue((current) => { | ||
const result = val(current); | ||
window.localStorage.setItem(key, result); | ||
return result; | ||
}); | ||
} else { | ||
window.localStorage.setItem(key, val); | ||
setValue(val); | ||
} | ||
}, [key]); | ||
useWindowEvent("storage", (event) => { | ||
if (event.storageArea === window.localStorage && event.key === key) { | ||
setValue(event.newValue); | ||
} | ||
}); | ||
react.useEffect(() => { | ||
if (defaultValue && !value) { | ||
setLocalStorageValue(defaultValue); | ||
} | ||
}, [defaultValue, value, setLocalStorageValue]); | ||
return [value, setLocalStorageValue]; | ||
} | ||
function useMergedRef(...refs) { | ||
return (node) => { | ||
refs.forEach((ref) => { | ||
if (typeof ref === "function") { | ||
ref(node); | ||
} else if (ref != null) { | ||
ref.current = node; | ||
} | ||
}); | ||
}; | ||
} | ||
function useQueue({ initialValues = [], limit }) { | ||
const [{ state, queue }, setState] = react.useState({ | ||
state: initialValues.slice(0, limit), | ||
queue: initialValues.slice(limit) | ||
}); | ||
const add = (...items) => setState((current) => { | ||
const results = [...current.state, ...current.queue, ...items]; | ||
return { | ||
state: results.slice(0, limit), | ||
queue: results.slice(limit) | ||
}; | ||
}); | ||
const update = (fn) => setState((current) => { | ||
const results = fn([...current.state, ...current.queue]); | ||
return { | ||
state: results.slice(0, limit), | ||
queue: results.slice(limit) | ||
}; | ||
}); | ||
const cleanQueue = () => setState((current) => ({ state: current.state, queue: [] })); | ||
return { | ||
state, | ||
queue, | ||
add, | ||
update, | ||
cleanQueue | ||
}; | ||
} | ||
function useReducedMotion() { | ||
return useMediaQuery("(prefers-reduced-motion: reduce)"); | ||
} | ||
const preventDefault = (event) => { | ||
event.preventDefault(); | ||
}; | ||
function useScrollLock(lock, options = { disableTouchEvents: false }) { | ||
const locked = react.useRef(false); | ||
const bodyOverflow = react.useRef(null); | ||
const unlockScroll = () => { | ||
if (locked.current) { | ||
locked.current = false; | ||
document.body.style.overflow = bodyOverflow.current || ""; | ||
if (options.disableTouchEvents) { | ||
document.body.removeEventListener("touchmove", preventDefault); | ||
} | ||
} | ||
}; | ||
const lockScroll = () => { | ||
locked.current = true; | ||
bodyOverflow.current = document.body.style.overflow; | ||
document.body.style.overflow = "hidden"; | ||
if (options.disableTouchEvents) { | ||
document.body.addEventListener("touchmove", preventDefault, { passive: false }); | ||
} | ||
}; | ||
react.useEffect(() => { | ||
if (lock) { | ||
lockScroll(); | ||
} else { | ||
unlockScroll(); | ||
} | ||
return unlockScroll; | ||
}, [lock]); | ||
} | ||
exports.randomId = randomId; | ||
exports.upperFirst = upperFirst; | ||
exports.useClickOutside = useClickOutside; | ||
exports.useClipboard = useClipboard; | ||
exports.useColorScheme = useColorScheme; | ||
exports.useDebouncedValue = useDebouncedValue; | ||
exports.useDocumentTitle = useDocumentTitle; | ||
exports.useFocusTrap = useFocusTrap; | ||
exports.useForm = useForm; | ||
exports.useId = useId; | ||
exports.useIsomorphicEffect = useIsomorphicEffect; | ||
exports.useListState = useListState; | ||
exports.useLocalStorageValue = useLocalStorageValue; | ||
exports.useMediaQuery = useMediaQuery; | ||
exports.useMergedRef = useMergedRef; | ||
exports.useQueue = useQueue; | ||
exports.useReducedMotion = useReducedMotion; | ||
exports.useScrollLock = useScrollLock; | ||
exports.useWindowEvent = useWindowEvent; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
}))); | ||
(function(i,o){typeof exports=="object"&&typeof module!="undefined"?o(exports,require("react")):typeof define=="function"&&define.amd?define(["exports","react"],o):(i=typeof globalThis!="undefined"?globalThis:i||self,o(i["@mantine/hooks"]={},i.React))})(this,function(i,o){"use strict";function L(){return`mantine-${Math.random().toString(36).substr(2,9)}`}function q(e){return typeof e!="string"?"":e.charAt(0).toUpperCase()+e.slice(1)}function H(e,t=["mousedown","touchstart"]){const n=o.useRef();return o.useEffect(()=>{const s=r=>{n.current&&!n.current.contains(r.target)&&e()};return t.forEach(r=>document.addEventListener(r,s)),()=>{t.forEach(r=>document.removeEventListener(r,s))}},[n,e]),n}function Q({timeout:e=2e3}={}){const[t,n]=o.useState(null),[s,r]=o.useState(!1),[u,m]=o.useState(null),f=h=>{clearTimeout(u),m(setTimeout(()=>r(!1),e)),r(h)};return{copy:h=>{"clipboard"in navigator?navigator.clipboard.writeText(h).then(()=>f(!0)).catch(a=>n(a)):n(new Error("useClipboard: navigator.clipboard is not supported"))},reset:()=>{r(!1),n(null),clearTimeout(u)},error:t,copied:s}}function B(e,t){try{return e.addEventListener("change",t),()=>e.removeEventListener("change",t)}catch(n){return e.addListener(t),()=>e.removeListener(t)}}function K(e){return typeof window!="undefined"&&"matchMedia"in window?window.matchMedia(e).matches:!1}function g(e){const[t,n]=o.useState(K(e)),s=o.useRef();return o.useEffect(()=>{if("matchMedia"in window)return s.current=window.matchMedia(e),n(s.current.matches),B(s.current,r=>n(r.matches))},[e]),t}function W(){return g("(prefers-color-scheme: dark)")?"dark":"light"}function U(e,t,n={leading:!1}){const[s,r]=o.useState(e),u=o.useRef(!1),m=o.useRef(null),f=o.useRef(!1),d=()=>window.clearTimeout(m.current);return o.useEffect(()=>{u.current&&(!f.current&&n.leading?(f.current=!0,r(e)):(d(),m.current=window.setTimeout(()=>{f.current=!1,r(e)},t)))},[e,n.leading]),o.useEffect(()=>(u.current=!0,d),[]),[s,d]}function z(e){o.useLayoutEffect(()=>{typeof e=="string"&&e.trim().length>0&&(document.title=e.trim())},[e])}const G=/input|select|textarea|button|object/,N="a, input, select, textarea, button, object, [tabindex]";function J(e){return process.env.NODE_ENV==="test"?!1:e.offsetWidth<=0&&e.offsetHeight<=0||e.style.display==="none"}function X(e){let t=e;for(;t&&t!==document.body;){if(J(t))return!1;t=t.parentNode}return!0}function P(e){let t=e.getAttribute("tabindex");return t===null&&(t=void 0),parseInt(t,10)}function _(e){const t=e.nodeName.toLowerCase(),n=!Number.isNaN(P(e));return(G.test(t)&&!e.disabled||e instanceof HTMLAnchorElement&&e.href||n)&&X(e)}function I(e){const t=P(e);return(Number.isNaN(t)||t>=0)&&_(e)}function F(e){return Array.from(e.querySelectorAll(N)).filter(I)}const D=[];let E=null,S=!1;function R(){S=!0}function A(){if(S){if(S=!1,!E||!E||E.contains(document.activeElement))return;(F(E)[0]||E).focus()}}function Y(){D.push(document.activeElement)}function Z(){let e=null;try{e=D.pop(),e&&e.focus()}catch(t){console.warn(["[@mantine/hooks/use-focus-trap] Focus was returned to",e,"but dom node does not exist"].join(" "))}}function x(e){E=e,document.addEventListener("focusout",R,!1),document.addEventListener("focusin",A,!0)}function ee(){E=null,document.removeEventListener("focusout",R),document.removeEventListener("focusin",A)}function te(e,t){const n=F(e);if(!n.length){t.preventDefault();return}if(!(n[t.shiftKey?0:n.length-1]===document.activeElement||e===document.activeElement))return;t.preventDefault();const u=n[t.shiftKey?n.length-1:0];u&&u.focus()}function ne(e,t="body > :not(script)"){const n=Array.from(document.querySelectorAll(t)).map(s=>{if(s.contains(e))return;const r=s.getAttribute("aria-hidden");return(r===null||r==="false")&&s.setAttribute("aria-hidden","true"),{node:s,ariaHidden:r}});return()=>{n.forEach(s=>{!s||(s.ariaHidden===null?s.node.removeAttribute("aria-hidden"):s.node.setAttribute("aria-hidden",s.ariaHidden))})}}function re(e=!0){const t=o.useRef(),n=o.useRef(null),s=o.useCallback(r=>{if(n.current&&n.current(),t.current&&(Z(),ee()),e&&r){x(r),Y();const u=m=>{n.current=ne(m);let f=r.querySelector("[data-autofocus]");if(!f){const d=Array.from(r.querySelectorAll(N));f=d.find(I)||d.find(_)||null,!f&&_(r)&&(f=r)}f?f.focus():process.env.NODE_ENV==="development"&&console.warn("[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node",r)};setTimeout(()=>{r.ownerDocument?u(r):process.env.NODE_ENV==="development"&&console.warn("[@mantine/hooks/use-focus-trap] Ref node is not part of the dom",r)}),t.current=r}else t.current=null},[e]);return o.useEffect(()=>{if(!e)return;const r=u=>{u.key==="Tab"&&t.current&&te(t.current,u)};return document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r)}},[e]),s}var oe=Object.defineProperty,se=Object.defineProperties,ue=Object.getOwnPropertyDescriptors,C=Object.getOwnPropertySymbols,ce=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable,j=(e,t,n)=>t in e?oe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,O=(e,t)=>{for(var n in t||(t={}))ce.call(t,n)&&j(e,n,t[n]);if(C)for(var n of C(t))ie.call(t,n)&&j(e,n,t[n]);return e},T=(e,t)=>se(e,ue(t));function ae({initialValues:e,validationRules:t={}}){const n=Object.keys(e).reduce((c,l)=>(c[l]=!1,c),{}),[s,r]=o.useState(n),[u,m]=o.useState(e),f=()=>r(n),d=()=>{m(e),f()},w=()=>{let c=!0;const l=Object.keys(u).reduce((v,y)=>(t&&typeof t[y]=="function"&&!t[y](u[y])?(v[y]=!0,c=!1):v[y]=!1,v),{});return r(l),c},h=c=>r(l=>T(O({},l),{[c]:typeof t[c]=="function"?!t[c](u[c]):!1})),a=(c,l)=>r(v=>T(O({},v),{[c]:l}));return{values:u,errors:s,validate:w,reset:d,setErrors:r,setValues:m,setFieldValue:(c,l)=>{m(v=>T(O({},v),{[c]:l})),a(c,!1)},setFieldError:a,validateField:h,resetErrors:f,onSubmit:c=>l=>{l&&l.preventDefault(),w()&&c(u)}}}function fe(e,t=L){const n=o.useRef(t());return e||n.current}const le=typeof document!="undefined"?o.useLayoutEffect:o.useEffect;var de=Object.defineProperty,pe=Object.defineProperties,me=Object.getOwnPropertyDescriptors,M=Object.getOwnPropertySymbols,be=Object.prototype.hasOwnProperty,he=Object.prototype.propertyIsEnumerable,k=(e,t,n)=>t in e?de(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,we=(e,t)=>{for(var n in t||(t={}))be.call(t,n)&&k(e,n,t[n]);if(M)for(var n of M(t))he.call(t,n)&&k(e,n,t[n]);return e},Ee=(e,t)=>pe(e,me(t));function ve(e=[]){const[t,n]=o.useState(e);return[t,{setState:n,append:(...a)=>n(p=>[...p,...a]),prepend:(...a)=>n(p=>[...a,...p]),insert:(a,...p)=>n(b=>[...b.slice(0,a),...p,...b.slice(a)]),apply:a=>n(p=>p.map((b,c)=>a(b,c))),remove:(...a)=>n(p=>p.filter((b,c)=>!a.includes(c))),reorder:({from:a,to:p})=>n(b=>{const c=[...b],l=b[a];return c.splice(a,1),c.splice(p,0,l),c}),setItem:(a,p)=>n(b=>{const c=[...b];return c[a]=p,c}),setItemProp:(a,p,b)=>n(c=>{const l=[...c];return l[a]=Ee(we({},l[a]),{[p]:b}),l})}]}function V(e,t,n){o.useEffect(()=>(window.addEventListener(e,t,n),()=>window.removeEventListener(e,t,n)),[])}function ye({key:e,defaultValue:t=void 0}){const[n,s]=o.useState(typeof window!="undefined"&&"localStorage"in window?window.localStorage.getItem(e):t!=null?t:""),r=o.useCallback(u=>{typeof u=="function"?s(m=>{const f=u(m);return window.localStorage.setItem(e,f),f}):(window.localStorage.setItem(e,u),s(u))},[e]);return V("storage",u=>{u.storageArea===window.localStorage&&u.key===e&&s(u.newValue)}),o.useEffect(()=>{t&&!n&&r(t)},[t,n,r]),[n,r]}function ge(...e){return t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})}}function _e({initialValues:e=[],limit:t}){const[{state:n,queue:s},r]=o.useState({state:e.slice(0,t),queue:e.slice(t)});return{state:n,queue:s,add:(...d)=>r(w=>{const h=[...w.state,...w.queue,...d];return{state:h.slice(0,t),queue:h.slice(t)}}),update:d=>r(w=>{const h=d([...w.state,...w.queue]);return{state:h.slice(0,t),queue:h.slice(t)}}),cleanQueue:()=>r(d=>({state:d.state,queue:[]}))}}function Se(){return g("(prefers-reduced-motion: reduce)")}const $=e=>{e.preventDefault()};function Oe(e,t={disableTouchEvents:!1}){const n=o.useRef(!1),s=o.useRef(null),r=()=>{n.current&&(n.current=!1,document.body.style.overflow=s.current||"",t.disableTouchEvents&&document.body.removeEventListener("touchmove",$))},u=()=>{n.current=!0,s.current=document.body.style.overflow,document.body.style.overflow="hidden",t.disableTouchEvents&&document.body.addEventListener("touchmove",$,{passive:!1})};o.useEffect(()=>(e?u():r(),r),[e])}i.randomId=L,i.upperFirst=q,i.useClickOutside=H,i.useClipboard=Q,i.useColorScheme=W,i.useDebouncedValue=U,i.useDocumentTitle=z,i.useFocusTrap=re,i.useForm=ae,i.useId=fe,i.useIsomorphicEffect=le,i.useListState=ve,i.useLocalStorageValue=ye,i.useMediaQuery=g,i.useMergedRef=ge,i.useQueue=_e,i.useReducedMotion=Se,i.useScrollLock=Oe,i.useWindowEvent=V,Object.defineProperty(i,"__esModule",{value:!0})}); | ||
//# sourceMappingURL=index.umd.js.map |
@@ -13,6 +13,6 @@ import React from 'react'; | ||
values: T; | ||
errors: { [P in keyof T]: boolean; }; | ||
errors: Record<keyof T, boolean>; | ||
validate: () => boolean; | ||
reset: () => void; | ||
setErrors: React.Dispatch<React.SetStateAction<{ [P in keyof T]: boolean; }>>; | ||
setErrors: React.Dispatch<React.SetStateAction<Record<keyof T, boolean>>>; | ||
setValues: React.Dispatch<React.SetStateAction<T>>; | ||
@@ -19,0 +19,0 @@ setFieldValue: <K extends keyof T, U extends T[K]>(field: K, value: U) => void; |
{ | ||
"name": "@mantine/hooks", | ||
"version": "1.3.0-alpha.0", | ||
"version": "1.3.0-alpha.1", | ||
"main": "cjs/index.js", | ||
@@ -5,0 +5,0 @@ "module": "esm/index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
0
209715
1481
3