@primereact/headless 11.0.0-alpha.7 → 11.0.0-alpha.9

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 (114) hide show
  1. package/breadcrumb/index.d.ts +2 -0
  2. package/breadcrumb/index.mjs +2 -0
  3. package/breadcrumb/index.mjs.map +1 -0
  4. package/breadcrumb/useBreadcrumb.d.ts +3 -0
  5. package/breadcrumb/useBreadcrumb.props.d.ts +2 -0
  6. package/breadcrumb/useBreadcrumb.test.d.ts +0 -0
  7. package/carousel/index.mjs +1 -1
  8. package/carousel/index.mjs.map +1 -1
  9. package/carousel/useCarousel.d.ts +18 -18
  10. package/colorpicker/colorManager.d.ts +101 -0
  11. package/colorpicker/index.d.ts +3 -0
  12. package/colorpicker/index.mjs +2 -0
  13. package/colorpicker/index.mjs.map +1 -0
  14. package/colorpicker/input/index.d.ts +2 -0
  15. package/colorpicker/input/index.mjs +2 -0
  16. package/colorpicker/input/index.mjs.map +1 -0
  17. package/colorpicker/input/useColorPickerInput.d.ts +11 -0
  18. package/colorpicker/input/useColorPickerInput.props.d.ts +2 -0
  19. package/colorpicker/input/useColorPickerInput.test.d.ts +0 -0
  20. package/colorpicker/slider/index.d.ts +2 -0
  21. package/colorpicker/slider/index.mjs +2 -0
  22. package/colorpicker/slider/index.mjs.map +1 -0
  23. package/colorpicker/slider/useColorPickerSlider.d.ts +13 -0
  24. package/colorpicker/slider/useColorPickerSlider.props.d.ts +2 -0
  25. package/colorpicker/slider/useColorPickerSlider.test.d.ts +0 -0
  26. package/colorpicker/useColorPicker.d.ts +26 -0
  27. package/colorpicker/useColorPicker.props.d.ts +2 -0
  28. package/colorpicker/useColorPicker.test.d.ts +0 -0
  29. package/commandmenu/index.d.ts +2 -0
  30. package/commandmenu/index.mjs +2 -0
  31. package/commandmenu/index.mjs.map +1 -0
  32. package/commandmenu/useCommandMenu.d.ts +11 -0
  33. package/commandmenu/useCommandMenu.props.d.ts +2 -0
  34. package/commandmenu/useCommandMenu.test.d.ts +0 -0
  35. package/contextmenu/index.d.ts +2 -0
  36. package/contextmenu/index.mjs +2 -0
  37. package/contextmenu/index.mjs.map +1 -0
  38. package/contextmenu/useContextMenu.d.ts +1 -0
  39. package/contextmenu/useContextMenu.props.d.ts +2 -0
  40. package/contextmenu/useContextMenu.test.d.ts +0 -0
  41. package/datepicker/index.d.ts +2 -0
  42. package/datepicker/index.mjs +2 -0
  43. package/datepicker/index.mjs.map +1 -0
  44. package/datepicker/useDatePicker.d.ts +114 -0
  45. package/datepicker/useDatePicker.props.d.ts +2 -0
  46. package/datepicker/useDatePicker.test.d.ts +0 -0
  47. package/gallery/index.mjs +1 -1
  48. package/gallery/index.mjs.map +1 -1
  49. package/gallery/item/index.mjs +1 -1
  50. package/gallery/item/index.mjs.map +1 -1
  51. package/gallery/useGallery.d.ts +2 -8
  52. package/inputtags/index.d.ts +2 -0
  53. package/inputtags/index.mjs +2 -0
  54. package/inputtags/index.mjs.map +1 -0
  55. package/inputtags/useInputTags.d.ts +20 -0
  56. package/inputtags/useInputTags.props.d.ts +2 -0
  57. package/inputtags/useInputTags.test.d.ts +0 -0
  58. package/listbox/index.d.ts +2 -0
  59. package/listbox/index.mjs +2 -0
  60. package/listbox/index.mjs.map +1 -0
  61. package/listbox/useListbox.d.ts +45 -0
  62. package/listbox/useListbox.props.d.ts +2 -0
  63. package/listbox/useListbox.test.d.ts +0 -0
  64. package/menu/index.d.ts +2 -0
  65. package/menu/index.mjs +2 -0
  66. package/menu/index.mjs.map +1 -0
  67. package/menu/sub/index.d.ts +2 -0
  68. package/menu/sub/index.mjs +2 -0
  69. package/menu/sub/index.mjs.map +1 -0
  70. package/menu/sub/useMenuSub.d.ts +19 -0
  71. package/menu/sub/useMenuSub.props.d.ts +2 -0
  72. package/menu/useMenu.d.ts +34 -0
  73. package/menu/useMenu.props.d.ts +2 -0
  74. package/menu/useMenu.test.d.ts +0 -0
  75. package/orgchart/index.d.ts +2 -0
  76. package/orgchart/index.mjs +2 -0
  77. package/orgchart/index.mjs.map +1 -0
  78. package/orgchart/useOrgChart.d.ts +20 -0
  79. package/orgchart/useOrgChart.props.d.ts +2 -0
  80. package/orgchart/useOrgChart.test.d.ts +0 -0
  81. package/overlay/index.d.ts +2 -0
  82. package/overlay/index.mjs +2 -0
  83. package/overlay/index.mjs.map +1 -0
  84. package/overlay/useOverlay.d.ts +16 -0
  85. package/overlay/useOverlay.props.d.ts +2 -0
  86. package/overlay/useOverlay.test.d.ts +0 -0
  87. package/package.json +4 -4
  88. package/password/index.d.ts +2 -0
  89. package/password/index.mjs +2 -0
  90. package/password/index.mjs.map +1 -0
  91. package/password/usePassword.d.ts +35 -0
  92. package/password/usePassword.props.d.ts +2 -0
  93. package/password/usePassword.test.d.ts +0 -0
  94. package/placer/index.mjs +1 -1
  95. package/placer/index.mjs.map +1 -1
  96. package/toast/index.d.ts +1 -0
  97. package/toast/index.mjs +1 -1
  98. package/toast/index.mjs.map +1 -1
  99. package/toast/item/index.css +1 -1
  100. package/toast/item/index.css.map +1 -1
  101. package/toast/item/index.mjs +1 -1
  102. package/toast/item/index.mjs.map +1 -1
  103. package/toast/item/useToastItem.d.ts +12 -8
  104. package/toast/toastStore.d.ts +40 -0
  105. package/toast/useToast.d.ts +12 -4
  106. package/tree/TreeDragDropService.d.ts +24 -0
  107. package/tree/index.d.ts +3 -0
  108. package/tree/index.mjs +2 -0
  109. package/tree/index.mjs.map +1 -0
  110. package/tree/useTree.d.ts +27 -0
  111. package/tree/useTree.props.d.ts +2 -0
  112. package/tree/useTree.test.d.ts +0 -0
  113. package/toast/index.css +0 -2
  114. package/toast/index.css.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/listbox/useListbox.ts","../../src/listbox/useListbox.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { useControlledState } from '@primereact/hooks/use-controlled-state';\nimport { equals, findLastIndex, findSingle, focus, getFirstFocusableElement, isElement, isNotEmpty, isPrintableCharacter, isString, resolveFieldData } from '@primeuix/utils';\nimport * as React from 'react';\nimport { defaultProps } from './useListbox.props';\n\nexport const useListbox = withHeadless({\n name: 'useListbox',\n defaultProps,\n setup({ id, props, elementRef }) {\n const [focusedState, setFocusedState] = React.useState<boolean>(false);\n const [focusedOptionIndexState, setFocusedOptionIndexState] = React.useState<number>(-1);\n const [valueState, setValueState] = useControlledState({\n value: props.value,\n defaultValue: props.defaultValue ?? null,\n onChange: props.onValueChange\n });\n\n const state = {\n value: valueState,\n focused: focusedState,\n focusedOptionIndex: focusedOptionIndexState\n };\n\n // element refs\n const listRef = React.useRef<HTMLElement>(null);\n const firstHiddenFocusableRef = React.useRef<HTMLElement>(null);\n const lastHiddenFocusableRef = React.useRef<HTMLElement>(null);\n\n // refs\n const optionTouched = React.useRef<boolean>(false);\n const startRangeIndex = React.useRef<number>(-1);\n const searchTimeout = React.useRef<NodeJS.Timeout | null>(null);\n const searchValue = React.useRef<string>('');\n\n const getOptions = () => {\n return visibleOptions || [];\n };\n\n const getOptionId = (index: number) => {\n return `${id}_${index}`;\n };\n\n const getOptionLabel = (option: unknown) => {\n return props.optionLabel ? resolveFieldData(option, props.optionLabel) : isString(option) ? option : null;\n };\n\n const getOptionValue = (option: unknown) => {\n return props.optionValue ? resolveFieldData(option, props.optionValue) : option;\n };\n\n const isOptionDisabled = (option: unknown) => {\n return props.optionDisabled ? resolveFieldData(option, props.optionDisabled) : false;\n };\n\n const isOptionGroup = (option: unknown) => {\n return !!(props.optionGroupLabel && (option as Record<string, unknown>)?.optionGroup && (option as Record<string, unknown>)?.group);\n };\n\n const getOptionGroupLabel = (optionGroup: unknown) => {\n return props.optionGroupLabel ? resolveFieldData(optionGroup, props.optionGroupLabel) : isString(optionGroup) ? optionGroup : null;\n };\n\n const getOptionGroupChildren = (optionGroup: unknown) => {\n return props.optionGroupChildren ? resolveFieldData(optionGroup, props.optionGroupChildren) : null;\n };\n\n const getFocusedOptionId = () => {\n return focusedOptionIndexState !== -1 ? getOptionId(focusedOptionIndexState!) : null;\n };\n\n const getAriaSetSize = () => {\n return getOptions().filter((option: unknown) => !isOptionGroup(option)).length;\n };\n\n const getAriaPosInset = (index: number) => {\n return (\n (props.optionGroupLabel\n ? index -\n (getOptions()\n .slice(0, index)\n .filter((option: unknown) => isOptionGroup(option)).length || 0)\n : index) + 1\n );\n };\n\n const onFirstHiddenFocus = () => {\n focus(listRef.current!);\n\n const firstFocusableEl = getFirstFocusableElement(elementRef.current!, ':not([data-p-hidden-focusable=\"true\"])');\n\n if (lastHiddenFocusableRef.current) {\n lastHiddenFocusableRef.current.tabIndex = isElement(firstFocusableEl) ? 0 : -1;\n }\n\n if (firstHiddenFocusableRef.current) {\n firstHiddenFocusableRef.current.tabIndex = -1;\n }\n };\n\n const onLastHiddenFocus = (event: React.FocusEvent) => {\n const relatedTarget = event.relatedTarget;\n\n if (relatedTarget === listRef.current) {\n const firstFocusableEl = getFirstFocusableElement(elementRef.current!, ':not([data-p-hidden-focusable=\"true\"])');\n\n if (firstFocusableEl instanceof HTMLElement) {\n focus(firstFocusableEl);\n }\n\n if (firstHiddenFocusableRef.current) {\n firstHiddenFocusableRef.current.tabIndex = 0;\n }\n } else {\n focus(firstHiddenFocusableRef.current!);\n }\n\n if (lastHiddenFocusableRef.current) {\n lastHiddenFocusableRef.current.tabIndex = -1;\n }\n };\n\n const onFocusOut = (event: React.FocusEvent) => {\n const elementContains = elementRef.current instanceof HTMLElement && elementRef.current.contains(event.relatedTarget as Node);\n\n if (!elementContains && lastHiddenFocusableRef.current && firstHiddenFocusableRef.current) {\n lastHiddenFocusableRef.current.tabIndex = 0;\n firstHiddenFocusableRef.current.tabIndex = 0;\n }\n };\n\n const onListFocus = () => {\n const focusedOptionIndex = focusedOptionIndexState !== -1 ? focusedOptionIndexState : props.autoOptionFocus ? findFirstFocusedOptionIndex() : findSelectedOptionIndex();\n\n setFocusedState(true);\n setFocusedOptionIndexState(focusedOptionIndex);\n\n autoUpdateModel();\n scrollInView(focusedOptionIndex);\n };\n\n const onListBlur = () => {\n setFocusedState(false);\n setFocusedOptionIndexState(-1);\n\n startRangeIndex.current = -1;\n searchValue.current = '';\n };\n\n const onListKeyDown = (event: React.KeyboardEvent) => {\n const metaKey = event.metaKey || event.ctrlKey;\n\n switch (event.code) {\n case 'ArrowDown':\n onArrowDownKey(event);\n break;\n\n case 'ArrowUp':\n onArrowUpKey(event);\n break;\n\n case 'Home':\n onHomeKey(event);\n break;\n\n case 'End':\n onEndKey(event);\n break;\n\n case 'PageDown':\n onPageDownKey(event);\n break;\n\n case 'PageUp':\n onPageUpKey(event);\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n case 'Space':\n onSpaceKey(event);\n break;\n\n case 'Tab':\n //NOOP\n break;\n\n case 'ShiftLeft':\n case 'ShiftRight':\n onShiftKey();\n break;\n\n default:\n if (props.multiple && event.code === 'KeyA' && metaKey) {\n const value = getOptions()\n .filter((option: unknown) => isValidOption(option))\n .map((option: unknown) => getOptionValue(option));\n\n updateModel(event, value);\n\n event.preventDefault();\n break;\n }\n\n if (!metaKey && isPrintableCharacter(event.key)) {\n searchOptions(event, event.key);\n event.preventDefault();\n }\n\n break;\n }\n };\n\n const onOptionSelect = (event: React.MouseEvent | React.KeyboardEvent, option: unknown, index = -1) => {\n if (props.disabled || isOptionDisabled(option)) {\n return;\n }\n\n if (props.multiple) {\n onOptionSelectMultiple(event, option);\n } else {\n onOptionSelectSingle(event, option);\n }\n\n optionTouched.current = false;\n\n if (index !== -1) {\n setFocusedOptionIndexState(index);\n }\n };\n\n const onOptionMouseDown = (event: React.MouseEvent, index: number) => {\n changeFocusedOptionIndex(event, index);\n };\n\n const onOptionMouseMove = (event: React.MouseEvent, index: number) => {\n if (props.focusOnHover && focusedState) {\n changeFocusedOptionIndex(event, index);\n }\n };\n\n const onOptionTouchEnd = () => {\n if (props.disabled) {\n return;\n }\n\n optionTouched.current = true;\n };\n\n const onOptionSelectSingle = (event: React.MouseEvent | React.KeyboardEvent, option: unknown) => {\n const selected = isSelected(option);\n const metaSelection = optionTouched.current ? false : props.metaKeySelection;\n let valueChanged = false;\n let value = null;\n\n if (metaSelection) {\n const metaKey = event && (event.metaKey || event.ctrlKey);\n\n if (selected) {\n if (metaKey) {\n value = null;\n valueChanged = true;\n }\n } else {\n value = getOptionValue(option);\n valueChanged = true;\n }\n } else {\n value = selected ? null : getOptionValue(option);\n valueChanged = true;\n }\n\n if (valueChanged) {\n updateModel(event, value);\n }\n };\n\n const onOptionSelectMultiple = (event: React.MouseEvent | React.KeyboardEvent, option: unknown) => {\n const selected = isSelected(option);\n const metaSelection = optionTouched.current ? false : props.metaKeySelection;\n let value = null;\n\n if (metaSelection) {\n const metaKey = event.metaKey || event.ctrlKey;\n\n if (selected) {\n value = metaKey ? removeOption(option) : [getOptionValue(option)];\n } else {\n value = metaKey ? (Array.isArray(valueState) ? valueState : []) : [];\n value = [...value, getOptionValue(option)];\n }\n } else {\n value = selected ? removeOption(option) : [...(Array.isArray(valueState) ? valueState : []), getOptionValue(option)];\n }\n\n updateModel(event, value);\n };\n\n const onOptionSelectRange = (event: React.MouseEvent | React.KeyboardEvent, start = -1, end = -1) => {\n start = start === -1 ? findNearestSelectedOptionIndex(end, true) : start;\n end = end === -1 ? findNearestSelectedOptionIndex(start) : end;\n\n if (start !== -1 && end !== -1) {\n const rangeStart = Math.min(start, end);\n const rangeEnd = Math.max(start, end);\n const value = getOptions()\n .slice(rangeStart, rangeEnd + 1)\n .filter((option: unknown) => isValidOption(option))\n .map((option: unknown) => getOptionValue(option));\n\n updateModel(event, value);\n }\n };\n\n const onFilterChange = () => {\n setFocusedOptionIndexState(-1);\n startRangeIndex.current = -1;\n };\n\n const onFilterBlur = () => {\n setFocusedOptionIndexState(-1);\n startRangeIndex.current = -1;\n };\n\n const onFilterKeyDown = (event: React.KeyboardEvent) => {\n switch (event.code) {\n case 'ArrowDown':\n onArrowDownKey(event);\n break;\n\n case 'ArrowUp':\n onArrowUpKey(event);\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n onArrowLeftKey(event, true);\n break;\n\n case 'Home':\n onHomeKey(event, true);\n break;\n\n case 'End':\n onEndKey(event, true);\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n onEnterKey(event);\n break;\n\n case 'ShiftLeft':\n case 'ShiftRight':\n onShiftKey();\n break;\n\n default:\n break;\n }\n };\n\n const onArrowDownKey = (event: React.KeyboardEvent) => {\n const optionIndex = focusedOptionIndexState !== -1 ? findNextOptionIndex(focusedOptionIndexState) : findFirstFocusedOptionIndex();\n\n if (props.multiple && event.shiftKey) {\n onOptionSelectRange(event, startRangeIndex.current, optionIndex);\n }\n\n changeFocusedOptionIndex(event, optionIndex);\n event.preventDefault();\n };\n\n const onArrowUpKey = (event: React.KeyboardEvent) => {\n const optionIndex = focusedOptionIndexState !== -1 ? findPrevOptionIndex(focusedOptionIndexState) : findLastFocusedOptionIndex();\n\n if (props.multiple && event.shiftKey) {\n onOptionSelectRange(event, optionIndex, startRangeIndex.current);\n }\n\n changeFocusedOptionIndex(event, optionIndex);\n event.preventDefault();\n };\n\n const onArrowLeftKey = (event: React.KeyboardEvent, pressedInInputText = false) => {\n if (pressedInInputText) {\n setFocusedOptionIndexState(-1);\n }\n };\n\n const onHomeKey = (event: React.KeyboardEvent, pressedInInputText = false) => {\n if (pressedInInputText) {\n const target = event.currentTarget as HTMLInputElement;\n\n if (event.shiftKey) {\n target?.setSelectionRange(0, target.selectionStart);\n } else {\n target?.setSelectionRange(0, 0);\n setFocusedOptionIndexState(-1);\n }\n } else {\n const metaKey = event.metaKey || event.ctrlKey;\n const optionIndex = findFirstOptionIndex();\n\n if (props.multiple && event.shiftKey && metaKey) {\n onOptionSelectRange(event, optionIndex, startRangeIndex.current);\n }\n\n changeFocusedOptionIndex(event, optionIndex);\n }\n\n event.preventDefault();\n };\n\n const onEndKey = (event: React.KeyboardEvent, pressedInInputText = false) => {\n if (pressedInInputText) {\n const target = event.currentTarget as HTMLInputElement;\n const length = target.value.length;\n\n if (event.shiftKey) {\n target.setSelectionRange(target.selectionStart, length);\n } else {\n target.setSelectionRange(length, length);\n setFocusedOptionIndexState(-1);\n }\n } else {\n const metaKey = event.metaKey || event.ctrlKey;\n const optionIndex = findLastOptionIndex();\n\n if (props.multiple && event.shiftKey && metaKey) {\n onOptionSelectRange(event, startRangeIndex.current, optionIndex);\n }\n\n changeFocusedOptionIndex(event, optionIndex);\n }\n\n event.preventDefault();\n };\n\n const onPageUpKey = (event: React.KeyboardEvent) => {\n scrollInView(0);\n event.preventDefault();\n };\n\n const onPageDownKey = (event: React.KeyboardEvent) => {\n scrollInView(getOptions().length - 1);\n event.preventDefault();\n };\n\n const onEnterKey = (event: React.KeyboardEvent) => {\n if (focusedOptionIndexState !== -1) {\n if (props.multiple && event.shiftKey) onOptionSelectRange(event, focusedOptionIndexState);\n else onOptionSelect(event, getOptions()[focusedOptionIndexState!]);\n }\n };\n\n const onSpaceKey = (event: React.KeyboardEvent) => {\n event.preventDefault();\n onEnterKey(event);\n };\n\n const onShiftKey = () => {\n startRangeIndex.current = focusedOptionIndexState!;\n };\n\n const isOptionMatched = (option: unknown) => {\n return isValidOption(option) && getOptionLabel(option)?.toLocaleLowerCase(props.locale).startsWith(searchValue.current?.toLocaleLowerCase(props.locale));\n };\n\n const isValidOption = (option: unknown) => {\n return isNotEmpty(option) && !isOptionDisabled(option) && !isOptionGroup(option);\n };\n\n const isValidSelectedOption = (option: unknown) => {\n return isValidOption(option) && isSelected(option);\n };\n\n const isEquals = (value1: unknown, value2: unknown) => {\n return equals(value1, value2, equalityKey);\n };\n\n const isSelected = (option: unknown) => {\n const optionValue = getOptionValue(option);\n\n if (props.multiple) {\n return Array.isArray(valueState) && valueState.some((value: unknown) => isEquals(value, optionValue));\n } else {\n return isEquals(valueState, optionValue);\n }\n };\n\n const findFirstOptionIndex = () => {\n return getOptions().findIndex((option: unknown) => isValidOption(option));\n };\n\n const findLastOptionIndex = () => {\n return findLastIndex(getOptions(), (option: unknown) => isValidOption(option));\n };\n\n const findNextOptionIndex = (index: number) => {\n const matchedOptionIndex =\n index < getOptions().length - 1\n ? getOptions()\n .slice(index + 1)\n .findIndex((option: unknown) => isValidOption(option))\n : -1;\n\n return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : index;\n };\n\n const findPrevOptionIndex = (index: number) => {\n const matchedOptionIndex = index > 0 ? findLastIndex(getOptions().slice(0, index), (option) => isValidOption(option)) : -1;\n\n return matchedOptionIndex > -1 ? matchedOptionIndex : index;\n };\n\n const findSelectedOptionIndex = () => {\n if (hasValue()) {\n if (props.multiple && Array.isArray(valueState)) {\n for (let index = valueState.length - 1; index >= 0; index--) {\n const value = valueState[index];\n const matchedOptionIndex = getOptions().findIndex((option: unknown) => isValidSelectedOption(option) && isEquals(value, getOptionValue(option)));\n\n if (matchedOptionIndex > -1) return matchedOptionIndex;\n }\n } else {\n return getOptions().findIndex((option: unknown) => isValidSelectedOption(option));\n }\n }\n\n return -1;\n };\n\n const findFirstSelectedOptionIndex = () => {\n return hasValue() ? getOptions().findIndex((option) => isValidSelectedOption(option)) : -1;\n };\n\n const findLastSelectedOptionIndex = () => {\n return hasValue() ? findLastIndex(getOptions(), (option) => isValidSelectedOption(option)) : -1;\n };\n\n const findNextSelectedOptionIndex = (index: number) => {\n const matchedOptionIndex =\n hasValue() && index < getOptions().length - 1\n ? getOptions()\n .slice(index + 1)\n .findIndex((option) => isValidSelectedOption(option))\n : -1;\n\n return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : -1;\n };\n\n const findPrevSelectedOptionIndex = (index: number) => {\n const matchedOptionIndex = hasValue() && index > 0 ? findLastIndex(getOptions().slice(0, index), (option) => isValidSelectedOption(option)) : -1;\n\n return matchedOptionIndex > -1 ? matchedOptionIndex : -1;\n };\n\n const findNearestSelectedOptionIndex = (index: number, firstCheckUp = false) => {\n let matchedOptionIndex = -1;\n\n if (hasValue()) {\n if (firstCheckUp) {\n matchedOptionIndex = findPrevSelectedOptionIndex(index);\n matchedOptionIndex = matchedOptionIndex === -1 ? findNextSelectedOptionIndex(index) : matchedOptionIndex;\n } else {\n matchedOptionIndex = findNextSelectedOptionIndex(index);\n matchedOptionIndex = matchedOptionIndex === -1 ? findPrevSelectedOptionIndex(index) : matchedOptionIndex;\n }\n }\n\n return matchedOptionIndex > -1 ? matchedOptionIndex : index;\n };\n\n const findFirstFocusedOptionIndex = () => {\n const selectedIndex = findFirstSelectedOptionIndex();\n\n return selectedIndex < 0 ? findFirstOptionIndex() : selectedIndex;\n };\n\n const findLastFocusedOptionIndex = () => {\n const selectedIndex = findLastSelectedOptionIndex();\n\n return selectedIndex < 0 ? findLastOptionIndex() : selectedIndex;\n };\n\n const searchOptions = (event: React.KeyboardEvent, char: string) => {\n searchValue.current = (searchValue.current || '') + char;\n\n let optionIndex = -1;\n\n if (isNotEmpty(searchValue.current)) {\n if (focusedOptionIndexState !== -1) {\n optionIndex = getOptions()\n .slice(focusedOptionIndexState)\n .findIndex((option: unknown) => isOptionMatched(option));\n optionIndex =\n optionIndex === -1\n ? getOptions()\n .slice(0, focusedOptionIndexState)\n .findIndex((option: unknown) => isOptionMatched(option))\n : optionIndex + focusedOptionIndexState;\n } else {\n optionIndex = getOptions().findIndex((option: unknown) => isOptionMatched(option));\n }\n\n if (optionIndex === -1 && focusedOptionIndexState === -1) {\n optionIndex = findFirstFocusedOptionIndex() ?? -1;\n }\n\n if (optionIndex !== -1) {\n changeFocusedOptionIndex(event, optionIndex);\n }\n }\n\n if (searchTimeout.current) {\n clearTimeout(searchTimeout.current);\n }\n\n searchTimeout.current = setTimeout(() => {\n searchValue.current = '';\n searchTimeout.current = null;\n }, 500);\n };\n\n const removeOption = (option: unknown) => {\n return Array.isArray(valueState) ? valueState.filter((val: unknown) => !isEquals(val, getOptionValue(option))) : [];\n };\n\n const changeFocusedOptionIndex = (event: React.MouseEvent | React.KeyboardEvent, index: number = -1) => {\n if (focusedOptionIndexState !== index) {\n setFocusedOptionIndexState(index);\n\n scrollInView();\n\n if (props.selectOnFocus && !props.multiple) {\n onOptionSelect(event, getOptions()[index]);\n }\n }\n };\n\n const nextFrame = (): Promise<void> => {\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n requestAnimationFrame(resolve as () => void);\n });\n });\n };\n\n const scrollInView = (index = -1) => {\n nextFrame().then(() => {\n const id = index !== -1 ? getOptionId(index) : getFocusedOptionId();\n const element = findSingle(listRef.current!, `[id=\"${id}\"]`);\n\n element?.scrollIntoView?.({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });\n });\n };\n\n const autoUpdateModel = () => {\n if (props.selectOnFocus && props.autoOptionFocus && !hasValue() && !props.multiple && focusedState) {\n const focusedOptionIndex = findFirstFocusedOptionIndex();\n\n setFocusedOptionIndexState(focusedOptionIndex);\n onOptionSelect(null as unknown as React.MouseEvent, getOptions()[focusedOptionIndex!]);\n }\n };\n\n const updateModel = (event: React.SyntheticEvent, value: unknown) => {\n setValueState([\n value,\n {\n originalEvent: event,\n value: value\n }\n ]);\n };\n\n const hasValue = () => {\n return isNotEmpty(valueState);\n };\n\n // effects\n React.useEffect(() => {\n autoUpdateModel();\n\n return () => {\n if (searchTimeout.current) {\n clearTimeout(searchTimeout.current);\n searchTimeout.current = null;\n }\n };\n }, []);\n\n // computed\n const optionsListGroup = React.useMemo(() => {\n const flattenOptions: unknown[] = [];\n\n (props.options || []).forEach((optionGroup) => {\n const optionGroupChildren = getOptionGroupChildren(optionGroup) || [];\n\n if (optionGroupChildren?.length) {\n flattenOptions.push({ optionGroup, group: true }, ...optionGroupChildren);\n }\n });\n\n return flattenOptions;\n }, [props.options]);\n\n const visibleOptions = props.optionGroupLabel ? optionsListGroup : props.options;\n const equalityKey = props.optionValue ? undefined : props.optionKey;\n\n return {\n state,\n // element refs\n listRef,\n firstHiddenFocusableRef,\n lastHiddenFocusableRef,\n // methods\n getOptions,\n getOptionId,\n getOptionLabel,\n getOptionValue,\n isOptionDisabled,\n isOptionGroup,\n getOptionGroupLabel,\n getOptionGroupChildren,\n getFocusedOptionId,\n getAriaSetSize,\n getAriaPosInset,\n onFirstHiddenFocus,\n onLastHiddenFocus,\n onFocusOut,\n onListFocus,\n onListBlur,\n onListKeyDown,\n onOptionSelect,\n onOptionMouseDown,\n onOptionMouseMove,\n onOptionTouchEnd,\n onFilterChange,\n onFilterBlur,\n onFilterKeyDown,\n isOptionMatched,\n isValidOption,\n isValidSelectedOption,\n isSelected,\n changeFocusedOptionIndex,\n scrollInView,\n updateModel,\n autoUpdateModel,\n equalityKey,\n hasValue\n };\n }\n});\n","import type { useListboxProps } from '@primereact/types/shared/listbox';\n\nexport const defaultProps: useListboxProps = {\n value: undefined,\n defaultValue: undefined,\n options: [],\n optionKey: undefined,\n optionLabel: undefined,\n optionValue: undefined,\n optionDisabled: undefined,\n optionGroupLabel: undefined,\n optionGroupChildren: undefined,\n disabled: false,\n locale: undefined,\n multiple: false,\n metaKeySelection: false,\n autoOptionFocus: true,\n selectOnFocus: false,\n focusOnHover: true,\n onValueChange: undefined\n};\n"],"mappings":"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","names":["withHeadless","useControlledState","equals","findLastIndex","findSingle","focus","getFirstFocusableElement","isElement","isNotEmpty","isPrintableCharacter","isString","resolveFieldData","React","defaultProps","useListbox","withHeadless","defaultProps","id","props","elementRef","_a","focusedState","setFocusedState","focusedOptionIndexState","setFocusedOptionIndexState","valueState","setValueState","useControlledState","state","listRef","firstHiddenFocusableRef","lastHiddenFocusableRef","optionTouched","startRangeIndex","searchTimeout","searchValue","getOptions","visibleOptions","getOptionId","index","getOptionLabel","option","resolveFieldData","isString","getOptionValue","isOptionDisabled","isOptionGroup","getOptionGroupLabel","optionGroup","getOptionGroupChildren","getFocusedOptionId","getAriaSetSize","getAriaPosInset","onFirstHiddenFocus","focus","firstFocusableEl","getFirstFocusableElement","isElement","onLastHiddenFocus","event","onFocusOut","onListFocus","focusedOptionIndex","findFirstFocusedOptionIndex","findSelectedOptionIndex","autoUpdateModel","scrollInView","onListBlur","onListKeyDown","metaKey","onArrowDownKey","onArrowUpKey","onHomeKey","onEndKey","onPageDownKey","onPageUpKey","onSpaceKey","onShiftKey","value","isValidOption","updateModel","isPrintableCharacter","searchOptions","onOptionSelect","onOptionSelectMultiple","onOptionSelectSingle","onOptionMouseDown","changeFocusedOptionIndex","onOptionMouseMove","onOptionTouchEnd","selected","isSelected","metaSelection","valueChanged","removeOption","onOptionSelectRange","start","end","findNearestSelectedOptionIndex","rangeStart","rangeEnd","onFilterChange","onFilterBlur","onFilterKeyDown","onArrowLeftKey","onEnterKey","optionIndex","findNextOptionIndex","findPrevOptionIndex","findLastFocusedOptionIndex","pressedInInputText","target","findFirstOptionIndex","length","findLastOptionIndex","isOptionMatched","_b","isNotEmpty","isValidSelectedOption","isEquals","value1","value2","equals","equalityKey","optionValue","findLastIndex","matchedOptionIndex","hasValue","findFirstSelectedOptionIndex","findLastSelectedOptionIndex","findNextSelectedOptionIndex","findPrevSelectedOptionIndex","firstCheckUp","selectedIndex","char","val","nextFrame","resolve","element","findSingle","optionsListGroup","flattenOptions","optionGroupChildren"]}
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ export declare const useListbox: (inProps?: unknown) => import("@primereact/types/core").HeadlessInstance<import("@primereact/types/shared/listbox").useListboxProps, unknown, {
3
+ state: {
4
+ value: unknown;
5
+ focused: boolean;
6
+ focusedOptionIndex: number;
7
+ };
8
+ listRef: React.RefObject<HTMLElement | null>;
9
+ firstHiddenFocusableRef: React.RefObject<HTMLElement | null>;
10
+ lastHiddenFocusableRef: React.RefObject<HTMLElement | null>;
11
+ getOptions: () => unknown[];
12
+ getOptionId: (index: number) => string;
13
+ getOptionLabel: (option: unknown) => any;
14
+ getOptionValue: (option: unknown) => any;
15
+ isOptionDisabled: (option: unknown) => any;
16
+ isOptionGroup: (option: unknown) => boolean;
17
+ getOptionGroupLabel: (optionGroup: unknown) => any;
18
+ getOptionGroupChildren: (optionGroup: unknown) => any;
19
+ getFocusedOptionId: () => string | null;
20
+ getAriaSetSize: () => number;
21
+ getAriaPosInset: (index: number) => number;
22
+ onFirstHiddenFocus: () => void;
23
+ onLastHiddenFocus: (event: React.FocusEvent) => void;
24
+ onFocusOut: (event: React.FocusEvent) => void;
25
+ onListFocus: () => void;
26
+ onListBlur: () => void;
27
+ onListKeyDown: (event: React.KeyboardEvent) => void;
28
+ onOptionSelect: (event: React.MouseEvent | React.KeyboardEvent, option: unknown, index?: number) => void;
29
+ onOptionMouseDown: (event: React.MouseEvent, index: number) => void;
30
+ onOptionMouseMove: (event: React.MouseEvent, index: number) => void;
31
+ onOptionTouchEnd: () => void;
32
+ onFilterChange: () => void;
33
+ onFilterBlur: () => void;
34
+ onFilterKeyDown: (event: React.KeyboardEvent) => void;
35
+ isOptionMatched: (option: unknown) => any;
36
+ isValidOption: (option: unknown) => boolean;
37
+ isValidSelectedOption: (option: unknown) => boolean;
38
+ isSelected: (option: unknown) => boolean;
39
+ changeFocusedOptionIndex: (event: React.MouseEvent | React.KeyboardEvent, index?: number) => void;
40
+ scrollInView: (index?: number) => void;
41
+ updateModel: (event: React.SyntheticEvent, value: unknown) => void;
42
+ autoUpdateModel: () => void;
43
+ equalityKey: string | undefined;
44
+ hasValue: () => boolean;
45
+ }>;
@@ -0,0 +1,2 @@
1
+ import type { useListboxProps } from '@primereact/types/shared/listbox';
2
+ export declare const defaultProps: useListboxProps;
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './useMenu';
2
+ export * from './useMenu.props';
package/menu/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import{withHeadless as N}from"@primereact/core/headless";import{findSingle as Q,focus as A,isPrintableCharacter as ee}from"@primeuix/utils";import*as u from"react";var F={open:void 0,defaultOpen:void 0,composite:!1,appendTo:"body",baseZIndex:0,autoZIndex:!0,tabIndex:0,onOpenChange:void 0};var ae=N({name:"useMenu",defaultProps:F,setup({props:r}){var C;let[L,h]=u.useState(r.open!==void 0?r.open:(C=r.defaultOpen)!=null?C:!1),[S,M]=u.useState(!1),[d,a]=u.useState(r.composite?[]:""),[K,R]=u.useState(null),v=u.useRef(!1),O=u.useRef(null),I=u.useRef(null),f=u.useRef(null),p=u.useRef(new Map),P={opened:L,focused:S,focusedOptionId:d,contextMenuTarget:K},H=u.useCallback((e,t)=>{p.current.set(e,t)},[]),_=u.useCallback(e=>{p.current.delete(e)},[]),w=e=>{r.onOpenChange&&r.onOpenChange({value:e})};u.useEffect(()=>{r.open!==void 0&&h(r.open)},[r.open]);let j=e=>{h(e),w(e)},g=u.useCallback(()=>{let e=[];return p.current.forEach((t,n)=>{if(t.getAttribute("data-p-disabled")==="true")return;let s=t,l=!0;for(;s&&s!==f.current;){let c=s.closest('[data-pc-name="menulist"]');if(!c||c===f.current)break;let i=c.previousElementSibling;if(i&&i.getAttribute("aria-expanded")==="false"){l=!1;break}s=c.parentElement}l&&e.push({id:n,element:t})}),e},[]),y=u.useCallback(()=>{let e=g();if(e.length===0)return[];let t=Math.min(...e.map(c=>c.id.split("_").length));if(d.length===0)return e.filter(i=>i.id.split("_").length===t);let o=d[d.length-1].split("_"),s=o.length;return e.filter(c=>{let i=c.id.split("_");if(i.length!==s)return!1;if(s===t)return i.length===t;let b=o.slice(0,-1).join("_"),x=i.slice(0,-1).join("_");return b===x})},[r.composite,d,g]),m=e=>{v.current=!0,r.composite?a(t=>{let n=Array.isArray(t)?t:[];if(n.length===0)return[e];if(n.includes(e)){let o=e.length,s=n.findIndex(l=>l.length===o);return s!==-1?[...n.slice(0,s),e]:n}else if(n[n.length-1].length===e.length)return[...n.slice(0,-1),e];return[...n,e]}):a(e)},E=()=>r.composite&&Array.isArray(d)?d[d.length-1]||"":typeof d=="string"?d:"",B=e=>{var l,c;let t=r.composite?y():g();if(t.length===0)return;let n=E(),o=n?t.findIndex(i=>i.id===n)+1:0,s=e.toLowerCase();for(let i=o;i<t.length;i++){let b=t[i];if((((l=b.element.textContent)==null?void 0:l.trim().toLowerCase())||"").startsWith(s)){r.composite?m(b.id):a(b.id);return}}for(let i=0;i<o;i++){let b=t[i];if((((c=b.element.textContent)==null?void 0:c.trim().toLowerCase())||"").startsWith(s)){r.composite?m(b.id):a(b.id);return}}},U=e=>{e.preventDefault();let t=r.composite?y():g();if(t.length===0)return;let n=E();if(!n){r.composite?m(t[0].id):a(t[0].id);return}let o=t.findIndex(l=>l.id===n),s=o<t.length-1?o+1:0;r.composite?m(t[s].id):a(t[s].id)},W=e=>{if(e.preventDefault(),e.altKey&&I.current){D();return}let t=r.composite?y():g();if(t.length===0)return;let n=E();if(!n){r.composite?m(t[t.length-1].id):a(t[t.length-1].id);return}let o=t.findIndex(l=>l.id===n),s=o>0?o-1:t.length-1;r.composite?m(t[s].id):a(t[s].id)},X=e=>{if(!r.composite)return;e.preventDefault();let t=E();if(!t)return;let n=p.current.get(t);if(!n)return;let o=n.getAttribute("aria-expanded");if(o!==null){if(o==="false"){let s=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,view:window});n.dispatchEvent(s)}setTimeout(()=>{let l=g().filter(c=>c.id.startsWith(t+"_")&&c.id.split("_").length===t.split("_").length+1);l.length>0&&a(c=>[...Array.isArray(c)?c:[],l[0].id])},10)}},Y=e=>{if(!(!r.composite||(e.preventDefault(),!E()||!Array.isArray(d)))&&d.length>1){let n=d[d.length-2],o=p.current.get(n);if(o&&o.getAttribute("aria-expanded")==="true"){let s=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,view:window});o.dispatchEvent(s)}}},Z=e=>{e.preventDefault();let t=r.composite?y():g();t.length!==0&&(r.composite?m(t[0].id):a(t[0].id))},V=e=>{e.preventDefault();let t=r.composite?y():g();t.length!==0&&(r.composite?m(t[t.length-1].id):a(t[t.length-1].id))},$=e=>{if(r.composite&&T(),f!=null&&f.current){let t=E(),n=Q(f==null?void 0:f.current,`[id="${t}"]`);if(n){let o=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,view:window});n.dispatchEvent(o)}}e.preventDefault()},T=()=>{k(),setTimeout(()=>{I.current&&A(I.current.elementRef.current)},10)},q=e=>{let t=e.metaKey||e.ctrlKey;switch(e.key){case"ArrowDown":U(e);break;case"ArrowUp":W(e);break;case"ArrowRight":r.composite&&X(e);break;case"ArrowLeft":r.composite&&Y(e);break;case"Home":Z(e);break;case"End":V(e);break;case"Enter":case" ":$(e);break;case"PageDown":case"PageUp":case"Backspace":case"ShiftLeft":case"ShiftRight":break;case"Escape":T();break;default:!t&&ee(e.key)&&B(e.key);break}},z=()=>{if(M(!0),E()===""&&!v.current){let t=r.composite?y():g();t.length>0&&(r.composite?m(t[0].id):a(t[0].id))}v.current=!1},G=()=>{M(!1),r.composite?k():a("")},k=()=>{r.composite?(p.current.forEach(e=>{if(e.getAttribute("aria-expanded")==="true"){let n=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,view:window});e.dispatchEvent(n)}}),a([])):a("")},J=e=>{if(!r.composite||!Array.isArray(d))return;let t=e.split("_").length-1;p.current.forEach((n,o)=>{let s=o.split("_").length-1;if(n.getAttribute("aria-expanded")==="true"&&s>=t){let c=new MouseEvent("mousedown",{bubbles:!0,cancelable:!0,view:window});n.dispatchEvent(c)}}),a(n=>(Array.isArray(n)?n:[]).filter(s=>s.split("_").length-1<t))},D=()=>{h(!1),w(!1),r.composite?a([]):a(""),setTimeout(()=>{I.current&&A(I.current.elementRef.current)},10)};return{state:P,portalRef:O,triggerRef:I,listRef:f,registerItem:H,unregisterItem:_,changeVisibleState:j,changeFocusedOptionId:m,hideSubmenusAfterLevel:J,onListKeyDown:q,onListFocus:z,onListBlur:G,onOverlayEnter:()=>{f.current&&A(f.current)},onTriggerClick:e=>{if(e&&e.type==="contextmenu"){e.preventDefault(),e.stopPropagation();let t={pageX:e.pageX,pageY:e.pageY};L?(w(!1),h(!1),setTimeout(()=>{R(t),w(!0),h(!0)},0)):(R(t),h(!0),w(!0))}else R(null),h(!0),w(!0)},onItemClick:e=>{e.preventDefault(),D()}}}});export{F as defaultProps,ae as useMenu};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/menu/useMenu.ts","../../src/menu/useMenu.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { findSingle, focus, isPrintableCharacter } from '@primeuix/utils';\nimport * as React from 'react';\nimport { defaultProps } from './useMenu.props';\n\nexport const useMenu = withHeadless({\n name: 'useMenu',\n defaultProps,\n setup({ props }) {\n const [openState, setOpenState] = React.useState<boolean>(props.open !== undefined ? props.open : (props.defaultOpen ?? false));\n const [focusedState, setFocusedState] = React.useState<boolean>(false);\n const [focusedOptionId, setFocusedOptionId] = React.useState<string | string[]>(props.composite ? [] : '');\n const [contextMenuTarget, setContextMenuTarget] = React.useState<{ pageX: number; pageY: number } | null>(null);\n const isMouseInteractionRef = React.useRef(false);\n\n const portalRef = React.useRef<{ containerRef: { current: { elementRef: React.RefObject<HTMLDivElement> } } } | null>(null);\n const triggerRef = React.useRef<{ elementRef: React.RefObject<HTMLButtonElement> } | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const itemRefsById = React.useRef<Map<string, HTMLElement>>(new Map());\n\n const state = {\n opened: openState,\n focused: focusedState,\n focusedOptionId,\n contextMenuTarget\n };\n\n const registerItem = React.useCallback((id: string, ref: HTMLElement) => {\n itemRefsById.current.set(id, ref);\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n itemRefsById.current.delete(id);\n }, []);\n\n const updateOpenState = (value: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange({ value });\n }\n };\n\n React.useEffect(() => {\n if (props.open !== undefined) {\n setOpenState(props.open);\n }\n }, [props.open]);\n\n const changeVisibleState = (isVisible: boolean) => {\n setOpenState(isVisible);\n updateOpenState(isVisible);\n };\n\n const getFocusableItems = React.useCallback(() => {\n const items: Array<{ id: string; element: HTMLElement }> = [];\n\n itemRefsById.current.forEach((element, id) => {\n const isDisabled = element.getAttribute('data-p-disabled') === 'true';\n\n if (isDisabled) return;\n\n let currentElement: HTMLElement | null = element;\n let isVisible = true;\n\n while (currentElement && currentElement !== listRef.current) {\n const parentList = currentElement.closest('[data-pc-name=\"menulist\"]') as HTMLElement | null;\n\n if (!parentList || parentList === listRef.current) break;\n\n const trigger = parentList.previousElementSibling as HTMLElement | null;\n\n if (trigger && trigger.getAttribute('aria-expanded') === 'false') {\n isVisible = false;\n break;\n }\n\n currentElement = parentList.parentElement;\n }\n\n if (!isVisible) return;\n\n items.push({ id, element });\n });\n\n return items;\n }, []);\n\n const getFocusableItemsAtCurrentLevel = React.useCallback(() => {\n const allFocusableItems = getFocusableItems();\n\n if (allFocusableItems.length === 0) return [];\n\n // Determine the root level depth by examining all items\n // Find the minimum underscore count among all items to determine root level depth\n const minDepth = Math.min(...allFocusableItems.map((item) => item.id.split('_').length));\n\n if (focusedOptionId.length === 0) {\n // No focus yet, return root level items\n const rootItems = allFocusableItems.filter((item) => {\n return item.id.split('_').length === minDepth;\n });\n\n return rootItems;\n }\n\n // Get the current focused item ID\n const currentFocusedId = focusedOptionId[focusedOptionId.length - 1];\n const currentIdParts = currentFocusedId.split('_');\n const currentDepth = currentIdParts.length;\n\n // Filter items that are at the same level and belong to the same parent\n const levelItems = allFocusableItems.filter((item) => {\n const itemParts = item.id.split('_');\n\n // Must have same depth\n if (itemParts.length !== currentDepth) return false;\n\n // For root level\n if (currentDepth === minDepth) {\n return itemParts.length === minDepth;\n }\n\n // For nested levels, check if they share the same parent path\n // Example: menu_0_1_2 and menu_0_1_3 share parent menu_0_1\n const currentParentPath = currentIdParts.slice(0, -1).join('_');\n const itemParentPath = itemParts.slice(0, -1).join('_');\n\n return currentParentPath === itemParentPath;\n });\n\n return levelItems;\n }, [props.composite, focusedOptionId, getFocusableItems]);\n\n const changeFocusedOptionId = (id: string) => {\n // Mark as mouse interaction to prevent auto-focus in onListFocus\n isMouseInteractionRef.current = true;\n\n if (props.composite) {\n setFocusedOptionId((prev) => {\n const prevArray = Array.isArray(prev) ? prev : [];\n\n if (prevArray.length === 0) {\n return [id];\n } else {\n if (prevArray.includes(id)) {\n const len = id.length;\n\n const findIndex = prevArray.findIndex((val) => val.length === len);\n\n if (findIndex !== -1) {\n return [...prevArray.slice(0, findIndex), id];\n }\n\n return prevArray;\n } else if (prevArray[prevArray.length - 1].length === id.length) {\n return [...prevArray.slice(0, -1), id];\n }\n\n return [...prevArray, id];\n }\n });\n } else {\n setFocusedOptionId(id);\n }\n };\n\n const getCurrentFocusedId = () => {\n if (props.composite && Array.isArray(focusedOptionId)) {\n return focusedOptionId[focusedOptionId.length - 1] || '';\n }\n\n return typeof focusedOptionId === 'string' ? focusedOptionId : '';\n };\n\n const searchItems = (char: string) => {\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length === 0) return;\n\n const currentFocusedId = getCurrentFocusedId();\n const startIndex = currentFocusedId ? focusableItems.findIndex((item) => item.id === currentFocusedId) + 1 : 0;\n const searchChar = char.toLowerCase();\n\n for (let i = startIndex; i < focusableItems.length; i++) {\n const item = focusableItems[i];\n const itemText = item.element.textContent?.trim().toLowerCase() || '';\n\n if (itemText.startsWith(searchChar)) {\n if (props.composite) {\n changeFocusedOptionId(item.id);\n } else {\n setFocusedOptionId(item.id);\n }\n\n return;\n }\n }\n\n for (let i = 0; i < startIndex; i++) {\n const item = focusableItems[i];\n const itemText = item.element.textContent?.trim().toLowerCase() || '';\n\n if (itemText.startsWith(searchChar)) {\n if (props.composite) {\n changeFocusedOptionId(item.id);\n } else {\n setFocusedOptionId(item.id);\n }\n\n return;\n }\n }\n };\n\n const onArrowDown = (event: React.KeyboardEvent) => {\n event.preventDefault();\n\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length === 0) return;\n\n const currentFocusedId = getCurrentFocusedId();\n\n if (!currentFocusedId) {\n if (props.composite) {\n changeFocusedOptionId(focusableItems[0].id);\n } else {\n setFocusedOptionId(focusableItems[0].id);\n }\n\n return;\n }\n\n const currentIndex = focusableItems.findIndex((item) => item.id === currentFocusedId);\n const nextIndex = currentIndex < focusableItems.length - 1 ? currentIndex + 1 : 0;\n\n if (props.composite) {\n changeFocusedOptionId(focusableItems[nextIndex].id);\n } else {\n setFocusedOptionId(focusableItems[nextIndex].id);\n }\n };\n\n const onArrowUp = (event: React.KeyboardEvent) => {\n event.preventDefault();\n\n if (event.altKey && triggerRef.current) {\n hide();\n\n return;\n }\n\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length === 0) return;\n\n const currentFocusedId = getCurrentFocusedId();\n\n if (!currentFocusedId) {\n if (props.composite) {\n changeFocusedOptionId(focusableItems[focusableItems.length - 1].id);\n } else {\n setFocusedOptionId(focusableItems[focusableItems.length - 1].id);\n }\n\n return;\n }\n\n const currentIndex = focusableItems.findIndex((item) => item.id === currentFocusedId);\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : focusableItems.length - 1;\n\n if (props.composite) {\n changeFocusedOptionId(focusableItems[prevIndex].id);\n } else {\n setFocusedOptionId(focusableItems[prevIndex].id);\n }\n };\n\n const onArrowRight = (event: React.KeyboardEvent) => {\n if (!props.composite) return;\n\n event.preventDefault();\n\n const currentFocusedId = getCurrentFocusedId();\n\n if (!currentFocusedId) return;\n\n // Find the focused element\n const focusedElement = itemRefsById.current.get(currentFocusedId);\n\n if (!focusedElement) return;\n\n const ariaExpanded = focusedElement.getAttribute('aria-expanded');\n\n if (ariaExpanded !== null) {\n if (ariaExpanded === 'false') {\n // Open the submenu by simulating mousedown\n const mouseDownEvent = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n\n focusedElement.dispatchEvent(mouseDownEvent);\n }\n\n setTimeout(() => {\n const focusableItems = getFocusableItems();\n\n const submenuItems = focusableItems.filter((item) => {\n return item.id.startsWith(currentFocusedId + '_') && item.id.split('_').length === currentFocusedId.split('_').length + 1;\n });\n\n // Focus the first item in the submenu\n if (submenuItems.length > 0) {\n setFocusedOptionId((prev) => {\n const prevArray = Array.isArray(prev) ? prev : [];\n\n return [...prevArray, submenuItems[0].id];\n });\n }\n }, 10);\n }\n };\n\n const onArrowLeft = (event: React.KeyboardEvent) => {\n if (!props.composite) return;\n\n event.preventDefault();\n\n const currentFocusedId = getCurrentFocusedId();\n\n if (!currentFocusedId || !Array.isArray(focusedOptionId)) return;\n\n if (focusedOptionId.length > 1) {\n const parentTriggerId = focusedOptionId[focusedOptionId.length - 2];\n const parentTrigger = itemRefsById.current.get(parentTriggerId);\n\n if (parentTrigger && parentTrigger.getAttribute('aria-expanded') === 'true') {\n // Close the submenu by simulating mousedown\n const mouseDownEvent = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n\n parentTrigger.dispatchEvent(mouseDownEvent);\n }\n }\n };\n\n const onHome = (event: React.KeyboardEvent) => {\n event.preventDefault();\n\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length === 0) return;\n\n if (props.composite) {\n changeFocusedOptionId(focusableItems[0].id);\n } else {\n setFocusedOptionId(focusableItems[0].id);\n }\n };\n\n const onEnd = (event: React.KeyboardEvent) => {\n event.preventDefault();\n\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length === 0) return;\n\n if (props.composite) {\n changeFocusedOptionId(focusableItems[focusableItems.length - 1].id);\n } else {\n setFocusedOptionId(focusableItems[focusableItems.length - 1].id);\n }\n };\n\n const onEnterKey = (event: React.KeyboardEvent) => {\n if (props.composite) {\n onEscapeKey();\n }\n\n if (listRef?.current) {\n const currentFocusedId = getCurrentFocusedId();\n const element = findSingle(listRef?.current, `[id=\"${currentFocusedId}\"]`) as HTMLElement;\n\n if (element) {\n const mouseDownEvent = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n\n element.dispatchEvent(mouseDownEvent);\n }\n }\n\n event.preventDefault();\n };\n\n const onEscapeKey = () => {\n hideAllSubmenus();\n\n setTimeout(() => {\n if (triggerRef.current) {\n focus(triggerRef.current.elementRef.current!);\n }\n }, 10);\n };\n\n const onListKeyDown = (event: React.KeyboardEvent) => {\n const metaKey = event.metaKey || event.ctrlKey;\n\n switch (event.key) {\n case 'ArrowDown':\n onArrowDown(event);\n\n break;\n\n case 'ArrowUp':\n onArrowUp(event);\n\n break;\n\n case 'ArrowRight':\n if (props.composite) {\n onArrowRight(event);\n }\n\n break;\n\n case 'ArrowLeft':\n if (props.composite) {\n onArrowLeft(event);\n }\n\n break;\n\n case 'Home':\n onHome(event);\n\n break;\n\n case 'End':\n onEnd(event);\n\n break;\n\n case 'Enter':\n case ' ':\n onEnterKey(event);\n\n break;\n\n case 'PageDown':\n case 'PageUp':\n case 'Backspace':\n case 'ShiftLeft':\n case 'ShiftRight':\n break;\n\n case 'Escape':\n onEscapeKey();\n\n break;\n\n default:\n if (!metaKey && isPrintableCharacter(event.key)) {\n searchItems(event.key);\n }\n\n break;\n }\n };\n\n const onListFocus = () => {\n setFocusedState(true);\n\n const currentFocusedId = getCurrentFocusedId();\n\n if (currentFocusedId === '' && !isMouseInteractionRef.current) {\n const focusableItems = props.composite ? getFocusableItemsAtCurrentLevel() : getFocusableItems();\n\n if (focusableItems.length > 0) {\n if (props.composite) {\n changeFocusedOptionId(focusableItems[0].id);\n } else {\n setFocusedOptionId(focusableItems[0].id);\n }\n }\n }\n\n isMouseInteractionRef.current = false;\n };\n\n const onListBlur = () => {\n setFocusedState(false);\n\n if (props.composite) {\n hideAllSubmenus();\n } else {\n // For non-composite mode, reset focus on blur\n setFocusedOptionId('');\n }\n };\n\n const hideAllSubmenus = () => {\n if (props.composite) {\n itemRefsById.current.forEach((element) => {\n const ariaExpanded = element.getAttribute('aria-expanded');\n\n if (ariaExpanded === 'true') {\n const mouseDownEvent = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n\n element.dispatchEvent(mouseDownEvent);\n }\n });\n\n setFocusedOptionId([]);\n } else {\n setFocusedOptionId('');\n }\n };\n\n const hideSubmenusAfterLevel = (targetItemId: string) => {\n if (!props.composite || !Array.isArray(focusedOptionId)) return;\n\n const targetLevel = targetItemId.split('_').length - 1;\n\n itemRefsById.current.forEach((element, elementId) => {\n const elementLevel = elementId.split('_').length - 1;\n const ariaExpanded = element.getAttribute('aria-expanded');\n\n if (ariaExpanded === 'true' && elementLevel >= targetLevel) {\n const mouseDownEvent = new MouseEvent('mousedown', {\n bubbles: true,\n cancelable: true,\n view: window\n });\n\n element.dispatchEvent(mouseDownEvent);\n }\n });\n\n setFocusedOptionId((prev) => {\n const prevArray = Array.isArray(prev) ? prev : [];\n\n return prevArray.filter((id) => {\n const idLevel = id.split('_').length - 1;\n\n return idLevel < targetLevel;\n });\n });\n };\n\n const hide = () => {\n setOpenState(false);\n updateOpenState(false);\n\n if (props.composite) {\n setFocusedOptionId([]);\n } else {\n setFocusedOptionId('');\n }\n\n setTimeout(() => {\n if (triggerRef.current) {\n focus(triggerRef.current.elementRef.current!);\n }\n }, 10);\n };\n\n const onOverlayEnter = () => {\n if (listRef.current) {\n focus(listRef.current);\n }\n };\n\n const onTriggerClick = (event?: React.MouseEvent) => {\n if (event && event.type === 'contextmenu') {\n event.preventDefault();\n event.stopPropagation();\n\n const newTarget = { pageX: event.pageX, pageY: event.pageY };\n\n if (openState) {\n updateOpenState(false);\n setOpenState(false);\n\n setTimeout(() => {\n setContextMenuTarget(newTarget);\n updateOpenState(true);\n setOpenState(true);\n }, 0);\n } else {\n setContextMenuTarget(newTarget);\n\n setOpenState(true);\n updateOpenState(true);\n }\n } else {\n setContextMenuTarget(null);\n\n setOpenState(true);\n updateOpenState(true);\n }\n };\n\n const onItemClick = (event: React.MouseEvent) => {\n event.preventDefault();\n hide();\n };\n\n return {\n state,\n //refs\n portalRef,\n triggerRef,\n listRef,\n //methods\n registerItem,\n unregisterItem,\n changeVisibleState,\n changeFocusedOptionId,\n hideSubmenusAfterLevel,\n onListKeyDown,\n onListFocus,\n onListBlur,\n onOverlayEnter,\n onTriggerClick,\n onItemClick\n };\n }\n});\n","import type { useMenuProps } from '@primereact/types/shared/menu';\n\nexport const defaultProps: useMenuProps = {\n open: undefined,\n defaultOpen: undefined,\n composite: false,\n appendTo: 'body',\n baseZIndex: 0,\n autoZIndex: true,\n tabIndex: 0,\n onOpenChange: undefined\n};\n"],"mappings":"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","names":["withHeadless","findSingle","focus","isPrintableCharacter","React","defaultProps","useMenu","withHeadless","defaultProps","props","_a","openState","setOpenState","focusedState","setFocusedState","focusedOptionId","setFocusedOptionId","contextMenuTarget","setContextMenuTarget","isMouseInteractionRef","portalRef","triggerRef","listRef","itemRefsById","state","registerItem","id","ref","unregisterItem","updateOpenState","value","changeVisibleState","isVisible","getFocusableItems","items","element","currentElement","parentList","trigger","getFocusableItemsAtCurrentLevel","allFocusableItems","minDepth","item","currentIdParts","currentDepth","itemParts","currentParentPath","itemParentPath","changeFocusedOptionId","prev","prevArray","len","findIndex","val","getCurrentFocusedId","searchItems","char","_b","focusableItems","currentFocusedId","startIndex","searchChar","onArrowDown","event","currentIndex","nextIndex","onArrowUp","hide","prevIndex","onArrowRight","focusedElement","ariaExpanded","mouseDownEvent","submenuItems","onArrowLeft","parentTriggerId","parentTrigger","onHome","onEnd","onEnterKey","onEscapeKey","findSingle","hideAllSubmenus","focus","onListKeyDown","metaKey","isPrintableCharacter","onListFocus","onListBlur","hideSubmenusAfterLevel","targetItemId","targetLevel","elementId","elementLevel","newTarget"]}
@@ -0,0 +1,2 @@
1
+ export * from './useMenuSub';
2
+ export * from './useMenuSub.props';
@@ -0,0 +1,2 @@
1
+ import{withHeadless as m}from"@primereact/core/headless";import*as t from"react";var f={open:void 0,defaultOpen:void 0,onOpenChange:void 0};var O=m({name:"useMenuSub",defaultProps:f,setup({props:e}){var s;let[u,o]=t.useState(e.open!==void 0?e.open:(s=e.defaultOpen)!=null?s:!1),c=t.useRef(null),i=t.useRef(null),d=t.useRef(null),r={opened:u},a=n=>{e.onOpenChange&&e.onOpenChange({value:n})};t.useEffect(()=>{e.open!==void 0&&o(e.open)},[e.open]);let l=()=>{if(!e.disabled){let n=!u;o(n),a(n)}};return{state:r,portalRef:c,triggerRef:i,listRef:d,toggle:l,open:()=>{e.disabled||(o(!0),a(!0))},close:()=>{e.disabled||(o(!1),a(!1))},onTriggerClick:()=>{e.disabled||l()}}}});export{f as defaultProps,O as useMenuSub};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/menu/sub/useMenuSub.ts","../../../src/menu/sub/useMenuSub.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport * as React from 'react';\nimport { defaultProps } from './useMenuSub.props';\n\nexport const useMenuSub = withHeadless({\n name: 'useMenuSub',\n defaultProps,\n setup({ props }) {\n const [openState, setOpenState] = React.useState<boolean>(props.open !== undefined ? props.open : (props.defaultOpen ?? false));\n\n const portalRef = React.useRef<{ containerRef: { current: { elementRef: React.RefObject<HTMLDivElement> } } } | null>(null);\n const triggerRef = React.useRef<HTMLDivElement | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n\n const state = {\n opened: openState\n };\n\n const updateOpenState = (value: boolean) => {\n if (props.onOpenChange) {\n props.onOpenChange({ value });\n }\n };\n\n React.useEffect(() => {\n if (props.open !== undefined) {\n setOpenState(props.open);\n }\n }, [props.open]);\n\n const toggle = () => {\n if (!props.disabled) {\n const newState = !openState;\n\n setOpenState(newState);\n updateOpenState(newState);\n }\n };\n\n const open = () => {\n if (!props.disabled) {\n const newState = true;\n\n setOpenState(newState);\n updateOpenState(newState);\n }\n };\n\n const close = () => {\n if (!props.disabled) {\n const newState = false;\n\n setOpenState(newState);\n updateOpenState(newState);\n }\n };\n\n const onTriggerClick = () => {\n if (!props.disabled) {\n toggle();\n }\n };\n\n return {\n state,\n // refs\n portalRef,\n triggerRef,\n listRef,\n // methods\n toggle,\n open,\n close,\n onTriggerClick\n };\n }\n});\n","import type { useMenuSubProps } from '@primereact/types/shared/menu';\n\nexport const defaultProps: useMenuSubProps = {\n open: undefined,\n defaultOpen: undefined,\n onOpenChange: undefined\n};\n"],"mappings":"AAAA,OAAS,gBAAAA,MAAoB,4BAC7B,UAAYC,MAAW,QCChB,IAAMC,EAAgC,CACzC,KAAM,OACN,YAAa,OACb,aAAc,MAClB,EDFO,IAAMC,EAAaC,EAAa,CACnC,KAAM,aACN,aAAAC,EACA,MAAM,CAAE,MAAAC,CAAM,EAAG,CAPrB,IAAAC,EAQQ,GAAM,CAACC,EAAWC,CAAY,EAAU,WAAkBH,EAAM,OAAS,OAAYA,EAAM,MAAQC,EAAAD,EAAM,cAAN,KAAAC,EAAqB,EAAM,EAExHG,EAAkB,SAA8F,IAAI,EACpHC,EAAmB,SAA8B,IAAI,EACrDC,EAAgB,SAAgC,IAAI,EAEpDC,EAAQ,CACV,OAAQL,CACZ,EAEMM,EAAmBC,GAAmB,CACpCT,EAAM,cACNA,EAAM,aAAa,CAAE,MAAAS,CAAM,CAAC,CAEpC,EAEM,YAAU,IAAM,CACdT,EAAM,OAAS,QACfG,EAAaH,EAAM,IAAI,CAE/B,EAAG,CAACA,EAAM,IAAI,CAAC,EAEf,IAAMU,EAAS,IAAM,CACjB,GAAI,CAACV,EAAM,SAAU,CACjB,IAAMW,EAAW,CAACT,EAElBC,EAAaQ,CAAQ,EACrBH,EAAgBG,CAAQ,CAC5B,CACJ,EA0BA,MAAO,CACH,MAAAJ,EAEA,UAAAH,EACA,WAAAC,EACA,QAAAC,EAEA,OAAAI,EACA,KAhCS,IAAM,CACVV,EAAM,WAGPG,EAAa,EAAQ,EACrBK,EAAgB,EAAQ,EAEhC,EA0BI,MAxBU,IAAM,CACXR,EAAM,WAGPG,EAAa,EAAQ,EACrBK,EAAgB,EAAQ,EAEhC,EAkBI,eAhBmB,IAAM,CACpBR,EAAM,UACPU,EAAO,CAEf,CAaA,CACJ,CACJ,CAAC","names":["withHeadless","React","defaultProps","useMenuSub","withHeadless","defaultProps","props","_a","openState","setOpenState","portalRef","triggerRef","listRef","state","updateOpenState","value","toggle","newState"]}
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ export declare const useMenuSub: (inProps?: unknown) => import("@primereact/types/core").HeadlessInstance<import("@primereact/types/shared/menu").useMenuSubProps, unknown, {
3
+ state: {
4
+ opened: boolean;
5
+ };
6
+ portalRef: React.RefObject<{
7
+ containerRef: {
8
+ current: {
9
+ elementRef: React.RefObject<HTMLDivElement>;
10
+ };
11
+ };
12
+ } | null>;
13
+ triggerRef: React.RefObject<HTMLDivElement | null>;
14
+ listRef: React.RefObject<HTMLUListElement | null>;
15
+ toggle: () => void;
16
+ open: () => void;
17
+ close: () => void;
18
+ onTriggerClick: () => void;
19
+ }>;
@@ -0,0 +1,2 @@
1
+ import type { useMenuSubProps } from '@primereact/types/shared/menu';
2
+ export declare const defaultProps: useMenuSubProps;
@@ -0,0 +1,34 @@
1
+ import * as React from 'react';
2
+ export declare const useMenu: (inProps?: unknown) => import("@primereact/types/core").HeadlessInstance<import("@primereact/types/shared/menu").useMenuProps, unknown, {
3
+ state: {
4
+ opened: boolean;
5
+ focused: boolean;
6
+ focusedOptionId: string | string[];
7
+ contextMenuTarget: {
8
+ pageX: number;
9
+ pageY: number;
10
+ } | null;
11
+ };
12
+ portalRef: React.RefObject<{
13
+ containerRef: {
14
+ current: {
15
+ elementRef: React.RefObject<HTMLDivElement>;
16
+ };
17
+ };
18
+ } | null>;
19
+ triggerRef: React.RefObject<{
20
+ elementRef: React.RefObject<HTMLButtonElement>;
21
+ } | null>;
22
+ listRef: React.RefObject<HTMLUListElement | null>;
23
+ registerItem: (id: string, ref: HTMLElement) => void;
24
+ unregisterItem: (id: string) => void;
25
+ changeVisibleState: (isVisible: boolean) => void;
26
+ changeFocusedOptionId: (id: string) => void;
27
+ hideSubmenusAfterLevel: (targetItemId: string) => void;
28
+ onListKeyDown: (event: React.KeyboardEvent) => void;
29
+ onListFocus: () => void;
30
+ onListBlur: () => void;
31
+ onOverlayEnter: () => void;
32
+ onTriggerClick: (event?: React.MouseEvent) => void;
33
+ onItemClick: (event: React.MouseEvent) => void;
34
+ }>;
@@ -0,0 +1,2 @@
1
+ import type { useMenuProps } from '@primereact/types/shared/menu';
2
+ export declare const defaultProps: useMenuProps;
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './useOrgChart';
2
+ export * from './useOrgChart.props';
@@ -0,0 +1,2 @@
1
+ import{withHeadless as P}from"@primereact/core/headless";import*as s from"react";var N={value:void 0,gap:40,selectable:!0,collapsible:!1,selectionMode:"single"};var H=P({name:"useOrgChart",defaultProps:N,setup({props:a}){let[f,d]=s.useState(()=>new Set),[g,h]=s.useState(()=>new Set),w=s.useMemo(()=>Array.from(f),[f]),M=s.useMemo(()=>Array.from(g),[g]),u=s.useRef(!1),b=s.useRef(new Set),S=s.useRef(new Set),k={selectedNodes:w,collapsedNodes:M},C=s.useCallback(e=>{e&&d(l=>{let t=new Set(l);return t.has(e)?a.selectionMode==="single"?t.clear():t.delete(e):(a.selectionMode==="single"&&t.clear(),t.add(e)),t})},[a.selectionMode]),R=s.useCallback(e=>{e&&h(l=>{let t=new Set(l);return t.has(e)?t.delete(e):t.add(e),t})},[]),E=s.useCallback((e,l)=>{(e.key==="Enter"||e.key===" ")&&(C(l),e.preventDefault(),e.stopPropagation())},[C]),T=s.useCallback((e,l)=>{(e.key==="Enter"||e.key===" ")&&(R(l),e.preventDefault(),e.stopPropagation())},[R]),z=s.useMemo(()=>{var l;let e=(l=a.gap)!=null?l:40;return Array.isArray(e)?e.length===1?e=[e[0],e[0]]:e.length===0&&(e=[40,40]):e=[e,e],{"--gap-x":e[0],"--gap-y":e[1]}},[a.gap]),y=s.useCallback(e=>e.reduce((l,t)=>(l.push(t),t.children&&t.children.length>0&&l.push(...y(t.children)),l),[]),[]),c=s.useMemo(()=>{if(!a.value||a.value.length===0)return new Map;let e=y(a.value),l=new Map;return e.forEach(t=>{l.set(t.key,t)}),l},[a.value,y]);s.useMemo(()=>{if(u.current||c.size===0)return;let e=new Set,l=new Set;c.forEach(t=>{var r,n;if(t.collapsedByDefault){let i=(n=(r=t.collapsible)!=null?r:a.collapsible)!=null?n:!1,o=t.children&&t.children.length>0;i&&o&&e.add(t.key)}}),c.forEach(t=>{var r,n;if(t.selectedByDefault&&((n=(r=t.selectable)!=null?r:a.selectable)!=null?n:!0)){if(a.selectionMode==="single"&&l.size>0)return;l.add(t.key)}}),S.current=e,b.current=l},[c,a.collapsible,a.selectable,a.selectionMode]);let m=s.useCallback(e=>{var t,r;return e?!!(((r=(t=e.collapsible)!=null?t:a.collapsible)!=null?r:!1)&&e.children&&e.children.length>0):!1},[a.collapsible]),K=s.useCallback(e=>{var l,t;return e?!!((t=(l=e.selectable)!=null?l:a.selectable)!=null&&t):!1},[a.selectable]),p=s.useCallback(e=>!e||!e.key||!m(e)?!1:!!(g.has(e.key)||!u.current&&S.current.has(e.key)),[g,m]),x=s.useCallback(e=>!e||!e.key?!1:!!(f.has(e.key)||!u.current&&b.current.has(e.key)),[f]);return s.useEffect(()=>{if(c.size===0){h(e=>e.size>0?new Set:e),d(e=>e.size>0?new Set:e);return}if(!u.current){u.current=!0;let e=S.current,l=b.current;e.size>0&&h(new Set(e)),l.size>0&&d(new Set(l));return}h(e=>{if(e.size===0)return e;let l=new Set,t=!1;return e.forEach(r=>{var i,o;let n=c.get(r);n&&((o=(i=n.collapsible)!=null?i:a.collapsible)!=null?o:!1)&&n.children&&n.children.length>0?l.add(r):t=!0}),t?l:e}),d(e=>{if(e.size===0)return e;let l=new Set,t=!1;return e.forEach(r=>{var i,o;let n=c.get(r);n&&((o=(i=n.selectable)!=null?i:a.selectable)!=null?o:!0)?l.add(r):t=!0}),t?l:e})},[c,a.collapsible,a.selectable]),{state:k,orgChartStyle:z,toggleNodeSelect:C,toggleNodeCollapse:R,isCollapsible:m,isSelectable:K,isCollapsed:p,isSelected:x,handleNodeKeyDown:E,handleCollapseKeyDown:T}}});export{N as defaultProps,H as useOrgChart};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/orgchart/useOrgChart.ts","../../src/orgchart/useOrgChart.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { TreeNode } from '@primereact/types/shared/orgchart';\nimport * as React from 'react';\nimport { defaultProps } from './useOrgChart.props';\n\nexport const useOrgChart = withHeadless({\n name: 'useOrgChart',\n defaultProps,\n setup({ props }) {\n const [selectedNodesSet, setSelectedNodesSet] = React.useState<Set<string>>(() => new Set());\n const [collapsedNodesSet, setCollapsedNodesSet] = React.useState<Set<string>>(() => new Set());\n\n const selectedNodes = React.useMemo(() => Array.from(selectedNodesSet), [selectedNodesSet]);\n const collapsedNodes = React.useMemo(() => Array.from(collapsedNodesSet), [collapsedNodesSet]);\n\n const isInitialized = React.useRef(false);\n const initialSelectedKeysRef = React.useRef<Set<string>>(new Set());\n const initialCollapsedKeysRef = React.useRef<Set<string>>(new Set());\n\n const state = {\n selectedNodes,\n collapsedNodes\n };\n\n const toggleNodeSelect = React.useCallback(\n (key?: string) => {\n if (!key) return;\n\n setSelectedNodesSet((prev) => {\n const next = new Set(prev);\n\n if (next.has(key)) {\n if (props.selectionMode === 'single') {\n next.clear();\n } else {\n next.delete(key);\n }\n } else {\n if (props.selectionMode === 'single') {\n next.clear();\n }\n\n next.add(key);\n }\n\n return next;\n });\n },\n [props.selectionMode]\n );\n\n const toggleNodeCollapse = React.useCallback((key?: string) => {\n if (!key) return;\n\n setCollapsedNodesSet((prev) => {\n const next = new Set(prev);\n\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n\n return next;\n });\n }, []);\n\n const handleNodeKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>, key?: string) => {\n if (event.key === 'Enter' || event.key === ' ') {\n toggleNodeSelect(key);\n\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [toggleNodeSelect]\n );\n\n const handleCollapseKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>, key?: string) => {\n if (event.key === 'Enter' || event.key === ' ') {\n toggleNodeCollapse(key);\n\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [toggleNodeCollapse]\n );\n\n const orgChartStyle = React.useMemo(() => {\n let gap = props.gap ?? 40;\n\n if (!Array.isArray(gap)) {\n gap = [gap, gap];\n } else if (gap.length === 1) {\n gap = [gap[0], gap[0]];\n } else if (gap.length === 0) {\n gap = [40, 40];\n }\n\n return {\n '--gap-x': gap[0],\n '--gap-y': gap[1]\n };\n }, [props.gap]);\n\n const flattenNodes = React.useCallback((nodes: TreeNode[]): TreeNode[] => {\n return nodes.reduce((acc, node) => {\n acc.push(node);\n\n if (node.children && node.children.length > 0) {\n acc.push(...flattenNodes(node.children));\n }\n\n return acc;\n }, [] as TreeNode[]);\n }, []);\n\n const nodeMap = React.useMemo(() => {\n if (!props.value || props.value.length === 0) return new Map<string, TreeNode>();\n\n const allNodes = flattenNodes(props.value);\n const map = new Map<string, TreeNode>();\n\n allNodes.forEach((node) => {\n map.set(node.key, node);\n });\n\n return map;\n }, [props.value, flattenNodes]);\n\n React.useMemo(() => {\n if (isInitialized.current || nodeMap.size === 0) return;\n\n const collapsedKeys = new Set<string>();\n const selectedKeys = new Set<string>();\n\n nodeMap.forEach((node) => {\n if (node.collapsedByDefault) {\n const nodeCollapsible = node.collapsible ?? props.collapsible ?? false;\n const hasChildren = node.children && node.children.length > 0;\n\n if (nodeCollapsible && hasChildren) {\n collapsedKeys.add(node.key);\n }\n }\n });\n\n nodeMap.forEach((node) => {\n if (node.selectedByDefault) {\n const nodeSelectable = node.selectable ?? props.selectable ?? true;\n\n if (nodeSelectable) {\n if (props.selectionMode === 'single' && selectedKeys.size > 0) {\n return;\n }\n\n selectedKeys.add(node.key);\n }\n }\n });\n\n initialCollapsedKeysRef.current = collapsedKeys;\n initialSelectedKeysRef.current = selectedKeys;\n }, [nodeMap, props.collapsible, props.selectable, props.selectionMode]);\n\n const isCollapsible = React.useCallback(\n (node?: TreeNode) => {\n if (!node) return false;\n\n const nodeCollapsible = node.collapsible ?? props.collapsible ?? false;\n\n return Boolean(nodeCollapsible && node.children && node.children.length > 0);\n },\n [props.collapsible]\n );\n\n const isSelectable = React.useCallback(\n (node?: TreeNode) => {\n if (!node) return false;\n\n return Boolean(node.selectable ?? props.selectable ?? false);\n },\n [props.selectable]\n );\n\n const isCollapsed = React.useCallback(\n (node?: TreeNode) => {\n if (!node || !node.key) return false;\n\n if (!isCollapsible(node)) return false;\n\n if (collapsedNodesSet.has(node.key)) return true;\n\n if (!isInitialized.current && initialCollapsedKeysRef.current.has(node.key)) {\n return true;\n }\n\n return false;\n },\n [collapsedNodesSet, isCollapsible]\n );\n\n const isSelected = React.useCallback(\n (node?: TreeNode) => {\n if (!node || !node.key) return false;\n\n if (selectedNodesSet.has(node.key)) return true;\n\n if (!isInitialized.current && initialSelectedKeysRef.current.has(node.key)) {\n return true;\n }\n\n return false;\n },\n [selectedNodesSet]\n );\n\n React.useEffect(() => {\n if (nodeMap.size === 0) {\n setCollapsedNodesSet((prev) => (prev.size > 0 ? new Set() : prev));\n setSelectedNodesSet((prev) => (prev.size > 0 ? new Set() : prev));\n\n return;\n }\n\n if (!isInitialized.current) {\n isInitialized.current = true;\n\n const collapsedKeys = initialCollapsedKeysRef.current;\n const selectedKeys = initialSelectedKeysRef.current;\n\n if (collapsedKeys.size > 0) {\n setCollapsedNodesSet(new Set(collapsedKeys));\n }\n\n if (selectedKeys.size > 0) {\n setSelectedNodesSet(new Set(selectedKeys));\n }\n\n return;\n }\n\n setCollapsedNodesSet((prev) => {\n if (prev.size === 0) return prev;\n\n const next = new Set<string>();\n let hasChanges = false;\n\n prev.forEach((key) => {\n const node = nodeMap.get(key);\n\n if (node) {\n const nodeCollapsible = node.collapsible ?? props.collapsible ?? false;\n\n if (nodeCollapsible && node.children && node.children.length > 0) {\n next.add(key);\n } else {\n hasChanges = true;\n }\n } else {\n hasChanges = true;\n }\n });\n\n return hasChanges ? next : prev;\n });\n\n setSelectedNodesSet((prev) => {\n if (prev.size === 0) return prev;\n\n const next = new Set<string>();\n let hasChanges = false;\n\n prev.forEach((key) => {\n const node = nodeMap.get(key);\n\n if (node) {\n const nodeSelectable = node.selectable ?? props.selectable ?? true;\n\n if (nodeSelectable) {\n next.add(key);\n } else {\n hasChanges = true;\n }\n } else {\n hasChanges = true;\n }\n });\n\n return hasChanges ? next : prev;\n });\n }, [nodeMap, props.collapsible, props.selectable]);\n\n return {\n state,\n orgChartStyle,\n toggleNodeSelect,\n toggleNodeCollapse,\n isCollapsible,\n isSelectable,\n isCollapsed,\n isSelected,\n handleNodeKeyDown,\n handleCollapseKeyDown\n };\n }\n});\n","import type { useOrgChartProps } from '@primereact/types/shared/orgchart';\n\nexport const defaultProps: useOrgChartProps = {\n value: undefined,\n gap: 40,\n selectable: true,\n collapsible: false,\n selectionMode: 'single'\n};\n"],"mappings":"AAAA,OAAS,gBAAAA,MAAoB,4BAE7B,UAAYC,MAAW,QCAhB,IAAMC,EAAiC,CAC1C,MAAO,OACP,IAAK,GACL,WAAY,GACZ,YAAa,GACb,cAAe,QACnB,EDHO,IAAMC,EAAcC,EAAa,CACpC,KAAM,cACN,aAAAC,EACA,MAAM,CAAE,MAAAC,CAAM,EAAG,CACb,GAAM,CAACC,EAAkBC,CAAmB,EAAU,WAAsB,IAAM,IAAI,GAAK,EACrF,CAACC,EAAmBC,CAAoB,EAAU,WAAsB,IAAM,IAAI,GAAK,EAEvFC,EAAsB,UAAQ,IAAM,MAAM,KAAKJ,CAAgB,EAAG,CAACA,CAAgB,CAAC,EACpFK,EAAuB,UAAQ,IAAM,MAAM,KAAKH,CAAiB,EAAG,CAACA,CAAiB,CAAC,EAEvFI,EAAsB,SAAO,EAAK,EAClCC,EAA+B,SAAoB,IAAI,GAAK,EAC5DC,EAAgC,SAAoB,IAAI,GAAK,EAE7DC,EAAQ,CACV,cAAAL,EACA,eAAAC,CACJ,EAEMK,EAAyB,cAC1BC,GAAiB,CACTA,GAELV,EAAqBW,GAAS,CAC1B,IAAMC,EAAO,IAAI,IAAID,CAAI,EAEzB,OAAIC,EAAK,IAAIF,CAAG,EACRZ,EAAM,gBAAkB,SACxBc,EAAK,MAAM,EAEXA,EAAK,OAAOF,CAAG,GAGfZ,EAAM,gBAAkB,UACxBc,EAAK,MAAM,EAGfA,EAAK,IAAIF,CAAG,GAGTE,CACX,CAAC,CACL,EACA,CAACd,EAAM,aAAa,CACxB,EAEMe,EAA2B,cAAaH,GAAiB,CACtDA,GAELR,EAAsBS,GAAS,CAC3B,IAAMC,EAAO,IAAI,IAAID,CAAI,EAEzB,OAAIC,EAAK,IAAIF,CAAG,EACZE,EAAK,OAAOF,CAAG,EAEfE,EAAK,IAAIF,CAAG,EAGTE,CACX,CAAC,CACL,EAAG,CAAC,CAAC,EAECE,EAA0B,cAC5B,CAACC,EAA4CL,IAAiB,EACtDK,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACvCN,EAAiBC,CAAG,EAEpBK,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EAE9B,EACA,CAACN,CAAgB,CACrB,EAEMO,EAA8B,cAChC,CAACD,EAA+CL,IAAiB,EACzDK,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACvCF,EAAmBH,CAAG,EAEtBK,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EAE9B,EACA,CAACF,CAAkB,CACvB,EAEMI,EAAsB,UAAQ,IAAM,CA3FlD,IAAAC,EA4FY,IAAIC,GAAMD,EAAApB,EAAM,MAAN,KAAAoB,EAAa,GAEvB,OAAK,MAAM,QAAQC,CAAG,EAEXA,EAAI,SAAW,EACtBA,EAAM,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EACdA,EAAI,SAAW,IACtBA,EAAM,CAAC,GAAI,EAAE,GAJbA,EAAM,CAACA,EAAKA,CAAG,EAOZ,CACH,UAAWA,EAAI,CAAC,EAChB,UAAWA,EAAI,CAAC,CACpB,CACJ,EAAG,CAACrB,EAAM,GAAG,CAAC,EAERsB,EAAqB,cAAaC,GAC7BA,EAAM,OAAO,CAACC,EAAKC,KACtBD,EAAI,KAAKC,CAAI,EAETA,EAAK,UAAYA,EAAK,SAAS,OAAS,GACxCD,EAAI,KAAK,GAAGF,EAAaG,EAAK,QAAQ,CAAC,EAGpCD,GACR,CAAC,CAAe,EACpB,CAAC,CAAC,EAECE,EAAgB,UAAQ,IAAM,CAChC,GAAI,CAAC1B,EAAM,OAASA,EAAM,MAAM,SAAW,EAAG,OAAO,IAAI,IAEzD,IAAM2B,EAAWL,EAAatB,EAAM,KAAK,EACnC4B,EAAM,IAAI,IAEhB,OAAAD,EAAS,QAASF,GAAS,CACvBG,EAAI,IAAIH,EAAK,IAAKA,CAAI,CAC1B,CAAC,EAEMG,CACX,EAAG,CAAC5B,EAAM,MAAOsB,CAAY,CAAC,EAExB,UAAQ,IAAM,CAChB,GAAIf,EAAc,SAAWmB,EAAQ,OAAS,EAAG,OAEjD,IAAMG,EAAgB,IAAI,IACpBC,EAAe,IAAI,IAEzBJ,EAAQ,QAASD,GAAS,CA3ItC,IAAAL,EAAAW,EA4IgB,GAAIN,EAAK,mBAAoB,CACzB,IAAMO,GAAkBD,GAAAX,EAAAK,EAAK,cAAL,KAAAL,EAAoBpB,EAAM,cAA1B,KAAA+B,EAAyC,GAC3DE,EAAcR,EAAK,UAAYA,EAAK,SAAS,OAAS,EAExDO,GAAmBC,GACnBJ,EAAc,IAAIJ,EAAK,GAAG,CAElC,CACJ,CAAC,EAEDC,EAAQ,QAASD,GAAS,CAtJtC,IAAAL,EAAAW,EAuJgB,GAAIN,EAAK,qBACkBM,GAAAX,EAAAK,EAAK,aAAL,KAAAL,EAAmBpB,EAAM,aAAzB,KAAA+B,EAAuC,IAE1C,CAChB,GAAI/B,EAAM,gBAAkB,UAAY8B,EAAa,KAAO,EACxD,OAGJA,EAAa,IAAIL,EAAK,GAAG,CAC7B,CAER,CAAC,EAEDhB,EAAwB,QAAUoB,EAClCrB,EAAuB,QAAUsB,CACrC,EAAG,CAACJ,EAAS1B,EAAM,YAAaA,EAAM,WAAYA,EAAM,aAAa,CAAC,EAEtE,IAAMkC,EAAsB,cACvBT,GAAoB,CAzKjC,IAAAL,EAAAW,EA0KgB,OAAKN,EAIE,KAFiBM,GAAAX,EAAAK,EAAK,cAAL,KAAAL,EAAoBpB,EAAM,cAA1B,KAAA+B,EAAyC,KAE/BN,EAAK,UAAYA,EAAK,SAAS,OAAS,GAJxD,EAKtB,EACA,CAACzB,EAAM,WAAW,CACtB,EAEMmC,EAAqB,cACtBV,GAAoB,CApLjC,IAAAL,EAAAW,EAqLgB,OAAKN,EAEE,IAAQM,GAAAX,EAAAK,EAAK,aAAL,KAAAL,EAAmBpB,EAAM,aAAzB,MAAA+B,GAFG,EAGtB,EACA,CAAC/B,EAAM,UAAU,CACrB,EAEMoC,EAAoB,cACrBX,GACO,CAACA,GAAQ,CAACA,EAAK,KAEf,CAACS,EAAcT,CAAI,EAAU,GAE7B,GAAAtB,EAAkB,IAAIsB,EAAK,GAAG,GAE9B,CAAClB,EAAc,SAAWE,EAAwB,QAAQ,IAAIgB,EAAK,GAAG,GAM9E,CAACtB,EAAmB+B,CAAa,CACrC,EAEMG,EAAmB,cACpBZ,GACO,CAACA,GAAQ,CAACA,EAAK,IAAY,GAE3B,GAAAxB,EAAiB,IAAIwB,EAAK,GAAG,GAE7B,CAAClB,EAAc,SAAWC,EAAuB,QAAQ,IAAIiB,EAAK,GAAG,GAM7E,CAACxB,CAAgB,CACrB,EAEA,OAAM,YAAU,IAAM,CAClB,GAAIyB,EAAQ,OAAS,EAAG,CACpBtB,EAAsBS,GAAUA,EAAK,KAAO,EAAI,IAAI,IAAQA,CAAK,EACjEX,EAAqBW,GAAUA,EAAK,KAAO,EAAI,IAAI,IAAQA,CAAK,EAEhE,MACJ,CAEA,GAAI,CAACN,EAAc,QAAS,CACxBA,EAAc,QAAU,GAExB,IAAMsB,EAAgBpB,EAAwB,QACxCqB,EAAetB,EAAuB,QAExCqB,EAAc,KAAO,GACrBzB,EAAqB,IAAI,IAAIyB,CAAa,CAAC,EAG3CC,EAAa,KAAO,GACpB5B,EAAoB,IAAI,IAAI4B,CAAY,CAAC,EAG7C,MACJ,CAEA1B,EAAsBS,GAAS,CAC3B,GAAIA,EAAK,OAAS,EAAG,OAAOA,EAE5B,IAAMC,EAAO,IAAI,IACbwB,EAAa,GAEjB,OAAAzB,EAAK,QAASD,GAAQ,CA3PtC,IAAAQ,EAAAW,EA4PoB,IAAMN,EAAOC,EAAQ,IAAId,CAAG,EAExBa,KACwBM,GAAAX,EAAAK,EAAK,cAAL,KAAAL,EAAoBpB,EAAM,cAA1B,KAAA+B,EAAyC,KAE1CN,EAAK,UAAYA,EAAK,SAAS,OAAS,EAC3DX,EAAK,IAAIF,CAAG,EAKhB0B,EAAa,EAErB,CAAC,EAEMA,EAAaxB,EAAOD,CAC/B,CAAC,EAEDX,EAAqBW,GAAS,CAC1B,GAAIA,EAAK,OAAS,EAAG,OAAOA,EAE5B,IAAMC,EAAO,IAAI,IACbwB,EAAa,GAEjB,OAAAzB,EAAK,QAASD,GAAQ,CApRtC,IAAAQ,EAAAW,EAqRoB,IAAMN,EAAOC,EAAQ,IAAId,CAAG,EAExBa,KACuBM,GAAAX,EAAAK,EAAK,aAAL,KAAAL,EAAmBpB,EAAM,aAAzB,KAAA+B,EAAuC,IAG1DjB,EAAK,IAAIF,CAAG,EAKhB0B,EAAa,EAErB,CAAC,EAEMA,EAAaxB,EAAOD,CAC/B,CAAC,CACL,EAAG,CAACa,EAAS1B,EAAM,YAAaA,EAAM,UAAU,CAAC,EAE1C,CACH,MAAAU,EACA,cAAAS,EACA,iBAAAR,EACA,mBAAAI,EACA,cAAAmB,EACA,aAAAC,EACA,YAAAC,EACA,WAAAC,EACA,kBAAArB,EACA,sBAAAE,CACJ,CACJ,CACJ,CAAC","names":["withHeadless","React","defaultProps","useOrgChart","withHeadless","defaultProps","props","selectedNodesSet","setSelectedNodesSet","collapsedNodesSet","setCollapsedNodesSet","selectedNodes","collapsedNodes","isInitialized","initialSelectedKeysRef","initialCollapsedKeysRef","state","toggleNodeSelect","key","prev","next","toggleNodeCollapse","handleNodeKeyDown","event","handleCollapseKeyDown","orgChartStyle","_a","gap","flattenNodes","nodes","acc","node","nodeMap","allNodes","map","collapsedKeys","selectedKeys","_b","nodeCollapsible","hasChildren","isCollapsible","isSelectable","isCollapsed","isSelected","hasChanges"]}
@@ -0,0 +1,20 @@
1
+ import { TreeNode } from '@primereact/types/shared/orgchart';
2
+ import * as React from 'react';
3
+ export declare const useOrgChart: (inProps?: unknown) => import("@primereact/types/core").HeadlessInstance<import("@primereact/types/shared/orgchart").useOrgChartProps, unknown, {
4
+ state: {
5
+ selectedNodes: string[];
6
+ collapsedNodes: string[];
7
+ };
8
+ orgChartStyle: {
9
+ '--gap-x': number;
10
+ '--gap-y': number;
11
+ };
12
+ toggleNodeSelect: (key?: string) => void;
13
+ toggleNodeCollapse: (key?: string) => void;
14
+ isCollapsible: (node?: TreeNode) => boolean;
15
+ isSelectable: (node?: TreeNode) => boolean;
16
+ isCollapsed: (node?: TreeNode) => boolean;
17
+ isSelected: (node?: TreeNode) => boolean;
18
+ handleNodeKeyDown: (event: React.KeyboardEvent<HTMLDivElement>, key?: string) => void;
19
+ handleCollapseKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>, key?: string) => void;
20
+ }>;
@@ -0,0 +1,2 @@
1
+ import type { useOrgChartProps } from '@primereact/types/shared/orgchart';
2
+ export declare const defaultProps: useOrgChartProps;
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './useOverlay';
2
+ export * from './useOverlay.props';
@@ -0,0 +1,2 @@
1
+ import{withHeadless as q}from"@primereact/core/headless";import{ConnectedOverlayScrollHandler as F}from"@primereact/core/utils";import{useEventListener as d,useUnmountEffect as G}from"@primereact/hooks";import{$dt as J}from"@primeuix/styled";import{absolutePosition as Q,addClass as _,addStyle as ee,getHiddenElementOuterHeight as te,getHiddenElementOuterWidth as ne,getOffset as H,getViewport as re,isTouchDevice as oe,relativePosition as le}from"@primeuix/utils/dom";import{ZIndex as E}from"@primeuix/utils/zindex";import{EventBus as U}from"@primeuix/utils/eventbus";var g=U();import*as a from"react";var T={target:void 0,defaultOpen:void 0,open:void 0,appendTo:"body",type:"overlay",baseZIndex:0,autoZIndex:!0,closeOnEscape:!0,onOpenChange:void 0};var Oe=q({name:"useOverlay",defaultProps:T,setup:({props:t,$primereact:M})=>{let[s,b]=a.useState(!1),n=a.useRef(null),c=a.useRef(null),m=a.useRef(!1),k={visible:s},u=a.useCallback(()=>{var e,i;return n!=null&&n.current&&(n==null?void 0:n.current)instanceof HTMLElement?n==null?void 0:n.current:(i=(e=n==null?void 0:n.current)==null?void 0:e.elementRef.current)!=null?i:null},[n]),S=()=>{var e;s||(b(!0),(e=t.onOpenChange)==null||e.call(t,{value:!0}))},f=()=>{var e;s&&(b(!1),(e=t.onOpenChange)==null||e.call(t,{value:!1}))},P=()=>{var i,r,o,l;let e=u();e&&(ee(e,{position:"absolute",top:"0"}),t.autoZIndex&&t.type&&E.set(t.type,e,((i=t.baseZIndex)!=null?i:0)+((l=(o=(r=M.config)==null?void 0:r.zIndex)==null?void 0:o[t.type])!=null?l:1e3)),z())},I=()=>{D(),V(),X(),t.type==="menu"&&K()},Z=()=>{O(),x(),h(),t.type==="menu"&&L()},N=()=>{let e=u();t.autoZIndex&&e&&E.clear(e)},z=()=>{let e=u();if(!e)return;if(t.target&&typeof t.target=="object"&&"pageX"in t.target&&"pageY"in t.target){let r=t.target,o=r.pageX+1,l=r.pageY+1,R=e.offsetParent?e.offsetWidth:ne(e),C=e.offsetParent?e.offsetHeight:te(e),p=re(),y=window.scrollY||document.documentElement.scrollTop||document.body.scrollTop||0,v=window.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft||0;o+R-v>p.width&&(o-=R),l+C-y>p.height&&(l-=C),o<v&&(o=v),l<y&&(l=y),e.style.left=o+"px",e.style.top=l+"px"}else if(t.target){t.appendTo==="self"?le(e,t.target):Q(e,t.target);let r=H(e),o=H(t.target),l=0;Number(r.left)<Number(o.left)&&(l=Number(o.left)-Number(r.left)),e.style.setProperty(J("overlay.arrow.left").name,`${l}px`),r.top<o.top&&(_(e,"p-overlay-flipped"),e.setAttribute("data-p-overlay-flipped","true"))}},[D,O]=d({type:"click",listener:e=>w(e)}),[K,L]=d({type:"contextmenu",listener:e=>w(e)}),[V,x]=d({type:"scroll",listener:()=>A()}),[X,h]=d({target:"window",type:"resize",listener:()=>B()}),w=e=>{if(m.current){m.current=!1;return}s&&Y(e)&&f()},Y=e=>{let i=u();if(!i)return;let r=e.target;return!(i.isSameNode(r)||i.contains(r))},A=()=>{c.current||(c.current=new F(u(),()=>{s&&f()})),c.current.bindScrollListener()},B=()=>{s&&!oe()&&f()},j=e=>{g.emit("overlay-click",{originalEvent:e,target:t.target}),m.current=!0},W=e=>{e.code==="Escape"&&$(e)},$=e=>{s&&f(),e.preventDefault()};return a.useEffect(()=>{t.open?S():t.open||f()},[t.open]),G(()=>{O(),x(),h(),t.type==="menu"&&L(),c.current&&(c.current.destroy(),c.current=null);let e=u();t.autoZIndex&&e&&E.clear(e)}),{state:k,containerRef:n,hide:f,onOverlayEnter:P,onOverlayAfterEnter:I,onLeave:Z,onAfterLeave:N,onOverlayClick:j,onOverlayKeyDown:W}}});export{T as defaultProps,Oe as useOverlay};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/overlay/useOverlay.ts","../../../primereact/src/overlayeventbus/OverlayEventBus.ts","../../src/overlay/useOverlay.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { ConnectedOverlayScrollHandler } from '@primereact/core/utils';\nimport { useEventListener, useUnmountEffect } from '@primereact/hooks';\nimport { $dt } from '@primeuix/styled';\nimport { absolutePosition, addClass, addStyle, getHiddenElementOuterHeight, getHiddenElementOuterWidth, getOffset, getViewport, isTouchDevice, relativePosition } from '@primeuix/utils/dom';\nimport { ZIndex } from '@primeuix/utils/zindex';\nimport { OverlayEventBus } from 'primereact/overlayeventbus';\nimport * as React from 'react';\nimport { defaultProps } from './useOverlay.props';\n\nexport const useOverlay = withHeadless({\n name: 'useOverlay',\n defaultProps,\n setup: ({ props, $primereact }) => {\n const [visibleState, setVisibleState] = React.useState(false);\n const containerRef = React.useRef<{ elementRef: React.RefObject<HTMLDivElement> } | null>(null);\n const scrollHandler = React.useRef<ConnectedOverlayScrollHandler | null>(null);\n const selfClick = React.useRef(false);\n\n const state = {\n visible: visibleState\n };\n\n const getContainer = React.useCallback(() => {\n if (containerRef?.current && containerRef?.current instanceof HTMLElement) {\n return containerRef?.current;\n }\n\n return containerRef?.current?.elementRef.current ?? null;\n }, [containerRef]);\n\n const show = () => {\n if (visibleState) return;\n\n setVisibleState(true);\n props.onOpenChange?.({\n value: true\n });\n };\n\n const hide = () => {\n if (!visibleState) return;\n\n setVisibleState(false);\n props.onOpenChange?.({\n value: false\n });\n };\n\n const onOverlayEnter = () => {\n const containerElement = getContainer();\n\n if (!containerElement) return;\n\n addStyle(containerElement, { position: 'absolute', top: '0' });\n\n if (props.autoZIndex && props.type) {\n ZIndex.set(props.type, containerElement, (props.baseZIndex ?? 0) + ($primereact.config?.zIndex?.[props.type] ?? 1000));\n }\n\n alignOverlay();\n };\n\n const onOverlayAfterEnter = () => {\n bindOutsideClickListener();\n bindScrollListener();\n bindResizeListener();\n\n if (props.type === 'menu') {\n bindOutsideContextMenuListener();\n }\n };\n\n const onLeave = () => {\n unbindOutsideClickListener();\n unbindScrollListener();\n unbindResizeListener();\n\n if (props.type === 'menu') {\n unbindOutsideContextMenuListener();\n }\n };\n\n const onAfterLeave = () => {\n const containerElement = getContainer();\n\n if (props.autoZIndex && containerElement) {\n ZIndex.clear(containerElement);\n }\n };\n\n const alignOverlay = () => {\n const containerElement = getContainer();\n\n if (!containerElement) return;\n\n const isVirtualTarget = props.target && typeof props.target === 'object' && 'pageX' in props.target && 'pageY' in props.target;\n\n if (isVirtualTarget) {\n const virtualTarget = props.target as { pageX: number; pageY: number };\n\n let left = virtualTarget.pageX + 1;\n let top = virtualTarget.pageY + 1;\n const width = containerElement.offsetParent ? containerElement.offsetWidth : getHiddenElementOuterWidth(containerElement);\n const height = containerElement.offsetParent ? containerElement.offsetHeight : getHiddenElementOuterHeight(containerElement);\n const viewport = getViewport();\n const scrollTop = window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n\n //flip\n if (left + width - scrollLeft > viewport.width) {\n left -= width;\n }\n\n //flip\n if (top + height - scrollTop > viewport.height) {\n top -= height;\n }\n\n //fit\n if (left < scrollLeft) {\n left = scrollLeft;\n }\n\n //fit\n if (top < scrollTop) {\n top = scrollTop;\n }\n\n containerElement.style.left = left + 'px';\n containerElement.style.top = top + 'px';\n } else if (props.target) {\n if (props.appendTo === 'self') {\n relativePosition(containerElement, props.target as HTMLElement);\n } else {\n absolutePosition(containerElement, props.target as HTMLElement);\n }\n\n const containerOffset = getOffset(containerElement);\n const targetOffset = getOffset(props.target as HTMLElement);\n let arrowLeft = 0;\n\n if (Number(containerOffset.left) < Number(targetOffset.left)) {\n arrowLeft = Number(targetOffset.left) - Number(containerOffset.left);\n }\n\n containerElement.style.setProperty($dt('overlay.arrow.left').name, `${arrowLeft}px`);\n\n if (containerOffset.top < targetOffset.top) {\n addClass(containerElement, 'p-overlay-flipped');\n containerElement.setAttribute('data-p-overlay-flipped', 'true');\n }\n }\n };\n\n const [bindOutsideClickListener, unbindOutsideClickListener] = useEventListener({\n type: 'click',\n listener: (event) => onOutsideClick(event as unknown as React.MouseEvent)\n });\n\n const [bindOutsideContextMenuListener, unbindOutsideContextMenuListener] = useEventListener({\n type: 'contextmenu',\n listener: (event) => onOutsideClick(event as unknown as React.MouseEvent)\n });\n\n const [bindScrollListener, unbindScrollListener] = useEventListener({\n type: 'scroll',\n listener: () => onScroll()\n });\n\n const [bindResizeListener, unbindResizeListener] = useEventListener({\n target: 'window',\n type: 'resize',\n listener: () => onResize()\n });\n\n const onOutsideClick = (event: React.MouseEvent) => {\n if (selfClick.current) {\n selfClick.current = false;\n\n return;\n }\n\n if (visibleState && isOutsideClicked(event)) {\n hide();\n }\n };\n\n const isOutsideClicked = (event: React.MouseEvent) => {\n const containerElement = getContainer();\n\n if (!containerElement) return;\n\n const target = event.target as Node;\n\n return !(containerElement.isSameNode(target) || containerElement.contains(target));\n };\n\n const onScroll = () => {\n if (!scrollHandler.current) {\n scrollHandler.current = new ConnectedOverlayScrollHandler(getContainer(), () => {\n if (visibleState) {\n hide();\n }\n });\n }\n\n scrollHandler.current.bindScrollListener();\n };\n\n const onResize = () => {\n if (visibleState && !isTouchDevice()) {\n hide();\n }\n };\n\n const onOverlayClick = (event: React.MouseEvent) => {\n OverlayEventBus.emit('overlay-click', {\n originalEvent: event,\n target: props.target\n });\n\n selfClick.current = true;\n };\n\n const onOverlayKeyDown = (event: React.KeyboardEvent) => {\n if (event.code === 'Escape') {\n onEscapeKey(event);\n }\n };\n\n const onEscapeKey = (event: React.KeyboardEvent) => {\n if (visibleState) {\n hide();\n }\n\n event.preventDefault();\n };\n\n React.useEffect(() => {\n if (props.open) {\n show();\n } else if (!props.open) {\n hide();\n }\n }, [props.open]);\n\n useUnmountEffect(() => {\n unbindOutsideClickListener();\n unbindScrollListener();\n unbindResizeListener();\n\n if (props.type === 'menu') {\n unbindOutsideContextMenuListener();\n }\n\n if (scrollHandler.current) {\n scrollHandler.current.destroy();\n scrollHandler.current = null;\n }\n\n const containerElement = getContainer();\n\n if (props.autoZIndex && containerElement) {\n ZIndex.clear(containerElement);\n }\n });\n\n return {\n state,\n containerRef,\n // methods\n hide,\n onOverlayEnter,\n onOverlayAfterEnter,\n onLeave,\n onAfterLeave,\n onOverlayClick,\n onOverlayKeyDown\n };\n }\n});\n","import { EventBus } from '@primeuix/utils/eventbus';\n\nexport default EventBus();\n","import type { useOverlayProps } from '@primereact/types/shared/overlay';\n\nexport const defaultProps: useOverlayProps = {\n target: undefined,\n defaultOpen: undefined,\n open: undefined,\n appendTo: 'body',\n type: 'overlay',\n baseZIndex: 0,\n autoZIndex: true,\n closeOnEscape: true,\n onOpenChange: undefined\n};\n"],"mappings":"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","names":["withHeadless","ConnectedOverlayScrollHandler","useEventListener","useUnmountEffect","$dt","absolutePosition","addClass","addStyle","getHiddenElementOuterHeight","getHiddenElementOuterWidth","getOffset","getViewport","isTouchDevice","relativePosition","ZIndex","EventBus","OverlayEventBus_default","React","defaultProps","useOverlay","withHeadless","defaultProps","props","$primereact","visibleState","setVisibleState","containerRef","scrollHandler","selfClick","state","getContainer","_a","_b","show","hide","onOverlayEnter","_c","_d","containerElement","addStyle","ZIndex","alignOverlay","onOverlayAfterEnter","bindOutsideClickListener","bindScrollListener","bindResizeListener","bindOutsideContextMenuListener","onLeave","unbindOutsideClickListener","unbindScrollListener","unbindResizeListener","unbindOutsideContextMenuListener","onAfterLeave","virtualTarget","left","top","width","getHiddenElementOuterWidth","height","getHiddenElementOuterHeight","viewport","getViewport","scrollTop","scrollLeft","relativePosition","absolutePosition","containerOffset","getOffset","targetOffset","arrowLeft","$dt","addClass","useEventListener","event","onOutsideClick","onScroll","onResize","isOutsideClicked","target","ConnectedOverlayScrollHandler","isTouchDevice","onOverlayClick","OverlayEventBus_default","onOverlayKeyDown","onEscapeKey","useUnmountEffect"]}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ export declare const useOverlay: (inProps?: unknown) => import("@primereact/types/core").HeadlessInstance<import("@primereact/types/shared/overlay").useOverlayProps, unknown, {
3
+ state: {
4
+ visible: boolean;
5
+ };
6
+ containerRef: React.RefObject<{
7
+ elementRef: React.RefObject<HTMLDivElement>;
8
+ } | null>;
9
+ hide: () => void;
10
+ onOverlayEnter: () => void;
11
+ onOverlayAfterEnter: () => void;
12
+ onLeave: () => void;
13
+ onAfterLeave: () => void;
14
+ onOverlayClick: (event: React.MouseEvent) => void;
15
+ onOverlayKeyDown: (event: React.KeyboardEvent) => void;
16
+ }>;
@@ -0,0 +1,2 @@
1
+ import type { useOverlayProps } from '@primereact/types/shared/overlay';
2
+ export declare const defaultProps: useOverlayProps;
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primereact/headless",
3
- "version": "11.0.0-alpha.7",
3
+ "version": "11.0.0-alpha.9",
4
4
  "author": "PrimeTek Informatics",
5
5
  "description": "",
6
6
  "homepage": "https://primereact.org/",
@@ -33,8 +33,8 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@primeuix/styled": "^0.7.4",
36
- "@primeuix/utils": "^0.6.1",
37
- "@primereact/core": "11.0.0-alpha.7",
38
- "@primereact/hooks": "11.0.0-alpha.7"
36
+ "@primeuix/utils": "^0.6.2",
37
+ "@primereact/core": "11.0.0-alpha.9",
38
+ "@primereact/hooks": "11.0.0-alpha.9"
39
39
  }
40
40
  }
@@ -0,0 +1,2 @@
1
+ export * from './usePassword';
2
+ export * from './usePassword.props';
@@ -0,0 +1,2 @@
1
+ import{withHeadless as B}from"@primereact/core/headless";import{useControlledState as F}from"@primereact/hooks/use-controlled-state";import{getOuterWidth as Z,isEmpty as P}from"@primeuix/utils";import*as n from"react";var C={value:void 0,defaultValue:void 0,onValueChange:void 0,strengthOptions:[{id:0,value:"Too weak",minDiversity:0,minLength:2},{id:1,value:"Weak",minDiversity:2,minLength:4},{id:2,value:"Medium",minDiversity:3,minLength:8},{id:3,value:"Strong",minDiversity:4,minLength:12}],appendTo:"body"};var N=B({name:"usePassword",defaultProps:C,setup({props:r,elementRef:l}){var w,b;let d=n.useRef(null),E=n.useRef(null),u=n.useRef(null),[a,R]=F({value:r.value,defaultValue:r.defaultValue,onChange:r.onValueChange}),[m,g]=n.useState(!1),[L,h]=n.useState(!0),[S,V]=n.useState(!1),[k,y]=n.useState(!1),p=n.useCallback((e,t)=>{if(!e||!t||t.length===0)return{id:-1,value:"",contains:[],length:0,percentage:0};let s=[];/[a-z]/.test(e)&&s.push("lowercase"),/[A-Z]/.test(e)&&s.push("uppercase"),/[0-9]/.test(e)&&s.push("number"),/[^a-zA-Z0-9]/.test(e)&&s.push("symbol");let i=s.length,o=e.length;for(let c=t.length-1;c>=0;c--){let f=t[c];if(i>=f.minDiversity&&o>=f.minLength){let A=t.length>1?Math.round((c+1)/t.length*100):100;return{id:f.id,value:f.value,contains:s,length:o,percentage:A}}}return{id:t[0].id,value:t[0].value,contains:s,length:o,percentage:0}},[]),v=n.useMemo(()=>{let e=r.strengthOptions||[];return p(a||"",e)},[a,r.strengthOptions,p]),M={value:a,strength:v,overlayVisible:m,levelsCount:(b=(w=r.strengthOptions)==null?void 0:w.length)!=null?b:4,showClearIcon:L,unmasked:S,focused:k,inputType:S?"text":"password"},O=n.useCallback(e=>e(a||"",v),[a,v]),T=()=>{m||g(!0)},x=e=>{let t=e.target.value;h(!P(t)),R([t,{originalEvent:e,value:t}])},D=()=>{y(!0)},H=()=>{y(!1)},I=e=>{g(e)},W=()=>{var e,t,s,i;if((i=(s=(t=(e=u==null?void 0:u.current)==null?void 0:e.containerRef)==null?void 0:t.current)==null?void 0:s.elementRef)!=null&&i.current){let o=u.current.containerRef.current.elementRef.current;l!=null&&l.current&&(o.style.minWidth=Z(l.current)+"px")}},j=e=>{var t,s;R([null,{originalEvent:e,value:null}]),h(!1),m&&g(!1),(s=(t=d.current)==null?void 0:t.elementRef)!=null&&s.current&&(d.current.elementRef.current.value="")},z=()=>{V(e=>!e)};return n.useEffect(()=>{P(a)&&h(!1)},[a]),{state:M,inputRef:d,overlayRef:E,portalRef:u,testRequirement:O,calculatePasswordStrength:p,onInputClick:T,onInputChange:x,onFocus:D,onBlur:H,onOverlayEnter:W,changeVisibleState:I,onClearClick:j,onMaskToggle:z}}});export{C as defaultProps,N as usePassword};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/password/usePassword.ts","../../src/password/usePassword.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { useControlledState } from '@primereact/hooks/use-controlled-state';\nimport type { PasswordStrengthLevel, PasswordStrengthResult } from '@primereact/types/shared/password';\nimport { getOuterWidth, isEmpty } from '@primeuix/utils';\nimport * as React from 'react';\nimport { defaultProps } from './usePassword.props';\n\nexport const usePassword = withHeadless({\n name: 'usePassword',\n defaultProps,\n setup({ props, elementRef }) {\n const inputRef = React.useRef<{ elementRef: React.RefObject<HTMLInputElement> } | null>(null);\n const overlayRef = React.useRef<HTMLDivElement | null>(null);\n const portalRef = React.useRef<{ containerRef: { current: { elementRef: React.RefObject<HTMLDivElement> } } } | null>(null);\n const [valueState, setValueState] = useControlledState({\n value: props.value,\n defaultValue: props.defaultValue,\n onChange: props.onValueChange\n });\n const [overlayVisibleState, setOverlayVisibleState] = React.useState<boolean>(false);\n const [showClearIcon, setShowClearIcon] = React.useState(true);\n const [unmaskedState, setUnmaskedState] = React.useState(false);\n const [focusedState, setFocusedState] = React.useState(false);\n\n const calculatePasswordStrength = React.useCallback((password: string, levels: PasswordStrengthLevel[]): PasswordStrengthResult => {\n if (!password || !levels || levels.length === 0) {\n return {\n id: -1,\n value: '',\n contains: [],\n length: 0,\n percentage: 0\n };\n }\n\n const contains: string[] = [];\n\n if (/[a-z]/.test(password)) {\n contains.push('lowercase');\n }\n\n if (/[A-Z]/.test(password)) {\n contains.push('uppercase');\n }\n\n if (/[0-9]/.test(password)) {\n contains.push('number');\n }\n\n if (/[^a-zA-Z0-9]/.test(password)) {\n contains.push('symbol');\n }\n\n const diversity = contains.length;\n const length = password.length;\n\n for (let i = levels.length - 1; i >= 0; i--) {\n const level = levels[i];\n\n if (diversity >= level.minDiversity && length >= level.minLength) {\n const percentage = levels.length > 1 ? Math.round(((i + 1) / levels.length) * 100) : 100;\n\n return {\n id: level.id,\n value: level.value,\n contains,\n length,\n percentage\n };\n }\n }\n\n return {\n id: levels[0].id,\n value: levels[0].value,\n contains,\n length,\n percentage: 0\n };\n }, []);\n\n const strength = React.useMemo(() => {\n const levels = props.strengthOptions || [];\n\n return calculatePasswordStrength(valueState || '', levels);\n }, [valueState, props.strengthOptions, calculatePasswordStrength]);\n\n const state = {\n value: valueState,\n strength,\n overlayVisible: overlayVisibleState,\n levelsCount: props.strengthOptions?.length ?? 4,\n showClearIcon,\n unmasked: unmaskedState,\n focused: focusedState,\n inputType: (unmaskedState ? 'text' : 'password') as 'text' | 'password'\n };\n\n const testRequirement = React.useCallback(\n (test: (value: string, strength: PasswordStrengthResult | null) => boolean) => {\n return test(valueState || '', strength);\n },\n [valueState, strength]\n );\n\n const onInputClick = () => {\n if (!overlayVisibleState) {\n setOverlayVisibleState(true);\n }\n };\n\n const onInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value;\n\n setShowClearIcon(!isEmpty(newValue));\n setValueState([\n newValue,\n {\n originalEvent: event,\n value: newValue\n }\n ]);\n };\n\n const onFocus = () => {\n setFocusedState(true);\n };\n\n const onBlur = () => {\n setFocusedState(false);\n };\n\n const changeVisibleState = (isVisible: boolean) => {\n setOverlayVisibleState(isVisible);\n };\n\n const onOverlayEnter = () => {\n if (portalRef?.current?.containerRef?.current?.elementRef?.current) {\n const element = portalRef.current.containerRef.current.elementRef.current;\n\n if (elementRef?.current) {\n element.style.minWidth = getOuterWidth(elementRef.current) + 'px';\n }\n }\n };\n\n const onClearClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setValueState([\n null,\n {\n originalEvent: event,\n value: null\n }\n ]);\n setShowClearIcon(false);\n\n if (overlayVisibleState) {\n setOverlayVisibleState(false);\n }\n\n // Clear the input value from DOM when using defaultValue (uncontrolled)\n if (inputRef.current?.elementRef?.current) {\n inputRef.current.elementRef.current.value = '';\n }\n };\n\n const onMaskToggle = () => {\n setUnmaskedState((prev) => !prev);\n };\n\n React.useEffect(() => {\n if (isEmpty(valueState)) {\n setShowClearIcon(false);\n }\n }, [valueState]);\n\n return {\n state,\n // refs\n inputRef,\n overlayRef,\n portalRef,\n // methods\n testRequirement,\n calculatePasswordStrength,\n onInputClick,\n onInputChange,\n onFocus,\n onBlur,\n onOverlayEnter,\n changeVisibleState,\n onClearClick,\n onMaskToggle\n };\n }\n});\n","import type { usePasswordProps } from '@primereact/types/shared/password';\n\nexport const defaultProps: usePasswordProps = {\n value: undefined,\n defaultValue: undefined,\n onValueChange: undefined,\n strengthOptions: [\n { id: 0, value: 'Too weak', minDiversity: 0, minLength: 2 },\n { id: 1, value: 'Weak', minDiversity: 2, minLength: 4 },\n { id: 2, value: 'Medium', minDiversity: 3, minLength: 8 },\n { id: 3, value: 'Strong', minDiversity: 4, minLength: 12 }\n ],\n appendTo: 'body'\n};\n"],"mappings":"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","names":["withHeadless","useControlledState","getOuterWidth","isEmpty","React","defaultProps","usePassword","withHeadless","defaultProps","props","elementRef","_a","_b","inputRef","overlayRef","portalRef","valueState","setValueState","useControlledState","overlayVisibleState","setOverlayVisibleState","showClearIcon","setShowClearIcon","unmaskedState","setUnmaskedState","focusedState","setFocusedState","calculatePasswordStrength","password","levels","contains","diversity","length","i","level","percentage","strength","state","testRequirement","test","onInputClick","onInputChange","event","newValue","isEmpty","onFocus","onBlur","changeVisibleState","isVisible","onOverlayEnter","_c","_d","element","getOuterWidth","onClearClick","onMaskToggle","prev"]}