@primereact/hooks 11.0.0-alpha.9 → 11.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE.md +45 -0
  2. package/README.md +34 -0
  3. package/index.d.ts +7 -0
  4. package/index.mjs +1 -1
  5. package/index.mjs.map +1 -1
  6. package/package.json +8 -12
  7. package/use-controlled-state/index.mjs +1 -1
  8. package/use-controlled-state/index.mjs.map +1 -1
  9. package/use-filter/_matchers.d.ts +23 -0
  10. package/use-filter/index.d.ts +94 -0
  11. package/use-filter/index.mjs +2 -0
  12. package/use-filter/index.mjs.map +1 -0
  13. package/use-is-mobile/index.d.ts +18 -0
  14. package/use-is-mobile/index.mjs +2 -0
  15. package/use-is-mobile/index.mjs.map +1 -0
  16. package/use-local-storage/index.d.ts +56 -0
  17. package/use-local-storage/index.mjs +2 -0
  18. package/use-local-storage/index.mjs.map +1 -0
  19. package/use-mask/index.d.ts +96 -67
  20. package/use-mask/index.mjs +1 -1
  21. package/use-mask/index.mjs.map +1 -1
  22. package/use-mounted/index.d.ts +36 -0
  23. package/use-mounted/index.mjs +2 -0
  24. package/use-mounted/index.mjs.map +1 -0
  25. package/use-number-formatter/index.d.ts +194 -0
  26. package/use-number-formatter/index.mjs +2 -0
  27. package/use-number-formatter/index.mjs.map +1 -0
  28. package/use-number-formatter/index.test.d.ts +0 -0
  29. package/use-presence/index.d.ts +1 -2
  30. package/use-presence/index.mjs +1 -1
  31. package/use-presence/index.mjs.map +1 -1
  32. package/use-props/index.d.ts +16 -11
  33. package/use-props/index.mjs +1 -1
  34. package/use-props/index.mjs.map +1 -1
  35. package/use-sortable-list/index.d.ts +43 -0
  36. package/use-sortable-list/index.mjs +2 -0
  37. package/use-sortable-list/index.mjs.map +1 -0
  38. package/use-tree-filter/index.d.ts +52 -0
  39. package/use-tree-filter/index.mjs +2 -0
  40. package/use-tree-filter/index.mjs.map +1 -0
  41. package/LICENSE +0 -21
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/use-attr-selector/index.ts","../src/use-controlled-state/index.ts","../src/use-event-listener/index.ts","../src/use-previous/index.ts","../src/use-hot-key/index.ts","../src/use-id/index.ts","../src/use-key-filter/index.ts","../src/use-mask/index.ts","../src/use-match-media/index.ts","../src/use-mount-effect/index.ts","../src/use-presence/index.ts","../src/use-props/index.ts","../src/use-queue-task/index.ts","../src/use-scrolltop/index.ts","../src/use-unmount-effect/index.ts","../src/use-update-effect/index.ts","../src/use-view-transition/index.ts","../src/use-visibility-change/index.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Generates a unique attribute selector based on the provided prefix.\n *\n * @param prefix - The prefix to prepend to the generated selector.\n * @returns A unique string combining the prefix and the selector.\n *\n * @example\n * ```ts\n * const selector = useAttrSelector('foo');\n * console.log(selector); // e.g., 'foo0'\n * ```\n */\nexport function useAttrSelector(prefix: string = ''): string {\n const id = React.useId();\n\n return React.useMemo(() => `${prefix}${id.replaceAll(/:|«|»/g, '')}`.trim().toLowerCase(), [id, prefix]);\n}\n","import { resolve } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * The options for the `useControlledState` hook.\n */\nexport interface UseControlledStateOptions<T = unknown, E = unknown> {\n /**\n * The value of the controlled state.\n */\n value?: T | undefined;\n /**\n * The default value of the uncontrolled state.\n */\n defaultValue?: T | undefined;\n /**\n * Callback function that is called when the value changes.\n */\n onChange?: (newValue: E) => void;\n}\n\n/**\n * The return type of the `useControlledState` hook.\n * A tuple containing the current value and a function to update it.\n */\nexport type UseControlledStateReturnType<T = unknown> = [T | undefined, (inValue: unknown | ((prev?: T) => unknown)) => void, boolean];\n\n/**\n * A custom hook that manages controlled and uncontrolled state.\n *\n * @param {UseControlledStateOptions} options - The options for the controlled state.\n * @returns A tuple containing the current value and a function to update it.\n *\n * @example\n * ```tsx\n * const ControlledComponent = () => {\n * const [controlledValue, setControlledValue] = React.useState('');\n *\n * const [value, setValue] = useControlledState({\n * value: controlledValue,\n * defaultValue: 'initial value',\n * onChange: (newValue) => {\n * setControlledValue(newValue);\n * }\n * });\n *\n * return <Component value={value} onChange={(e) => setValue(e.target.value)} />;\n * };\n * ```\n */\nexport function useControlledState<T = unknown, E = T>({ value, defaultValue, onChange }: UseControlledStateOptions<T, E>): UseControlledStateReturnType<T | undefined> {\n const [valueState, setValueState] = React.useState<T | undefined>(defaultValue ?? value);\n\n const isControlled = value !== undefined;\n const computedValue = isControlled ? (value as T) : valueState;\n\n const setValue = React.useCallback(\n (inValue: unknown | ((prev?: T) => unknown)) => {\n // @todo - update resolve to accept multiple parameters\n const [newValue, onChangeParam] = resolve(inValue, computedValue, isControlled) as [T, E];\n\n onChange?.(onChangeParam);\n\n if (!isControlled) {\n setValueState(newValue);\n }\n },\n [computedValue, isControlled, onChange]\n );\n\n React.useEffect(() => {\n if (!isControlled) {\n setValueState(defaultValue);\n }\n }, [defaultValue, isControlled]);\n\n return [computedValue, setValue, isControlled];\n}\n","import { getTargetElement, isNotEmpty } from '@primeuix/utils';\nimport * as React from 'react';\nimport { usePrevious } from '../use-previous';\n\n/**\n * The options for the `useEventListener` hook.\n */\nexport interface UseEventListenerOptions<T = keyof HTMLElementEventMap> {\n /**\n * The target element to bind the event listener to.\n * @default 'document'\n */\n target?: 'document' | 'window' | 'body' | HTMLElement | (() => HTMLElement) | React.Ref<HTMLElement> | string | null;\n /**\n * The event type to listen for.\n */\n type: T | string;\n /**\n * The event listener callback.\n */\n listener: EventListener;\n /**\n * The event listener options\n */\n options?: AddEventListenerOptions | boolean;\n /**\n * A boolean indicating whether the event listener should be active.\n */\n when?: boolean;\n}\n\n/**\n * The return type of the `useEventListener` hook.\n * A tuple containing functions;\n * 1. `bind` function is used to bind the event listener.\n * 2. `unbind` function is used to unbind the event listener.\n */\nexport type UseEventListenerReturnType = [(options?: Partial<Omit<UseEventListenerOptions, 'target'>> & { target?: UseEventListenerOptions['target'] | Document | null }) => void, () => void];\n\n/**\n * Listens for the specified event type on the target element.\n *\n * @param {UseEventListenerOptions} options - The options for the event listener.\n * @returns A tuple containing functions;\n * 1. `bind` function is used to bind the event listener.\n * 2. `unbind` function is used to unbind the event listener.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const [bind, unbind] = useEventListener({\n * target: 'document',\n * type: 'click',\n * listener: (event) => {\n * console.log(event);\n * },\n * when: true\n * });\n *\n * return <div>Click me</div>;\n * };\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const [bind, unbind] = useEventListener({\n * target: () => document.querySelector('.element'),\n * type: 'mouseover',\n * listener: (event) => {\n * console.log(event);\n * }\n * });\n *\n * return <div>MouseOver to `.element`</div>;\n * };\n * ```\n */\nexport function useEventListener({ target = 'document', type, listener, options, when = true }: UseEventListenerOptions): UseEventListenerReturnType {\n const targetRef = React.useRef<HTMLElement | null>(null);\n const listenerRef = React.useRef<EventListener | null>(null);\n let prevListener = usePrevious(listener);\n let prevOptions = usePrevious(options);\n\n const bind = (bindOptions: Partial<Omit<UseEventListenerOptions, 'target'>> & { target?: UseEventListenerOptions['target'] | Document | null } = {}) => {\n const { target: bindTarget } = bindOptions;\n\n if (isNotEmpty(bindTarget)) {\n unbind();\n\n if (bindOptions.when || when) {\n targetRef.current = getTargetElement(bindTarget) as HTMLElement;\n }\n }\n\n if (!listenerRef.current && targetRef.current) {\n listenerRef.current = (event: Event) => listener && listener(event);\n targetRef.current.addEventListener(type, listenerRef.current, options);\n }\n };\n\n const unbind = () => {\n if (listenerRef.current) {\n targetRef.current?.removeEventListener(type, listenerRef.current, options);\n listenerRef.current = null;\n }\n };\n\n const dispose = () => {\n unbind();\n // Prevent memory leak by releasing\n prevListener = null;\n prevOptions = null;\n };\n\n const updateTarget = React.useCallback(() => {\n if (when) {\n targetRef.current = getTargetElement(target) as HTMLElement;\n } else {\n unbind();\n targetRef.current = null;\n }\n }, [target, when]);\n\n React.useEffect(() => {\n return () => {\n dispose();\n };\n }, []);\n\n React.useEffect(() => {\n updateTarget();\n }, [updateTarget]);\n\n React.useEffect(() => {\n const listenerChanged = `${prevListener}` !== `${listener}`;\n const optionsChanged = prevOptions !== options;\n const listenerExists = listenerRef.current;\n\n if (listenerExists && (listenerChanged || optionsChanged)) {\n unbind();\n\n if (when) {\n bind();\n }\n } else if (!listenerExists) {\n dispose();\n }\n }, [listener, options, when]);\n\n return [bind, unbind];\n}\n","import * as React from 'react';\n\n/**\n * Returns the previous value of the provided value.\n *\n * @param value - The value to track.\n * @returns The previous value of the provided value.\n *\n * @example\n * ```tsx\n * const [count, setCount] = React.useState(5);\n * const prevCount = usePrevious(count);\n *\n * console.log(prevCount); // undefined\n *\n * setCount(10);\n *\n * console.log(prevCount); // 5\n * ```\n */\nexport function usePrevious<T>(value: T): T | null | undefined {\n const ref = React.useRef<T | null>(null);\n\n React.useEffect(() => {\n ref.current = value;\n\n return () => {\n ref.current = null;\n };\n }, [value]);\n\n return ref.current;\n}\n","import * as React from 'react';\n\nexport type UseHotKeyTarget = Document | HTMLElement | null | undefined;\n\nexport interface UseHotKeyOptions {\n /**\n * Target to listen on. Defaults to `document` when available.\n */\n target?: UseHotKeyTarget;\n /**\n * Keyboard event type.\n * @default 'keydown'\n */\n event?: 'keydown' | 'keyup' | 'keypress';\n /**\n * Enables or disables the listener.\n * @default true\n */\n when?: boolean;\n}\n\n/**\n * Runs the provided handler when any of the given keys is pressed.\n *\n * @param keys A single key or an array of keys to listen for (e.g. 'k' or 'ctrl+k').\n * @param handler Callback fired when a matching key event occurs.\n * @param options Optional configuration for target, event type, and enable flag.\n */\nexport function useHotKey(keys: string | string[], handler: (event: KeyboardEvent) => void, options: UseHotKeyOptions = {}) {\n const { target, event = 'keydown', when = true } = options;\n const handlerRef = React.useRef(handler);\n\n const normalizeKey = (key: string) => {\n const lower = key.toLowerCase();\n\n if (lower === 'space' || lower === 'spacebar') return ' ';\n\n return lower;\n };\n\n const parseKeySpec = (spec: string) => {\n const parts = spec\n .split('+')\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean);\n\n let key: string | undefined;\n const required = {\n ctrl: false,\n meta: false,\n alt: false,\n shift: false\n };\n\n parts.forEach((part) => {\n switch (part) {\n case 'ctrl':\n case 'control':\n required.ctrl = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n required.meta = true;\n break;\n case 'alt':\n case 'option':\n required.alt = true;\n break;\n case 'shift':\n required.shift = true;\n break;\n default:\n key = normalizeKey(part);\n }\n });\n\n return { key, required };\n };\n\n const matches = (spec: ReturnType<typeof parseKeySpec>, event: KeyboardEvent) => {\n if (!spec.key) return false;\n\n const { required } = spec;\n\n if (required.ctrl !== event.ctrlKey || required.meta !== event.metaKey || required.alt !== event.altKey || required.shift !== event.shiftKey) {\n return false;\n }\n\n return normalizeKey(event.key) === spec.key;\n };\n\n React.useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n if (!when) {\n return;\n }\n\n const targetElement: UseHotKeyTarget = target ?? (typeof document !== 'undefined' ? document : null);\n\n if (!targetElement) {\n return;\n }\n\n const keySpecs = (Array.isArray(keys) ? keys : [keys]).map(parseKeySpec);\n\n const listener: EventListener = (event) => {\n const keyboardEvent = event as KeyboardEvent;\n\n if (keySpecs.some((spec) => matches(spec, keyboardEvent))) {\n handlerRef.current?.(keyboardEvent);\n }\n };\n\n targetElement.addEventListener(event, listener);\n\n return () => {\n targetElement.removeEventListener(event, listener);\n };\n }, [event, keys, target, when]);\n}\n","import * as React from 'react';\n\n/**\n * Generates a unique identifier.\n *\n * @param initialValue Optional initial value for the ID.\n * @returns The generated or provided ID.\n *\n * @example\n * ```tsx\n * const id = useId('foo');\n * console.log(id); // 'foo'\n * ```\n *\n * @example\n * ```tsx\n * const defaultId = useId();\n * console.log(defaultId); // e.g., 'pr_id_0'\n * ```\n */\nexport function useId(initialValue?: string): string {\n const idx = React.useId();\n const [idState, setIdState] = React.useState<string>(initialValue || `pr_id_${idx.replaceAll(/:|«|»/g, '')}`);\n\n React.useEffect(() => {\n setIdState(initialValue || `pr_id_${idx.replaceAll(/:|«|»/g, '')}`);\n }, [initialValue, idx]);\n\n return idState;\n}\n","import { isAndroid } from '@primeuix/utils';\n\n/**\n * The options for the `useKeyFilter` hook.\n */\nexport interface UseKeyFilterOptions {\n /**\n * Sets the pattern for key filtering.\n * @default /./\n */\n pattern?: 'pint' | 'int' | 'pnum' | 'money' | 'num' | 'hex' | 'email' | 'alpha' | 'alphanum' | RegExp;\n /**\n * When enabled, instead of blocking keys, input is validated internally to test against the regular expression.\n * @default false\n */\n validateOnly?: boolean;\n}\n\nexport interface UseKeyFilterExposes {\n /**\n * Handles input events for key filter.\n * Processes character input and composition events while applying the filter pattern.\n * @param event - The form or composition event from the input element\n */\n onBeforeInput: (event: React.CompositionEvent<HTMLInputElement>) => void;\n /**\n * Handles keypress events for character input validation.\n * Validates and places characters according to the filter pattern.\n * @param event - The keyboard event from the input element\n */\n onKeyPress: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /**\n * Handles paste events for clipboard content insertion.\n * Processes pasted content according to the mask pattern.\n * @param event - The clipboard event from the input element\n */\n onPaste: (event: React.ClipboardEvent<HTMLInputElement>) => void;\n /**\n * Validates the current input value against the filter pattern.\n * @param event - The form event from the input element\n * @returns true if the value matches the pattern, false otherwise\n */\n validate: (event: React.FormEvent<HTMLInputElement>) => boolean;\n}\n\nexport function useKeyFilter(options: UseKeyFilterOptions): UseKeyFilterExposes {\n const { pattern = /./, validateOnly = false } = options;\n\n const DEFAULT_MASKS = {\n pint: /[\\d]/,\n int: /[\\d-]/,\n pnum: /[\\d.]/,\n money: /[\\d.\\s,]/,\n num: /[\\d-.]/,\n hex: /[0-9a-f]/i,\n email: /[a-z0-9_.-@]/i,\n alpha: /[a-z_]/i,\n alphanum: /[a-z0-9_]/\n };\n\n const getRegex = (): RegExp => {\n return typeof pattern === 'string' ? DEFAULT_MASKS[pattern] : pattern;\n };\n\n const onBeforeInput = (event: React.CompositionEvent<HTMLInputElement>) => {\n // android devices must use beforeinput https://stackoverflow.com/questions/36753548/keycode-on-android-is-always-229\n if (validateOnly || !isAndroid()) {\n return;\n }\n\n validateKey(event, event.data);\n };\n\n const onKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // non android devices use keydown\n if (validateOnly || isAndroid()) {\n return;\n }\n\n if (event.ctrlKey || event.altKey || event.metaKey) {\n return;\n }\n\n validateKey(event, event.key);\n };\n\n const onPaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n if (validateOnly) {\n return;\n }\n\n const regex = getRegex();\n const clipboard = event.clipboardData.getData('text');\n\n // loop over each letter pasted and if any fail prevent the paste\n [...clipboard].forEach((c) => {\n if (!regex.test(c)) {\n event.preventDefault();\n\n return false;\n }\n });\n };\n\n const validateKey = (event: React.CompositionEvent<HTMLInputElement> | React.KeyboardEvent<HTMLInputElement>, key: string) => {\n if (key === null || key === undefined) {\n return;\n }\n\n // some AZERTY keys come in with 2 chars like ´ç if Dead key is pressed first\n const isPrintableKey = key.length <= 2;\n\n if (!isPrintableKey) {\n return;\n }\n\n const regex = getRegex();\n\n if (!regex.test(key)) {\n event.preventDefault();\n }\n };\n\n const validate = (event: React.FormEvent<HTMLInputElement>) => {\n const value = (event.target as HTMLInputElement).value;\n let validatePattern = true;\n\n const regex = getRegex();\n\n if (value && !regex.test(value)) {\n validatePattern = false;\n }\n\n return validatePattern;\n };\n\n return {\n onBeforeInput,\n onKeyPress,\n onPaste,\n validate\n };\n}\n","import { useMountEffect } from '@primereact/hooks';\nimport { getUserAgent } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * Event fired when the component's state changes.\n */\nexport interface UseMaskChangeEvent {\n /**\n * The value of the component.\n */\n value: string | undefined;\n}\n\n/**\n * The options for the `useMask` hook.\n */\nexport interface UseMaskOptions {\n /**\n * Mask pattern.\n */\n mask: string;\n /**\n * Defines if model sets the raw unmasked value to bound value or the formatted mask value.\n * @default false\n */\n unmask?: string;\n /**\n * Placeholder character in mask, default is underscore.\n * @default _\n */\n slotChar?: string;\n /**\n * Clears the incomplete value on blur.\n * @default true\n */\n autoClear?: boolean;\n /**\n * Whether the components are clickable or not.\n * @default false\n */\n readOnly?: boolean;\n /**\n * Callback function that is called when the value is changed.\n * @param event The event that triggered the change.\n * @param event.value The value of the component.\n * @returns void\n */\n onMaskChange?: (event: UseMaskChangeEvent) => void;\n /**\n * Reference to the mask element.\n */\n target: HTMLInputElement;\n}\n\nexport interface UseMaskExposes {\n /**\n * Handles input events for the masked input field.\n * Processes character input and composition events while applying the mask pattern.\n * @param event - The form or composition event from the input element\n */\n onMaskInput: (event: React.FormEvent<HTMLInputElement> | React.CompositionEvent<HTMLInputElement>) => void;\n /**\n * Handles keydown events for special key operations.\n * Manages backspace, delete, escape, and enter key behaviors.\n * @param event - The keyboard event from the input element\n */\n onMaskKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /**\n * Handles keypress events for character input validation.\n * Validates and places characters according to the mask pattern.\n * @param event - The keyboard event from the input element\n */\n onMaskKeyPress: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /**\n * Handles focus events when the input gains focus.\n * Initializes the mask display and sets the cursor position.\n * @param event - The focus event from the input element\n */\n onMaskFocus: (event: React.FocusEvent<HTMLInputElement>) => void;\n /**\n * Handles blur events when the input loses focus.\n * Validates the final value and triggers change events if needed.\n * @param event - The focus event from the input element\n */\n onMaskBlur: (event: React.FocusEvent<HTMLInputElement>) => void;\n /**\n * Handles paste events for clipboard content insertion.\n * Processes pasted content according to the mask pattern.\n * @param event - The clipboard event from the input element\n */\n onMaskPaste: (event: React.ClipboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * useMask hook is used to enter input in a certain format such as numeric, date, currency, email and phone.\n *\n * @param {UseMaskOptions} options - The options for the mask.\n * @returns {UseMaskExposes} - The exposed methods for the mask.\n *\n * @example\n * ```tsx\n * const { onMaskInput, onMaskKeyDown, onMaskKeyPress, onMaskFocus, onMaskBlur, onMaskPaste } = useMask({\n * mask: '99/99/9999',\n * onMaskChange: (event: UseMaskChangeEvent) => setValue(event.value ?? ''),\n * target: ref\n * });\n *\n * return (\n * <div className=\"card flex justify-center\">\n * <InputText ref={ref} value={value} placeholder=\"99/99/9999\" onInput={onMaskInput} onKeyDown={onMaskKeyDown} onKeyPress={onMaskKeyPress} onFocus={onMaskFocus} onBlur={onMaskBlur} onPaste={onMaskPaste} />\n * </div>\n * );\n */\nexport function useMask(options: UseMaskOptions): UseMaskExposes {\n const { mask, unmask, slotChar = '_', autoClear = true, readOnly = false, onMaskChange, target } = options;\n\n const len = React.useRef(0);\n const tests = React.useRef<Array<RegExp | null>>([]);\n const buffer = React.useRef<string[]>([]);\n const defaultBuffer = React.useRef<string | null>(null);\n const partialPosition = React.useRef<number>(0);\n const androidChrome = React.useRef(false);\n const focus = React.useRef(false);\n const focusText = React.useRef<string | null>(null);\n const firstNonMaskPos = React.useRef<number | null>(null);\n const lastRequiredNonMaskPos = React.useRef<number>(0);\n const caretTimeoutId = React.useRef<NodeJS.Timeout | null>(null);\n const oldVal = React.useRef<string | null>(null);\n const currentVal = React.useRef<string | null>(null);\n\n const onMaskInput = (event: React.FormEvent<HTMLInputElement> | React.CompositionEvent<HTMLInputElement>) => {\n // Check if the event is part of a text composition process (e.g., for Asian languages).\n // If event.isComposing is true, it means the user is still composing text and the input is not finalized.\n if ('isComposing' in event && event.isComposing) {\n return;\n }\n\n if (androidChrome.current) handleAndroidInput();\n else handleInputChange(event);\n };\n\n const onMaskKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (readOnly) {\n return;\n }\n\n const k = event.code;\n let pos, begin, end;\n const iPhone = /iphone/i.test(getUserAgent());\n\n oldVal.current = target?.value as string;\n\n //backspace, delete, and escape get special treatment\n if (k === 'Backspace' || k === 'Delete' || (iPhone && k === 'Escape')) {\n pos = caret();\n\n if (!pos) {\n return;\n }\n\n begin = pos.begin;\n end = pos.end;\n\n if (end - begin === 0) {\n begin = k !== 'Delete' ? seekPrev(begin) : (end = seekNext(begin - 1));\n end = k === 'Delete' ? seekNext(end) : end;\n }\n\n clearBuffer(begin, end);\n shiftL(begin, end - 1);\n updateModelValue((event.target as HTMLInputElement).value);\n\n event.preventDefault();\n } else if (k === 'Enter') {\n // enter\n target.blur();\n updateModelValue((event.target as HTMLInputElement).value);\n } else if (k === 'Escape') {\n // escape\n if (target) {\n target.value = focusText.current ?? '';\n }\n\n caret(0, checkVal());\n updateModelValue((event.target as HTMLInputElement).value);\n event.preventDefault();\n }\n };\n\n const onMaskKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (readOnly) {\n return;\n }\n\n const k = event.code,\n pos = caret();\n let p: number, c: string, next: number;\n\n if (!pos) {\n return;\n }\n\n if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey || event.key === 'CapsLock' || event.key === 'Escape' || event.key === 'Tab') {\n //Ignore\n return;\n } else if (k && k !== 'Enter') {\n if (pos.end - pos.begin !== 0) {\n clearBuffer(pos.begin, pos.end);\n shiftL(pos.begin, pos.end - 1);\n }\n\n p = seekNext(pos.begin - 1);\n\n if (p < len.current) {\n c = event.key;\n\n if (tests.current[p]?.test(c)) {\n shiftR(p);\n\n buffer.current[p] = c;\n writeBuffer();\n next = seekNext(p);\n\n if (/android/i.test(getUserAgent())) {\n //Path for CSP Violation on FireFox OS 1.1\n const proxy = () => {\n caret(next);\n };\n\n setTimeout(proxy, 0);\n } else {\n caret(next);\n }\n }\n }\n\n event.preventDefault();\n }\n\n updateModelValue((event.target as HTMLInputElement).value);\n };\n\n const onMaskFocus = () => {\n if (readOnly) {\n return;\n }\n\n if (caretTimeoutId.current) {\n clearTimeout(caretTimeoutId.current as NodeJS.Timeout);\n }\n\n focus.current = true;\n focusText.current = target.value as string;\n\n if (!target.value || target.value === defaultBuffer.current) {\n requestAnimationFrame(() => {\n if (target === document.activeElement) {\n caret(0, 0);\n }\n });\n } else {\n const pos = checkVal();\n\n caretTimeoutId.current = setTimeout(() => {\n if (target !== document.activeElement) {\n return;\n }\n\n writeBuffer();\n\n if (pos === mask?.replace('?', '').length) {\n caret(0, pos);\n } else {\n caret(pos);\n }\n }, 10);\n }\n };\n\n const onMaskBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n focus.current = false;\n checkVal();\n updateModelValue(event.target.value);\n\n if (target.value !== focusText.current) {\n const e = new Event('change', { bubbles: true, cancelable: false });\n\n target.dispatchEvent(e);\n }\n };\n\n const onMaskPaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n handleInputChange(event);\n };\n\n const caret = (first?: number, last?: number): { begin: number; end: number } | undefined => {\n let begin = 0,\n end = 0;\n\n if (typeof first === 'number') {\n begin = first;\n end = typeof last === 'number' ? last : begin;\n\n target.setSelectionRange(begin, end);\n } else {\n if (target) {\n begin = target.selectionStart ?? 0;\n end = target.selectionEnd ?? 0;\n }\n }\n\n return { begin, end };\n };\n\n const getPlaceholder = (i: number) => {\n if (i < slotChar.length) {\n return slotChar.charAt(i);\n }\n\n return slotChar.charAt(0);\n };\n\n const seekNext = (pos: number) => {\n while (++pos < len.current && !tests.current[pos]);\n\n return pos;\n };\n\n const seekPrev = (pos: number) => {\n while (--pos >= 0 && !tests.current[pos]);\n\n return pos;\n };\n\n const shiftL = (begin: number, end: number) => {\n let i, j;\n\n if (begin < 0) {\n return;\n }\n\n for (i = begin, j = seekNext(end); i < len.current; i++) {\n if (tests.current[i]) {\n if (j < len.current && tests.current[i]?.test(buffer.current[j])) {\n buffer.current[i] = buffer.current[j];\n buffer.current[j] = getPlaceholder(j);\n } else {\n break;\n }\n\n j = seekNext(j);\n }\n }\n\n writeBuffer();\n caret(Math.max(firstNonMaskPos.current ?? 0, begin));\n };\n\n const shiftR = (pos: number) => {\n let i, c, j, t;\n\n for (i = pos, c = getPlaceholder(pos); i < len.current; i++) {\n if (tests.current[i]) {\n j = seekNext(i);\n t = buffer.current[i];\n buffer.current[i] = c;\n\n if (j < len.current && tests.current[j]?.test(t)) {\n c = t;\n } else {\n break;\n }\n }\n }\n };\n\n const handleAndroidInput = () => {\n const curVal = target.value as string;\n const pos = caret();\n\n if (!pos) {\n return;\n }\n\n if (oldVal.current && oldVal.current.length && oldVal.current.length > curVal.length) {\n // a deletion or backspace happened\n checkVal(true);\n while (pos.begin > 0 && !tests.current[pos.begin - 1]) pos.begin--;\n\n if (pos.begin === 0) {\n while (pos.begin < (firstNonMaskPos.current ?? 0) && !tests.current[pos.begin]) pos.begin++;\n }\n\n caret(pos.begin, pos.begin);\n } else {\n checkVal(true);\n while (pos.begin < len.current && !tests.current[pos.begin]) pos.begin++;\n\n caret(pos.begin, pos.begin);\n }\n };\n\n const clearBuffer = (start: number, end: number) => {\n let i;\n\n for (i = start; i < end && i < len.current; i++) {\n if (tests.current[i]) {\n buffer.current[i] = getPlaceholder(i);\n }\n }\n };\n\n const writeBuffer = () => {\n if (target) {\n target.value = buffer.current.join('');\n }\n };\n\n const checkVal = (allow = false): number => {\n //try to place characters where they belong\n const test = target.value;\n let lastMatch = -1,\n i,\n c,\n pos;\n\n for (i = 0, pos = 0; i < len.current; i++) {\n const currentTest = tests.current[i];\n\n if (currentTest !== null) {\n buffer.current[i] = getPlaceholder(i);\n\n while (pos++ < (test?.length ?? 0)) {\n c = test?.charAt(pos - 1) ?? '';\n\n if (currentTest.test(c)) {\n buffer.current[i] = c;\n lastMatch = i;\n break;\n }\n }\n\n if (pos > (test?.length ?? 0)) {\n clearBuffer(i + 1, len.current);\n break;\n }\n } else {\n if (buffer.current[i] === test?.charAt(pos)) {\n pos++;\n }\n\n if (i < partialPosition.current) {\n lastMatch = i;\n }\n }\n }\n\n if (allow) {\n writeBuffer();\n } else if (lastMatch + 1 < partialPosition.current) {\n if (autoClear || buffer.current.join('') === defaultBuffer.current) {\n // Invalid value. Remove it and replace it with the\n // mask, which is the default behavior.\n if (target.value) {\n target.value = '';\n }\n\n clearBuffer(0, len.current);\n } else {\n // Invalid value, but we opt to show the value to the\n // user and allow them to correct their mistake.\n writeBuffer();\n }\n } else {\n writeBuffer();\n\n if (target) {\n target.value = target.value.substring(0, lastMatch + 1);\n }\n }\n\n return partialPosition.current ? i : (firstNonMaskPos.current ?? 0);\n };\n\n const handleInputChange = (event: React.FormEvent<HTMLInputElement> | React.ClipboardEvent<HTMLInputElement>) => {\n const isPasteEvent = event.type === 'paste';\n\n if (readOnly || isPasteEvent) {\n return;\n }\n\n const pos = checkVal(true);\n\n caret(pos);\n updateModelValue((event.target as HTMLInputElement).value);\n };\n\n const unmaskValue = (value: string) => {\n const unmaskedBuffer = [];\n const thisbuffer = value.split('');\n\n for (let i = 0; i < thisbuffer.length; i++) {\n const c = thisbuffer[i];\n\n if (tests.current[i] && c !== getPlaceholder(i)) {\n unmaskedBuffer.push(c);\n }\n }\n\n return unmaskedBuffer.join('');\n };\n\n const updateModelValue = (value: string) => {\n if (currentVal.current === value) return;\n\n const val = unmask ? unmaskValue(value) : value;\n const finalValue = defaultBuffer.current !== val ? val : '';\n\n currentVal.current = value;\n\n if (target) {\n target.value = finalValue;\n }\n\n // Call the onMaskChange callback to update React state\n if (onMaskChange) {\n onMaskChange({ value: finalValue });\n }\n };\n\n const updateValue = (updateModel = true) => {\n if (target) {\n if (target.value == null) {\n target.value = '';\n\n if (updateModel) {\n updateModelValue('');\n }\n } else {\n checkVal();\n\n setTimeout(() => {\n if (target) {\n writeBuffer();\n checkVal();\n\n if (updateModel) updateModelValue(target.value);\n }\n }, 10);\n }\n\n focusText.current = target.value;\n }\n };\n\n const initMask = () => {\n tests.current = [];\n partialPosition.current = mask ? mask.length : 0;\n len.current = mask ? mask.length : 0;\n firstNonMaskPos.current = null;\n const defs = {\n 9: '[0-9]',\n a: '[A-Za-z]',\n '*': '[A-Za-z0-9]'\n } as Record<string, string>;\n\n const ua = getUserAgent();\n\n androidChrome.current = /chrome/i.test(ua) && /android/i.test(ua);\n\n const maskTokens = mask ? mask.split('') : '';\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c === '?') {\n len.current--;\n partialPosition.current = i;\n } else if (defs[c]) {\n tests.current.push(new RegExp(defs[c]));\n\n if (firstNonMaskPos.current === null) {\n firstNonMaskPos.current = tests.current.length - 1;\n }\n\n if (i < partialPosition.current) {\n lastRequiredNonMaskPos.current = tests.current.length - 1;\n }\n } else {\n tests.current.push(null);\n }\n }\n\n buffer.current = [];\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c !== '?') {\n if (defs[c]) buffer.current.push(getPlaceholder(i));\n else buffer.current.push(c);\n }\n }\n\n defaultBuffer.current = buffer.current.join('');\n\n updateValue(false);\n };\n\n useMountEffect(() => {\n initMask();\n });\n\n return {\n onMaskInput,\n onMaskKeyDown,\n onMaskKeyPress,\n onMaskFocus,\n onMaskBlur,\n onMaskPaste\n };\n}\n","import * as React from 'react';\n\n/**\n * Listens for the specified media query.\n *\n * @param query - The media query to match.\n * @param when - A boolean indicating whether the media query should be active.\n * @returns A boolean indicating whether the media query matches.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const isMobile = useMatchMedia('(max-width: 768px)');\n *\n * return <div>{isMobile ? 'Mobile' : 'Desktop'}</div>;\n * };\n */\nexport function useMatchMedia(query: string, when: boolean = true): boolean {\n const [matches, setMatches] = React.useState(false);\n const matchMedia = React.useRef<MediaQueryList | null>(null);\n\n const handleChange = (event: MediaQueryListEvent) => setMatches(event.matches);\n const bind = () => matchMedia.current?.addEventListener('change', handleChange);\n const unbind = () => matchMedia.current?.removeEventListener('change', handleChange) && (matchMedia.current = null);\n\n React.useEffect(() => {\n if (when) {\n matchMedia.current = window.matchMedia(query);\n setMatches(matchMedia.current.matches);\n\n bind();\n }\n\n return () => {\n unbind();\n };\n }, [query, when]);\n\n return matches;\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs a mount effect only once.\n * This is similar to `useEffect`, but it only runs on mount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @returns {void}\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * useMountEffect(() => {\n * console.log('Mounted');\n * });\n * };\n * ```\n */\nexport function useMountEffect(effect: React.EffectCallback): void {\n const mounted = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n\n effect?.();\n }\n }, []);\n}\n","import * as React from 'react';\n\n/**\n * usePresence hook is used to manage the presence of a component.\n *\n * @param open - The open state.\n * @returns An object containing the present, exiting, mounted, and ref states.\n *\n * @example\n * ```tsx\n * const { present, exiting, mounted, ref } = usePresence(true);\n *\n * return present && (\n * <div className=\"card flex justify-center\"></div>\n * );\n */\n\nexport function usePresence(open: boolean, fallbackMs: number = 500) {\n const [present, setPresent] = React.useState(open);\n const [exiting, setExiting] = React.useState(false);\n const [mounted, setMounted] = React.useState(false);\n const ref = React.useRef<HTMLElement>(null);\n const cleanupRef = React.useRef<(() => void) | null>(null);\n const rafCleanupRef = React.useRef<(() => void) | null>(null);\n\n React.useEffect(() => {\n if (cleanupRef.current) {\n cleanupRef.current();\n cleanupRef.current = null;\n }\n\n if (rafCleanupRef.current) {\n rafCleanupRef.current();\n rafCleanupRef.current = null;\n }\n\n if (open) {\n setPresent(true);\n setExiting(false);\n\n const rafs: number[] = [];\n\n rafs.push(\n requestAnimationFrame(() => {\n rafs.push(\n requestAnimationFrame(() => {\n rafs.push(requestAnimationFrame(() => setMounted(true)));\n })\n );\n })\n );\n\n rafCleanupRef.current = () => {\n rafs.forEach((raf) => cancelAnimationFrame(raf));\n rafs.length = 0;\n };\n } else if (ref.current) {\n setExiting(true);\n setMounted(false);\n const node = ref.current;\n let isHandled = false;\n\n const handleEnd = () => {\n if (isHandled) return;\n\n isHandled = true;\n\n setPresent(false);\n setExiting(false);\n\n node.removeEventListener('transitionend', handleEnd);\n node.removeEventListener('animationend', handleEnd);\n\n cleanupRef.current = null;\n };\n\n node.addEventListener('transitionend', handleEnd, { passive: true });\n node.addEventListener('animationend', handleEnd, { passive: true });\n\n // const fallbackTimeout = setTimeout(() => {\n // if (!isHandled) {\n // handleEnd();\n // }\n // }, fallbackMs);\n\n cleanupRef.current = () => {\n // clearTimeout(fallbackTimeout);\n\n if (!isHandled) {\n node.removeEventListener('transitionend', handleEnd);\n node.removeEventListener('animationend', handleEnd);\n }\n };\n } else {\n setMounted(false);\n setPresent(false);\n setExiting(false);\n }\n }, [open, fallbackMs]);\n\n React.useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n\n if (rafCleanupRef.current) {\n rafCleanupRef.current();\n }\n };\n }, []);\n\n return { present, exiting, mounted, ref };\n}\n","import * as React from 'react';\n\n/**\n * Used to merge and differentiate incoming props with the default props.\n * - Keys that exist in both `props1` and `props2` are placed in `props`, with values from `props1`.\n * - Keys that exist in `props1` but not in `props2` are placed in `attrs`.\n *\n * @template P1 The type of the incoming set of props.\n * @template P2 The type of the default set of props.\n *\n * @param props1 The incoming set of props (e.g., user-defined or dynamic props).\n * @param props2 The default set of props (e.g., default props).\n * @returns An object containing:\n * - `props`: A new object containing keys that exist in both `props1` and `props2`, using values from `props1`.\n * - `attrs`: A new object containing keys that exist only in `props1`, excluding any keys from `props2`.\n *\n * @example\n * ```ts\n * const { props, attrs } = useProps({ id: 'foo', className: 'bar' }, { className: 'baz' });\n *\n * console.log(props); // { className: 'bar' }\n * console.log(attrs); // { id: 'foo' }\n * ```\n */\nexport function useProps<P1, P2>(props1: P1 = {} as P1, props2: P2 = {} as P2) {\n type Props = Pick<P1 & P2, keyof P2>;\n type Attrs = Omit<P1, keyof P2>;\n type Result = { props: Props; attrs: Attrs };\n\n return React.useMemo(() => {\n const result: Result = { props: { ...props2 } as Props, attrs: {} as Attrs };\n\n Object.entries(props1 as Record<string, unknown>).forEach(([key, value]) => {\n if (key in (props2 as Record<string, unknown>)) {\n (result.props as Record<string, unknown>)[key] = value;\n } else {\n (result.attrs as Record<string, unknown>)[key] = value;\n }\n });\n\n return result;\n }, [props1, props2]);\n}\n","import * as React from 'react';\n\nexport const useQueueTask = () => {\n const tasksRef = React.useRef(new Map<string | number, () => void>());\n const scheduledRef = React.useRef(false);\n\n const flush = React.useCallback(() => {\n scheduledRef.current = false;\n const tasks = tasksRef.current;\n\n tasksRef.current = new Map();\n tasks.forEach((task) => task());\n }, []);\n\n return React.useCallback(\n (id: string | number, task: () => void) => {\n tasksRef.current.set(id, task);\n\n if (!scheduledRef.current) {\n scheduledRef.current = true;\n queueMicrotask(flush);\n }\n },\n [flush]\n );\n};\n","import { getWindowScrollTop } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * The options for the `useScrollTop` hook.\n */\nexport interface UseScrollTopOptions {\n /**\n * Reference to the target element.\n * @default window\n */\n target?: Window | Element | null;\n /**\n * Defines the threshold value of the vertical scroll position of the target to toggle the visibility.\n * @default 400\n */\n threshold?: number;\n /**\n * Defines the scrolling behaviour, 'smooth' adds an animation and 'auto' scrolls with a jump.\n * @default smooth\n */\n behavior?: ScrollBehavior;\n}\n\n/**\n * The exposes for the `useScrollTop` hook.\n */\nexport interface UseScrollTopExposes {\n /**\n * Current visible state as a boolean.\n * @default false\n */\n visible: boolean;\n /**\n * Scrolls the target element to the top.\n */\n scrollToTop: () => void;\n}\n\n/**\n * useScrollTop hook is used to enter input in a certain format such as numeric, date, currency, email and phone.\n *\n * @param {UseScrollTopOptions} options - The options for the scroll top behavior.\n * @returns {UseScrollTopExposes} - The exposed methods for the scroll top behavior.\n *\n * @example\n * ```tsx\n * const { scrollToTop, visible } = useScrollTop({\n * target: elementRef.current,\n * threshold: 400,\n * behavior: 'smooth'\n * });\n *\n * return (\n * <div ref={elementRef}>\n * {visible && (\n * <Button onClick={scrollToTop}>\n * <i className=\"pi pi-arrow-up\" />\n * </Button>\n * )}\n * </div>\n * );\n */\nexport function useScrollTop(options?: UseScrollTopOptions): UseScrollTopExposes {\n const { target = typeof window !== 'undefined' ? window : null, threshold = 400, behavior = 'smooth' } = options || {};\n const [visible, setVisible] = React.useState(false);\n\n const scrollToTop = () => {\n target?.scroll({\n top: 0,\n behavior: behavior\n });\n };\n\n React.useEffect(() => {\n if (!target) return;\n\n const checkVisibility = (scrollY: number) => {\n if (scrollY > threshold) setVisible(true);\n else setVisible(false);\n };\n\n const onScroll = () => {\n const scrollY = target === window ? getWindowScrollTop() : (target as Element).scrollTop;\n\n checkVisibility(scrollY);\n };\n\n target.addEventListener('scroll', onScroll);\n\n return () => {\n target.removeEventListener('scroll', onScroll);\n };\n }, [target, threshold]);\n\n return {\n //state\n visible,\n //methods\n scrollToTop\n };\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs an unmount effect only once.\n * This is similar to `useEffect`, but it only runs on unmount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @returns {void}\n *\n * @example\n * ```tsx\n * const Component = () => {\n * useUnmountEffect(() => {\n * console.log('Unmounted');\n * });\n * };\n * ```\n */\nexport function useUnmountEffect(effect: React.EffectCallback): void {\n React.useEffect(() => {\n return () => {\n effect?.();\n };\n }, []);\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs an update effect whenever dependencies change.\n * This is similar to `useEffect`, but it does not run on mount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @param {React.DependencyList} dependencies the dependencies\n * @returns {void}\n *\n * @example\n * ```tsx\n * const Component = ({ value }) => {\n * useUpdateEffect(() => {\n * console.log('Updated');\n * }, [value]);\n * };\n * ```\n */\nexport function useUpdateEffect(effect: React.EffectCallback, dependencies?: React.DependencyList): void {\n const mounted = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n\n return;\n }\n\n return effect?.();\n }, dependencies);\n}\n","import * as React from 'react';\n\n/**\n * Starts a view transition.\n *\n * @returns A function that starts a view transition.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const startTransition = useViewTransition();\n *\n * const handleClick = () => {\n * startTransition(() => {\n * // Perform some work\n * });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * };\n */\nexport function useViewTransition() {\n const startTransition = React.useCallback((callback: () => void) => {\n if (document.startViewTransition) {\n document.startViewTransition(() => {\n callback();\n });\n } else {\n callback();\n }\n }, []);\n\n return startTransition;\n}\n","import * as React from 'react';\n\n/**\n * useVisibilityChange hook is used to check if the document is visible.\n *\n * @returns A boolean indicating whether the document is visible.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const isVisible = useVisibilityChange();\n *\n * return <div>{isVisible ? 'Visible' : 'Hidden'}</div>;\n * };\n */\nexport function useVisibilityChange() {\n const [isVisible, setIsVisible] = React.useState(true);\n\n React.useEffect(() => {\n const handleVisibilityChange = () => {\n setIsVisible(!document.hidden);\n };\n\n handleVisibilityChange();\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return isVisible;\n}\n"],"mappings":"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","names":["React","useAttrSelector","prefix","id","resolve","React","useControlledState","value","defaultValue","onChange","valueState","setValueState","isControlled","computedValue","setValue","inValue","newValue","onChangeParam","getTargetElement","isNotEmpty","React","React","usePrevious","value","ref","useEventListener","target","type","listener","options","when","targetRef","listenerRef","prevListener","usePrevious","prevOptions","bind","bindOptions","bindTarget","isNotEmpty","unbind","getTargetElement","event","_a","dispose","updateTarget","listenerChanged","optionsChanged","listenerExists","React","useHotKey","keys","handler","options","target","event","when","handlerRef","normalizeKey","key","lower","parseKeySpec","spec","parts","p","required","part","matches","targetElement","keySpecs","listener","_a","keyboardEvent","React","useId","initialValue","idx","idState","setIdState","isAndroid","useKeyFilter","options","pattern","validateOnly","DEFAULT_MASKS","getRegex","onBeforeInput","event","validateKey","onKeyPress","onPaste","regex","c","key","value","validatePattern","useMountEffect","getUserAgent","React","useMask","options","mask","unmask","slotChar","autoClear","readOnly","onMaskChange","target","len","tests","buffer","defaultBuffer","partialPosition","androidChrome","focus","focusText","firstNonMaskPos","lastRequiredNonMaskPos","caretTimeoutId","oldVal","currentVal","onMaskInput","event","handleAndroidInput","handleInputChange","onMaskKeyDown","_a","k","pos","begin","end","iPhone","caret","seekPrev","seekNext","clearBuffer","shiftL","updateModelValue","checkVal","onMaskKeyPress","p","c","next","shiftR","writeBuffer","onMaskFocus","onMaskBlur","e","onMaskPaste","first","last","_b","getPlaceholder","i","j","t","curVal","start","allow","_c","_d","test","lastMatch","currentTest","isPasteEvent","unmaskValue","value","unmaskedBuffer","thisbuffer","val","finalValue","updateValue","updateModel","initMask","defs","ua","maskTokens","React","useMatchMedia","query","when","matches","setMatches","matchMedia","handleChange","event","bind","_a","unbind","React","useMountEffect","effect","mounted","React","usePresence","open","fallbackMs","present","setPresent","exiting","setExiting","mounted","setMounted","ref","cleanupRef","rafCleanupRef","rafs","raf","node","isHandled","handleEnd","React","useProps","props1","props2","result","__spreadValues","key","value","React","useQueueTask","tasksRef","scheduledRef","flush","tasks","task","id","getWindowScrollTop","React","useScrollTop","options","target","threshold","behavior","visible","setVisible","scrollToTop","checkVisibility","scrollY","onScroll","React","useUnmountEffect","effect","React","useUpdateEffect","effect","dependencies","mounted","React","useViewTransition","callback","React","useVisibilityChange","isVisible","setIsVisible","handleVisibilityChange"]}
1
+ {"version":3,"sources":["../src/use-attr-selector/index.ts","../src/use-sortable-list/index.ts","../src/use-controlled-state/index.ts","../src/use-event-listener/index.ts","../src/use-previous/index.ts","../src/use-filter/index.ts","../src/use-filter/_matchers.ts","../src/use-tree-filter/index.ts","../src/use-hot-key/index.ts","../src/use-id/index.ts","../src/use-key-filter/index.ts","../src/use-local-storage/index.ts","../src/use-mask/index.ts","../src/use-match-media/index.ts","../src/use-is-mobile/index.ts","../src/use-mount-effect/index.ts","../src/use-mounted/index.ts","../src/use-number-formatter/index.ts","../src/use-presence/index.ts","../src/use-props/index.ts","../src/use-queue-task/index.ts","../src/use-scrolltop/index.ts","../src/use-unmount-effect/index.ts","../src/use-update-effect/index.ts","../src/use-view-transition/index.ts","../src/use-visibility-change/index.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Generates a unique attribute selector based on the provided prefix.\n *\n * @param prefix - The prefix to prepend to the generated selector.\n * @returns A unique string combining the prefix and the selector.\n *\n * @example\n * ```ts\n * const selector = useAttrSelector('foo');\n * console.log(selector); // e.g., 'foo0'\n * ```\n */\nexport function useAttrSelector(prefix: string = ''): string {\n const id = React.useId();\n\n return React.useMemo(() => `${prefix}${id.replaceAll(/:|«|»/g, '')}`.trim().toLowerCase(), [id, prefix]);\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface SortableListState<TListId extends string = string, TItem = unknown> {\n draggedItems: TItem[];\n draggedIndex: number | null;\n sourceListId: TListId | null;\n dragOverListId: TListId | null;\n dragOverIndex: number | null;\n isDragging: boolean;\n}\n\nexport interface UseSortableListOptions<TListId extends string = string, TItem = unknown> {\n /** Called when items are reordered within the same list */\n onReorder: (listId: TListId, fromIndex: number, toIndex: number) => void;\n /** Called when items are dropped onto a different list */\n onTransfer?: (sourceListId: TListId, targetListId: TListId, items: TItem[], targetIndex?: number) => void;\n /** Whether a transfer from source to target is allowed. Defaults to true. */\n canTransfer?: (sourceListId: TListId, targetListId: TListId) => boolean;\n /** Resolve the set of items to drag. Useful for multi-selection. Defaults to [item]. */\n getSelectedItems?: (listId: TListId, item: TItem) => TItem[];\n}\n\nexport interface UseSortableListReturn<TListId extends string = string, TItem = unknown> {\n dragState: SortableListState<TListId, TItem>;\n /**\n * Drag handlers for the list container.\n * Must be spread onto the list wrapper element — handles both same-list reorder\n * (via dragOverIndexRef) and cross-list transfer in onDrop, so individual items\n * do not need onDrop handlers and CSS transitions on items are safe to use.\n */\n getListHandlers: (listId: TListId) => {\n onDragOver: (e: React.DragEvent) => void;\n onDrop: (e: React.DragEvent) => void;\n };\n /** Drag handlers for individual items (onDragStart, onDragOver, onDragEnd) */\n getItemHandlers: (\n listId: TListId,\n index: number,\n item: TItem\n ) => {\n draggable: true;\n 'data-index': number;\n onDragStart: (e: React.DragEvent) => void;\n onDragOver: (e: React.DragEvent) => void;\n onDragEnd: () => void;\n };\n /** Reset all drag state */\n reset: () => void;\n}\n\nconst INITIAL_STATE = {\n draggedItems: [],\n draggedIndex: null,\n sourceListId: null,\n dragOverListId: null,\n dragOverIndex: null,\n isDragging: false\n};\n\nexport function useSortableList<TListId extends string = string, TItem = unknown>({ onReorder, onTransfer, canTransfer, getSelectedItems }: UseSortableListOptions<TListId, TItem>): UseSortableListReturn<TListId, TItem> {\n const draggedItemsRef = React.useRef<TItem[]>([]);\n const dragSourceRef = React.useRef<TListId | null>(null);\n const draggedIndexRef = React.useRef<number | null>(null);\n // Tracks the last hovered item index so list-level onDrop always uses the correct target,\n // regardless of where the cursor is when released (even over a transitioning item).\n const dragOverIndexRef = React.useRef<number | null>(null);\n\n const [dragState, setDragState] = React.useState<SortableListState<TListId, TItem>>(INITIAL_STATE as SortableListState<TListId, TItem>);\n\n const reset = React.useCallback(() => {\n draggedItemsRef.current = [];\n dragSourceRef.current = null;\n draggedIndexRef.current = null;\n dragOverIndexRef.current = null;\n setDragState(INITIAL_STATE as SortableListState<TListId, TItem>);\n }, []);\n\n const isTransferAllowed = React.useCallback(\n (sourceListId: TListId, targetListId: TListId) => {\n if (!onTransfer) return false;\n\n return canTransfer ? canTransfer(sourceListId, targetListId) : true;\n },\n [onTransfer, canTransfer]\n );\n\n const getListHandlers = React.useCallback(\n (listId: TListId) => ({\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault();\n const sourceListId = dragSourceRef.current;\n\n if (sourceListId === listId) {\n e.dataTransfer.dropEffect = 'move';\n } else if (sourceListId) {\n e.dataTransfer.dropEffect = isTransferAllowed(sourceListId, listId) ? 'move' : 'none';\n }\n\n setDragState((prev) => (prev.dragOverListId !== listId ? { ...prev, dragOverListId: listId, dragOverIndex: null } : prev));\n },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault();\n const sourceListId = dragSourceRef.current;\n const fromIndex = draggedIndexRef.current;\n const toIndex = dragOverIndexRef.current;\n\n if (sourceListId === listId) {\n // Same-list reorder using the last committed hover index.\n // Because drop is handled here (not on individual items), CSS transitions\n // on items cannot affect which element receives the drop event.\n if (fromIndex !== null && toIndex !== null && fromIndex !== toIndex) {\n onReorder(listId, fromIndex, toIndex);\n }\n } else if (sourceListId && draggedItemsRef.current.length > 0 && isTransferAllowed(sourceListId, listId)) {\n onTransfer!(sourceListId, listId, draggedItemsRef.current, toIndex ?? undefined);\n }\n\n reset();\n }\n }),\n [onReorder, onTransfer, isTransferAllowed, reset]\n );\n\n const getItemHandlers = React.useCallback(\n (listId: TListId, index: number, item: TItem) => ({\n draggable: true as const,\n 'data-index': index,\n onDragStart: (e: React.DragEvent) => {\n const itemsToDrag = getSelectedItems ? getSelectedItems(listId, item) : [item];\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', '');\n\n // Set refs immediately so dragOver/drop handlers work from the first event.\n draggedItemsRef.current = itemsToDrag;\n dragSourceRef.current = listId;\n draggedIndexRef.current = index;\n dragOverIndexRef.current = index;\n\n // Defer the state update by one frame so the browser captures the drag\n // ghost image from the element while it is still visible (opacity: 1).\n // React's synchronous batch flush would otherwise hide the element\n // (opacity: 0 in consumer code) before the ghost snapshot is taken.\n requestAnimationFrame(() => {\n setDragState({\n draggedItems: itemsToDrag,\n draggedIndex: index,\n sourceListId: listId,\n dragOverListId: null,\n dragOverIndex: null,\n isDragging: true\n });\n });\n },\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const sourceListId = dragSourceRef.current;\n const isSameList = sourceListId === listId;\n\n if (isSameList) {\n e.dataTransfer.dropEffect = 'move';\n } else if (sourceListId) {\n e.dataTransfer.dropEffect = isTransferAllowed(sourceListId, listId) ? 'move' : 'none';\n }\n\n // The dragged item stays at its original slot (invisible placeholder).\n // Skip dragOverIndex updates for it to prevent the feedback loop where\n // hovering the invisible item resets all visual shifts.\n if (isSameList && index === draggedIndexRef.current) {\n return;\n }\n\n dragOverIndexRef.current = index;\n setDragState((prev) => (prev.dragOverListId !== listId || prev.dragOverIndex !== index ? { ...prev, dragOverListId: listId, dragOverIndex: index } : prev));\n },\n onDragEnd: reset\n }),\n [isTransferAllowed, getSelectedItems, reset]\n );\n\n return { dragState, getListHandlers, getItemHandlers, reset };\n}\n","import { resolve } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * The options for the `useControlledState` hook.\n */\nexport interface UseControlledStateOptions<T = unknown, E = unknown> {\n /**\n * The value of the controlled state.\n */\n value?: T | undefined;\n /**\n * The default value of the uncontrolled state.\n */\n defaultValue?: T | undefined;\n /**\n * Callback function that is called when the value changes.\n */\n onChange?: (newValue: E) => void;\n}\n\n/**\n * The return type of the `useControlledState` hook.\n * A tuple containing the current value and a function to update it.\n */\nexport type UseControlledStateReturnType<T = unknown> = [T | undefined, (inValue: unknown | ((prev?: T) => unknown)) => void, boolean];\n\n/**\n * A custom hook that manages controlled and uncontrolled state.\n *\n * @param {UseControlledStateOptions} options - The options for the controlled state.\n * @returns A tuple containing the current value and a function to update it.\n *\n * @example\n * ```tsx\n * const ControlledComponent = () => {\n * const [controlledValue, setControlledValue] = React.useState('');\n *\n * const [value, setValue] = useControlledState({\n * value: controlledValue,\n * defaultValue: 'initial value',\n * onChange: (newValue) => {\n * setControlledValue(newValue);\n * }\n * });\n *\n * return <Component value={value} onChange={(e) => setValue(e.target.value)} />;\n * };\n * ```\n */\nexport function useControlledState<T = unknown, E = T>({ value, defaultValue, onChange }: UseControlledStateOptions<T, E>): UseControlledStateReturnType<T | undefined> {\n const isControlledRef = React.useRef(value !== undefined);\n const isControlled = isControlledRef.current;\n\n const [valueState, setValueState] = React.useState<T | undefined>(() => {\n return isControlled ? undefined : (defaultValue ?? value);\n });\n\n const computedValue = isControlled ? (value as T) : valueState;\n\n const setValue = React.useCallback(\n (inValue: unknown | ((prev?: T) => unknown)) => {\n // @todo - update resolve to accept multiple parameters\n const [newValue, onChangeParam] = resolve(inValue, computedValue, isControlled) as [T, E];\n\n onChange?.(onChangeParam);\n\n if (!isControlled) {\n setValueState(newValue);\n }\n },\n [computedValue, isControlled, onChange]\n );\n\n React.useEffect(() => {\n if (!isControlled) {\n setValueState(defaultValue);\n }\n }, [defaultValue, isControlled]);\n\n return [computedValue, setValue, isControlled];\n}\n","import { getTargetElement, isNotEmpty } from '@primeuix/utils';\nimport * as React from 'react';\nimport { usePrevious } from '../use-previous';\n\n/**\n * The options for the `useEventListener` hook.\n */\nexport interface UseEventListenerOptions<T = keyof HTMLElementEventMap> {\n /**\n * The target element to bind the event listener to.\n * @default 'document'\n */\n target?: 'document' | 'window' | 'body' | HTMLElement | (() => HTMLElement) | React.Ref<HTMLElement> | string | null;\n /**\n * The event type to listen for.\n */\n type: T | string;\n /**\n * The event listener callback.\n */\n listener: EventListener;\n /**\n * The event listener options\n */\n options?: AddEventListenerOptions | boolean;\n /**\n * A boolean indicating whether the event listener should be active.\n */\n when?: boolean;\n}\n\n/**\n * The return type of the `useEventListener` hook.\n * A tuple containing functions;\n * 1. `bind` function is used to bind the event listener.\n * 2. `unbind` function is used to unbind the event listener.\n */\nexport type UseEventListenerReturnType = [(options?: Partial<Omit<UseEventListenerOptions, 'target'>> & { target?: UseEventListenerOptions['target'] | Document | null }) => void, () => void];\n\n/**\n * Listens for the specified event type on the target element.\n *\n * @param {UseEventListenerOptions} options - The options for the event listener.\n * @returns A tuple containing functions;\n * 1. `bind` function is used to bind the event listener.\n * 2. `unbind` function is used to unbind the event listener.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const [bind, unbind] = useEventListener({\n * target: 'document',\n * type: 'click',\n * listener: (event) => {\n * console.log(event);\n * },\n * when: true\n * });\n *\n * return <div>Click me</div>;\n * };\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const [bind, unbind] = useEventListener({\n * target: () => document.querySelector('.element'),\n * type: 'mouseover',\n * listener: (event) => {\n * console.log(event);\n * }\n * });\n *\n * return <div>MouseOver to `.element`</div>;\n * };\n * ```\n */\nexport function useEventListener({ target = 'document', type, listener, options, when = true }: UseEventListenerOptions): UseEventListenerReturnType {\n const targetRef = React.useRef<HTMLElement | null>(null);\n const listenerRef = React.useRef<EventListener | null>(null);\n let prevListener = usePrevious(listener);\n let prevOptions = usePrevious(options);\n\n const bind = (bindOptions: Partial<Omit<UseEventListenerOptions, 'target'>> & { target?: UseEventListenerOptions['target'] | Document | null } = {}) => {\n const { target: bindTarget } = bindOptions;\n\n if (isNotEmpty(bindTarget)) {\n unbind();\n\n if (bindOptions.when || when) {\n targetRef.current = getTargetElement(bindTarget) as HTMLElement;\n }\n }\n\n if (!listenerRef.current && targetRef.current) {\n listenerRef.current = (event: Event) => listener && listener(event);\n targetRef.current.addEventListener(type, listenerRef.current, options);\n }\n };\n\n const unbind = () => {\n if (listenerRef.current) {\n targetRef.current?.removeEventListener(type, listenerRef.current, options);\n listenerRef.current = null;\n }\n };\n\n const dispose = () => {\n unbind();\n // Prevent memory leak by releasing\n prevListener = null;\n prevOptions = null;\n };\n\n const updateTarget = React.useCallback(() => {\n if (when) {\n targetRef.current = getTargetElement(target) as HTMLElement;\n } else {\n unbind();\n targetRef.current = null;\n }\n }, [target, when]);\n\n React.useEffect(() => {\n return () => {\n dispose();\n };\n }, []);\n\n React.useEffect(() => {\n updateTarget();\n }, [updateTarget]);\n\n React.useEffect(() => {\n const listenerChanged = `${prevListener}` !== `${listener}`;\n const optionsChanged = prevOptions !== options;\n const listenerExists = listenerRef.current;\n\n if (listenerExists && (listenerChanged || optionsChanged)) {\n unbind();\n\n if (when) {\n bind();\n }\n } else if (!listenerExists) {\n dispose();\n }\n }, [listener, options, when]);\n\n return [bind, unbind];\n}\n","import * as React from 'react';\n\n/**\n * Returns the previous value of the provided value.\n *\n * @param value - The value to track.\n * @returns The previous value of the provided value.\n *\n * @example\n * ```tsx\n * const [count, setCount] = React.useState(5);\n * const prevCount = usePrevious(count);\n *\n * console.log(prevCount); // undefined\n *\n * setCount(10);\n *\n * console.log(prevCount); // 5\n * ```\n */\nexport function usePrevious<T>(value: T): T | null | undefined {\n const ref = React.useRef<T | null>(null);\n\n React.useEffect(() => {\n ref.current = value;\n\n return () => {\n ref.current = null;\n };\n }, [value]);\n\n return ref.current;\n}\n","'use client';\nimport { resolveFieldData } from '@primeuix/utils/object';\nimport * as React from 'react';\nimport { BUILT_IN_MATCHERS, getGlobalMatchers, registerMatcher, unregisterMatcher, type BuiltInMatchMode, type FilterMatcher } from './_matchers';\n\nexport { registerMatcher, unregisterMatcher, BUILT_IN_MATCHERS, getGlobalMatchers };\nexport type { FilterMatcher, BuiltInMatchMode };\n\nexport type FilterOperator = 'and' | 'or';\n\nexport interface FilterConstraint<TMode extends string = string> {\n value: unknown;\n matchMode?: TMode;\n}\n\nexport interface FilterRuleSimple<TMode extends string = string> {\n field: string | string[];\n value: unknown;\n matchMode?: TMode;\n operator?: never;\n constraints?: never;\n}\n\nexport interface FilterRuleComposite<TMode extends string = string> {\n field: string | string[];\n operator?: FilterOperator;\n constraints: FilterConstraint<TMode>[];\n value?: never;\n matchMode?: never;\n}\n\nexport type FilterRule<TMode extends string = string> = FilterRuleSimple<TMode> | FilterRuleComposite<TMode>;\n\nexport interface UseFilterOptions<T, TMode extends string = BuiltInMatchMode> {\n data: T[];\n /** Shorthand: target field for a single-rule filter. Use `rules` / `defaultRules` for multi-rule setups. */\n field?: string | string[];\n /** Shorthand: value for the single-rule filter declared via `field`. */\n value?: unknown;\n /** Shorthand: match mode for the single-rule filter declared via `field`. Defaults to `contains`. */\n matchMode?: TMode;\n /** Shorthand: callback when the single-rule value changes. */\n onValueChange?: (value: unknown) => void;\n /** Multi-rule controlled state. Omit and use `field/value` for a single rule. */\n rules?: FilterRule<TMode>[];\n /** Multi-rule uncontrolled initial state. */\n defaultRules?: FilterRule<TMode>[];\n matchers?: Partial<Record<TMode, FilterMatcher>> & Record<string, FilterMatcher>;\n filterLocale?: string;\n filterDelay?: number;\n /** When true, `filteredData` is returned as-is; the consumer is responsible for filtering (server-side). */\n lazy?: boolean;\n /** Fires after rules settle (honours `filterDelay`). The consumer is expected to fetch a new `data` slice. */\n onLazyLoad?: (event: LazyFilterEvent<TMode>) => void;\n onRulesChange?: (rules: FilterRule<TMode>[]) => void;\n}\n\nexport interface LazyFilterEvent<TMode extends string = string> {\n rules: FilterRule<TMode>[];\n filterLocale?: string;\n}\n\nexport interface FilterConstraintCursor<TMode extends string = string> {\n value: unknown;\n matchMode: TMode | undefined;\n setValue: (value: unknown) => void;\n setMatchMode: (matchMode: TMode) => void;\n remove: () => void;\n}\n\nexport interface FilterRuleCursor<TMode extends string = string> {\n field: string | string[];\n value: unknown;\n matchMode: TMode | undefined;\n operator: FilterOperator | undefined;\n constraints: FilterConstraint<TMode>[] | undefined;\n setValue: (value: unknown) => void;\n setMatchMode: (matchMode: TMode) => void;\n setOperator: (operator: FilterOperator) => void;\n addConstraint: (matchMode?: TMode) => void;\n constraint: (index: number) => FilterConstraintCursor<TMode> | undefined;\n remove: () => void;\n clear: () => void;\n}\n\nexport interface UseFilterReturn<T, TMode extends string = string> {\n rules: FilterRule<TMode>[];\n filteredData: T[];\n isFiltered: boolean;\n\n setRules: (rules: FilterRule<TMode>[]) => void;\n setValue: (ruleIndex: number, value: unknown) => void;\n setMatchMode: (ruleIndex: number, matchMode: TMode) => void;\n setOperator: (ruleIndex: number, operator: FilterOperator) => void;\n setConstraintValue: (ruleIndex: number, constraintIndex: number, value: unknown) => void;\n setConstraintMatchMode: (ruleIndex: number, constraintIndex: number, matchMode: TMode) => void;\n addRule: (rule: FilterRule<TMode>) => void;\n removeRule: (ruleIndex: number) => void;\n clearRule: (ruleIndex: number) => void;\n addConstraint: (ruleIndex: number, matchMode?: TMode) => void;\n removeConstraint: (ruleIndex: number, constraintIndex: number) => void;\n clearAll: () => void;\n\n rule: (ruleKey: number | string) => FilterRuleCursor<TMode> | undefined;\n\n match: (item: T) => boolean;\n matchers: Readonly<Record<string, FilterMatcher>>;\n}\n\nfunction defaultMatchMode(): BuiltInMatchMode {\n return 'contains';\n}\n\nfunction ruleIsComposite<TMode extends string>(rule: FilterRule<TMode>): rule is FilterRuleComposite<TMode> {\n return Array.isArray((rule as FilterRuleComposite<TMode>).constraints);\n}\n\nfunction matchFields(item: unknown, field: string | string[], filterValue: unknown, matchMode: string, locale: string | undefined, matchers: Record<string, FilterMatcher>): boolean {\n const rule = matchers[matchMode];\n\n if (!rule) return true;\n\n if (Array.isArray(field)) {\n if (filterValue === undefined || filterValue === null || filterValue === '') return true;\n\n return field.some((f) => rule(resolveFieldData(item as Record<string, unknown>, f), filterValue, locale));\n }\n\n return rule(typeof item === 'object' ? resolveFieldData(item as Record<string, unknown>, field) : item, filterValue, locale);\n}\n\nexport function matchRule<T, TMode extends string>(item: T, rule: FilterRule<TMode>, matchers: Record<string, FilterMatcher>, locale?: string): boolean {\n if (ruleIsComposite(rule)) {\n const constraints = rule.constraints ?? [];\n\n if (constraints.length === 0) return true;\n\n const operator = rule.operator ?? 'and';\n\n if (operator === 'and') {\n return constraints.every((c) => matchFields(item, rule.field, c.value, c.matchMode ?? defaultMatchMode(), locale, matchers));\n }\n\n return constraints.some((c) => matchFields(item, rule.field, c.value, c.matchMode ?? defaultMatchMode(), locale, matchers));\n }\n\n return matchFields(item, rule.field, rule.value, rule.matchMode ?? defaultMatchMode(), locale, matchers);\n}\n\nexport function useFilter<T, TMode extends string = BuiltInMatchMode>(options: UseFilterOptions<T, TMode>): UseFilterReturn<T, TMode> {\n const shorthandField = options.field;\n const shorthandMatchMode = options.matchMode;\n const hasShorthand = shorthandField !== undefined;\n const shorthandControlled = hasShorthand && options.value !== undefined;\n\n const initialShorthandRule = React.useMemo<FilterRule<TMode>[]>(() => {\n if (!hasShorthand) return [];\n\n return [{ field: shorthandField!, value: options.value ?? null, matchMode: shorthandMatchMode } as FilterRule<TMode>];\n }, [hasShorthand, shorthandField, shorthandMatchMode]);\n\n const isControlled = options.rules !== undefined || shorthandControlled;\n const [internalRules, setInternalRules] = React.useState<FilterRule<TMode>[]>(options.defaultRules ?? (hasShorthand ? initialShorthandRule : []));\n\n const shorthandRules = React.useMemo<FilterRule<TMode>[]>(() => [{ field: shorthandField!, value: options.value, matchMode: shorthandMatchMode } as FilterRule<TMode>], [shorthandField, options.value, shorthandMatchMode]);\n\n const currentRules = options.rules !== undefined ? options.rules : shorthandControlled ? shorthandRules : internalRules;\n\n const onRulesChangeRef = React.useRef(options.onRulesChange);\n const onValueChangeRef = React.useRef(options.onValueChange);\n\n onRulesChangeRef.current = options.onRulesChange;\n onValueChangeRef.current = options.onValueChange;\n\n const commit = React.useCallback(\n (next: FilterRule<TMode>[]) => {\n if (!isControlled) setInternalRules(next);\n onRulesChangeRef.current?.(next);\n\n if (hasShorthand) {\n const first = next[0];\n\n if (first && !('constraints' in first)) onValueChangeRef.current?.(first.value);\n }\n },\n [isControlled, hasShorthand]\n );\n\n const filterLocale = options.filterLocale;\n const filterDelay = options.filterDelay ?? 0;\n\n const matchers = React.useMemo<Record<string, FilterMatcher>>(() => {\n return { ...(BUILT_IN_MATCHERS as Record<string, FilterMatcher>), ...getGlobalMatchers(), ...(options.matchers ?? {}) };\n }, [options.matchers]);\n\n const [debouncedRules, setDebouncedRules] = React.useState<FilterRule<TMode>[]>(currentRules);\n\n React.useEffect(() => {\n if (filterDelay <= 0) return;\n\n const t = setTimeout(() => setDebouncedRules(currentRules), filterDelay);\n\n return () => clearTimeout(t);\n }, [currentRules, filterDelay]);\n\n const activeRules = filterDelay > 0 ? debouncedRules : currentRules;\n\n const activeRulesNonEmpty = React.useMemo(() => activeRules.filter((r) => ruleHasValue(r)), [activeRules]);\n\n const match = React.useCallback((item: T) => activeRulesNonEmpty.every((r) => matchRule(item, r, matchers, filterLocale)), [activeRulesNonEmpty, matchers, filterLocale]);\n\n const lazy = !!options.lazy;\n\n const filteredData = React.useMemo(() => {\n if (lazy) return options.data;\n\n if (activeRulesNonEmpty.length === 0) return options.data;\n\n return options.data.filter(match);\n }, [lazy, options.data, activeRulesNonEmpty, match]);\n\n const isFiltered = activeRulesNonEmpty.length > 0;\n\n const onLazyLoadRef = React.useRef(options.onLazyLoad);\n\n onLazyLoadRef.current = options.onLazyLoad;\n\n const lastLazyKeyRef = React.useRef<string | null>(null);\n\n React.useEffect(() => {\n if (!lazy) return;\n\n const key = JSON.stringify(activeRules);\n\n if (lastLazyKeyRef.current === key) return;\n\n lastLazyKeyRef.current = key;\n onLazyLoadRef.current?.({ rules: activeRules, filterLocale });\n }, [lazy, activeRules, filterLocale]);\n\n const setRules = React.useCallback((next: FilterRule<TMode>[]) => commit(next), [commit]);\n\n const setValue = React.useCallback(\n (ruleIndex: number, value: unknown) => {\n const next = currentRules.map((r, i) => (i === ruleIndex ? { ...(r as FilterRuleSimple<TMode>), value } : r));\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const setMatchMode = React.useCallback(\n (ruleIndex: number, matchMode: TMode) => {\n const next = currentRules.map((r, i) => (i === ruleIndex ? { ...(r as FilterRuleSimple<TMode>), matchMode } : r));\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const setOperator = React.useCallback(\n (ruleIndex: number, operator: FilterOperator) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex) return r;\n\n if (!ruleIsComposite(r)) {\n return { field: r.field, operator, constraints: [{ value: r.value, matchMode: r.matchMode }] } as FilterRule<TMode>;\n }\n\n return { ...r, operator };\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const setConstraintValue = React.useCallback(\n (ruleIndex: number, constraintIndex: number, value: unknown) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex) return r;\n\n const constraints = ruleIsComposite(r) ? r.constraints.map((c, ci) => (ci === constraintIndex ? { ...c, value } : c)) : constraintIndex === 0 ? [{ value, matchMode: r.matchMode }] : (r.constraints ?? []);\n\n return { field: r.field, operator: ruleIsComposite(r) ? r.operator : undefined, constraints } as FilterRule<TMode>;\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const setConstraintMatchMode = React.useCallback(\n (ruleIndex: number, constraintIndex: number, matchMode: TMode) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex) return r;\n\n const constraints = ruleIsComposite(r) ? r.constraints.map((c, ci) => (ci === constraintIndex ? { ...c, matchMode } : c)) : constraintIndex === 0 ? [{ value: r.value, matchMode }] : (r.constraints ?? []);\n\n return { field: r.field, operator: ruleIsComposite(r) ? r.operator : undefined, constraints } as FilterRule<TMode>;\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const addRule = React.useCallback((rule: FilterRule<TMode>) => commit([...currentRules, rule]), [currentRules, commit]);\n\n const removeRule = React.useCallback(\n (ruleIndex: number) => {\n const next = currentRules.filter((_, i) => i !== ruleIndex);\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const clearRule = React.useCallback(\n (ruleIndex: number) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex) return r;\n\n if (ruleIsComposite(r)) {\n return { ...r, constraints: r.constraints.map((c) => ({ ...c, value: null })) };\n }\n\n return { ...r, value: null };\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const addConstraint = React.useCallback(\n (ruleIndex: number, matchMode?: TMode) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex) return r;\n\n const base = ruleIsComposite(r) ? r.constraints : [{ value: r.value, matchMode: r.matchMode }];\n\n return {\n field: r.field,\n operator: ruleIsComposite(r) ? r.operator : 'and',\n constraints: [...base, { value: null, matchMode: matchMode ?? (defaultMatchMode() as unknown as TMode) }]\n } as FilterRule<TMode>;\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const removeConstraint = React.useCallback(\n (ruleIndex: number, constraintIndex: number) => {\n const next = currentRules.map((r, i) => {\n if (i !== ruleIndex || !ruleIsComposite(r)) return r;\n\n const filtered = r.constraints.filter((_, ci) => ci !== constraintIndex);\n\n if (filtered.length === 0) return r;\n\n return { ...r, constraints: filtered };\n });\n\n commit(next);\n },\n [currentRules, commit]\n );\n\n const clearAll = React.useCallback(() => {\n const next = currentRules.map((r) => (ruleIsComposite(r) ? { ...r, constraints: r.constraints.map((c) => ({ ...c, value: null })) } : { ...r, value: null }));\n\n commit(next);\n }, [currentRules, commit]);\n\n const rule = React.useCallback(\n (key: number | string): FilterRuleCursor<TMode> | undefined => {\n const index = typeof key === 'number' ? key : currentRules.findIndex((r) => (Array.isArray(r.field) ? r.field.join(',') === key : r.field === key));\n\n if (index < 0 || !currentRules[index]) return undefined;\n\n const r = currentRules[index];\n const composite = ruleIsComposite(r);\n\n const constraintCursor = (ci: number): FilterConstraintCursor<TMode> | undefined => {\n const list = composite ? r.constraints : [{ value: r.value, matchMode: r.matchMode }];\n\n if (ci < 0 || ci >= list.length) return undefined;\n\n const c = list[ci];\n\n return {\n value: c.value,\n matchMode: c.matchMode,\n setValue: (v) => setConstraintValue(index, ci, v),\n setMatchMode: (m) => setConstraintMatchMode(index, ci, m),\n remove: () => removeConstraint(index, ci)\n };\n };\n\n return {\n field: r.field,\n value: composite ? undefined : r.value,\n matchMode: composite ? undefined : r.matchMode,\n operator: composite ? r.operator : undefined,\n constraints: composite ? r.constraints : undefined,\n setValue: (v) => setValue(index, v),\n setMatchMode: (m) => setMatchMode(index, m),\n setOperator: (op) => setOperator(index, op),\n addConstraint: (mm) => addConstraint(index, mm),\n constraint: constraintCursor,\n remove: () => removeRule(index),\n clear: () => clearRule(index)\n };\n },\n [currentRules, setValue, setMatchMode, setOperator, setConstraintValue, setConstraintMatchMode, addConstraint, removeConstraint, removeRule, clearRule]\n );\n\n return {\n rules: currentRules,\n filteredData,\n isFiltered,\n setRules,\n setValue,\n setMatchMode,\n setOperator,\n setConstraintValue,\n setConstraintMatchMode,\n addRule,\n removeRule,\n clearRule,\n addConstraint,\n removeConstraint,\n clearAll,\n rule,\n match,\n matchers\n };\n}\n\nexport function ruleHasValue<TMode extends string>(rule: FilterRule<TMode>): boolean {\n if (ruleIsComposite(rule)) {\n return rule.constraints.some((c) => c.value !== null && c.value !== undefined && c.value !== '');\n }\n\n return rule.value !== null && rule.value !== undefined && rule.value !== '';\n}\n","import { equals, removeAccents } from '@primeuix/utils/object';\n\nexport type FilterMatcher = (value: unknown, filter: unknown, filterLocale?: string) => boolean;\n\nfunction hasGetTime(x: unknown): x is { getTime: () => number } {\n return !!x && typeof (x as { getTime?: unknown }).getTime === 'function';\n}\n\nfunction norm(v: unknown, locale?: string) {\n return removeAccents(String(v)).toLocaleLowerCase(locale);\n}\n\nexport const BUILT_IN_MATCHERS = {\n startsWith(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return true;\n if (value === undefined || value === null) return false;\n\n return norm(value, locale).startsWith(norm(filter, locale));\n },\n contains(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return true;\n if (value === undefined || value === null) return false;\n\n return norm(value, locale).indexOf(norm(filter, locale)) !== -1;\n },\n notContains(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return true;\n if (value === undefined || value === null) return false;\n\n return norm(value, locale).indexOf(norm(filter, locale)) === -1;\n },\n endsWith(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return true;\n if (value === undefined || value === null) return false;\n\n return norm(value, locale).endsWith(norm(filter, locale));\n },\n equals(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() === filter.getTime();\n\n return norm(value, locale) === norm(filter, locale);\n },\n notEquals(value, filter, locale) {\n if (filter === undefined || filter === null || filter === '') return false;\n if (value === undefined || value === null) return true;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() !== filter.getTime();\n\n return norm(value, locale) !== norm(filter, locale);\n },\n in(value, filter) {\n if (!Array.isArray(filter) || filter.length === 0) return true;\n\n for (const f of filter) if (equals(value, f)) return true;\n\n return false;\n },\n between(value, filter) {\n if (!Array.isArray(filter) || filter[0] == null || filter[1] == null) return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter[0]) && hasGetTime(filter[1])) {\n return (filter[0] as { getTime: () => number }).getTime() <= value.getTime() && value.getTime() <= (filter[1] as { getTime: () => number }).getTime();\n }\n\n return (filter[0] as number) <= (value as number) && (value as number) <= (filter[1] as number);\n },\n lt(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() < filter.getTime();\n\n return (value as number) < (filter as number);\n },\n lte(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() <= filter.getTime();\n\n return (value as number) <= (filter as number);\n },\n gt(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() > filter.getTime();\n\n return (value as number) > (filter as number);\n },\n gte(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n if (hasGetTime(value) && hasGetTime(filter)) return value.getTime() >= filter.getTime();\n\n return (value as number) >= (filter as number);\n },\n dateIs(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n return (value as Date).toDateString() === (filter as Date).toDateString();\n },\n dateIsNot(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n return (value as Date).toDateString() !== (filter as Date).toDateString();\n },\n dateBefore(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n return (value as Date).getTime() < (filter as Date).getTime();\n },\n dateAfter(value, filter) {\n if (filter === undefined || filter === null) return true;\n if (value === undefined || value === null) return false;\n\n return (value as Date).getTime() > (filter as Date).getTime();\n }\n} as const satisfies Record<string, FilterMatcher>;\n\nexport type BuiltInMatchMode = keyof typeof BUILT_IN_MATCHERS;\n\nconst globalMatchers: Record<string, FilterMatcher> = {};\n\nexport function registerMatcher(name: string, fn: FilterMatcher): void {\n globalMatchers[name] = fn;\n}\n\nexport function unregisterMatcher(name: string): void {\n delete globalMatchers[name];\n}\n\nexport function getGlobalMatchers(): Readonly<Record<string, FilterMatcher>> {\n return globalMatchers;\n}\n","'use client';\nimport { useControlledState } from '@primereact/hooks/use-controlled-state';\nimport { BUILT_IN_MATCHERS, getGlobalMatchers, matchRule, registerMatcher, ruleHasValue, unregisterMatcher, type BuiltInMatchMode, type FilterMatcher, type FilterRule } from '@primereact/hooks/use-filter';\nimport { resolveFieldData } from '@primeuix/utils/object';\nimport * as React from 'react';\n\nexport { registerMatcher, unregisterMatcher };\n\nexport type TreeFilterMode = 'lenient' | 'strict';\n\nexport interface TreeNodeLike {\n key?: string | number;\n data?: Record<string, unknown>;\n children?: TreeNodeLike[];\n}\n\nexport interface UseTreeFilterOptions<TNode extends TreeNodeLike, TMode extends string = BuiltInMatchMode> {\n nodes: TNode[];\n rules?: FilterRule<TMode>[];\n defaultRules?: FilterRule<TMode>[];\n /**\n * Shorthand for the single-field case. When set, the hook synthesizes a single\n * `{ field, value, matchMode }` rule. Ignored when `rules` / `defaultRules` is provided.\n */\n field?: string | string[];\n /** Controlled value for the shorthand `field`. Omit to let the hook own the state. */\n value?: unknown;\n /** Initial value when the hook owns the state. */\n defaultValue?: unknown;\n /** Fires when the shorthand `value` changes. */\n onValueChange?: (value: unknown) => void;\n /** Match mode for the shorthand `field`. Defaults to `'contains'`. */\n matchMode?: TMode;\n matchers?: Partial<Record<TMode, FilterMatcher>> & Record<string, FilterMatcher>;\n filterMode?: TreeFilterMode;\n filterLocale?: string;\n filterDelay?: number;\n /** When true, `filteredNodes` is returned as-is; the consumer fetches filtered data itself. */\n lazy?: boolean;\n /** Fires after rules settle (honours `filterDelay`). The consumer is expected to fetch filtered tree data. */\n onLazyLoad?: (event: LazyTreeFilterEvent<TMode>) => void;\n onRulesChange?: (rules: FilterRule<TMode>[]) => void;\n}\n\nexport interface LazyTreeFilterEvent<TMode extends string = string> {\n rules: FilterRule<TMode>[];\n filterMode: TreeFilterMode;\n filterLocale?: string;\n}\n\nexport interface UseTreeFilterReturn<TNode extends TreeNodeLike, TMode extends string = string> {\n rules: FilterRule<TMode>[];\n filteredNodes: TNode[];\n isFiltered: boolean;\n setRules: (rules: FilterRule<TMode>[]) => void;\n value: unknown;\n setValue: (value: unknown) => void;\n clearAll: () => void;\n match: (node: TNode) => boolean;\n matchers: Readonly<Record<string, FilterMatcher>>;\n}\n\nfunction nodeTarget<TNode extends TreeNodeLike>(node: TNode, field: string): unknown {\n // Prefer `node.data` (DataTable-style node) when it's an object that owns the\n // field, otherwise fall back to the node itself (Tree-style where fields like\n // `label` live at the top level). `node.data` may also be a primitive (string\n // / number) — guard against that before using `in`.\n const dataIsObject = node.data !== null && typeof node.data === 'object';\n\n if (dataIsObject && field in (node.data as object)) {\n return (node.data as Record<string, unknown>)[field];\n }\n\n if (dataIsObject) {\n const fromData = resolveFieldData(node.data as Record<string, unknown>, field);\n\n if (fromData !== undefined) return fromData;\n }\n\n if (field in (node as Record<string, unknown>)) return (node as Record<string, unknown>)[field];\n\n return resolveFieldData(node as unknown as Record<string, unknown>, field);\n}\n\nfunction isLeaf(node: TreeNodeLike): boolean {\n return !node.children || node.children.length === 0;\n}\n\nfunction nodeMatchesDirect<TNode extends TreeNodeLike, TMode extends string>(node: TNode, rule: FilterRule<TMode>, matchers: Record<string, FilterMatcher>, locale: string | undefined): boolean {\n const fields = Array.isArray(rule.field) ? rule.field : [rule.field];\n const projected: Record<string, unknown> = {};\n\n for (const f of fields) projected[f] = nodeTarget(node, f);\n\n return matchRule(projected, { ...rule, field: fields } as FilterRule<TMode>, matchers, locale);\n}\n\nfunction filterTree<TNode extends TreeNodeLike, TMode extends string>(nodes: TNode[], rules: FilterRule<TMode>[], matchers: Record<string, FilterMatcher>, locale: string | undefined, strict: boolean): TNode[] {\n const out: TNode[] = [];\n\n for (const node of nodes) {\n const selfMatch = rules.every((rule) => nodeMatchesDirect(node, rule, matchers, locale));\n\n let childMatched: TNode[] | null = null;\n\n if (node.children && node.children.length > 0) {\n const kidsFiltered = filterTree(node.children as TNode[], rules, matchers, locale, strict);\n\n if (kidsFiltered.length > 0) childMatched = kidsFiltered;\n }\n\n // lenient: self match or any descendant match → keep (all original children)\n // strict: leaf → must self-match; parent → must have a matching descendant\n if (strict) {\n if (isLeaf(node)) {\n if (selfMatch) out.push(node);\n } else if (childMatched) {\n out.push({ ...node, children: childMatched } as TNode);\n }\n } else {\n if (selfMatch) {\n out.push(node);\n } else if (childMatched) {\n out.push({ ...node, children: childMatched } as TNode);\n }\n }\n }\n\n return out;\n}\n\nexport function useTreeFilter<TNode extends TreeNodeLike, TMode extends string = BuiltInMatchMode>(options: UseTreeFilterOptions<TNode, TMode>): UseTreeFilterReturn<TNode, TMode> {\n // ---- Shorthand mode (field / value / matchMode) -------------------------\n // Active only when `field` is provided AND no explicit `rules` / `defaultRules`.\n // `value` can be controlled (parent owns) or uncontrolled (hook owns via defaultValue).\n const isShorthand = options.field !== undefined && options.rules === undefined && options.defaultRules === undefined;\n const shorthandMatchMode = (options.matchMode ?? ('contains' as TMode)) as TMode;\n\n const [shorthandValue, setShorthandValue] = useControlledState<unknown, unknown>({\n value: options.value,\n defaultValue: options.defaultValue,\n onChange: options.onValueChange\n });\n\n const setValue = React.useCallback((next: unknown) => setShorthandValue(next), [setShorthandValue]);\n\n // ---- Rule-array mode (existing API) -------------------------------------\n const isControlled = options.rules !== undefined;\n const [internalRules, setInternalRules] = React.useState<FilterRule<TMode>[]>(options.defaultRules ?? []);\n\n const shorthandRules = React.useMemo<FilterRule<TMode>[]>(() => {\n if (!isShorthand) return [];\n\n return [{ field: options.field as string | string[], value: shorthandValue, matchMode: shorthandMatchMode } as FilterRule<TMode>];\n }, [isShorthand, options.field, shorthandValue, shorthandMatchMode]);\n\n const currentRules = isShorthand ? shorthandRules : isControlled ? (options.rules ?? []) : internalRules;\n\n const onRulesChangeRef = React.useRef(options.onRulesChange);\n\n onRulesChangeRef.current = options.onRulesChange;\n\n const commit = React.useCallback(\n (next: FilterRule<TMode>[]) => {\n if (isShorthand) {\n // In shorthand mode, the only mutable surface is `value`.\n setShorthandValue((next[0] as FilterRule<TMode> | undefined)?.value ?? null);\n } else if (!isControlled) {\n setInternalRules(next);\n }\n\n onRulesChangeRef.current?.(next);\n },\n [isShorthand, isControlled, setShorthandValue]\n );\n\n const filterLocale = options.filterLocale;\n const filterDelay = options.filterDelay ?? 0;\n const filterMode = options.filterMode ?? 'lenient';\n\n const matchers = React.useMemo<Record<string, FilterMatcher>>(() => ({ ...(BUILT_IN_MATCHERS as Record<string, FilterMatcher>), ...getGlobalMatchers(), ...(options.matchers ?? {}) }), [options.matchers]);\n\n const [debouncedRules, setDebouncedRules] = React.useState<FilterRule<TMode>[]>(currentRules);\n\n React.useEffect(() => {\n if (filterDelay <= 0) return;\n\n const t = setTimeout(() => setDebouncedRules(currentRules), filterDelay);\n\n return () => clearTimeout(t);\n }, [currentRules, filterDelay]);\n\n const activeRules = filterDelay > 0 ? debouncedRules : currentRules;\n const activeRulesNonEmpty = React.useMemo(() => activeRules.filter(ruleHasValue), [activeRules]);\n\n const match = React.useCallback((node: TNode) => activeRulesNonEmpty.every((rule) => nodeMatchesDirect(node, rule, matchers, filterLocale)), [activeRulesNonEmpty, matchers, filterLocale]);\n\n const lazy = !!options.lazy;\n\n const filteredNodes = React.useMemo(() => {\n if (lazy) return options.nodes;\n\n if (activeRulesNonEmpty.length === 0) return options.nodes;\n\n return filterTree(options.nodes, activeRulesNonEmpty, matchers, filterLocale, filterMode === 'strict');\n }, [lazy, options.nodes, activeRulesNonEmpty, matchers, filterLocale, filterMode]);\n\n const onLazyLoadRef = React.useRef(options.onLazyLoad);\n\n onLazyLoadRef.current = options.onLazyLoad;\n\n const lastLazyKeyRef = React.useRef<string | null>(null);\n\n React.useEffect(() => {\n if (!lazy) return;\n\n const key = JSON.stringify(activeRules) + '|' + filterMode;\n\n if (lastLazyKeyRef.current === key) return;\n\n lastLazyKeyRef.current = key;\n onLazyLoadRef.current?.({ rules: activeRules, filterMode, filterLocale });\n }, [lazy, activeRules, filterMode, filterLocale]);\n\n const setRules = React.useCallback((next: FilterRule<TMode>[]) => commit(next), [commit]);\n\n const clearAll = React.useCallback(() => {\n const next = currentRules.map((r) =>\n Array.isArray((r as { constraints?: unknown }).constraints) ? { ...r, constraints: (r as { constraints: { value: unknown; matchMode?: TMode }[] }).constraints.map((c) => ({ ...c, value: null })) } : { ...r, value: null }\n ) as FilterRule<TMode>[];\n\n commit(next);\n }, [currentRules, commit]);\n\n return {\n rules: currentRules,\n filteredNodes,\n isFiltered: activeRulesNonEmpty.length > 0,\n setRules,\n value: shorthandValue,\n setValue,\n clearAll,\n match,\n matchers\n };\n}\n","import * as React from 'react';\n\nexport type UseHotKeyTarget = Document | HTMLElement | null | undefined;\n\nexport interface UseHotKeyOptions {\n /**\n * Target to listen on. Defaults to `document` when available.\n */\n target?: UseHotKeyTarget;\n /**\n * Keyboard event type.\n * @default 'keydown'\n */\n event?: 'keydown' | 'keyup' | 'keypress';\n /**\n * Enables or disables the listener.\n * @default true\n */\n when?: boolean;\n}\n\n/**\n * Runs the provided handler when any of the given keys is pressed.\n *\n * @param keys A single key or an array of keys to listen for (e.g. 'k' or 'ctrl+k').\n * @param handler Callback fired when a matching key event occurs.\n * @param options Optional configuration for target, event type, and enable flag.\n */\nexport function useHotKey(keys: string | string[], handler: (event: KeyboardEvent) => void, options: UseHotKeyOptions = {}) {\n const { target, event = 'keydown', when = true } = options;\n const handlerRef = React.useRef(handler);\n\n const normalizeKey = (key: string) => {\n const lower = key.toLowerCase();\n\n if (lower === 'space' || lower === 'spacebar') return ' ';\n\n return lower;\n };\n\n const parseKeySpec = (spec: string) => {\n const parts = spec\n .split('+')\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean);\n\n let key: string | undefined;\n const required = {\n ctrl: false,\n meta: false,\n alt: false,\n shift: false\n };\n\n parts.forEach((part) => {\n switch (part) {\n case 'ctrl':\n case 'control':\n required.ctrl = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n required.meta = true;\n break;\n case 'alt':\n case 'option':\n required.alt = true;\n break;\n case 'shift':\n required.shift = true;\n break;\n default:\n key = normalizeKey(part);\n }\n });\n\n return { key, required };\n };\n\n const matches = (spec: ReturnType<typeof parseKeySpec>, event: KeyboardEvent) => {\n if (!spec.key) return false;\n\n const { required } = spec;\n\n if (required.ctrl !== event.ctrlKey || required.meta !== event.metaKey || required.alt !== event.altKey || required.shift !== event.shiftKey) {\n return false;\n }\n\n return normalizeKey(event.key) === spec.key;\n };\n\n React.useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n if (!when) {\n return;\n }\n\n const targetElement: UseHotKeyTarget = target ?? (typeof document !== 'undefined' ? document : null);\n\n if (!targetElement) {\n return;\n }\n\n const keySpecs = (Array.isArray(keys) ? keys : [keys]).map(parseKeySpec);\n\n const listener: EventListener = (event) => {\n const keyboardEvent = event as KeyboardEvent;\n\n if (keySpecs.some((spec) => matches(spec, keyboardEvent))) {\n handlerRef.current?.(keyboardEvent);\n }\n };\n\n targetElement.addEventListener(event, listener);\n\n return () => {\n targetElement.removeEventListener(event, listener);\n };\n }, [event, keys, target, when]);\n}\n","import * as React from 'react';\n\n/**\n * Generates a unique identifier.\n *\n * @param initialValue Optional initial value for the ID.\n * @returns The generated or provided ID.\n *\n * @example\n * ```tsx\n * const id = useId('foo');\n * console.log(id); // 'foo'\n * ```\n *\n * @example\n * ```tsx\n * const defaultId = useId();\n * console.log(defaultId); // e.g., 'pr_id_0'\n * ```\n */\nexport function useId(initialValue?: string): string {\n const idx = React.useId();\n const [idState, setIdState] = React.useState<string>(initialValue || `pr_id_${idx.replaceAll(/:|«|»/g, '')}`);\n\n React.useEffect(() => {\n setIdState(initialValue || `pr_id_${idx.replaceAll(/:|«|»/g, '')}`);\n }, [initialValue, idx]);\n\n return idState;\n}\n","import { isAndroid } from '@primeuix/utils';\n\n/**\n * The options for the `useKeyFilter` hook.\n */\nexport interface UseKeyFilterOptions {\n /**\n * Sets the pattern for key filtering.\n * @default /./\n */\n pattern?: 'pint' | 'int' | 'pnum' | 'money' | 'num' | 'hex' | 'email' | 'alpha' | 'alphanum' | RegExp;\n /**\n * When enabled, instead of blocking keys, input is validated internally to test against the regular expression.\n * @default false\n */\n validateOnly?: boolean;\n}\n\nexport interface UseKeyFilterExposes {\n /**\n * Handles input events for key filter.\n * Processes character input and composition events while applying the filter pattern.\n * @param event - The form or composition event from the input element\n */\n onBeforeInput: (event: React.CompositionEvent<HTMLInputElement>) => void;\n /**\n * Handles keypress events for character input validation.\n * Validates and places characters according to the filter pattern.\n * @param event - The keyboard event from the input element\n */\n onKeyPress: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /**\n * Handles paste events for clipboard content insertion.\n * Processes pasted content according to the mask pattern.\n * @param event - The clipboard event from the input element\n */\n onPaste: (event: React.ClipboardEvent<HTMLInputElement>) => void;\n /**\n * Validates the current input value against the filter pattern.\n * @param event - The form event from the input element\n * @returns true if the value matches the pattern, false otherwise\n */\n validate: (event: React.FormEvent<HTMLInputElement>) => boolean;\n}\n\nexport function useKeyFilter(options: UseKeyFilterOptions): UseKeyFilterExposes {\n const { pattern = /./, validateOnly = false } = options;\n\n const DEFAULT_MASKS = {\n pint: /[\\d]/,\n int: /[\\d-]/,\n pnum: /[\\d.]/,\n money: /[\\d.\\s,]/,\n num: /[\\d-.]/,\n hex: /[0-9a-f]/i,\n email: /[a-z0-9_.-@]/i,\n alpha: /[a-z_]/i,\n alphanum: /[a-z0-9_]/\n };\n\n const getRegex = (): RegExp => {\n return typeof pattern === 'string' ? DEFAULT_MASKS[pattern] : pattern;\n };\n\n const onBeforeInput = (event: React.CompositionEvent<HTMLInputElement>) => {\n // android devices must use beforeinput https://stackoverflow.com/questions/36753548/keycode-on-android-is-always-229\n if (validateOnly || !isAndroid()) {\n return;\n }\n\n validateKey(event, event.data);\n };\n\n const onKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // non android devices use keydown\n if (validateOnly || isAndroid()) {\n return;\n }\n\n if (event.ctrlKey || event.altKey || event.metaKey) {\n return;\n }\n\n validateKey(event, event.key);\n };\n\n const onPaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n if (validateOnly) {\n return;\n }\n\n const regex = getRegex();\n const clipboard = event.clipboardData.getData('text');\n\n // loop over each letter pasted and if any fail prevent the paste\n [...clipboard].forEach((c) => {\n if (!regex.test(c)) {\n event.preventDefault();\n\n return false;\n }\n });\n };\n\n const validateKey = (event: React.CompositionEvent<HTMLInputElement> | React.KeyboardEvent<HTMLInputElement>, key: string) => {\n if (key === null || key === undefined) {\n return;\n }\n\n // some AZERTY keys come in with 2 chars like ´ç if Dead key is pressed first\n const isPrintableKey = key.length <= 2;\n\n if (!isPrintableKey) {\n return;\n }\n\n const regex = getRegex();\n\n if (!regex.test(key)) {\n event.preventDefault();\n }\n };\n\n const validate = (event: React.FormEvent<HTMLInputElement>) => {\n const value = (event.target as HTMLInputElement).value;\n let validatePattern = true;\n\n const regex = getRegex();\n\n if (value && !regex.test(value)) {\n validatePattern = false;\n }\n\n return validatePattern;\n };\n\n return {\n onBeforeInput,\n onKeyPress,\n onPaste,\n validate\n };\n}\n","import * as React from 'react';\n\n/**\n * The options for the `useLocalStorage` hook.\n */\nexport interface UseLocalStorageOptions<T = unknown> {\n /**\n * The key to use in localStorage.\n */\n key: string;\n /**\n * The initial value to use when no value is found in localStorage.\n */\n initialValue: T;\n /**\n * Custom serializer function. Defaults to `JSON.stringify`.\n */\n serializer?: (value: T) => string;\n /**\n * Custom deserializer function. Defaults to `JSON.parse`.\n */\n deserializer?: (value: string) => T;\n}\n\n/**\n * The return type of the `useLocalStorage` hook.\n * A tuple containing:\n * 1. The current stored value.\n * 2. A setter function to update the value.\n * 3. A function to remove the value from localStorage.\n */\nexport type UseLocalStorageReturnType<T = unknown> = [T, React.Dispatch<React.SetStateAction<T>>, () => void];\n\n/**\n * A custom hook that syncs state with localStorage.\n * Uses initialValue for SSR and first client render to avoid hydration mismatch,\n * then reads the stored value in useLayoutEffect (before paint) so no flash occurs.\n *\n * @param {UseLocalStorageOptions} options - The options for the local storage hook.\n * @returns A tuple containing the current value, a setter function, and a remove function.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const [sizes, setSizes, removeSizes] = useLocalStorage({\n * key: 'splitter-sizes',\n * initialValue: [50, 50]\n * });\n *\n * return (\n * <Splitter.Root sizes={sizes} onResizeEnd={(e) => setSizes(e.sizes)}>\n * <Splitter.Panel />\n * <Splitter.Panel />\n * </Splitter.Root>\n * );\n * };\n * ```\n */\nexport function useLocalStorage<T>({ key, initialValue, serializer = JSON.stringify, deserializer = JSON.parse }: UseLocalStorageOptions<T>): UseLocalStorageReturnType<T> {\n const [storedValue, setStoredValue] = React.useState<T>(initialValue);\n const hydrated = React.useRef(false);\n\n // Read from localStorage before paint (after hydration).\n // Triggers a synchronous re-render so the user never sees the initialValue flash.\n React.useLayoutEffect(() => {\n try {\n const item = window.localStorage.getItem(key);\n\n if (item !== null) {\n setStoredValue(deserializer(item));\n }\n } catch {\n // Storage unavailable\n }\n\n hydrated.current = true;\n }, [key, deserializer]);\n\n // Write to localStorage on changes (skip until hydration is complete)\n React.useEffect(() => {\n if (!hydrated.current) return;\n\n try {\n window.localStorage.setItem(key, serializer(storedValue));\n } catch {\n // Storage full or unavailable\n }\n }, [key, storedValue, serializer]);\n\n const remove = React.useCallback(() => {\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Storage unavailable\n }\n\n setStoredValue(initialValue);\n }, [key, initialValue]);\n\n return [storedValue, setStoredValue, remove];\n}\n","import { getUserAgent } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * Event payload for `useMask` value/complete callbacks.\n */\nexport interface UseMaskValueChangeEvent {\n /**\n * The DOM event that triggered the change, or `null` for programmatic\n * updates (`setValue`, `reset`).\n */\n originalEvent: Event | null;\n /**\n * Masked value (e.g. `\"12/05/2026\"`). Always in masked form.\n */\n value: string;\n /**\n * Unmasked (raw) value (e.g. `\"12052026\"`). Separators and placeholder\n * characters are stripped.\n */\n rawValue: string;\n /**\n * Whether all required slots are filled.\n */\n isComplete: boolean;\n}\n\n/**\n * Options for the `useMask` hook.\n */\nexport interface UseMaskOptions {\n /**\n * Mask pattern. Built-in tokens:\n * - `9` → [0-9]\n * - `a` → [A-Za-z]\n * - `A` → [A-Z]\n * - `*` → [A-Za-z0-9]\n * Append `?` to mark the remainder of the mask as optional. Extend with\n * the `tokens` option.\n */\n mask: string;\n /**\n * Custom token map merged on top of the built-in tokens. Each token\n * character is matched against the supplied RegExp.\n * @example { '#': /[0-9]/, H: /[A-Fa-f0-9]/ }\n */\n tokens?: Record<string, RegExp>;\n /**\n * Controlled masked value. When provided, the hook operates in\n * controlled mode.\n */\n value?: string;\n /**\n * Initial masked value for uncontrolled mode. Ignored when `value` is\n * provided.\n */\n defaultValue?: string;\n /**\n * Fires whenever the value changes (typing, paste, programmatic).\n */\n onValueChange?: (event: UseMaskValueChangeEvent) => void;\n /**\n * Fires when the value transitions to complete (all required slots\n * filled). Re-fires if the value becomes incomplete and is completed\n * again.\n */\n onComplete?: (event: UseMaskValueChangeEvent) => void;\n /**\n * Placeholder character for empty slots. Pass `null` to skip filling\n * empty slots visually.\n * @default '_'\n */\n slotChar?: string | null;\n /**\n * Whether to render the mask skeleton on focus.\n * @default false\n */\n showMaskOnFocus?: boolean;\n /**\n * Always render the mask skeleton, regardless of focus state.\n * @default false\n */\n alwaysShowMask?: boolean;\n /**\n * Clear an incomplete value on blur.\n * @default true\n */\n autoClear?: boolean;\n /**\n * Transform every character before token validation (e.g. uppercase).\n */\n transform?: (char: string) => string;\n /**\n * Read-only mode. Typing is blocked; programmatic `setValue` still\n * works.\n * @default false\n */\n readOnly?: boolean;\n}\n\n/**\n * Return type of the `useMask` hook.\n */\nexport interface UseMaskReturn {\n /**\n * Ref callback for the target `<input>` (or `<textarea>`). Attaches\n * native event listeners on mount and tears them down on unmount or\n * when the ref switches to a new element.\n */\n ref: (element: HTMLInputElement | null) => void;\n /**\n * Current masked value (always reflects what is in the input).\n */\n value: string;\n /**\n * Current unmasked (raw) value.\n */\n rawValue: string;\n /**\n * Whether all required slots are filled.\n */\n isComplete: boolean;\n /**\n * Programmatically set the masked value. The value is normalized\n * through the mask before being applied.\n */\n setValue: (next: string) => void;\n /**\n * Reset the input to an empty mask skeleton.\n */\n reset: () => void;\n}\n\nconst DEFAULT_TOKENS: Record<string, RegExp> = {\n '9': /[0-9]/,\n a: /[A-Za-z]/,\n A: /[A-Z]/,\n '*': /[A-Za-z0-9]/\n};\n\n/**\n * React hook for masked text input. Attach the returned `ref` to any\n * component that forwards a ref to a real `<input>` (e.g. `InputText`,\n * `Textarea`, `DatePicker.Input`). The hook installs DOM event listeners\n * directly on the element, so no other props need to be wired.\n *\n * @example\n * const { ref, value, rawValue, isComplete } = useMask({ mask: '99/99/9999' });\n * return <InputText ref={ref} placeholder=\"DD/MM/YYYY\" />;\n */\nexport function useMask(options: UseMaskOptions): UseMaskReturn {\n const { mask, tokens: userTokens, value: controlledValue, defaultValue, onValueChange, onComplete, slotChar = '_', showMaskOnFocus = false, alwaysShowMask = false, autoClear = true, transform, readOnly = false } = options;\n\n // Latest callback refs so handlers always see the freshest values\n // without forcing the listener registration to re-run on every render.\n const onValueChangeRef = React.useRef(onValueChange);\n\n onValueChangeRef.current = onValueChange;\n const onCompleteRef = React.useRef(onComplete);\n\n onCompleteRef.current = onComplete;\n const transformRef = React.useRef(transform);\n\n transformRef.current = transform;\n\n // Controlled / uncontrolled hybrid state. The hook owns an internal\n // string that mirrors the masked DOM value. When the consumer passes\n // `value` we operate in controlled mode and ignore internal state for\n // the public `value` field. Internal state still drives derived\n // outputs (`rawValue`, `isComplete`) when uncontrolled.\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = React.useState<string>(defaultValue ?? '');\n const value = isControlled ? (controlledValue ?? '') : internalValue;\n const setStateValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n },\n [isControlled]\n );\n\n // ---------------------------------------------------------------------\n // Mask engine state — preserved from the previous implementation. These\n // refs hold the parsed mask metadata and the live character buffer.\n // ---------------------------------------------------------------------\n const targetRef = React.useRef<HTMLInputElement | null>(null);\n const len = React.useRef(0);\n const tests = React.useRef<Array<RegExp | null>>([]);\n const buffer = React.useRef<string[]>([]);\n const defaultBuffer = React.useRef<string>('');\n const partialPosition = React.useRef<number>(0);\n const androidChrome = React.useRef(false);\n const focus = React.useRef(false);\n const focusText = React.useRef<string | null>(null);\n const firstNonMaskPos = React.useRef<number | null>(null);\n const lastRequiredNonMaskPos = React.useRef<number>(0);\n const caretTimeoutId = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const oldVal = React.useRef<string | null>(null);\n const currentVal = React.useRef<string | null>(null);\n const wasComplete = React.useRef(false);\n const lastEmittedValue = React.useRef<string | null>(null);\n\n // Cached options so handlers don't capture stale closures when options\n // change between renders.\n const optsRef = React.useRef({ slotChar, showMaskOnFocus, alwaysShowMask, autoClear, readOnly, mask, userTokens });\n\n optsRef.current = { slotChar, showMaskOnFocus, alwaysShowMask, autoClear, readOnly, mask, userTokens };\n\n // ---------------------------------------------------------------------\n // Helpers (all read `targetRef.current` lazily so a ref swap is safe).\n // ---------------------------------------------------------------------\n\n const getPlaceholder = React.useCallback((i: number) => {\n const sc = optsRef.current.slotChar;\n\n if (sc == null) return '';\n\n if (i < sc.length) return sc.charAt(i);\n\n return sc.charAt(0);\n }, []);\n\n const caret = React.useCallback((first?: number, last?: number): { begin: number; end: number } | undefined => {\n const target = targetRef.current;\n let begin = 0;\n let end = 0;\n\n if (!target) return { begin, end };\n\n if (typeof first === 'number') {\n begin = first;\n end = typeof last === 'number' ? last : begin;\n target.setSelectionRange(begin, end);\n } else {\n begin = target.selectionStart ?? 0;\n end = target.selectionEnd ?? 0;\n }\n\n return { begin, end };\n }, []);\n\n const seekNext = React.useCallback((pos: number) => {\n while (++pos < len.current && !tests.current[pos]);\n\n return pos;\n }, []);\n\n const seekPrev = React.useCallback((pos: number) => {\n while (--pos >= 0 && !tests.current[pos]);\n\n return pos;\n }, []);\n\n // Track whether we're currently writing to the DOM ourselves, so the\n // resulting `input` event doesn't re-enter our own handler chain.\n const internalWrite = React.useRef(false);\n\n // DOM value setter using React's native value setter so React's\n // `_valueTracker` stays in sync. Note: this only mutates the DOM —\n // it intentionally does NOT dispatch an `input` event. We dispatch\n // exactly once per user-visible change (see `notifyReact` below)\n // to avoid firing React `onChange` mid-operation and to keep\n // downstream consumers (e.g. DatePicker.Input parsing the value)\n // from seeing intermediate buffer states.\n const setNativeValue = React.useCallback((target: HTMLInputElement, next: string) => {\n const proto = window.HTMLInputElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;\n\n if (setter) setter.call(target, next);\n else target.value = next;\n }, []);\n\n // Notify React (and any other React-side onChange listeners) that\n // the input value has changed. Wraps the dispatch in `internalWrite`\n // so our own native `input` listener doesn't re-process the event.\n const notifyReact = React.useCallback((target: HTMLInputElement) => {\n internalWrite.current = true;\n try {\n target.dispatchEvent(new Event('input', { bubbles: true }));\n } finally {\n internalWrite.current = false;\n }\n }, []);\n\n const writeBuffer = React.useCallback(() => {\n const target = targetRef.current;\n\n if (!target) return;\n setNativeValue(target, buffer.current.join(''));\n }, [setNativeValue]);\n\n const clearBuffer = React.useCallback(\n (start: number, end: number) => {\n for (let i = start; i < end && i < len.current; i++) {\n if (tests.current[i]) buffer.current[i] = getPlaceholder(i);\n }\n },\n [getPlaceholder]\n );\n\n const shiftL = React.useCallback(\n (begin: number, end: number) => {\n if (begin < 0) return;\n\n let j = seekNext(end);\n\n for (let i = begin; i < len.current; i++) {\n if (tests.current[i]) {\n if (j < len.current && tests.current[i]?.test(buffer.current[j])) {\n buffer.current[i] = buffer.current[j];\n buffer.current[j] = getPlaceholder(j);\n } else {\n break;\n }\n\n j = seekNext(j);\n }\n }\n\n writeBuffer();\n caret(Math.max(firstNonMaskPos.current ?? 0, begin));\n },\n [seekNext, getPlaceholder, writeBuffer, caret]\n );\n\n const shiftR = React.useCallback(\n (pos: number) => {\n let c = getPlaceholder(pos);\n\n for (let i = pos; i < len.current; i++) {\n if (tests.current[i]) {\n const j = seekNext(i);\n const t = buffer.current[i];\n\n buffer.current[i] = c;\n\n if (j < len.current && tests.current[j]?.test(t)) {\n c = t;\n } else {\n break;\n }\n }\n }\n },\n [getPlaceholder, seekNext]\n );\n\n const checkVal = React.useCallback(\n (allow = false): number => {\n const target = targetRef.current;\n\n if (!target) return firstNonMaskPos.current ?? 0;\n\n const test = target.value;\n let lastMatch = -1;\n let i: number;\n let c: string;\n let pos: number;\n\n for (i = 0, pos = 0; i < len.current; i++) {\n const currentTest = tests.current[i];\n\n if (currentTest !== null) {\n buffer.current[i] = getPlaceholder(i);\n\n while (pos++ < (test?.length ?? 0)) {\n c = test?.charAt(pos - 1) ?? '';\n\n if (currentTest.test(c)) {\n buffer.current[i] = c;\n lastMatch = i;\n break;\n }\n }\n\n if (pos > (test?.length ?? 0)) {\n clearBuffer(i + 1, len.current);\n break;\n }\n } else {\n if (buffer.current[i] === test?.charAt(pos)) pos++;\n\n if (i < partialPosition.current) lastMatch = i;\n }\n }\n\n if (allow) {\n writeBuffer();\n } else if (lastMatch + 1 < partialPosition.current) {\n if (optsRef.current.autoClear || buffer.current.join('') === defaultBuffer.current) {\n if (target.value) setNativeValue(target, '');\n clearBuffer(0, len.current);\n } else {\n writeBuffer();\n }\n } else {\n writeBuffer();\n setNativeValue(target, target.value.substring(0, lastMatch + 1));\n }\n\n return partialPosition.current ? i! : (firstNonMaskPos.current ?? 0);\n },\n [getPlaceholder, clearBuffer, writeBuffer, setNativeValue]\n );\n\n const unmaskValue = React.useCallback(\n (masked: string) => {\n const out: string[] = [];\n const chars = masked.split('');\n\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i];\n\n if (tests.current[i] && c !== getPlaceholder(i)) {\n out.push(c);\n }\n }\n\n return out.join('');\n },\n [getPlaceholder]\n );\n\n const computeIsComplete = React.useCallback((maskedValue: string) => {\n // Complete when the buffer up to lastRequiredNonMaskPos has no\n // placeholders in its required slots.\n const chars = maskedValue.split('');\n\n for (let i = 0; i <= lastRequiredNonMaskPos.current && i < len.current; i++) {\n if (tests.current[i]) {\n const c = chars[i];\n\n if (!c || !tests.current[i]?.test(c)) return false;\n }\n }\n\n return true;\n }, []);\n\n // Single source of truth for emitting changes. Reads the current DOM\n // value, notifies React (so onChange handlers fire), derives\n // rawValue/isComplete, syncs internal state, and fires user callbacks.\n const emitChange = React.useCallback(\n (originalEvent: Event | null) => {\n const target = targetRef.current;\n\n if (!target) return;\n\n const masked = target.value;\n const isDefault = masked === defaultBuffer.current;\n const reported = isDefault ? '' : masked;\n\n if (lastEmittedValue.current === reported) return;\n lastEmittedValue.current = reported;\n\n // Notify React-side `onChange` handlers (e.g. DatePicker.Input's\n // parser) that the DOM value has changed. The flag `internalWrite`\n // prevents our own listener from re-processing this dispatch.\n // We only dispatch when the originating event was NOT a native\n // `input` event — for those, React already gets the change via\n // the original event.\n if (originalEvent?.type !== 'input') {\n notifyReact(target);\n }\n\n const rawValue = isDefault ? '' : unmaskValue(masked);\n const complete = !isDefault && computeIsComplete(masked);\n const eventPayload: UseMaskValueChangeEvent = {\n originalEvent,\n value: reported,\n rawValue,\n isComplete: complete\n };\n\n // Mirror DOM into hook's internal state (no-op in controlled mode).\n setStateValue(reported);\n\n onValueChangeRef.current?.(eventPayload);\n\n if (complete && !wasComplete.current) {\n onCompleteRef.current?.(eventPayload);\n }\n\n wasComplete.current = complete;\n currentVal.current = masked;\n },\n [unmaskValue, computeIsComplete, setStateValue, notifyReact]\n );\n\n // ---------------------------------------------------------------------\n // Event handlers — invoked from native DOM listeners installed in the\n // ref callback below.\n // ---------------------------------------------------------------------\n\n const handleInputChange = React.useCallback(\n (event: Event) => {\n if (optsRef.current.readOnly) return;\n if (event.type === 'paste') return;\n\n const pos = checkVal(true);\n\n caret(pos);\n emitChange(event);\n },\n [checkVal, caret, emitChange]\n );\n\n const handleAndroidInput = React.useCallback(\n (event: Event) => {\n const target = targetRef.current;\n\n if (!target) return;\n\n const curVal = target.value;\n const pos = caret();\n\n if (!pos) return;\n\n if (oldVal.current && oldVal.current.length && oldVal.current.length > curVal.length) {\n checkVal(true);\n while (pos.begin > 0 && !tests.current[pos.begin - 1]) pos.begin--;\n\n if (pos.begin === 0) {\n while (pos.begin < (firstNonMaskPos.current ?? 0) && !tests.current[pos.begin]) pos.begin++;\n }\n\n caret(pos.begin, pos.begin);\n } else {\n checkVal(true);\n while (pos.begin < len.current && !tests.current[pos.begin]) pos.begin++;\n caret(pos.begin, pos.begin);\n }\n\n emitChange(event);\n },\n [caret, checkVal, emitChange]\n );\n\n const onInput = React.useCallback(\n (event: Event) => {\n const target = targetRef.current;\n\n if (!target) return;\n // Ignore our own re-dispatched input events — they exist only to\n // notify React listeners (e.g. DatePicker.Input's onChange parse).\n if (internalWrite.current) return;\n\n if ('isComposing' in event && (event as InputEvent).isComposing) return;\n\n if (androidChrome.current) handleAndroidInput(event);\n else handleInputChange(event);\n },\n [handleAndroidInput, handleInputChange]\n );\n\n const onKeyDown = React.useCallback(\n (event: KeyboardEvent) => {\n const target = targetRef.current;\n\n if (!target || optsRef.current.readOnly) return;\n\n const k = event.code;\n let pos: { begin: number; end: number } | undefined;\n let begin: number;\n let end: number;\n const iPhone = /iphone/i.test(getUserAgent());\n\n oldVal.current = target.value;\n\n if (k === 'Backspace' || k === 'Delete' || (iPhone && k === 'Escape')) {\n pos = caret();\n\n if (!pos) return;\n\n begin = pos.begin;\n end = pos.end;\n\n if (end - begin === 0) {\n begin = k !== 'Delete' ? seekPrev(begin) : (end = seekNext(begin - 1));\n end = k === 'Delete' ? seekNext(end) : end;\n }\n\n clearBuffer(begin, end);\n shiftL(begin, end - 1);\n emitChange(event);\n\n event.preventDefault();\n } else if (k === 'Enter') {\n target.blur();\n emitChange(event);\n } else if (k === 'Escape') {\n setNativeValue(target, focusText.current ?? '');\n caret(0, checkVal());\n emitChange(event);\n event.preventDefault();\n }\n },\n [caret, seekPrev, seekNext, clearBuffer, shiftL, emitChange, setNativeValue, checkVal]\n );\n\n const onKeyPress = React.useCallback(\n (event: KeyboardEvent) => {\n const target = targetRef.current;\n\n if (!target || optsRef.current.readOnly) return;\n\n const k = event.code;\n const pos = caret();\n\n if (!pos) return;\n\n if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey || event.key === 'CapsLock' || event.key === 'Escape' || event.key === 'Tab') {\n return;\n }\n\n if (k && k !== 'Enter') {\n if (pos.end - pos.begin !== 0) {\n clearBuffer(pos.begin, pos.end);\n shiftL(pos.begin, pos.end - 1);\n }\n\n const p = seekNext(pos.begin - 1);\n\n if (p < len.current) {\n let c = event.key;\n\n if (transformRef.current) c = transformRef.current(c);\n\n if (tests.current[p]?.test(c)) {\n shiftR(p);\n buffer.current[p] = c;\n writeBuffer();\n const next = seekNext(p);\n\n if (/android/i.test(getUserAgent())) {\n setTimeout(() => caret(next), 0);\n } else {\n caret(next);\n }\n }\n }\n\n event.preventDefault();\n }\n\n emitChange(event);\n },\n [caret, clearBuffer, shiftL, seekNext, shiftR, writeBuffer, emitChange]\n );\n\n const onFocus = React.useCallback(\n (_event: FocusEvent) => {\n const target = targetRef.current;\n\n if (!target || optsRef.current.readOnly) return;\n if (caretTimeoutId.current) clearTimeout(caretTimeoutId.current);\n focus.current = true;\n focusText.current = target.value;\n\n const shouldShowSkeleton = optsRef.current.showMaskOnFocus || optsRef.current.alwaysShowMask;\n\n if (!target.value || target.value === defaultBuffer.current) {\n if (shouldShowSkeleton) {\n setNativeValue(target, defaultBuffer.current);\n }\n\n requestAnimationFrame(() => {\n if (target === document.activeElement) {\n caret(firstNonMaskPos.current ?? 0, firstNonMaskPos.current ?? 0);\n }\n });\n } else {\n const pos = checkVal();\n\n caretTimeoutId.current = setTimeout(() => {\n if (target !== document.activeElement) return;\n writeBuffer();\n\n if (pos === optsRef.current.mask?.replace('?', '').length) {\n caret(0, pos);\n } else {\n caret(pos);\n }\n }, 10);\n }\n },\n [caret, checkVal, writeBuffer, setNativeValue]\n );\n\n const onBlur = React.useCallback(\n (event: FocusEvent) => {\n const target = targetRef.current;\n\n if (!target) return;\n focus.current = false;\n checkVal();\n\n if (!optsRef.current.alwaysShowMask && target.value === defaultBuffer.current) {\n setNativeValue(target, '');\n }\n\n emitChange(event);\n\n if (target.value !== focusText.current) {\n target.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));\n }\n },\n [checkVal, emitChange, setNativeValue]\n );\n\n const onPaste = React.useCallback(\n (event: Event) => {\n const target = targetRef.current;\n\n if (!target || optsRef.current.readOnly) return;\n\n // Defer to next tick so the pasted content is already in the input,\n // then run a full revalidation through checkVal(true).\n setTimeout(() => {\n const pos = checkVal(true);\n\n caret(pos);\n emitChange(event);\n }, 0);\n },\n [checkVal, caret, emitChange]\n );\n\n // ---------------------------------------------------------------------\n // Mask initialization: parses the pattern into the tests/buffer refs\n // and writes the initial value into the bound input (if any).\n // ---------------------------------------------------------------------\n const initMask = React.useCallback(() => {\n tests.current = [];\n partialPosition.current = mask ? mask.length : 0;\n len.current = mask ? mask.length : 0;\n firstNonMaskPos.current = null;\n lastRequiredNonMaskPos.current = 0;\n\n const tokenMap: Record<string, RegExp> = { ...DEFAULT_TOKENS, ...userTokens };\n const ua = getUserAgent();\n\n androidChrome.current = /chrome/i.test(ua) && /android/i.test(ua);\n\n const maskTokens = mask ? mask.split('') : [];\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c === '?') {\n len.current--;\n partialPosition.current = i;\n } else if (tokenMap[c]) {\n tests.current.push(tokenMap[c]);\n\n if (firstNonMaskPos.current === null) {\n firstNonMaskPos.current = tests.current.length - 1;\n }\n\n if (i < partialPosition.current) {\n lastRequiredNonMaskPos.current = tests.current.length - 1;\n }\n } else {\n tests.current.push(null);\n }\n }\n\n buffer.current = [];\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c !== '?') {\n if (tokenMap[c]) buffer.current.push(getPlaceholder(i));\n else buffer.current.push(c);\n }\n }\n\n defaultBuffer.current = buffer.current.join('');\n\n const target = targetRef.current;\n\n if (target) {\n // Seed initial skeleton only when alwaysShowMask is on AND\n // the input has no value yet. Initial controlled/defaultValue\n // sync is handled by the dedicated effect below — keeping\n // `initMask` independent of `value` prevents it from\n // re-running on every keystroke (which would re-write the\n // DOM and fight user typing).\n if (!target.value && optsRef.current.alwaysShowMask) {\n setNativeValue(target, defaultBuffer.current);\n }\n }\n }, [mask, userTokens, getPlaceholder, setNativeValue]);\n\n // Re-init when mask or tokens change.\n React.useEffect(() => {\n initMask();\n }, [initMask]);\n\n // ---------------------------------------------------------------------\n // Sync controlled value -> input. When the consumer changes `value`\n // externally we must reflect it in the DOM.\n // ---------------------------------------------------------------------\n React.useEffect(() => {\n const target = targetRef.current;\n\n if (!target) return;\n if (controlledValue === undefined) return;\n if (controlledValue === currentVal.current) return;\n if (focus.current) return; // Don't fight the user while typing.\n\n setNativeValue(target, controlledValue);\n checkVal();\n currentVal.current = target.value;\n }, [controlledValue, setNativeValue, checkVal]);\n\n // ---------------------------------------------------------------------\n // Ref callback: install / tear down native listeners on the target.\n //\n // The callback has a STABLE identity (`useCallback` with no deps) so\n // React doesn't tear down and re-attach listeners on every render.\n // Listeners themselves are stable refs to the latest handlers via\n // the `*Handler` indirections below.\n // ---------------------------------------------------------------------\n const onInputRef = React.useRef(onInput);\n\n onInputRef.current = onInput;\n const onKeyDownRef = React.useRef(onKeyDown);\n\n onKeyDownRef.current = onKeyDown;\n const onKeyPressRef = React.useRef(onKeyPress);\n\n onKeyPressRef.current = onKeyPress;\n const onFocusRef = React.useRef(onFocus);\n\n onFocusRef.current = onFocus;\n const onBlurRef = React.useRef(onBlur);\n\n onBlurRef.current = onBlur;\n const onPasteRef = React.useRef(onPaste);\n\n onPasteRef.current = onPaste;\n\n // Stable trampoline handlers that delegate to the latest refs.\n const stableHandlers = React.useMemo(\n () => ({\n input: (e: Event) => onInputRef.current(e),\n keydown: (e: KeyboardEvent) => onKeyDownRef.current(e),\n keypress: (e: KeyboardEvent) => onKeyPressRef.current(e),\n focus: (e: FocusEvent) => onFocusRef.current(e),\n blur: (e: FocusEvent) => onBlurRef.current(e),\n paste: (e: Event) => onPasteRef.current(e)\n }),\n []\n );\n\n const refCallback = React.useCallback(\n (element: HTMLInputElement | null) => {\n const previous = targetRef.current;\n\n if (previous && previous !== element) {\n previous.removeEventListener('input', stableHandlers.input);\n previous.removeEventListener('keydown', stableHandlers.keydown);\n previous.removeEventListener('keypress', stableHandlers.keypress);\n previous.removeEventListener('focus', stableHandlers.focus);\n previous.removeEventListener('blur', stableHandlers.blur);\n previous.removeEventListener('paste', stableHandlers.paste);\n }\n\n targetRef.current = element;\n\n if (element && element !== previous) {\n element.addEventListener('input', stableHandlers.input);\n element.addEventListener('keydown', stableHandlers.keydown);\n element.addEventListener('keypress', stableHandlers.keypress);\n element.addEventListener('focus', stableHandlers.focus);\n element.addEventListener('blur', stableHandlers.blur);\n element.addEventListener('paste', stableHandlers.paste);\n\n // Seed the freshly-bound element. Use `controlledValue`\n // (not `value`) so the seed only happens for an externally\n // supplied controlled value; uncontrolled internal state\n // changes are handled by the user's typing and shouldn't\n // re-seed mid-stream.\n if (controlledValue) {\n setNativeValue(element, controlledValue);\n checkVal();\n } else if (defaultValue && !element.value) {\n setNativeValue(element, defaultValue);\n checkVal();\n } else if (optsRef.current.alwaysShowMask && !element.value) {\n setNativeValue(element, defaultBuffer.current);\n }\n }\n },\n // Intentionally NO `value`/`controlledValue` deps — see comment\n // above. The setter closures below read fresh values from refs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [stableHandlers]\n );\n\n // ---------------------------------------------------------------------\n // Derived public outputs.\n // ---------------------------------------------------------------------\n const rawValue = React.useMemo(() => (value ? unmaskValue(value) : ''), [value, unmaskValue]);\n const isComplete = React.useMemo(() => (value ? computeIsComplete(value) : false), [value, computeIsComplete]);\n\n const setValue = React.useCallback(\n (next: string) => {\n const target = targetRef.current;\n\n if (!target) return;\n setNativeValue(target, next ?? '');\n checkVal(true);\n emitChange(null);\n },\n [setNativeValue, checkVal, emitChange]\n );\n\n const reset = React.useCallback(() => {\n const target = targetRef.current;\n\n if (!target) return;\n setNativeValue(target, '');\n clearBuffer(0, len.current);\n\n if (optsRef.current.alwaysShowMask) {\n setNativeValue(target, defaultBuffer.current);\n }\n\n currentVal.current = target.value;\n wasComplete.current = false;\n emitChange(null);\n }, [setNativeValue, clearBuffer, emitChange]);\n\n return {\n ref: refCallback,\n value,\n rawValue,\n isComplete,\n setValue,\n reset\n };\n}\n","import * as React from 'react';\n\n/**\n * Listens for the specified media query.\n *\n * @param query - The media query to match.\n * @param when - A boolean indicating whether the media query should be active.\n * @returns A boolean indicating whether the media query matches.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const isMobile = useMatchMedia('(max-width: 768px)');\n *\n * return <div>{isMobile ? 'Mobile' : 'Desktop'}</div>;\n * };\n */\nexport function useMatchMedia(query: string, when: boolean = true): boolean {\n const [matches, setMatches] = React.useState(false);\n const matchMedia = React.useRef<MediaQueryList | null>(null);\n\n const handleChange = (event: MediaQueryListEvent) => setMatches(event.matches);\n const bind = () => matchMedia.current?.addEventListener('change', handleChange);\n const unbind = () => matchMedia.current?.removeEventListener('change', handleChange) && (matchMedia.current = null);\n\n React.useEffect(() => {\n if (when) {\n matchMedia.current = window.matchMedia(query);\n setMatches(matchMedia.current.matches);\n\n bind();\n }\n\n return () => {\n unbind();\n };\n }, [query, when]);\n\n return matches;\n}\n","import { useMatchMedia } from '../use-match-media';\n\nconst MOBILE_BREAKPOINT = 768;\n\n/**\n * Detects whether the viewport matches a mobile breakpoint.\n *\n * @param breakpoint - Max-width in pixels to consider as mobile. Defaults to 768.\n * @returns A boolean indicating whether the viewport is at or below the breakpoint.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const isMobile = useIsMobile();\n * return <div>{isMobile ? 'Mobile' : 'Desktop'}</div>;\n * };\n *\n * // Custom breakpoint\n * const isTablet = useIsMobile(1024);\n * ```\n */\nexport function useIsMobile(breakpoint: number = MOBILE_BREAKPOINT): boolean {\n return useMatchMedia(`(max-width: ${breakpoint - 1}px)`);\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs a mount effect only once.\n * This is similar to `useEffect`, but it only runs on mount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @returns {void}\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * useMountEffect(() => {\n * console.log('Mounted');\n * });\n * };\n * ```\n */\nexport function useMountEffect(effect: React.EffectCallback): void {\n const mounted = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n\n effect?.();\n }\n }, []);\n}\n","import * as React from 'react';\n\n/**\n * Options for the useMounted hook.\n */\nexport interface UseMountedOptions {\n /**\n * Callback invoked when the component transitions to mounted state.\n */\n onMounted?: () => void;\n /**\n * Callback invoked when the component transitions to unmounted state\n * or when the component is destroyed while mounted.\n */\n onUnmounted?: () => void;\n}\n\n/**\n * Custom hook that tracks whether a component is mounted on the client.\n * Provides SSR-safe mounting detection with optional lifecycle callbacks.\n *\n * @param {UseMountedOptions} options configuration options\n * @returns {boolean} whether the component is currently mounted\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const mounted = useMounted({\n * onMounted: () => console.log('Mounted'),\n * onUnmounted: () => console.log('Unmounted')\n * });\n *\n * if (!mounted) return null;\n *\n * return <div>Content</div>;\n * };\n * ```\n */\nexport function useMounted(options: UseMountedOptions = {}): boolean {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n\n options.onMounted?.();\n\n return () => {\n options.onUnmounted?.();\n };\n }, []);\n\n return mounted;\n}\n","import * as React from 'react';\n\n/**\n * The options for the `useNumberFormatter` hook.\n */\nexport interface UseNumberFormatterOptions {\n /**\n * The numeric value to be formatted.\n */\n value?: number | string | null | undefined;\n /**\n * Locale to be used in formatting.\n */\n locale?: string;\n /**\n * The locale matching algorithm to use. Possible values are 'lookup' and 'best fit'.\n * @default 'best fit'\n */\n localeMatcher?: 'lookup' | 'best fit';\n /**\n * Defines the behavior of the component.\n * @default 'decimal'\n */\n mode?: 'decimal' | 'currency';\n /**\n * The currency to use in currency formatting (ISO 4217 currency codes).\n */\n currency?: string;\n /**\n * How to display the currency in currency formatting.\n */\n currencyDisplay?: 'symbol' | 'narrowSymbol' | 'code' | 'name';\n /**\n * Whether to use grouping separators, such as thousands separators.\n * @default true\n */\n useGrouping?: boolean;\n /**\n * The minimum number of fraction digits to use.\n */\n minFractionDigits?: number;\n /**\n * The maximum number of fraction digits to use.\n */\n maxFractionDigits?: number;\n /**\n * How decimals should be rounded.\n */\n roundingMode?: 'ceil' | 'floor' | 'expand' | 'trunc' | 'halfCeil' | 'halfFloor' | 'halfExpand' | 'halfTrunc' | 'halfEven';\n /**\n * Text to display before the value.\n */\n prefix?: string;\n /**\n * Text to display after the value.\n */\n suffix?: string;\n /**\n * Minimum boundary value (used to determine if minus sign is allowed).\n */\n min?: number;\n /**\n * Whether to format the value.\n * @default true\n */\n format?: boolean;\n}\n\n/**\n * The exposes for the `useNumberFormatter` hook.\n */\nexport interface UseNumberFormatterExposes {\n /**\n * The formatted value based on the provided value and options.\n */\n formattedValue: string;\n /**\n * Formats a numeric value to a localized string.\n * @param value - The value to format\n * @returns The formatted string\n */\n formatValue: (value: number | string | null | undefined) => string;\n /**\n * Parses a formatted string back to a numeric value.\n * @param text - The text to parse\n * @returns The parsed number, '-' for minus sign only, or null if invalid\n */\n parseValue: (text: string) => number | string | null;\n /**\n * Adds two numbers with floating-point precision handling.\n * @param base - The base number\n * @param increment - The increment to add\n * @returns The sum with proper precision\n */\n addWithPrecision: (base: number, increment: number) => number;\n /**\n * Checks if the mode is decimal.\n * @returns True if mode is 'decimal'\n */\n isDecimalMode: () => boolean;\n /**\n * Checks if a character is a numeral character (digit, decimal, group separator, or minus sign).\n * @param char - The character to check\n * @returns True if the character is a numeral character\n */\n isNumeralChar: (char: string) => boolean;\n /**\n * Checks if a character is a minus sign.\n * @param char - The character to check\n * @returns True if the character is a minus sign\n */\n isMinusSign: (char: string) => boolean;\n /**\n * Checks if a character is a decimal sign.\n * @param char - The character to check\n * @returns True if the character is a decimal sign\n */\n isDecimalSign: (char: string) => boolean;\n /**\n * Checks if minus sign is allowed based on min value.\n * @returns True if minus sign is allowed\n */\n allowMinusSign: () => boolean;\n /**\n * Gets the decimal character indexes in a value string.\n * @param val - The value string to analyze\n * @returns Object with decimalCharIndex and decimalCharIndexWithoutPrefix\n */\n getDecimalCharIndexes: (val: string) => { decimalCharIndex: number; decimalCharIndexWithoutPrefix: number };\n /**\n * Gets various character indexes (decimal, minus, suffix, currency) in a value string.\n * @param val - The value string to analyze\n * @returns Object with character indexes\n */\n getCharIndexes: (val: string) => { decimalCharIndex: number; minusCharIndex: number; suffixCharIndex: number; currencyCharIndex: number };\n /**\n * Gets the length of decimal part in a formatted value.\n * @param value - The formatted value string\n * @returns The decimal length\n */\n getDecimalLength: (value: string) => number;\n /**\n * Concatenates two value strings, handling decimal positions.\n * @param val1 - The first value\n * @param val2 - The second value\n * @returns The concatenated result\n */\n concatValues: (val1: string, val2: string) => string;\n /**\n * The group character used for thousands separator.\n */\n groupChar: string | null;\n /**\n * The prefix character/string.\n */\n prefixChar: string | null;\n /**\n * The suffix character/string.\n */\n suffixChar: string | null;\n /**\n * The resolved Intl.NumberFormat options.\n */\n resolvedOptions: () => Intl.ResolvedNumberFormatOptions | undefined;\n /**\n * Reinitializes the parser (call when options change).\n */\n constructParser: () => void;\n}\n\n/**\n * useNumberFormatter hook is used to format and parse numbers using Intl.NumberFormat.\n *\n * @param {UseNumberFormatterOptions} options - The options for the number formatter.\n * @returns {UseNumberFormatterExposes} - The exposed methods for the number formatter.\n *\n * @example\n * ```tsx\n * const formatter = useNumberFormatter({\n * value: 1234.56,\n * locale: 'en-US',\n * mode: 'currency',\n * currency: 'USD'\n * });\n *\n * const formatted = formatter.formatValue(1234.56); // \"$1,234.56\"\n * const parsed = formatter.parseValue(\"$1,234.56\"); // 1234.56\n * ```\n */\nexport function useNumberFormatter(options: UseNumberFormatterOptions = {}): UseNumberFormatterExposes {\n const { value, locale, localeMatcher, mode = 'decimal', currency, currencyDisplay, useGrouping = true, minFractionDigits, maxFractionDigits, roundingMode, prefix, suffix, min, format = true } = options;\n\n // Internal refs for regex patterns\n const numberFormat = React.useRef<Intl.NumberFormat | null>(null);\n const groupCharRef = React.useRef<string | null>(null);\n const prefixCharRef = React.useRef<string | null>(null);\n const suffixCharRef = React.useRef<string | null>(null);\n const _numeral = React.useRef<RegExp | null>(null);\n const _group = React.useRef<RegExp | null>(null);\n const _minusSign = React.useRef<RegExp | null>(null);\n const _currency = React.useRef<RegExp | null>(null);\n const _decimal = React.useRef<RegExp | null>(null);\n const _suffix = React.useRef<RegExp | null>(null);\n const _prefix = React.useRef<RegExp | null>(null);\n const _index = React.useRef<((d: string) => number | undefined) | null>(null);\n\n const getOptions = () => {\n return {\n localeMatcher: localeMatcher,\n style: mode,\n currency: currency,\n currencyDisplay: currencyDisplay,\n useGrouping: useGrouping,\n minimumFractionDigits: minFractionDigits ?? undefined,\n maximumFractionDigits: maxFractionDigits ?? undefined,\n roundingMode: roundingMode\n };\n };\n\n const escapeRegExp = (text: string) => {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n };\n\n const getDecimalExpression = () => {\n const formatter = new Intl.NumberFormat(locale, { ...getOptions(), useGrouping: false });\n\n return new RegExp(\n `[${formatter\n .format(1.1)\n .replace(_currency.current ?? '', '')\n .trim()\n .replace(_numeral.current ?? '', '')}]`,\n 'g'\n );\n };\n\n const getGroupingExpression = () => {\n const formatter = new Intl.NumberFormat(locale, { useGrouping: true });\n\n groupCharRef.current = formatter\n .format(1000000)\n .trim()\n .replace(_numeral.current ?? '', '')\n .charAt(0);\n\n return new RegExp(`[${groupCharRef.current}]`, 'g');\n };\n\n const getMinusSignExpression = () => {\n const formatter = new Intl.NumberFormat(locale, { useGrouping: false });\n\n return new RegExp(\n `[${formatter\n .format(-1)\n .trim()\n .replace(_numeral.current ?? '', '')}]`,\n 'g'\n );\n };\n\n const getCurrencyExpression = () => {\n if (currency) {\n const formatter = new Intl.NumberFormat(locale, { style: 'currency', currency: currency, currencyDisplay: currencyDisplay, minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: roundingMode });\n\n return new RegExp(\n `[${formatter\n .format(1)\n .replace(/\\s/g, '')\n .replace(_numeral.current ?? '', '')\n .replace(_group.current ?? '', '')}]`,\n 'g'\n );\n }\n\n return new RegExp(`[]`, 'g');\n };\n\n const getPrefixExpression = () => {\n if (prefix) {\n _prefix.current = new RegExp(escapeRegExp(prefix), 'g');\n } else {\n const formatter = new Intl.NumberFormat(locale, { style: mode, currency: currency, currencyDisplay: currencyDisplay });\n\n const prefixStr = formatter.format(1).split('1')[0];\n\n _prefix.current = new RegExp(escapeRegExp(prefixStr), 'g');\n }\n\n return _prefix.current;\n };\n\n const getSuffixExpression = () => {\n if (suffix) {\n _suffix.current = new RegExp(escapeRegExp(suffix), 'g');\n } else {\n const formatter = new Intl.NumberFormat(locale, { style: mode, currency: currency, currencyDisplay: currencyDisplay, minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: roundingMode });\n\n const suffixStr = formatter.format(1).split('1')[1];\n\n _suffix.current = new RegExp(escapeRegExp(suffixStr), 'g');\n }\n\n return _suffix.current;\n };\n\n const constructParser = () => {\n numberFormat.current = new Intl.NumberFormat(locale, getOptions());\n const numerals = [...new Intl.NumberFormat(locale, { useGrouping: false }).format(9876543210)].reverse();\n const index = new Map(numerals.map((d, i) => [d, i]));\n\n _numeral.current = new RegExp(`[${numerals.join('')}]`, 'g');\n _group.current = getGroupingExpression();\n _minusSign.current = getMinusSignExpression();\n _currency.current = getCurrencyExpression();\n _decimal.current = getDecimalExpression();\n _suffix.current = getSuffixExpression();\n _prefix.current = getPrefixExpression();\n _index.current = (d) => index.get(d);\n\n // Set prefix and suffix chars\n if (prefix) {\n prefixCharRef.current = prefix;\n } else {\n const formatter = new Intl.NumberFormat(locale, { style: mode, currency: currency, currencyDisplay: currencyDisplay });\n\n prefixCharRef.current = formatter.format(1).split('1')[0];\n }\n\n if (suffix) {\n suffixCharRef.current = suffix;\n } else {\n const formatter = new Intl.NumberFormat(locale, { style: mode, currency: currency, currencyDisplay: currencyDisplay, minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: roundingMode });\n\n suffixCharRef.current = formatter.format(1).split('1')[1];\n }\n };\n\n const formatValue = (value: number | string | null | undefined) => {\n if (value != null) {\n if (typeof value === 'string' && value === '-') {\n // Minus sign\n return value;\n }\n\n if (format) {\n const formatter = new Intl.NumberFormat(locale, getOptions());\n const numericValue = typeof value === 'string' ? Number(value) : value;\n let formattedValue = formatter.format(numericValue);\n\n if (prefix) {\n formattedValue = prefix + formattedValue;\n }\n\n if (suffix) {\n formattedValue = formattedValue + suffix;\n }\n\n return formattedValue;\n }\n\n return value.toString();\n }\n\n return '';\n };\n\n const parseValue = (text: string) => {\n let cleanText = text\n .replace(_suffix.current || '', '')\n .replace(_prefix.current || '', '')\n .trim()\n .replace(/\\s/g, '')\n .replace(_currency.current || '', '');\n\n if (_decimal.current && _minusSign.current && _numeral.current) {\n const validChars = new RegExp(\n `[${[...new Intl.NumberFormat(locale, { useGrouping: false }).format(9876543210)].reverse().join('')}${new Intl.NumberFormat(locale).format(1.1).replace(/[0-9]/g, '')}${new Intl.NumberFormat(locale)\n .format(-1)\n .replace(/[0-9]/g, '')}]`,\n 'g'\n );\n\n cleanText = cleanText.match(validChars)?.join('') || '';\n }\n\n if (_group.current) {\n cleanText = cleanText.replace(_group.current, '');\n }\n\n if (_minusSign.current) {\n cleanText = cleanText.replace(_minusSign.current, '-');\n }\n\n if (_decimal.current) {\n cleanText = cleanText.replace(_decimal.current, '.');\n }\n\n if (_numeral.current && _index.current) {\n cleanText = cleanText.replace(_numeral.current, (d) => {\n const res = _index.current ? _index.current(d) : undefined;\n\n return res !== undefined ? res.toString() : '';\n });\n }\n\n if (cleanText) {\n if (cleanText === '-') return cleanText;\n\n const parsedValue = +cleanText;\n\n return isNaN(parsedValue) ? null : parsedValue;\n }\n\n return null;\n };\n\n const addWithPrecision = (base: number, increment: number) => {\n const baseStr = base.toString();\n const stepStr = increment.toString();\n\n const baseDecimalPlaces = baseStr.includes('.') ? baseStr.split('.')[1].length : 0;\n const stepDecimalPlaces = stepStr.includes('.') ? stepStr.split('.')[1].length : 0;\n\n const maxDecimalPlaces = Math.max(baseDecimalPlaces, stepDecimalPlaces);\n const precision = Math.pow(10, maxDecimalPlaces);\n\n return Math.round((base + increment) * precision) / precision;\n };\n\n const isDecimalMode = () => {\n return mode === 'decimal';\n };\n\n const resetRegex = () => {\n if (_numeral.current) _numeral.current.lastIndex = 0;\n\n if (_decimal.current) _decimal.current.lastIndex = 0;\n\n if (_group.current) _group.current.lastIndex = 0;\n\n if (_minusSign.current) _minusSign.current.lastIndex = 0;\n };\n\n const isNumeralChar = (char: string) => {\n if (char.length === 1 && ((_numeral.current && _numeral.current.test(char)) || (_decimal.current && _decimal.current.test(char)) || (_group.current && _group.current.test(char)) || (_minusSign.current && _minusSign.current.test(char)))) {\n resetRegex();\n\n return true;\n }\n\n return false;\n };\n\n const isMinusSignFn = (char: string) => {\n if ((_minusSign.current && _minusSign.current.test(char)) || char === '-') {\n if (_minusSign.current) {\n _minusSign.current.lastIndex = 0;\n }\n\n return true;\n }\n\n return false;\n };\n\n const isDecimalSignFn = (char: string) => {\n if ((locale?.includes('fr') && ['.', ','].includes(char)) || (_decimal.current && _decimal.current.test(char))) {\n if (_decimal.current) {\n _decimal.current.lastIndex = 0;\n }\n\n return true;\n }\n\n return false;\n };\n\n const allowMinusSign = () => {\n return min === undefined || min === null || min < 0;\n };\n\n const getDecimalCharIndexes = (val: string) => {\n const decimalCharIndex = _decimal.current ? val.search(_decimal.current) : -1;\n\n if (_decimal.current) {\n _decimal.current.lastIndex = 0;\n }\n\n const filteredVal = val\n .replace(_prefix.current || '', '')\n .trim()\n .replace(/\\s/g, '')\n .replace(_currency.current || '', '');\n const decimalCharIndexWithoutPrefix = _decimal.current ? filteredVal.search(_decimal.current) : -1;\n\n if (_decimal.current) {\n _decimal.current.lastIndex = 0;\n }\n\n return { decimalCharIndex, decimalCharIndexWithoutPrefix };\n };\n\n const getCharIndexes = (val: string) => {\n const resetRegexLastIndex = (regex: RegExp | null) => {\n if (regex) {\n regex.lastIndex = 0;\n }\n };\n\n const decimalCharIndex = _decimal.current ? val.search(_decimal.current) : -1;\n\n resetRegexLastIndex(_decimal.current);\n\n const minusCharIndex = _minusSign.current ? val.search(_minusSign.current) : -1;\n\n resetRegexLastIndex(_minusSign.current);\n\n const suffixCharIndex = _suffix.current ? val.search(_suffix.current) : -1;\n\n resetRegexLastIndex(_suffix.current);\n\n const currencyCharIndex = _currency.current ? val.search(_currency.current) : -1;\n\n resetRegexLastIndex(_currency.current);\n\n return { decimalCharIndex, minusCharIndex, suffixCharIndex, currencyCharIndex };\n };\n\n const getDecimalLength = (value: string) => {\n if (value) {\n const valueSplit = value.split(_decimal.current ?? '');\n\n if (valueSplit.length === 2) {\n return valueSplit[1]\n .replace(_suffix.current ?? '', '')\n .trim()\n .replace(/\\s/g, '')\n .replace(_currency.current ?? '', '').length;\n }\n }\n\n return 0;\n };\n\n const concatValues = (val1: string, val2: string) => {\n if (val1 && val2) {\n const decimalRegex = _decimal.current;\n const decimalCharIndex = decimalRegex ? val2.search(decimalRegex) : -1;\n\n if (decimalRegex) {\n decimalRegex.lastIndex = 0;\n }\n\n if (suffixCharRef.current) {\n return decimalCharIndex !== -1 ? val1.replace(suffixCharRef.current, '').split(decimalRegex ?? '')[0] + val2.replace(suffixCharRef.current, '').slice(decimalCharIndex) + suffixCharRef.current : val1;\n } else if (prefixCharRef.current) {\n return decimalCharIndex !== -1 ? val1.split(decimalRegex ?? '')[0] + val2.slice(decimalCharIndex) : val1;\n }\n }\n\n return val1;\n };\n\n React.useEffect(() => {\n constructParser();\n }, [locale, localeMatcher, mode, currency, currencyDisplay, useGrouping, minFractionDigits, maxFractionDigits, roundingMode, prefix, suffix]);\n\n return {\n formattedValue: formatValue(value),\n formatValue,\n parseValue,\n addWithPrecision,\n isDecimalMode,\n isNumeralChar,\n isMinusSign: isMinusSignFn,\n isDecimalSign: isDecimalSignFn,\n allowMinusSign,\n getDecimalCharIndexes,\n getCharIndexes,\n getDecimalLength,\n concatValues,\n groupChar: groupCharRef.current,\n prefixChar: prefixCharRef.current,\n suffixChar: suffixCharRef.current,\n resolvedOptions: () => numberFormat.current?.resolvedOptions(),\n constructParser\n };\n}\n","import * as React from 'react';\n\n/**\n * usePresence hook is used to manage the presence of a component.\n *\n * @param open - The open state.\n * @returns An object containing the present, exiting, mounted, and ref states.\n *\n * @example\n * ```tsx\n * const { present, exiting, mounted, ref } = usePresence(true);\n *\n * return present && (\n * <div className=\"card flex justify-center\"></div>\n * );\n */\n\nexport function usePresence(open: boolean, fallbackMs: number = 500) {\n const [present, setPresent] = React.useState(open);\n const [exiting, setExiting] = React.useState(false);\n const [mounted, setMounted] = React.useState(false);\n const nodeRef = React.useRef<HTMLElement | null>(null);\n const cleanupRef = React.useRef<(() => void) | null>(null);\n const rafCleanupRef = React.useRef<(() => void) | null>(null);\n\n const ref = React.useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n React.useEffect(() => {\n if (cleanupRef.current) {\n cleanupRef.current();\n cleanupRef.current = null;\n }\n\n if (rafCleanupRef.current) {\n rafCleanupRef.current();\n rafCleanupRef.current = null;\n }\n\n if (open) {\n setPresent(true);\n setExiting(false);\n\n const rafs: number[] = [];\n\n rafs.push(\n requestAnimationFrame(() => {\n rafs.push(\n requestAnimationFrame(() => {\n rafs.push(requestAnimationFrame(() => setMounted(true)));\n })\n );\n })\n );\n\n rafCleanupRef.current = () => {\n rafs.forEach((raf) => cancelAnimationFrame(raf));\n rafs.length = 0;\n };\n } else if (nodeRef.current) {\n setExiting(true);\n setMounted(false);\n const node = nodeRef.current;\n let isHandled = false;\n\n const handleEnd = () => {\n if (isHandled) return;\n\n isHandled = true;\n\n setPresent(false);\n setExiting(false);\n\n node.removeEventListener('transitionend', handleEnd);\n node.removeEventListener('animationend', handleEnd);\n\n cleanupRef.current = null;\n };\n\n node.addEventListener('transitionend', handleEnd, { passive: true });\n node.addEventListener('animationend', handleEnd, { passive: true });\n\n // const fallbackTimeout = setTimeout(() => {\n // if (!isHandled) {\n // handleEnd();\n // }\n // }, fallbackMs);\n\n cleanupRef.current = () => {\n // clearTimeout(fallbackTimeout);\n\n if (!isHandled) {\n node.removeEventListener('transitionend', handleEnd);\n node.removeEventListener('animationend', handleEnd);\n }\n };\n } else {\n setMounted(false);\n setPresent(false);\n setExiting(false);\n }\n }, [open, fallbackMs]);\n\n React.useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n\n if (rafCleanupRef.current) {\n rafCleanupRef.current();\n }\n };\n }, []);\n\n return { present, exiting, mounted, ref };\n}\n","import * as React from 'react';\n\n/**\n * Performs a shallow comparison of two objects to determine if their values are equal.\n * Returns true if both objects have the same keys with the same values (by reference).\n */\nfunction shallowEqual(objA: Record<string, unknown>, objB: Record<string, unknown>): boolean {\n if (objA === objB) return true;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false;\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i];\n\n if (objA[key] !== objB[key]) return false;\n }\n\n return true;\n}\n\n/**\n * Used to merge and differentiate incoming props with the default props.\n * - Keys that exist in both `props1` and `props2` are placed in `props`, with values from `props2`.\n * - Keys that exist in `props2` but not in `props1` are placed in `attrs`.\n *\n * Uses structural comparison to preserve referential stability — if the computed\n * props and attrs are shallowly equal to the previous result, the same reference is returned.\n * This prevents unnecessary downstream useMemo invalidation even when the parent\n * passes a new props object reference with identical values (e.g., from JSX spread).\n *\n * @template P1 The type of the default set of props.\n * @template P2 The type of the incoming set of props.\n *\n * @param props1 The default set of props (e.g., default props).\n * @param props2 The incoming set of props (e.g., user-defined or dynamic props).\n * @returns An object containing:\n * - `props`: A new object containing keys that exist in both `props1` and `props2`, using values from `props2`.\n * - `attrs`: A new object containing keys that exist only in `props2`, excluding any keys from `props1`.\n *\n * @example\n * ```ts\n * const { props, attrs } = useProps({ className: 'baz' }, { id: 'foo', className: 'bar' });\n *\n * console.log(props); // { className: 'bar' }\n * console.log(attrs); // { id: 'foo' }\n * ```\n */\nexport function useProps<P1, P2>(props1: P1 = {} as P1, props2: P2 = {} as P2) {\n type Props = Pick<P1 & P2, keyof P1>;\n type Attrs = Omit<P2, keyof P1>;\n type Result = { props: Props; attrs: Attrs };\n\n const prevRef = React.useRef<Result | null>(null);\n\n return React.useMemo(() => {\n const newProps = { ...props1 } as Props;\n const newAttrs = {} as Attrs;\n\n Object.entries(props2 as Record<string, unknown>).forEach(([key, value]) => {\n if (key in (props1 as Record<string, unknown>)) {\n (newProps as Record<string, unknown>)[key] = value;\n } else {\n (newAttrs as Record<string, unknown>)[key] = value;\n }\n });\n\n const prev = prevRef.current;\n\n if (prev && shallowEqual(prev.props as Record<string, unknown>, newProps as Record<string, unknown>) && shallowEqual(prev.attrs as Record<string, unknown>, newAttrs as Record<string, unknown>)) {\n return prev;\n }\n\n const result: Result = { props: newProps, attrs: newAttrs };\n\n prevRef.current = result;\n\n return result;\n }, [props1, props2]);\n}\n","import * as React from 'react';\n\nexport const useQueueTask = () => {\n const tasksRef = React.useRef(new Map<string | number, () => void>());\n const scheduledRef = React.useRef(false);\n\n const flush = React.useCallback(() => {\n scheduledRef.current = false;\n const tasks = tasksRef.current;\n\n tasksRef.current = new Map();\n tasks.forEach((task) => task());\n }, []);\n\n return React.useCallback(\n (id: string | number, task: () => void) => {\n tasksRef.current.set(id, task);\n\n if (!scheduledRef.current) {\n scheduledRef.current = true;\n queueMicrotask(flush);\n }\n },\n [flush]\n );\n};\n","import { getWindowScrollTop } from '@primeuix/utils';\nimport * as React from 'react';\n\n/**\n * The options for the `useScrollTop` hook.\n */\nexport interface UseScrollTopOptions {\n /**\n * Reference to the target element.\n * @default window\n */\n target?: Window | Element | null;\n /**\n * Defines the threshold value of the vertical scroll position of the target to toggle the visibility.\n * @default 400\n */\n threshold?: number;\n /**\n * Defines the scrolling behaviour, 'smooth' adds an animation and 'auto' scrolls with a jump.\n * @default smooth\n */\n behavior?: ScrollBehavior;\n}\n\n/**\n * The exposes for the `useScrollTop` hook.\n */\nexport interface UseScrollTopExposes {\n /**\n * Current visible state as a boolean.\n * @default false\n */\n visible: boolean;\n /**\n * Scrolls the target element to the top.\n */\n scrollToTop: () => void;\n}\n\n/**\n * useScrollTop hook is used to enter input in a certain format such as numeric, date, currency, email and phone.\n *\n * @param {UseScrollTopOptions} options - The options for the scroll top behavior.\n * @returns {UseScrollTopExposes} - The exposed methods for the scroll top behavior.\n *\n * @example\n * ```tsx\n * const { scrollToTop, visible } = useScrollTop({\n * target: elementRef.current,\n * threshold: 400,\n * behavior: 'smooth'\n * });\n *\n * return (\n * <div ref={elementRef}>\n * {visible && (\n * <Button onClick={scrollToTop}>\n * <i className=\"pi pi-arrow-up\" />\n * </Button>\n * )}\n * </div>\n * );\n */\nexport function useScrollTop(options?: UseScrollTopOptions): UseScrollTopExposes {\n const { target = typeof window !== 'undefined' ? window : null, threshold = 400, behavior = 'smooth' } = options || {};\n const [visible, setVisible] = React.useState(false);\n\n const scrollToTop = () => {\n target?.scroll({\n top: 0,\n behavior: behavior\n });\n };\n\n React.useEffect(() => {\n if (!target) return;\n\n const checkVisibility = (scrollY: number) => {\n if (scrollY > threshold) setVisible(true);\n else setVisible(false);\n };\n\n const onScroll = () => {\n const scrollY = target === window ? getWindowScrollTop() : (target as Element).scrollTop;\n\n checkVisibility(scrollY);\n };\n\n target.addEventListener('scroll', onScroll);\n\n return () => {\n target.removeEventListener('scroll', onScroll);\n };\n }, [target, threshold]);\n\n return {\n //state\n visible,\n //methods\n scrollToTop\n };\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs an unmount effect only once.\n * This is similar to `useEffect`, but it only runs on unmount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @returns {void}\n *\n * @example\n * ```tsx\n * const Component = () => {\n * useUnmountEffect(() => {\n * console.log('Unmounted');\n * });\n * };\n * ```\n */\nexport function useUnmountEffect(effect: React.EffectCallback): void {\n React.useEffect(() => {\n return () => {\n effect?.();\n };\n }, []);\n}\n","import * as React from 'react';\n\n/**\n * Custom hook that runs an update effect whenever dependencies change.\n * This is similar to `useEffect`, but it does not run on mount.\n *\n * @param {React.EffectCallback} effect the callback function\n * @param {React.DependencyList} dependencies the dependencies\n * @returns {void}\n *\n * @example\n * ```tsx\n * const Component = ({ value }) => {\n * useUpdateEffect(() => {\n * console.log('Updated');\n * }, [value]);\n * };\n * ```\n */\nexport function useUpdateEffect(effect: React.EffectCallback, dependencies?: React.DependencyList): void {\n const mounted = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n\n return;\n }\n\n return effect?.();\n }, dependencies);\n}\n","import * as React from 'react';\n\n/**\n * Starts a view transition.\n *\n * @returns A function that starts a view transition.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const startTransition = useViewTransition();\n *\n * const handleClick = () => {\n * startTransition(() => {\n * // Perform some work\n * });\n * };\n *\n * return <button onClick={handleClick}>Click me</button>;\n * };\n */\nexport function useViewTransition() {\n const startTransition = React.useCallback((callback: () => void) => {\n if (document.startViewTransition) {\n document.startViewTransition(() => {\n callback();\n });\n } else {\n callback();\n }\n }, []);\n\n return startTransition;\n}\n","import * as React from 'react';\n\n/**\n * useVisibilityChange hook is used to check if the document is visible.\n *\n * @returns A boolean indicating whether the document is visible.\n *\n * @example\n * ```tsx\n * const Component = () => {\n * const isVisible = useVisibilityChange();\n *\n * return <div>{isVisible ? 'Visible' : 'Hidden'}</div>;\n * };\n */\nexport function useVisibilityChange() {\n const [isVisible, setIsVisible] = React.useState(true);\n\n React.useEffect(() => {\n const handleVisibilityChange = () => {\n setIsVisible(!document.hidden);\n };\n\n handleVisibilityChange();\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return isVisible;\n}\n"],"mappings":"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","names":["React","useAttrSelector","prefix","id","React","INITIAL_STATE","useSortableList","onReorder","onTransfer","canTransfer","getSelectedItems","draggedItemsRef","dragSourceRef","draggedIndexRef","dragOverIndexRef","dragState","setDragState","reset","isTransferAllowed","sourceListId","targetListId","getListHandlers","listId","e","prev","__spreadProps","__spreadValues","fromIndex","toIndex","getItemHandlers","index","item","itemsToDrag","isSameList","resolve","React","useControlledState","value","defaultValue","onChange","isControlled","valueState","setValueState","computedValue","setValue","inValue","newValue","onChangeParam","getTargetElement","isNotEmpty","React","React","usePrevious","value","ref","useEventListener","target","type","listener","options","when","targetRef","listenerRef","prevListener","usePrevious","prevOptions","bind","bindOptions","bindTarget","isNotEmpty","unbind","getTargetElement","event","_a","dispose","updateTarget","listenerChanged","optionsChanged","listenerExists","resolveFieldData","React","equals","removeAccents","hasGetTime","x","norm","v","locale","BUILT_IN_MATCHERS","value","filter","f","globalMatchers","getGlobalMatchers","globalMatchers","defaultMatchMode","ruleIsComposite","rule","matchFields","item","field","filterValue","matchMode","locale","matchers","f","resolveFieldData","matchRule","_a","_b","_c","constraints","c","useFilter","options","shorthandField","shorthandMatchMode","hasShorthand","shorthandControlled","initialShorthandRule","isControlled","internalRules","setInternalRules","shorthandRules","currentRules","onRulesChangeRef","onValueChangeRef","commit","next","first","filterLocale","filterDelay","__spreadValues","BUILT_IN_MATCHERS","getGlobalMatchers","debouncedRules","setDebouncedRules","t","activeRules","activeRulesNonEmpty","r","ruleHasValue","match","lazy","filteredData","isFiltered","onLazyLoadRef","lastLazyKeyRef","key","setRules","setValue","ruleIndex","value","i","__spreadProps","setMatchMode","setOperator","operator","setConstraintValue","constraintIndex","ci","setConstraintMatchMode","addRule","removeRule","_","clearRule","addConstraint","base","removeConstraint","filtered","clearAll","index","composite","constraintCursor","list","v","m","op","mm","useControlledState","BUILT_IN_MATCHERS","getGlobalMatchers","matchRule","registerMatcher","ruleHasValue","unregisterMatcher","resolveFieldData","React","nodeTarget","node","field","dataIsObject","fromData","resolveFieldData","isLeaf","nodeMatchesDirect","rule","matchers","locale","fields","projected","matchRule","__spreadProps","__spreadValues","filterTree","nodes","rules","strict","out","selfMatch","childMatched","kidsFiltered","useTreeFilter","options","_a","_b","_c","_d","_e","isShorthand","shorthandMatchMode","shorthandValue","setShorthandValue","useControlledState","setValue","next","isControlled","internalRules","setInternalRules","shorthandRules","currentRules","onRulesChangeRef","commit","filterLocale","filterDelay","filterMode","BUILT_IN_MATCHERS","getGlobalMatchers","debouncedRules","setDebouncedRules","t","activeRules","activeRulesNonEmpty","ruleHasValue","match","lazy","filteredNodes","onLazyLoadRef","lastLazyKeyRef","key","setRules","clearAll","r","c","React","useHotKey","keys","handler","options","target","event","when","handlerRef","normalizeKey","key","lower","parseKeySpec","spec","parts","p","required","part","matches","targetElement","keySpecs","listener","_a","keyboardEvent","React","useId","initialValue","idx","idState","setIdState","isAndroid","useKeyFilter","options","pattern","validateOnly","DEFAULT_MASKS","getRegex","onBeforeInput","event","validateKey","onKeyPress","onPaste","regex","c","key","value","validatePattern","React","useLocalStorage","key","initialValue","serializer","deserializer","storedValue","setStoredValue","hydrated","item","e","remove","getUserAgent","React","DEFAULT_TOKENS","useMask","options","mask","userTokens","controlledValue","defaultValue","onValueChange","onComplete","slotChar","showMaskOnFocus","alwaysShowMask","autoClear","transform","readOnly","onValueChangeRef","onCompleteRef","transformRef","isControlled","internalValue","setInternalValue","value","setStateValue","next","targetRef","len","tests","buffer","defaultBuffer","partialPosition","androidChrome","focus","focusText","firstNonMaskPos","lastRequiredNonMaskPos","caretTimeoutId","oldVal","currentVal","wasComplete","lastEmittedValue","optsRef","getPlaceholder","i","sc","caret","first","last","_a","_b","target","begin","end","seekNext","pos","seekPrev","internalWrite","setNativeValue","proto","setter","notifyReact","writeBuffer","clearBuffer","start","shiftL","j","shiftR","c","t","checkVal","allow","_c","_d","_e","test","lastMatch","currentTest","unmaskValue","masked","out","chars","computeIsComplete","maskedValue","emitChange","originalEvent","isDefault","reported","rawValue","complete","eventPayload","handleInputChange","event","handleAndroidInput","curVal","onInput","onKeyDown","k","iPhone","getUserAgent","onKeyPress","p","onFocus","_event","shouldShowSkeleton","onBlur","onPaste","initMask","tokenMap","__spreadValues","ua","maskTokens","onInputRef","onKeyDownRef","onKeyPressRef","onFocusRef","onBlurRef","onPasteRef","stableHandlers","e","refCallback","element","previous","isComplete","setValue","reset","React","useMatchMedia","query","when","matches","setMatches","matchMedia","handleChange","event","bind","_a","unbind","MOBILE_BREAKPOINT","useIsMobile","breakpoint","useMatchMedia","React","useMountEffect","effect","mounted","React","useMounted","options","mounted","setMounted","_a","React","useNumberFormatter","options","value","locale","localeMatcher","mode","currency","currencyDisplay","useGrouping","minFractionDigits","maxFractionDigits","roundingMode","prefix","suffix","min","format","numberFormat","groupCharRef","prefixCharRef","suffixCharRef","_numeral","_group","_minusSign","_currency","_decimal","_suffix","_prefix","_index","getOptions","escapeRegExp","text","getDecimalExpression","_a","_b","formatter","__spreadProps","__spreadValues","getGroupingExpression","getMinusSignExpression","getCurrencyExpression","getPrefixExpression","prefixStr","getSuffixExpression","suffixStr","constructParser","numerals","index","d","i","formatValue","numericValue","formattedValue","parseValue","cleanText","validChars","res","parsedValue","addWithPrecision","base","increment","baseStr","stepStr","baseDecimalPlaces","stepDecimalPlaces","maxDecimalPlaces","precision","isDecimalMode","resetRegex","isNumeralChar","char","isMinusSignFn","isDecimalSignFn","allowMinusSign","getDecimalCharIndexes","val","decimalCharIndex","filteredVal","decimalCharIndexWithoutPrefix","getCharIndexes","resetRegexLastIndex","regex","minusCharIndex","suffixCharIndex","currencyCharIndex","getDecimalLength","_c","valueSplit","concatValues","val1","val2","decimalRegex","React","usePresence","open","fallbackMs","present","setPresent","exiting","setExiting","mounted","setMounted","nodeRef","cleanupRef","rafCleanupRef","ref","node","rafs","raf","isHandled","handleEnd","React","shallowEqual","objA","objB","keysA","keysB","i","key","useProps","props1","props2","prevRef","newProps","__spreadValues","newAttrs","value","prev","result","React","useQueueTask","tasksRef","scheduledRef","flush","tasks","task","id","getWindowScrollTop","React","useScrollTop","options","target","threshold","behavior","visible","setVisible","scrollToTop","checkVisibility","scrollY","onScroll","React","useUnmountEffect","effect","React","useUpdateEffect","effect","dependencies","mounted","React","useViewTransition","callback","React","useVisibilityChange","isVisible","setIsVisible","handleVisibilityChange"]}