reka-ui 2.3.0 → 2.3.2

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 (131) hide show
  1. package/dist/Accordion/AccordionItem.cjs +1 -1
  2. package/dist/Accordion/AccordionItem.cjs.map +1 -1
  3. package/dist/Accordion/AccordionItem.js +1 -1
  4. package/dist/Accordion/AccordionItem.js.map +1 -1
  5. package/dist/AlertDialog/AlertDialogContent.cjs +0 -1
  6. package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
  7. package/dist/AlertDialog/AlertDialogContent.js +0 -1
  8. package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
  9. package/dist/Combobox/ComboboxCancel.cjs +1 -1
  10. package/dist/Combobox/ComboboxCancel.cjs.map +1 -1
  11. package/dist/Combobox/ComboboxCancel.js +1 -1
  12. package/dist/Combobox/ComboboxCancel.js.map +1 -1
  13. package/dist/Combobox/ComboboxContentImpl.cjs +1 -1
  14. package/dist/Combobox/ComboboxContentImpl.js +1 -1
  15. package/dist/Combobox/ComboboxEmpty.cjs +1 -1
  16. package/dist/Combobox/ComboboxEmpty.cjs.map +1 -1
  17. package/dist/Combobox/ComboboxEmpty.js +1 -1
  18. package/dist/Combobox/ComboboxEmpty.js.map +1 -1
  19. package/dist/Combobox/ComboboxGroup.cjs +1 -1
  20. package/dist/Combobox/ComboboxGroup.cjs.map +1 -1
  21. package/dist/Combobox/ComboboxGroup.js +1 -1
  22. package/dist/Combobox/ComboboxGroup.js.map +1 -1
  23. package/dist/Combobox/ComboboxInput.cjs +7 -10
  24. package/dist/Combobox/ComboboxInput.cjs.map +1 -1
  25. package/dist/Combobox/ComboboxInput.js +7 -10
  26. package/dist/Combobox/ComboboxInput.js.map +1 -1
  27. package/dist/Combobox/ComboboxItem.cjs +2 -2
  28. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  29. package/dist/Combobox/ComboboxItem.js +2 -2
  30. package/dist/Combobox/ComboboxItem.js.map +1 -1
  31. package/dist/Combobox/ComboboxRoot.cjs +23 -33
  32. package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
  33. package/dist/Combobox/ComboboxRoot.js +24 -34
  34. package/dist/Combobox/ComboboxRoot.js.map +1 -1
  35. package/dist/DateRangePicker/DateRangePickerCalendar.cjs +2 -1
  36. package/dist/DateRangePicker/DateRangePickerCalendar.cjs.map +1 -1
  37. package/dist/DateRangePicker/DateRangePickerCalendar.js +2 -1
  38. package/dist/DateRangePicker/DateRangePickerCalendar.js.map +1 -1
  39. package/dist/DateRangePicker/DateRangePickerRoot.cjs +5 -2
  40. package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
  41. package/dist/DateRangePicker/DateRangePickerRoot.js +5 -2
  42. package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
  43. package/dist/Dialog/DialogContent.cjs +0 -1
  44. package/dist/Dialog/DialogContent.cjs.map +1 -1
  45. package/dist/Dialog/DialogContent.js +0 -1
  46. package/dist/Dialog/DialogContent.js.map +1 -1
  47. package/dist/Dialog/DialogContentImpl.cjs +1 -1
  48. package/dist/Dialog/DialogContentImpl.js +1 -1
  49. package/dist/DismissableLayer/utils.cjs +12 -4
  50. package/dist/DismissableLayer/utils.cjs.map +1 -1
  51. package/dist/DismissableLayer/utils.js +12 -4
  52. package/dist/DismissableLayer/utils.js.map +1 -1
  53. package/dist/Editable/EditableRoot.cjs +2 -2
  54. package/dist/Editable/EditableRoot.cjs.map +1 -1
  55. package/dist/Editable/EditableRoot.js +2 -2
  56. package/dist/Editable/EditableRoot.js.map +1 -1
  57. package/dist/HoverCard/HoverCardContentImpl.cjs +1 -1
  58. package/dist/HoverCard/HoverCardContentImpl.js +1 -1
  59. package/dist/Listbox/ListboxFilter.cjs +1 -1
  60. package/dist/Listbox/ListboxFilter.cjs.map +1 -1
  61. package/dist/Listbox/ListboxFilter.js +1 -1
  62. package/dist/Listbox/ListboxFilter.js.map +1 -1
  63. package/dist/Listbox/ListboxRoot.cjs.map +1 -1
  64. package/dist/Listbox/ListboxRoot.js.map +1 -1
  65. package/dist/Listbox/ListboxVirtualizer.cjs +1 -1
  66. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  67. package/dist/Listbox/ListboxVirtualizer.js +1 -1
  68. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  69. package/dist/Menu/MenuContentImpl.cjs +1 -1
  70. package/dist/Menu/MenuContentImpl.js +1 -1
  71. package/dist/NavigationMenu/NavigationMenuContentImpl.cjs +1 -1
  72. package/dist/NavigationMenu/NavigationMenuContentImpl.js +1 -1
  73. package/dist/PinInput/PinInputInput.cjs +14 -6
  74. package/dist/PinInput/PinInputInput.cjs.map +1 -1
  75. package/dist/PinInput/PinInputInput.js +14 -6
  76. package/dist/PinInput/PinInputInput.js.map +1 -1
  77. package/dist/PinInput/PinInputRoot.cjs +4 -2
  78. package/dist/PinInput/PinInputRoot.cjs.map +1 -1
  79. package/dist/PinInput/PinInputRoot.js +4 -2
  80. package/dist/PinInput/PinInputRoot.js.map +1 -1
  81. package/dist/Popover/PopoverContentImpl.cjs +1 -1
  82. package/dist/Popover/PopoverContentImpl.js +1 -1
  83. package/dist/Primitive/Slot.cjs +7 -7
  84. package/dist/Primitive/Slot.cjs.map +1 -1
  85. package/dist/Primitive/Slot.js +7 -7
  86. package/dist/Primitive/Slot.js.map +1 -1
  87. package/dist/RadioGroup/Radio.cjs +2 -0
  88. package/dist/RadioGroup/Radio.cjs.map +1 -1
  89. package/dist/RadioGroup/Radio.js +2 -0
  90. package/dist/RadioGroup/Radio.js.map +1 -1
  91. package/dist/RangeCalendar/useRangeCalendar.cjs +22 -4
  92. package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
  93. package/dist/RangeCalendar/useRangeCalendar.js +22 -4
  94. package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
  95. package/dist/Select/SelectContent.cjs +8 -4
  96. package/dist/Select/SelectContent.cjs.map +1 -1
  97. package/dist/Select/SelectContent.js +9 -5
  98. package/dist/Select/SelectContent.js.map +1 -1
  99. package/dist/Select/SelectContentImpl.cjs +1 -1
  100. package/dist/Select/SelectContentImpl.js +1 -1
  101. package/dist/Select/SelectItemText.cjs +1 -1
  102. package/dist/Select/SelectItemText.cjs.map +1 -1
  103. package/dist/Select/SelectItemText.js +2 -2
  104. package/dist/Select/SelectItemText.js.map +1 -1
  105. package/dist/Stepper/StepperRoot.cjs +1 -1
  106. package/dist/Stepper/StepperRoot.cjs.map +1 -1
  107. package/dist/Stepper/StepperRoot.js +1 -1
  108. package/dist/Stepper/StepperRoot.js.map +1 -1
  109. package/dist/Toast/ToastViewport.cjs +1 -1
  110. package/dist/Toast/ToastViewport.js +1 -1
  111. package/dist/Tooltip/TooltipContentImpl.cjs +1 -1
  112. package/dist/Tooltip/TooltipContentImpl.js +1 -1
  113. package/dist/constant/components.cjs.map +1 -1
  114. package/dist/constant/components.js.map +1 -1
  115. package/dist/constant.d.ts +60 -0
  116. package/dist/date/useDateField.cjs +6 -2
  117. package/dist/date/useDateField.cjs.map +1 -1
  118. package/dist/date/useDateField.js +6 -2
  119. package/dist/date/useDateField.js.map +1 -1
  120. package/dist/index.d.ts +17 -16
  121. package/dist/nuxt/index.cjs +14 -14
  122. package/dist/nuxt/index.d.cts +2 -2
  123. package/dist/nuxt/index.d.mts +2 -2
  124. package/dist/nuxt/index.mjs +14 -14
  125. package/dist/resolver/index.cjs +9 -5
  126. package/dist/resolver/index.mjs +9 -5
  127. package/dist/shared/useForwardProps.cjs +2 -4
  128. package/dist/shared/useForwardProps.cjs.map +1 -1
  129. package/dist/shared/useForwardProps.js +3 -5
  130. package/dist/shared/useForwardProps.js.map +1 -1
  131. package/package.json +1 -1
@@ -78,11 +78,11 @@ function usePointerDownOutside(onPointerDownOutside, element, enabled = true) {
78
78
  }
79
79
  };
80
80
  }
81
- function useFocusOutside(onFocusOutside, element) {
81
+ function useFocusOutside(onFocusOutside, element, enabled = true) {
82
82
  const ownerDocument = element?.value?.ownerDocument ?? globalThis?.document;
83
83
  const isFocusInsideDOMTree = vue.ref(false);
84
84
  vue.watchEffect((cleanupFn) => {
85
- if (!shared.isClient)
85
+ if (!shared.isClient || !vue.toValue(enabled))
86
86
  return;
87
87
  const handleFocus = async (event) => {
88
88
  if (!element?.value)
@@ -105,8 +105,16 @@ function useFocusOutside(onFocusOutside, element) {
105
105
  cleanupFn(() => ownerDocument.removeEventListener("focusin", handleFocus));
106
106
  });
107
107
  return {
108
- onFocusCapture: () => isFocusInsideDOMTree.value = true,
109
- onBlurCapture: () => isFocusInsideDOMTree.value = false
108
+ onFocusCapture: () => {
109
+ if (!vue.toValue(enabled))
110
+ return;
111
+ isFocusInsideDOMTree.value = true;
112
+ },
113
+ onBlurCapture: () => {
114
+ if (!vue.toValue(enabled))
115
+ return;
116
+ isFocusInsideDOMTree.value = false;
117
+ }
110
118
  };
111
119
  }
112
120
 
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../src/DismissableLayer/utils.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref } from 'vue'\nimport { isClient } from '@vueuse/shared'\nimport { nextTick, ref, toValue, watchEffect } from 'vue'\nimport { handleAndDispatchCustomEvent } from '@/shared'\n\nexport type PointerDownOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent\n}>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport const DISMISSABLE_LAYER_NAME = 'DismissableLayer'\nexport const CONTEXT_UPDATE = 'dismissableLayer.update'\nexport const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'\nexport const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'\n\nfunction isLayerExist(layerElement: HTMLElement, targetElement: HTMLElement) {\n const targetLayer = targetElement.closest(\n '[data-dismissable-layer]',\n )\n\n const mainLayer = layerElement.dataset.dismissableLayer === ''\n ? layerElement\n : layerElement.querySelector(\n '[data-dismissable-layer]',\n ) as HTMLElement\n\n const nodeList = Array.from(\n layerElement.ownerDocument.querySelectorAll('[data-dismissable-layer]'),\n )\n\n if (targetLayer && (mainLayer === targetLayer || nodeList.indexOf(mainLayer) < nodeList.indexOf(targetLayer))\n ) {\n return true\n }\n else {\n return false\n }\n}\n\n/**\n * Listens for `pointerdown` outside a DOM subtree. We use `pointerdown` rather than `pointerup`\n * to mimic layer dismissing behaviour present in OS.\n * Returns props to pass to the node we want to check for outside events.\n */\nexport function usePointerDownOutside(\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isPointerInsideDOMTree = ref(false)\n const handleClickRef = ref(() => {})\n\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handlePointerDown = async (event: PointerEvent) => {\n const target = event.target as HTMLElement | undefined\n\n if (!element?.value || !target)\n return\n\n if (isLayerExist(element.value, target)) {\n isPointerInsideDOMTree.value = false\n return\n }\n\n if (event.target && !isPointerInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n\n function handleAndDispatchPointerDownOutsideEvent() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n onPointerDownOutside,\n eventDetail,\n )\n }\n\n /**\n * On touch devices, we need to wait for a click event because browsers implement\n * a ~350ms delay between the time the user stops touching the display and when the\n * browser executes events. We need to ensure we don't reactivate pointer-events within\n * this timeframe otherwise the browser may execute events that should have been prevented.\n *\n * Additionally, this also lets us deal automatically with cancellations when a click event\n * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc.\n *\n * This is why we also continuously remove the previous listener, because we cannot be\n * certain that it was raised, and therefore cleaned-up.\n */\n if (event.pointerType === 'touch') {\n ownerDocument.removeEventListener('click', handleClickRef.value)\n handleClickRef.value = handleAndDispatchPointerDownOutsideEvent\n ownerDocument.addEventListener('click', handleClickRef.value, {\n once: true,\n })\n }\n else {\n handleAndDispatchPointerDownOutsideEvent()\n }\n }\n else {\n // We need to remove the event listener in case the outside click has been canceled.\n // See: https://github.com/radix-ui/primitives/issues/2171\n ownerDocument.removeEventListener('click', handleClickRef.value)\n }\n isPointerInsideDOMTree.value = false\n }\n /**\n * if this hook executes in a component that mounts via a `pointerdown` event, the event\n * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid\n * this by delaying the event listener registration on the document.\n * This is how the DOM works, ie:\n * ```\n * button.addEventListener('pointerdown', () => {\n * console.log('I will log');\n * document.addEventListener('pointerdown', () => {\n * console.log('I will also log');\n * })\n * });\n */\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener('pointerdown', handlePointerDown)\n }, 0)\n\n cleanupFn(() => {\n window.clearTimeout(timerId)\n ownerDocument.removeEventListener('pointerdown', handlePointerDown)\n ownerDocument.removeEventListener('click', handleClickRef.value)\n })\n })\n\n return {\n onPointerDownCapture: () => {\n if (!toValue(enabled))\n return\n isPointerInsideDOMTree.value = true\n },\n }\n}\n\n/**\n * Listens for when focus happens outside a DOM subtree.\n * Returns props to pass to the root (node) of the subtree we want to check.\n */\nexport function useFocusOutside(\n onFocusOutside?: (event: FocusOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isFocusInsideDOMTree = ref(false)\n watchEffect((cleanupFn) => {\n if (!isClient)\n return\n const handleFocus = async (event: FocusEvent) => {\n if (!element?.value)\n return\n\n await nextTick()\n await nextTick()\n const target = event.target as HTMLElement | undefined\n if (!element.value || !target || isLayerExist(element.value, target))\n return\n\n if (event.target && !isFocusInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n handleAndDispatchCustomEvent(\n FOCUS_OUTSIDE,\n onFocusOutside,\n eventDetail,\n )\n }\n }\n\n ownerDocument.addEventListener('focusin', handleFocus)\n\n cleanupFn(() => ownerDocument.removeEventListener('focusin', handleFocus))\n })\n\n return {\n onFocusCapture: () => (isFocusInsideDOMTree.value = true),\n onBlurCapture: () => (isFocusInsideDOMTree.value = false),\n }\n}\n\nexport function dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE)\n document.dispatchEvent(event)\n}\n"],"names":["ref","watchEffect","isClient","toValue","handleAndDispatchCustomEvent","nextTick"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../src/DismissableLayer/utils.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref } from 'vue'\nimport { isClient } from '@vueuse/shared'\nimport { nextTick, ref, toValue, watchEffect } from 'vue'\nimport { handleAndDispatchCustomEvent } from '@/shared'\n\nexport type PointerDownOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent\n}>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport const DISMISSABLE_LAYER_NAME = 'DismissableLayer'\nexport const CONTEXT_UPDATE = 'dismissableLayer.update'\nexport const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'\nexport const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'\n\nfunction isLayerExist(layerElement: HTMLElement, targetElement: HTMLElement) {\n const targetLayer = targetElement.closest(\n '[data-dismissable-layer]',\n )\n\n const mainLayer = layerElement.dataset.dismissableLayer === ''\n ? layerElement\n : layerElement.querySelector(\n '[data-dismissable-layer]',\n ) as HTMLElement\n\n const nodeList = Array.from(\n layerElement.ownerDocument.querySelectorAll('[data-dismissable-layer]'),\n )\n\n if (targetLayer && (mainLayer === targetLayer || nodeList.indexOf(mainLayer) < nodeList.indexOf(targetLayer))\n ) {\n return true\n }\n else {\n return false\n }\n}\n\n/**\n * Listens for `pointerdown` outside a DOM subtree. We use `pointerdown` rather than `pointerup`\n * to mimic layer dismissing behaviour present in OS.\n * Returns props to pass to the node we want to check for outside events.\n */\nexport function usePointerDownOutside(\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isPointerInsideDOMTree = ref(false)\n const handleClickRef = ref(() => {})\n\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handlePointerDown = async (event: PointerEvent) => {\n const target = event.target as HTMLElement | undefined\n\n if (!element?.value || !target)\n return\n\n if (isLayerExist(element.value, target)) {\n isPointerInsideDOMTree.value = false\n return\n }\n\n if (event.target && !isPointerInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n\n function handleAndDispatchPointerDownOutsideEvent() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n onPointerDownOutside,\n eventDetail,\n )\n }\n\n /**\n * On touch devices, we need to wait for a click event because browsers implement\n * a ~350ms delay between the time the user stops touching the display and when the\n * browser executes events. We need to ensure we don't reactivate pointer-events within\n * this timeframe otherwise the browser may execute events that should have been prevented.\n *\n * Additionally, this also lets us deal automatically with cancellations when a click event\n * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc.\n *\n * This is why we also continuously remove the previous listener, because we cannot be\n * certain that it was raised, and therefore cleaned-up.\n */\n if (event.pointerType === 'touch') {\n ownerDocument.removeEventListener('click', handleClickRef.value)\n handleClickRef.value = handleAndDispatchPointerDownOutsideEvent\n ownerDocument.addEventListener('click', handleClickRef.value, {\n once: true,\n })\n }\n else {\n handleAndDispatchPointerDownOutsideEvent()\n }\n }\n else {\n // We need to remove the event listener in case the outside click has been canceled.\n // See: https://github.com/radix-ui/primitives/issues/2171\n ownerDocument.removeEventListener('click', handleClickRef.value)\n }\n isPointerInsideDOMTree.value = false\n }\n /**\n * if this hook executes in a component that mounts via a `pointerdown` event, the event\n * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid\n * this by delaying the event listener registration on the document.\n * This is how the DOM works, ie:\n * ```\n * button.addEventListener('pointerdown', () => {\n * console.log('I will log');\n * document.addEventListener('pointerdown', () => {\n * console.log('I will also log');\n * })\n * });\n */\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener('pointerdown', handlePointerDown)\n }, 0)\n\n cleanupFn(() => {\n window.clearTimeout(timerId)\n ownerDocument.removeEventListener('pointerdown', handlePointerDown)\n ownerDocument.removeEventListener('click', handleClickRef.value)\n })\n })\n\n return {\n onPointerDownCapture: () => {\n if (!toValue(enabled))\n return\n isPointerInsideDOMTree.value = true\n },\n }\n}\n\n/**\n * Listens for when focus happens outside a DOM subtree.\n * Returns props to pass to the root (node) of the subtree we want to check.\n */\nexport function useFocusOutside(\n onFocusOutside?: (event: FocusOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isFocusInsideDOMTree = ref(false)\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handleFocus = async (event: FocusEvent) => {\n if (!element?.value)\n return\n\n await nextTick()\n await nextTick()\n const target = event.target as HTMLElement | undefined\n if (!element.value || !target || isLayerExist(element.value, target))\n return\n\n if (event.target && !isFocusInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n handleAndDispatchCustomEvent(\n FOCUS_OUTSIDE,\n onFocusOutside,\n eventDetail,\n )\n }\n }\n\n ownerDocument.addEventListener('focusin', handleFocus)\n\n cleanupFn(() => ownerDocument.removeEventListener('focusin', handleFocus))\n })\n\n return {\n onFocusCapture: () => {\n if (!toValue(enabled))\n return\n\n isFocusInsideDOMTree.value = true\n },\n onBlurCapture: () => {\n if (!toValue(enabled))\n return\n\n isFocusInsideDOMTree.value = false\n },\n }\n}\n\nexport function dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE)\n document.dispatchEvent(event)\n}\n"],"names":["ref","watchEffect","isClient","toValue","handleAndDispatchCustomEvent","nextTick"],"mappings":"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"}
@@ -76,11 +76,11 @@ function usePointerDownOutside(onPointerDownOutside, element, enabled = true) {
76
76
  }
77
77
  };
78
78
  }
79
- function useFocusOutside(onFocusOutside, element) {
79
+ function useFocusOutside(onFocusOutside, element, enabled = true) {
80
80
  const ownerDocument = element?.value?.ownerDocument ?? globalThis?.document;
81
81
  const isFocusInsideDOMTree = ref(false);
82
82
  watchEffect((cleanupFn) => {
83
- if (!isClient)
83
+ if (!isClient || !toValue(enabled))
84
84
  return;
85
85
  const handleFocus = async (event) => {
86
86
  if (!element?.value)
@@ -103,8 +103,16 @@ function useFocusOutside(onFocusOutside, element) {
103
103
  cleanupFn(() => ownerDocument.removeEventListener("focusin", handleFocus));
104
104
  });
105
105
  return {
106
- onFocusCapture: () => isFocusInsideDOMTree.value = true,
107
- onBlurCapture: () => isFocusInsideDOMTree.value = false
106
+ onFocusCapture: () => {
107
+ if (!toValue(enabled))
108
+ return;
109
+ isFocusInsideDOMTree.value = true;
110
+ },
111
+ onBlurCapture: () => {
112
+ if (!toValue(enabled))
113
+ return;
114
+ isFocusInsideDOMTree.value = false;
115
+ }
108
116
  };
109
117
  }
110
118
 
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/DismissableLayer/utils.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref } from 'vue'\nimport { isClient } from '@vueuse/shared'\nimport { nextTick, ref, toValue, watchEffect } from 'vue'\nimport { handleAndDispatchCustomEvent } from '@/shared'\n\nexport type PointerDownOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent\n}>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport const DISMISSABLE_LAYER_NAME = 'DismissableLayer'\nexport const CONTEXT_UPDATE = 'dismissableLayer.update'\nexport const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'\nexport const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'\n\nfunction isLayerExist(layerElement: HTMLElement, targetElement: HTMLElement) {\n const targetLayer = targetElement.closest(\n '[data-dismissable-layer]',\n )\n\n const mainLayer = layerElement.dataset.dismissableLayer === ''\n ? layerElement\n : layerElement.querySelector(\n '[data-dismissable-layer]',\n ) as HTMLElement\n\n const nodeList = Array.from(\n layerElement.ownerDocument.querySelectorAll('[data-dismissable-layer]'),\n )\n\n if (targetLayer && (mainLayer === targetLayer || nodeList.indexOf(mainLayer) < nodeList.indexOf(targetLayer))\n ) {\n return true\n }\n else {\n return false\n }\n}\n\n/**\n * Listens for `pointerdown` outside a DOM subtree. We use `pointerdown` rather than `pointerup`\n * to mimic layer dismissing behaviour present in OS.\n * Returns props to pass to the node we want to check for outside events.\n */\nexport function usePointerDownOutside(\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isPointerInsideDOMTree = ref(false)\n const handleClickRef = ref(() => {})\n\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handlePointerDown = async (event: PointerEvent) => {\n const target = event.target as HTMLElement | undefined\n\n if (!element?.value || !target)\n return\n\n if (isLayerExist(element.value, target)) {\n isPointerInsideDOMTree.value = false\n return\n }\n\n if (event.target && !isPointerInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n\n function handleAndDispatchPointerDownOutsideEvent() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n onPointerDownOutside,\n eventDetail,\n )\n }\n\n /**\n * On touch devices, we need to wait for a click event because browsers implement\n * a ~350ms delay between the time the user stops touching the display and when the\n * browser executes events. We need to ensure we don't reactivate pointer-events within\n * this timeframe otherwise the browser may execute events that should have been prevented.\n *\n * Additionally, this also lets us deal automatically with cancellations when a click event\n * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc.\n *\n * This is why we also continuously remove the previous listener, because we cannot be\n * certain that it was raised, and therefore cleaned-up.\n */\n if (event.pointerType === 'touch') {\n ownerDocument.removeEventListener('click', handleClickRef.value)\n handleClickRef.value = handleAndDispatchPointerDownOutsideEvent\n ownerDocument.addEventListener('click', handleClickRef.value, {\n once: true,\n })\n }\n else {\n handleAndDispatchPointerDownOutsideEvent()\n }\n }\n else {\n // We need to remove the event listener in case the outside click has been canceled.\n // See: https://github.com/radix-ui/primitives/issues/2171\n ownerDocument.removeEventListener('click', handleClickRef.value)\n }\n isPointerInsideDOMTree.value = false\n }\n /**\n * if this hook executes in a component that mounts via a `pointerdown` event, the event\n * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid\n * this by delaying the event listener registration on the document.\n * This is how the DOM works, ie:\n * ```\n * button.addEventListener('pointerdown', () => {\n * console.log('I will log');\n * document.addEventListener('pointerdown', () => {\n * console.log('I will also log');\n * })\n * });\n */\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener('pointerdown', handlePointerDown)\n }, 0)\n\n cleanupFn(() => {\n window.clearTimeout(timerId)\n ownerDocument.removeEventListener('pointerdown', handlePointerDown)\n ownerDocument.removeEventListener('click', handleClickRef.value)\n })\n })\n\n return {\n onPointerDownCapture: () => {\n if (!toValue(enabled))\n return\n isPointerInsideDOMTree.value = true\n },\n }\n}\n\n/**\n * Listens for when focus happens outside a DOM subtree.\n * Returns props to pass to the root (node) of the subtree we want to check.\n */\nexport function useFocusOutside(\n onFocusOutside?: (event: FocusOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isFocusInsideDOMTree = ref(false)\n watchEffect((cleanupFn) => {\n if (!isClient)\n return\n const handleFocus = async (event: FocusEvent) => {\n if (!element?.value)\n return\n\n await nextTick()\n await nextTick()\n const target = event.target as HTMLElement | undefined\n if (!element.value || !target || isLayerExist(element.value, target))\n return\n\n if (event.target && !isFocusInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n handleAndDispatchCustomEvent(\n FOCUS_OUTSIDE,\n onFocusOutside,\n eventDetail,\n )\n }\n }\n\n ownerDocument.addEventListener('focusin', handleFocus)\n\n cleanupFn(() => ownerDocument.removeEventListener('focusin', handleFocus))\n })\n\n return {\n onFocusCapture: () => (isFocusInsideDOMTree.value = true),\n onBlurCapture: () => (isFocusInsideDOMTree.value = false),\n }\n}\n\nexport function dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE)\n document.dispatchEvent(event)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/DismissableLayer/utils.ts"],"sourcesContent":["import type { MaybeRefOrGetter, Ref } from 'vue'\nimport { isClient } from '@vueuse/shared'\nimport { nextTick, ref, toValue, watchEffect } from 'vue'\nimport { handleAndDispatchCustomEvent } from '@/shared'\n\nexport type PointerDownOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent\n}>\nexport type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>\n\nexport const DISMISSABLE_LAYER_NAME = 'DismissableLayer'\nexport const CONTEXT_UPDATE = 'dismissableLayer.update'\nexport const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'\nexport const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'\n\nfunction isLayerExist(layerElement: HTMLElement, targetElement: HTMLElement) {\n const targetLayer = targetElement.closest(\n '[data-dismissable-layer]',\n )\n\n const mainLayer = layerElement.dataset.dismissableLayer === ''\n ? layerElement\n : layerElement.querySelector(\n '[data-dismissable-layer]',\n ) as HTMLElement\n\n const nodeList = Array.from(\n layerElement.ownerDocument.querySelectorAll('[data-dismissable-layer]'),\n )\n\n if (targetLayer && (mainLayer === targetLayer || nodeList.indexOf(mainLayer) < nodeList.indexOf(targetLayer))\n ) {\n return true\n }\n else {\n return false\n }\n}\n\n/**\n * Listens for `pointerdown` outside a DOM subtree. We use `pointerdown` rather than `pointerup`\n * to mimic layer dismissing behaviour present in OS.\n * Returns props to pass to the node we want to check for outside events.\n */\nexport function usePointerDownOutside(\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isPointerInsideDOMTree = ref(false)\n const handleClickRef = ref(() => {})\n\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handlePointerDown = async (event: PointerEvent) => {\n const target = event.target as HTMLElement | undefined\n\n if (!element?.value || !target)\n return\n\n if (isLayerExist(element.value, target)) {\n isPointerInsideDOMTree.value = false\n return\n }\n\n if (event.target && !isPointerInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n\n function handleAndDispatchPointerDownOutsideEvent() {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n onPointerDownOutside,\n eventDetail,\n )\n }\n\n /**\n * On touch devices, we need to wait for a click event because browsers implement\n * a ~350ms delay between the time the user stops touching the display and when the\n * browser executes events. We need to ensure we don't reactivate pointer-events within\n * this timeframe otherwise the browser may execute events that should have been prevented.\n *\n * Additionally, this also lets us deal automatically with cancellations when a click event\n * isn't raised because the page was considered scrolled/drag-scrolled, long-pressed, etc.\n *\n * This is why we also continuously remove the previous listener, because we cannot be\n * certain that it was raised, and therefore cleaned-up.\n */\n if (event.pointerType === 'touch') {\n ownerDocument.removeEventListener('click', handleClickRef.value)\n handleClickRef.value = handleAndDispatchPointerDownOutsideEvent\n ownerDocument.addEventListener('click', handleClickRef.value, {\n once: true,\n })\n }\n else {\n handleAndDispatchPointerDownOutsideEvent()\n }\n }\n else {\n // We need to remove the event listener in case the outside click has been canceled.\n // See: https://github.com/radix-ui/primitives/issues/2171\n ownerDocument.removeEventListener('click', handleClickRef.value)\n }\n isPointerInsideDOMTree.value = false\n }\n /**\n * if this hook executes in a component that mounts via a `pointerdown` event, the event\n * would bubble up to the document and trigger a `pointerDownOutside` event. We avoid\n * this by delaying the event listener registration on the document.\n * This is how the DOM works, ie:\n * ```\n * button.addEventListener('pointerdown', () => {\n * console.log('I will log');\n * document.addEventListener('pointerdown', () => {\n * console.log('I will also log');\n * })\n * });\n */\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener('pointerdown', handlePointerDown)\n }, 0)\n\n cleanupFn(() => {\n window.clearTimeout(timerId)\n ownerDocument.removeEventListener('pointerdown', handlePointerDown)\n ownerDocument.removeEventListener('click', handleClickRef.value)\n })\n })\n\n return {\n onPointerDownCapture: () => {\n if (!toValue(enabled))\n return\n isPointerInsideDOMTree.value = true\n },\n }\n}\n\n/**\n * Listens for when focus happens outside a DOM subtree.\n * Returns props to pass to the root (node) of the subtree we want to check.\n */\nexport function useFocusOutside(\n onFocusOutside?: (event: FocusOutsideEvent) => void,\n element?: Ref<HTMLElement | undefined>,\n enabled: MaybeRefOrGetter<boolean> = true,\n) {\n const ownerDocument: Document\n = element?.value?.ownerDocument ?? globalThis?.document\n\n const isFocusInsideDOMTree = ref(false)\n watchEffect((cleanupFn) => {\n if (!isClient || !toValue(enabled))\n return\n const handleFocus = async (event: FocusEvent) => {\n if (!element?.value)\n return\n\n await nextTick()\n await nextTick()\n const target = event.target as HTMLElement | undefined\n if (!element.value || !target || isLayerExist(element.value, target))\n return\n\n if (event.target && !isFocusInsideDOMTree.value) {\n const eventDetail = { originalEvent: event }\n handleAndDispatchCustomEvent(\n FOCUS_OUTSIDE,\n onFocusOutside,\n eventDetail,\n )\n }\n }\n\n ownerDocument.addEventListener('focusin', handleFocus)\n\n cleanupFn(() => ownerDocument.removeEventListener('focusin', handleFocus))\n })\n\n return {\n onFocusCapture: () => {\n if (!toValue(enabled))\n return\n\n isFocusInsideDOMTree.value = true\n },\n onBlurCapture: () => {\n if (!toValue(enabled))\n return\n\n isFocusInsideDOMTree.value = false\n },\n }\n}\n\nexport function dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE)\n document.dispatchEvent(event)\n}\n"],"names":[],"mappings":"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"}
@@ -2,11 +2,11 @@
2
2
 
3
3
  const vue = require('vue');
4
4
  const core = require('@vueuse/core');
5
- const DismissableLayer_utils = require('../DismissableLayer/utils.cjs');
6
5
  const shared_createContext = require('../shared/createContext.cjs');
7
6
  const shared_useDirection = require('../shared/useDirection.cjs');
8
7
  const Primitive_usePrimitiveElement = require('../Primitive/usePrimitiveElement.cjs');
9
8
  const shared_useFormControl = require('../shared/useFormControl.cjs');
9
+ const DismissableLayer_utils = require('../DismissableLayer/utils.cjs');
10
10
  const Primitive_Primitive = require('../Primitive/Primitive.cjs');
11
11
  const VisuallyHidden_VisuallyHiddenInput = require('../VisuallyHidden/VisuallyHiddenInput.cjs');
12
12
 
@@ -95,7 +95,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
95
95
  }
96
96
  }
97
97
  const pointerDownOutside = DismissableLayer_utils.usePointerDownOutside(() => handleDismiss(), currentElement, isEditing);
98
- const focusOutside = DismissableLayer_utils.useFocusOutside(() => handleDismiss(), currentElement);
98
+ const focusOutside = DismissableLayer_utils.useFocusOutside(() => handleDismiss(), currentElement, isEditing);
99
99
  const isEmpty = vue.computed(() => modelValue.value === "");
100
100
  __expose({
101
101
  /** Function to submit the value of the editable */
@@ -1 +1 @@
1
- {"version":3,"file":"EditableRoot.cjs","sources":["../../src/Editable/EditableRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Direction, FormFieldProps } from '@/shared/types'\nimport { useFocusOutside, usePointerDownOutside } from '@/DismissableLayer'\nimport { createContext, useDirection, useFormControl } from '@/shared'\n\ntype ActivationMode = 'focus' | 'dblclick' | 'none'\ntype SubmitMode = 'blur' | 'enter' | 'none' | 'both'\n\ntype EditableRootContext = {\n id: Ref<string | undefined>\n name: Ref<string | undefined>\n maxLength: Ref<number | undefined>\n disabled: Ref<boolean>\n modelValue: Ref<string | null | undefined>\n inputValue: Ref<string | null | undefined>\n placeholder: Ref<{ edit: string, preview: string }>\n isEditing: Ref<boolean>\n submitMode: Ref<SubmitMode>\n activationMode: Ref<ActivationMode>\n selectOnFocus: Ref<boolean>\n edit: () => void\n cancel: () => void\n submit: () => void\n inputRef: Ref<HTMLInputElement | undefined>\n startWithEditMode: Ref<boolean>\n isEmpty: Ref<boolean>\n readonly: Ref<boolean>\n autoResize: Ref<boolean>\n}\n\nexport interface EditableRootProps extends PrimitiveProps, FormFieldProps {\n /** The default value of the editable field */\n defaultValue?: string\n /** The value of the editable field */\n modelValue?: string | null\n /** The placeholder for the editable field */\n placeholder?: string | { edit: string, preview: string }\n /** The reading direction of the calendar when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the editable field is disabled */\n disabled?: boolean\n /** Whether the editable field is read-only */\n readonly?: boolean\n /** The activation event of the editable field */\n activationMode?: ActivationMode\n /** Whether to select the text in the input when it is focused. */\n selectOnFocus?: boolean\n /** The submit event of the editable field */\n submitMode?: SubmitMode\n /** Whether to start with the edit mode active */\n startWithEditMode?: boolean\n /** The maximum number of characters allowed */\n maxLength?: number\n /** Whether the editable field should auto resize */\n autoResize?: boolean\n /** The id of the field */\n id?: string\n}\n\nexport type EditableRootEmits = {\n /** Event handler called whenever the model value changes */\n 'update:modelValue': [value: string]\n /** Event handler called when a value is submitted */\n 'submit': [value: string | null | undefined]\n /** Event handler called when the editable field changes state */\n 'update:state': [state: 'edit' | 'submit' | 'cancel']\n}\n\nexport const [injectEditableRootContext, provideEditableRootContext]\n = createContext<EditableRootContext>('EditableRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport type { Ref } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { computed, ref, toRefs, watch } from 'vue'\nimport { Primitive, usePrimitiveElement } from '@/Primitive'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<EditableRootProps>(), {\n as: 'div',\n disabled: false,\n submitMode: 'blur',\n activationMode: 'focus',\n selectOnFocus: false,\n placeholder: 'Enter text...',\n autoResize: false,\n required: false,\n})\n\nconst emits = defineEmits<EditableRootEmits>()\ndefineSlots<{\n default?: (props: {\n /** Whether the editable field is in edit mode */\n isEditing: boolean\n /** The value of the editable field */\n modelValue: typeof modelValue.value\n /** Whether the editable field is empty */\n isEmpty: boolean\n /** Function to submit the value of the editable */\n submit: () => void\n /** Function to cancel the value of the editable */\n cancel: () => void\n /** Function to set the editable in edit mode */\n edit: () => void\n }) => any\n}>()\n\nconst {\n id,\n name,\n defaultValue,\n startWithEditMode,\n placeholder: propPlaceholder,\n maxLength,\n disabled,\n dir: propDir,\n submitMode,\n activationMode,\n selectOnFocus,\n readonly,\n autoResize,\n required,\n} = toRefs(props)\n\nconst inputRef = ref<HTMLInputElement | undefined>()\nconst dir = useDirection(propDir)\nconst isEditing = ref(startWithEditMode.value ?? false)\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: defaultValue.value ?? '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\n\nconst isFormControl = useFormControl(currentElement)\n\nconst placeholder = computed(() => {\n return typeof propPlaceholder.value === 'string' ? { edit: propPlaceholder.value, preview: propPlaceholder.value } : propPlaceholder.value\n})\n\nconst inputValue = ref(modelValue.value)\n\nwatch(() => modelValue.value, () => {\n inputValue.value = modelValue.value\n}, { immediate: true, deep: true })\n\nfunction cancel() {\n isEditing.value = false\n emits('update:state', 'cancel')\n}\n\nfunction edit() {\n isEditing.value = true\n inputValue.value = modelValue.value\n\n emits('update:state', 'edit')\n}\n\nfunction submit() {\n modelValue.value = inputValue.value\n isEditing.value = false\n\n emits('update:state', 'submit')\n emits('submit', modelValue.value)\n}\n\nfunction handleDismiss() {\n if (isEditing.value) {\n if (submitMode.value === 'blur' || submitMode.value === 'both')\n submit()\n else\n cancel()\n }\n}\n\nconst pointerDownOutside = usePointerDownOutside(() => handleDismiss(), currentElement, isEditing)\nconst focusOutside = useFocusOutside(() => handleDismiss(), currentElement)\nconst isEmpty = computed(() => modelValue.value === '')\n\ndefineExpose({\n /** Function to submit the value of the editable */\n submit,\n /** Function to cancel the value of the editable */\n cancel,\n /** Function to set the editable in edit mode */\n edit,\n})\n\nprovideEditableRootContext({\n id,\n name,\n disabled,\n isEditing,\n maxLength,\n modelValue,\n inputValue,\n placeholder,\n edit,\n cancel,\n submit,\n activationMode,\n submitMode,\n selectOnFocus,\n inputRef,\n startWithEditMode,\n isEmpty,\n readonly,\n autoResize,\n})\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n data-dismissable-layer\n @focus.capture=\"focusOutside.onFocusCapture\"\n @blur.capture=\"focusOutside.onBlurCapture\"\n @pointerdown.capture=\"pointerDownOutside.onPointerDownCapture\"\n >\n <slot\n :model-value=\"modelValue\"\n :is-editing=\"isEditing\"\n :is-empty=\"isEmpty\"\n :submit=\"submit\"\n :cancel=\"cancel\"\n :edit=\"edit\"\n />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"text\"\n :value=\"modelValue\"\n :name=\"name\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","ref","useDirection","useVModel","usePrimitiveElement","useFormControl","computed","watch","usePointerDownOutside","useFocusOutside"],"mappings":"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"}
1
+ {"version":3,"file":"EditableRoot.cjs","sources":["../../src/Editable/EditableRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Direction, FormFieldProps } from '@/shared/types'\nimport { useFocusOutside, usePointerDownOutside } from '@/DismissableLayer'\nimport { createContext, useDirection, useFormControl } from '@/shared'\n\ntype ActivationMode = 'focus' | 'dblclick' | 'none'\ntype SubmitMode = 'blur' | 'enter' | 'none' | 'both'\n\ntype EditableRootContext = {\n id: Ref<string | undefined>\n name: Ref<string | undefined>\n maxLength: Ref<number | undefined>\n disabled: Ref<boolean>\n modelValue: Ref<string | null | undefined>\n inputValue: Ref<string | null | undefined>\n placeholder: Ref<{ edit: string, preview: string }>\n isEditing: Ref<boolean>\n submitMode: Ref<SubmitMode>\n activationMode: Ref<ActivationMode>\n selectOnFocus: Ref<boolean>\n edit: () => void\n cancel: () => void\n submit: () => void\n inputRef: Ref<HTMLInputElement | undefined>\n startWithEditMode: Ref<boolean>\n isEmpty: Ref<boolean>\n readonly: Ref<boolean>\n autoResize: Ref<boolean>\n}\n\nexport interface EditableRootProps extends PrimitiveProps, FormFieldProps {\n /** The default value of the editable field */\n defaultValue?: string\n /** The value of the editable field */\n modelValue?: string | null\n /** The placeholder for the editable field */\n placeholder?: string | { edit: string, preview: string }\n /** The reading direction of the calendar when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the editable field is disabled */\n disabled?: boolean\n /** Whether the editable field is read-only */\n readonly?: boolean\n /** The activation event of the editable field */\n activationMode?: ActivationMode\n /** Whether to select the text in the input when it is focused. */\n selectOnFocus?: boolean\n /** The submit event of the editable field */\n submitMode?: SubmitMode\n /** Whether to start with the edit mode active */\n startWithEditMode?: boolean\n /** The maximum number of characters allowed */\n maxLength?: number\n /** Whether the editable field should auto resize */\n autoResize?: boolean\n /** The id of the field */\n id?: string\n}\n\nexport type EditableRootEmits = {\n /** Event handler called whenever the model value changes */\n 'update:modelValue': [value: string]\n /** Event handler called when a value is submitted */\n 'submit': [value: string | null | undefined]\n /** Event handler called when the editable field changes state */\n 'update:state': [state: 'edit' | 'submit' | 'cancel']\n}\n\nexport const [injectEditableRootContext, provideEditableRootContext]\n = createContext<EditableRootContext>('EditableRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport type { Ref } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { computed, ref, toRefs, watch } from 'vue'\nimport { Primitive, usePrimitiveElement } from '@/Primitive'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<EditableRootProps>(), {\n as: 'div',\n disabled: false,\n submitMode: 'blur',\n activationMode: 'focus',\n selectOnFocus: false,\n placeholder: 'Enter text...',\n autoResize: false,\n required: false,\n})\n\nconst emits = defineEmits<EditableRootEmits>()\ndefineSlots<{\n default?: (props: {\n /** Whether the editable field is in edit mode */\n isEditing: boolean\n /** The value of the editable field */\n modelValue: typeof modelValue.value\n /** Whether the editable field is empty */\n isEmpty: boolean\n /** Function to submit the value of the editable */\n submit: () => void\n /** Function to cancel the value of the editable */\n cancel: () => void\n /** Function to set the editable in edit mode */\n edit: () => void\n }) => any\n}>()\n\nconst {\n id,\n name,\n defaultValue,\n startWithEditMode,\n placeholder: propPlaceholder,\n maxLength,\n disabled,\n dir: propDir,\n submitMode,\n activationMode,\n selectOnFocus,\n readonly,\n autoResize,\n required,\n} = toRefs(props)\n\nconst inputRef = ref<HTMLInputElement | undefined>()\nconst dir = useDirection(propDir)\nconst isEditing = ref(startWithEditMode.value ?? false)\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: defaultValue.value ?? '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\n\nconst isFormControl = useFormControl(currentElement)\n\nconst placeholder = computed(() => {\n return typeof propPlaceholder.value === 'string' ? { edit: propPlaceholder.value, preview: propPlaceholder.value } : propPlaceholder.value\n})\n\nconst inputValue = ref(modelValue.value)\n\nwatch(() => modelValue.value, () => {\n inputValue.value = modelValue.value\n}, { immediate: true, deep: true })\n\nfunction cancel() {\n isEditing.value = false\n emits('update:state', 'cancel')\n}\n\nfunction edit() {\n isEditing.value = true\n inputValue.value = modelValue.value\n\n emits('update:state', 'edit')\n}\n\nfunction submit() {\n modelValue.value = inputValue.value\n isEditing.value = false\n\n emits('update:state', 'submit')\n emits('submit', modelValue.value)\n}\n\nfunction handleDismiss() {\n if (isEditing.value) {\n if (submitMode.value === 'blur' || submitMode.value === 'both')\n submit()\n else\n cancel()\n }\n}\n\nconst pointerDownOutside = usePointerDownOutside(() => handleDismiss(), currentElement, isEditing)\nconst focusOutside = useFocusOutside(() => handleDismiss(), currentElement, isEditing)\n\nconst isEmpty = computed(() => modelValue.value === '')\n\ndefineExpose({\n /** Function to submit the value of the editable */\n submit,\n /** Function to cancel the value of the editable */\n cancel,\n /** Function to set the editable in edit mode */\n edit,\n})\n\nprovideEditableRootContext({\n id,\n name,\n disabled,\n isEditing,\n maxLength,\n modelValue,\n inputValue,\n placeholder,\n edit,\n cancel,\n submit,\n activationMode,\n submitMode,\n selectOnFocus,\n inputRef,\n startWithEditMode,\n isEmpty,\n readonly,\n autoResize,\n})\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n data-dismissable-layer\n @focus.capture=\"focusOutside.onFocusCapture\"\n @blur.capture=\"focusOutside.onBlurCapture\"\n @pointerdown.capture=\"pointerDownOutside.onPointerDownCapture\"\n >\n <slot\n :model-value=\"modelValue\"\n :is-editing=\"isEditing\"\n :is-empty=\"isEmpty\"\n :submit=\"submit\"\n :cancel=\"cancel\"\n :edit=\"edit\"\n />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"text\"\n :value=\"modelValue\"\n :name=\"name\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","ref","useDirection","useVModel","usePrimitiveElement","useFormControl","computed","watch","usePointerDownOutside","useFocusOutside"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { defineComponent, toRefs, ref, computed, watch, createBlock, openBlock, unref, mergeProps, withCtx, renderSlot, createCommentVNode } from 'vue';
2
2
  import { useVModel } from '@vueuse/core';
3
- import { u as usePointerDownOutside, a as useFocusOutside } from '../DismissableLayer/utils.js';
4
3
  import { c as createContext } from '../shared/createContext.js';
5
4
  import { u as useDirection } from '../shared/useDirection.js';
6
5
  import { u as usePrimitiveElement } from '../Primitive/usePrimitiveElement.js';
7
6
  import { u as useFormControl } from '../shared/useFormControl.js';
7
+ import { u as usePointerDownOutside, a as useFocusOutside } from '../DismissableLayer/utils.js';
8
8
  import { P as Primitive } from '../Primitive/Primitive.js';
9
9
  import { _ as _sfc_main$1 } from '../VisuallyHidden/VisuallyHiddenInput.js';
10
10
 
@@ -93,7 +93,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
93
93
  }
94
94
  }
95
95
  const pointerDownOutside = usePointerDownOutside(() => handleDismiss(), currentElement, isEditing);
96
- const focusOutside = useFocusOutside(() => handleDismiss(), currentElement);
96
+ const focusOutside = useFocusOutside(() => handleDismiss(), currentElement, isEditing);
97
97
  const isEmpty = computed(() => modelValue.value === "");
98
98
  __expose({
99
99
  /** Function to submit the value of the editable */
@@ -1 +1 @@
1
- {"version":3,"file":"EditableRoot.js","sources":["../../src/Editable/EditableRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Direction, FormFieldProps } from '@/shared/types'\nimport { useFocusOutside, usePointerDownOutside } from '@/DismissableLayer'\nimport { createContext, useDirection, useFormControl } from '@/shared'\n\ntype ActivationMode = 'focus' | 'dblclick' | 'none'\ntype SubmitMode = 'blur' | 'enter' | 'none' | 'both'\n\ntype EditableRootContext = {\n id: Ref<string | undefined>\n name: Ref<string | undefined>\n maxLength: Ref<number | undefined>\n disabled: Ref<boolean>\n modelValue: Ref<string | null | undefined>\n inputValue: Ref<string | null | undefined>\n placeholder: Ref<{ edit: string, preview: string }>\n isEditing: Ref<boolean>\n submitMode: Ref<SubmitMode>\n activationMode: Ref<ActivationMode>\n selectOnFocus: Ref<boolean>\n edit: () => void\n cancel: () => void\n submit: () => void\n inputRef: Ref<HTMLInputElement | undefined>\n startWithEditMode: Ref<boolean>\n isEmpty: Ref<boolean>\n readonly: Ref<boolean>\n autoResize: Ref<boolean>\n}\n\nexport interface EditableRootProps extends PrimitiveProps, FormFieldProps {\n /** The default value of the editable field */\n defaultValue?: string\n /** The value of the editable field */\n modelValue?: string | null\n /** The placeholder for the editable field */\n placeholder?: string | { edit: string, preview: string }\n /** The reading direction of the calendar when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the editable field is disabled */\n disabled?: boolean\n /** Whether the editable field is read-only */\n readonly?: boolean\n /** The activation event of the editable field */\n activationMode?: ActivationMode\n /** Whether to select the text in the input when it is focused. */\n selectOnFocus?: boolean\n /** The submit event of the editable field */\n submitMode?: SubmitMode\n /** Whether to start with the edit mode active */\n startWithEditMode?: boolean\n /** The maximum number of characters allowed */\n maxLength?: number\n /** Whether the editable field should auto resize */\n autoResize?: boolean\n /** The id of the field */\n id?: string\n}\n\nexport type EditableRootEmits = {\n /** Event handler called whenever the model value changes */\n 'update:modelValue': [value: string]\n /** Event handler called when a value is submitted */\n 'submit': [value: string | null | undefined]\n /** Event handler called when the editable field changes state */\n 'update:state': [state: 'edit' | 'submit' | 'cancel']\n}\n\nexport const [injectEditableRootContext, provideEditableRootContext]\n = createContext<EditableRootContext>('EditableRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport type { Ref } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { computed, ref, toRefs, watch } from 'vue'\nimport { Primitive, usePrimitiveElement } from '@/Primitive'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<EditableRootProps>(), {\n as: 'div',\n disabled: false,\n submitMode: 'blur',\n activationMode: 'focus',\n selectOnFocus: false,\n placeholder: 'Enter text...',\n autoResize: false,\n required: false,\n})\n\nconst emits = defineEmits<EditableRootEmits>()\ndefineSlots<{\n default?: (props: {\n /** Whether the editable field is in edit mode */\n isEditing: boolean\n /** The value of the editable field */\n modelValue: typeof modelValue.value\n /** Whether the editable field is empty */\n isEmpty: boolean\n /** Function to submit the value of the editable */\n submit: () => void\n /** Function to cancel the value of the editable */\n cancel: () => void\n /** Function to set the editable in edit mode */\n edit: () => void\n }) => any\n}>()\n\nconst {\n id,\n name,\n defaultValue,\n startWithEditMode,\n placeholder: propPlaceholder,\n maxLength,\n disabled,\n dir: propDir,\n submitMode,\n activationMode,\n selectOnFocus,\n readonly,\n autoResize,\n required,\n} = toRefs(props)\n\nconst inputRef = ref<HTMLInputElement | undefined>()\nconst dir = useDirection(propDir)\nconst isEditing = ref(startWithEditMode.value ?? false)\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: defaultValue.value ?? '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\n\nconst isFormControl = useFormControl(currentElement)\n\nconst placeholder = computed(() => {\n return typeof propPlaceholder.value === 'string' ? { edit: propPlaceholder.value, preview: propPlaceholder.value } : propPlaceholder.value\n})\n\nconst inputValue = ref(modelValue.value)\n\nwatch(() => modelValue.value, () => {\n inputValue.value = modelValue.value\n}, { immediate: true, deep: true })\n\nfunction cancel() {\n isEditing.value = false\n emits('update:state', 'cancel')\n}\n\nfunction edit() {\n isEditing.value = true\n inputValue.value = modelValue.value\n\n emits('update:state', 'edit')\n}\n\nfunction submit() {\n modelValue.value = inputValue.value\n isEditing.value = false\n\n emits('update:state', 'submit')\n emits('submit', modelValue.value)\n}\n\nfunction handleDismiss() {\n if (isEditing.value) {\n if (submitMode.value === 'blur' || submitMode.value === 'both')\n submit()\n else\n cancel()\n }\n}\n\nconst pointerDownOutside = usePointerDownOutside(() => handleDismiss(), currentElement, isEditing)\nconst focusOutside = useFocusOutside(() => handleDismiss(), currentElement)\nconst isEmpty = computed(() => modelValue.value === '')\n\ndefineExpose({\n /** Function to submit the value of the editable */\n submit,\n /** Function to cancel the value of the editable */\n cancel,\n /** Function to set the editable in edit mode */\n edit,\n})\n\nprovideEditableRootContext({\n id,\n name,\n disabled,\n isEditing,\n maxLength,\n modelValue,\n inputValue,\n placeholder,\n edit,\n cancel,\n submit,\n activationMode,\n submitMode,\n selectOnFocus,\n inputRef,\n startWithEditMode,\n isEmpty,\n readonly,\n autoResize,\n})\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n data-dismissable-layer\n @focus.capture=\"focusOutside.onFocusCapture\"\n @blur.capture=\"focusOutside.onBlurCapture\"\n @pointerdown.capture=\"pointerDownOutside.onPointerDownCapture\"\n >\n <slot\n :model-value=\"modelValue\"\n :is-editing=\"isEditing\"\n :is-empty=\"isEmpty\"\n :submit=\"submit\"\n :cancel=\"cancel\"\n :edit=\"edit\"\n />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"text\"\n :value=\"modelValue\"\n :name=\"name\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditableRoot.js","sources":["../../src/Editable/EditableRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Direction, FormFieldProps } from '@/shared/types'\nimport { useFocusOutside, usePointerDownOutside } from '@/DismissableLayer'\nimport { createContext, useDirection, useFormControl } from '@/shared'\n\ntype ActivationMode = 'focus' | 'dblclick' | 'none'\ntype SubmitMode = 'blur' | 'enter' | 'none' | 'both'\n\ntype EditableRootContext = {\n id: Ref<string | undefined>\n name: Ref<string | undefined>\n maxLength: Ref<number | undefined>\n disabled: Ref<boolean>\n modelValue: Ref<string | null | undefined>\n inputValue: Ref<string | null | undefined>\n placeholder: Ref<{ edit: string, preview: string }>\n isEditing: Ref<boolean>\n submitMode: Ref<SubmitMode>\n activationMode: Ref<ActivationMode>\n selectOnFocus: Ref<boolean>\n edit: () => void\n cancel: () => void\n submit: () => void\n inputRef: Ref<HTMLInputElement | undefined>\n startWithEditMode: Ref<boolean>\n isEmpty: Ref<boolean>\n readonly: Ref<boolean>\n autoResize: Ref<boolean>\n}\n\nexport interface EditableRootProps extends PrimitiveProps, FormFieldProps {\n /** The default value of the editable field */\n defaultValue?: string\n /** The value of the editable field */\n modelValue?: string | null\n /** The placeholder for the editable field */\n placeholder?: string | { edit: string, preview: string }\n /** The reading direction of the calendar when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** Whether the editable field is disabled */\n disabled?: boolean\n /** Whether the editable field is read-only */\n readonly?: boolean\n /** The activation event of the editable field */\n activationMode?: ActivationMode\n /** Whether to select the text in the input when it is focused. */\n selectOnFocus?: boolean\n /** The submit event of the editable field */\n submitMode?: SubmitMode\n /** Whether to start with the edit mode active */\n startWithEditMode?: boolean\n /** The maximum number of characters allowed */\n maxLength?: number\n /** Whether the editable field should auto resize */\n autoResize?: boolean\n /** The id of the field */\n id?: string\n}\n\nexport type EditableRootEmits = {\n /** Event handler called whenever the model value changes */\n 'update:modelValue': [value: string]\n /** Event handler called when a value is submitted */\n 'submit': [value: string | null | undefined]\n /** Event handler called when the editable field changes state */\n 'update:state': [state: 'edit' | 'submit' | 'cancel']\n}\n\nexport const [injectEditableRootContext, provideEditableRootContext]\n = createContext<EditableRootContext>('EditableRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport type { Ref } from 'vue'\nimport { useVModel } from '@vueuse/core'\nimport { computed, ref, toRefs, watch } from 'vue'\nimport { Primitive, usePrimitiveElement } from '@/Primitive'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<EditableRootProps>(), {\n as: 'div',\n disabled: false,\n submitMode: 'blur',\n activationMode: 'focus',\n selectOnFocus: false,\n placeholder: 'Enter text...',\n autoResize: false,\n required: false,\n})\n\nconst emits = defineEmits<EditableRootEmits>()\ndefineSlots<{\n default?: (props: {\n /** Whether the editable field is in edit mode */\n isEditing: boolean\n /** The value of the editable field */\n modelValue: typeof modelValue.value\n /** Whether the editable field is empty */\n isEmpty: boolean\n /** Function to submit the value of the editable */\n submit: () => void\n /** Function to cancel the value of the editable */\n cancel: () => void\n /** Function to set the editable in edit mode */\n edit: () => void\n }) => any\n}>()\n\nconst {\n id,\n name,\n defaultValue,\n startWithEditMode,\n placeholder: propPlaceholder,\n maxLength,\n disabled,\n dir: propDir,\n submitMode,\n activationMode,\n selectOnFocus,\n readonly,\n autoResize,\n required,\n} = toRefs(props)\n\nconst inputRef = ref<HTMLInputElement | undefined>()\nconst dir = useDirection(propDir)\nconst isEditing = ref(startWithEditMode.value ?? false)\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: defaultValue.value ?? '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\n\nconst isFormControl = useFormControl(currentElement)\n\nconst placeholder = computed(() => {\n return typeof propPlaceholder.value === 'string' ? { edit: propPlaceholder.value, preview: propPlaceholder.value } : propPlaceholder.value\n})\n\nconst inputValue = ref(modelValue.value)\n\nwatch(() => modelValue.value, () => {\n inputValue.value = modelValue.value\n}, { immediate: true, deep: true })\n\nfunction cancel() {\n isEditing.value = false\n emits('update:state', 'cancel')\n}\n\nfunction edit() {\n isEditing.value = true\n inputValue.value = modelValue.value\n\n emits('update:state', 'edit')\n}\n\nfunction submit() {\n modelValue.value = inputValue.value\n isEditing.value = false\n\n emits('update:state', 'submit')\n emits('submit', modelValue.value)\n}\n\nfunction handleDismiss() {\n if (isEditing.value) {\n if (submitMode.value === 'blur' || submitMode.value === 'both')\n submit()\n else\n cancel()\n }\n}\n\nconst pointerDownOutside = usePointerDownOutside(() => handleDismiss(), currentElement, isEditing)\nconst focusOutside = useFocusOutside(() => handleDismiss(), currentElement, isEditing)\n\nconst isEmpty = computed(() => modelValue.value === '')\n\ndefineExpose({\n /** Function to submit the value of the editable */\n submit,\n /** Function to cancel the value of the editable */\n cancel,\n /** Function to set the editable in edit mode */\n edit,\n})\n\nprovideEditableRootContext({\n id,\n name,\n disabled,\n isEditing,\n maxLength,\n modelValue,\n inputValue,\n placeholder,\n edit,\n cancel,\n submit,\n activationMode,\n submitMode,\n selectOnFocus,\n inputRef,\n startWithEditMode,\n isEmpty,\n readonly,\n autoResize,\n})\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n data-dismissable-layer\n @focus.capture=\"focusOutside.onFocusCapture\"\n @blur.capture=\"focusOutside.onBlurCapture\"\n @pointerdown.capture=\"pointerDownOutside.onPointerDownCapture\"\n >\n <slot\n :model-value=\"modelValue\"\n :is-editing=\"isEditing\"\n :is-empty=\"isEmpty\"\n :submit=\"submit\"\n :cancel=\"cancel\"\n :edit=\"edit\"\n />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n type=\"text\"\n :value=\"modelValue\"\n :name=\"name\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  const vue = require('vue');
4
- const DismissableLayer_DismissableLayer = require('../DismissableLayer/DismissableLayer.cjs');
5
4
  const Popper_PopperContent = require('../Popper/PopperContent.cjs');
6
5
  require('@floating-ui/vue');
7
6
  const HoverCard_utils = require('./utils.cjs');
@@ -10,6 +9,7 @@ const shared_useForwardProps = require('../shared/useForwardProps.cjs');
10
9
  const shared_useForwardExpose = require('../shared/useForwardExpose.cjs');
11
10
  const HoverCard_HoverCardRoot = require('./HoverCardRoot.cjs');
12
11
  const shared_useGraceArea = require('../shared/useGraceArea.cjs');
12
+ const DismissableLayer_DismissableLayer = require('../DismissableLayer/DismissableLayer.cjs');
13
13
 
14
14
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
15
15
  __name: "HoverCardContentImpl",
@@ -1,5 +1,4 @@
1
1
  import { defineComponent, ref, watchEffect, onMounted, onUnmounted, createBlock, openBlock, unref, withModifiers, withCtx, createVNode, mergeProps, renderSlot, nextTick } from 'vue';
2
- import { _ as _sfc_main$1 } from '../DismissableLayer/DismissableLayer.js';
3
2
  import { _ as _sfc_main$2 } from '../Popper/PopperContent.js';
4
3
  import '@floating-ui/vue';
5
4
  import { g as getTabbableNodes } from './utils.js';
@@ -8,6 +7,7 @@ import { u as useForwardProps } from '../shared/useForwardProps.js';
8
7
  import { u as useForwardExpose } from '../shared/useForwardExpose.js';
9
8
  import { i as injectHoverCardRootContext } from './HoverCardRoot.js';
10
9
  import { u as useGraceArea } from '../shared/useGraceArea.js';
10
+ import { _ as _sfc_main$1 } from '../DismissableLayer/DismissableLayer.js';
11
11
 
12
12
  const _sfc_main = /* @__PURE__ */ defineComponent({
13
13
  __name: "HoverCardContentImpl",
@@ -57,7 +57,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
57
57
  ],
58
58
  onInput: _cache[0] || (_cache[0] = (event) => {
59
59
  modelValue.value = event.target.value;
60
- vue.unref(rootContext).highlightFirstItem(event);
60
+ vue.unref(rootContext).highlightFirstItem();
61
61
  }),
62
62
  onCompositionstart: vue.unref(rootContext).onCompositionStart,
63
63
  onCompositionend: vue.unref(rootContext).onCompositionEnd
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxFilter.cjs","sources":["../../src/Listbox/ListboxFilter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '..'\nimport { useVModel } from '@vueuse/core'\nimport { computed, onMounted, onUnmounted, ref, watchSyncEffect } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { Primitive } from '..'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\n\nexport interface ListboxFilterProps extends PrimitiveProps {\n /** The controlled value of the filter. Can be binded with with v-model. */\n modelValue?: string\n /** Focus on element when mounted. */\n autoFocus?: boolean\n /** When `true`, prevents the user from interacting with item */\n disabled?: boolean\n}\n\nexport type ListboxFilterEmits = {\n 'update:modelValue': [string]\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<ListboxFilterProps>(), {\n as: 'input',\n})\nconst emits = defineEmits<ListboxFilterEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst rootContext = injectListboxRootContext()\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst disabled = computed(() => props.disabled || rootContext.disabled.value || false)\n\nconst activedescendant = ref<string | undefined>()\nwatchSyncEffect(() => activedescendant.value = rootContext.highlightedElement.value?.id)\n\nonMounted(() => {\n rootContext.focusable.value = false\n\n setTimeout(() => {\n // make sure all DOM was flush then only capture the focus\n if (props.autoFocus)\n currentElement.value?.focus()\n }, 1)\n})\n\nonUnmounted(() => {\n rootContext.focusable.value = true\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :value=\"modelValue\"\n :disabled=\"disabled ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :aria-disabled=\"disabled ?? undefined\"\n :aria-activedescendant=\"activedescendant\"\n type=\"text\"\n @keydown.down.up.home.end.prevent=\"rootContext.onKeydownNavigation\"\n @keydown.enter=\"rootContext.onKeydownEnter\"\n @input=\"(event: InputEvent) => {\n modelValue = (event.target as HTMLInputElement).value\n rootContext.highlightFirstItem(event)\n }\"\n @compositionstart=\"rootContext.onCompositionStart\"\n @compositionend=\"rootContext.onCompositionEnd\"\n >\n <slot :model-value=\"modelValue\" />\n </Primitive>\n</template>\n"],"names":["useVModel","injectListboxRootContext","usePrimitiveElement","computed","ref","watchSyncEffect","onMounted","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAA,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAO,EAAA;AAAA,MACvD,YAAc,EAAA,EAAA;AAAA,MACd,OAAA,EAAU,MAAM,UAAe,KAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,cAAcC,4CAAyB,EAAA;AAE7C,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAIC,iDAAoB,EAAA;AACjE,IAAM,MAAA,QAAA,GAAWC,aAAS,MAAM,KAAA,CAAM,YAAY,WAAY,CAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAErF,IAAA,MAAM,mBAAmBC,OAAwB,EAAA;AACjD,IAAAC,mBAAA,CAAgB,MAAM,gBAAiB,CAAA,KAAA,GAAQ,WAAY,CAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAEvF,IAAAC,aAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,KAAA;AAE9B,MAAA,UAAA,CAAW,MAAM;AAEf,QAAA,IAAI,KAAM,CAAA,SAAA;AACR,UAAA,cAAA,CAAe,OAAO,KAAM,EAAA;AAAA,SAC7B,CAAC,CAAA;AAAA,KACL,CAAA;AAED,IAAAC,eAAA,CAAY,MAAM;AAChB,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,IAAA;AAAA,KAC/B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ListboxFilter.cjs","sources":["../../src/Listbox/ListboxFilter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '..'\nimport { useVModel } from '@vueuse/core'\nimport { computed, onMounted, onUnmounted, ref, watchSyncEffect } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { Primitive } from '..'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\n\nexport interface ListboxFilterProps extends PrimitiveProps {\n /** The controlled value of the filter. Can be binded with with v-model. */\n modelValue?: string\n /** Focus on element when mounted. */\n autoFocus?: boolean\n /** When `true`, prevents the user from interacting with item */\n disabled?: boolean\n}\n\nexport type ListboxFilterEmits = {\n 'update:modelValue': [string]\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<ListboxFilterProps>(), {\n as: 'input',\n})\nconst emits = defineEmits<ListboxFilterEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst rootContext = injectListboxRootContext()\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst disabled = computed(() => props.disabled || rootContext.disabled.value || false)\n\nconst activedescendant = ref<string | undefined>()\nwatchSyncEffect(() => activedescendant.value = rootContext.highlightedElement.value?.id)\n\nonMounted(() => {\n rootContext.focusable.value = false\n\n setTimeout(() => {\n // make sure all DOM was flush then only capture the focus\n if (props.autoFocus)\n currentElement.value?.focus()\n }, 1)\n})\n\nonUnmounted(() => {\n rootContext.focusable.value = true\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :value=\"modelValue\"\n :disabled=\"disabled ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :aria-disabled=\"disabled ?? undefined\"\n :aria-activedescendant=\"activedescendant\"\n type=\"text\"\n @keydown.down.up.home.end.prevent=\"rootContext.onKeydownNavigation\"\n @keydown.enter=\"rootContext.onKeydownEnter\"\n @input=\"(event: InputEvent) => {\n modelValue = (event.target as HTMLInputElement).value\n rootContext.highlightFirstItem()\n }\"\n @compositionstart=\"rootContext.onCompositionStart\"\n @compositionend=\"rootContext.onCompositionEnd\"\n >\n <slot :model-value=\"modelValue\" />\n </Primitive>\n</template>\n"],"names":["useVModel","injectListboxRootContext","usePrimitiveElement","computed","ref","watchSyncEffect","onMounted","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAAA,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAO,EAAA;AAAA,MACvD,YAAc,EAAA,EAAA;AAAA,MACd,OAAA,EAAU,MAAM,UAAe,KAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,cAAcC,4CAAyB,EAAA;AAE7C,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAIC,iDAAoB,EAAA;AACjE,IAAM,MAAA,QAAA,GAAWC,aAAS,MAAM,KAAA,CAAM,YAAY,WAAY,CAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAErF,IAAA,MAAM,mBAAmBC,OAAwB,EAAA;AACjD,IAAAC,mBAAA,CAAgB,MAAM,gBAAiB,CAAA,KAAA,GAAQ,WAAY,CAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAEvF,IAAAC,aAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,KAAA;AAE9B,MAAA,UAAA,CAAW,MAAM;AAEf,QAAA,IAAI,KAAM,CAAA,SAAA;AACR,UAAA,cAAA,CAAe,OAAO,KAAM,EAAA;AAAA,SAC7B,CAAC,CAAA;AAAA,KACL,CAAA;AAED,IAAAC,eAAA,CAAY,MAAM;AAChB,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,IAAA;AAAA,KAC/B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -55,7 +55,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
55
55
  ],
56
56
  onInput: _cache[0] || (_cache[0] = (event) => {
57
57
  modelValue.value = event.target.value;
58
- unref(rootContext).highlightFirstItem(event);
58
+ unref(rootContext).highlightFirstItem();
59
59
  }),
60
60
  onCompositionstart: unref(rootContext).onCompositionStart,
61
61
  onCompositionend: unref(rootContext).onCompositionEnd
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxFilter.js","sources":["../../src/Listbox/ListboxFilter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '..'\nimport { useVModel } from '@vueuse/core'\nimport { computed, onMounted, onUnmounted, ref, watchSyncEffect } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { Primitive } from '..'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\n\nexport interface ListboxFilterProps extends PrimitiveProps {\n /** The controlled value of the filter. Can be binded with with v-model. */\n modelValue?: string\n /** Focus on element when mounted. */\n autoFocus?: boolean\n /** When `true`, prevents the user from interacting with item */\n disabled?: boolean\n}\n\nexport type ListboxFilterEmits = {\n 'update:modelValue': [string]\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<ListboxFilterProps>(), {\n as: 'input',\n})\nconst emits = defineEmits<ListboxFilterEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst rootContext = injectListboxRootContext()\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst disabled = computed(() => props.disabled || rootContext.disabled.value || false)\n\nconst activedescendant = ref<string | undefined>()\nwatchSyncEffect(() => activedescendant.value = rootContext.highlightedElement.value?.id)\n\nonMounted(() => {\n rootContext.focusable.value = false\n\n setTimeout(() => {\n // make sure all DOM was flush then only capture the focus\n if (props.autoFocus)\n currentElement.value?.focus()\n }, 1)\n})\n\nonUnmounted(() => {\n rootContext.focusable.value = true\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :value=\"modelValue\"\n :disabled=\"disabled ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :aria-disabled=\"disabled ?? undefined\"\n :aria-activedescendant=\"activedescendant\"\n type=\"text\"\n @keydown.down.up.home.end.prevent=\"rootContext.onKeydownNavigation\"\n @keydown.enter=\"rootContext.onKeydownEnter\"\n @input=\"(event: InputEvent) => {\n modelValue = (event.target as HTMLInputElement).value\n rootContext.highlightFirstItem(event)\n }\"\n @compositionstart=\"rootContext.onCompositionStart\"\n @compositionend=\"rootContext.onCompositionEnd\"\n >\n <slot :model-value=\"modelValue\" />\n </Primitive>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAO,EAAA;AAAA,MACvD,YAAc,EAAA,EAAA;AAAA,MACd,OAAA,EAAU,MAAM,UAAe,KAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,cAAc,wBAAyB,EAAA;AAE7C,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAI,mBAAoB,EAAA;AACjE,IAAM,MAAA,QAAA,GAAW,SAAS,MAAM,KAAA,CAAM,YAAY,WAAY,CAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAErF,IAAA,MAAM,mBAAmB,GAAwB,EAAA;AACjD,IAAA,eAAA,CAAgB,MAAM,gBAAiB,CAAA,KAAA,GAAQ,WAAY,CAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAEvF,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,KAAA;AAE9B,MAAA,UAAA,CAAW,MAAM;AAEf,QAAA,IAAI,KAAM,CAAA,SAAA;AACR,UAAA,cAAA,CAAe,OAAO,KAAM,EAAA;AAAA,SAC7B,CAAC,CAAA;AAAA,KACL,CAAA;AAED,IAAA,WAAA,CAAY,MAAM;AAChB,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,IAAA;AAAA,KAC/B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ListboxFilter.js","sources":["../../src/Listbox/ListboxFilter.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '..'\nimport { useVModel } from '@vueuse/core'\nimport { computed, onMounted, onUnmounted, ref, watchSyncEffect } from 'vue'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { Primitive } from '..'\nimport { injectListboxRootContext } from './ListboxRoot.vue'\n\nexport interface ListboxFilterProps extends PrimitiveProps {\n /** The controlled value of the filter. Can be binded with with v-model. */\n modelValue?: string\n /** Focus on element when mounted. */\n autoFocus?: boolean\n /** When `true`, prevents the user from interacting with item */\n disabled?: boolean\n}\n\nexport type ListboxFilterEmits = {\n 'update:modelValue': [string]\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = withDefaults(defineProps<ListboxFilterProps>(), {\n as: 'input',\n})\nconst emits = defineEmits<ListboxFilterEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current input values */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: '',\n passive: (props.modelValue === undefined) as false,\n})\n\nconst rootContext = injectListboxRootContext()\n\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst disabled = computed(() => props.disabled || rootContext.disabled.value || false)\n\nconst activedescendant = ref<string | undefined>()\nwatchSyncEffect(() => activedescendant.value = rootContext.highlightedElement.value?.id)\n\nonMounted(() => {\n rootContext.focusable.value = false\n\n setTimeout(() => {\n // make sure all DOM was flush then only capture the focus\n if (props.autoFocus)\n currentElement.value?.focus()\n }, 1)\n})\n\nonUnmounted(() => {\n rootContext.focusable.value = true\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :value=\"modelValue\"\n :disabled=\"disabled ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :aria-disabled=\"disabled ?? undefined\"\n :aria-activedescendant=\"activedescendant\"\n type=\"text\"\n @keydown.down.up.home.end.prevent=\"rootContext.onKeydownNavigation\"\n @keydown.enter=\"rootContext.onKeydownEnter\"\n @input=\"(event: InputEvent) => {\n modelValue = (event.target as HTMLInputElement).value\n rootContext.highlightFirstItem()\n }\"\n @compositionstart=\"rootContext.onCompositionStart\"\n @compositionend=\"rootContext.onCompositionEnd\"\n >\n <slot :model-value=\"modelValue\" />\n </Primitive>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAGd,IAAA,MAAM,KAAQ,GAAA,MAAA;AASd,IAAA,MAAM,UAAa,GAAA,SAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAO,EAAA;AAAA,MACvD,YAAc,EAAA,EAAA;AAAA,MACd,OAAA,EAAU,MAAM,UAAe,KAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,cAAc,wBAAyB,EAAA;AAE7C,IAAA,MAAM,EAAE,gBAAA,EAAkB,cAAe,EAAA,GAAI,mBAAoB,EAAA;AACjE,IAAM,MAAA,QAAA,GAAW,SAAS,MAAM,KAAA,CAAM,YAAY,WAAY,CAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAErF,IAAA,MAAM,mBAAmB,GAAwB,EAAA;AACjD,IAAA,eAAA,CAAgB,MAAM,gBAAiB,CAAA,KAAA,GAAQ,WAAY,CAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAEvF,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,KAAA;AAE9B,MAAA,UAAA,CAAW,MAAM;AAEf,QAAA,IAAI,KAAM,CAAA,SAAA;AACR,UAAA,cAAA,CAAe,OAAO,KAAM,EAAA;AAAA,SAC7B,CAAC,CAAA;AAAA,KACL,CAAA;AAED,IAAA,WAAA,CAAY,MAAM;AAChB,MAAA,WAAA,CAAY,UAAU,KAAQ,GAAA,IAAA;AAAA,KAC/B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListboxRoot.cjs","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: (event: InputEvent) => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","useCollection","useTypeahead","usePrimitiveElement","useKbd","useDirection","useFormControl","ref","useVModel","compare","createEventHook","nextTick","getFocusIntent","findValuesBetween","watch"],"mappings":"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"}
1
+ {"version":3,"file":"ListboxRoot.cjs","sources":["../../src/Listbox/ListboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { AcceptableValue, DataOrientation, Direction, FormFieldProps } from '@/shared/types'\nimport { usePrimitiveElement } from '@/Primitive'\nimport { getFocusIntent } from '@/RovingFocus/utils'\nimport { createContext, findValuesBetween, useDirection, useFormControl, useKbd, useTypeahead } from '@/shared'\nimport { Primitive } from '..'\n\ntype ListboxRootContext<T> = {\n modelValue: Ref<T | Array<T> | undefined>\n onValueChange: (val: T) => void\n multiple: Ref<boolean>\n orientation: Ref<DataOrientation>\n dir: Ref<Direction>\n disabled: Ref<boolean>\n highlightOnHover: Ref<boolean>\n highlightedElement: Ref<HTMLElement | null>\n isVirtual: Ref<boolean>\n virtualFocusHook: EventHook<Event | null | undefined>\n virtualKeydownHook: EventHook<KeyboardEvent>\n virtualHighlightHook: EventHook<any>\n by?: string | ((a: T, b: T) => boolean)\n firstValue?: Ref<T | undefined>\n selectionBehavior?: Ref<'toggle' | 'replace'>\n\n focusable: Ref<boolean>\n\n onLeave: (event: Event) => void\n onEnter: (event: Event) => void\n changeHighlight: (el: HTMLElement, scrollIntoView?: boolean) => void\n onKeydownNavigation: (event: KeyboardEvent) => void\n onKeydownEnter: (event: KeyboardEvent) => void\n onKeydownTypeAhead: (event: KeyboardEvent) => void\n onCompositionStart: () => void\n onCompositionEnd: () => void\n highlightFirstItem: () => void\n}\n\nexport const [injectListboxRootContext, provideListboxRootContext]\n = createContext<ListboxRootContext<AcceptableValue>>('ListboxRoot')\n\nexport interface ListboxRootProps<T = AcceptableValue> extends PrimitiveProps, FormFieldProps {\n /** The controlled value of the listbox. Can be binded with with `v-model`. */\n modelValue?: T | Array<T>\n /** The value of the listbox when initially rendered. Use when you do not need to control the state of the Listbox */\n defaultValue?: T | Array<T>\n /** Whether multiple options can be selected or not. */\n multiple?: boolean\n /** The orientation of the listbox. <br>Mainly so arrow navigation is done accordingly (left & right vs. up & down) */\n orientation?: DataOrientation\n /** The reading direction of the listbox when applicable. <br> If omitted, inherits globally from `ConfigProvider` or assumes LTR (left-to-right) reading mode. */\n dir?: Direction\n /** When `true`, prevents the user from interacting with listbox */\n disabled?: boolean\n /**\n * How multiple selection should behave in the collection.\n * @defaultValue 'toggle'\n */\n selectionBehavior?: 'toggle' | 'replace'\n /** When `true`, hover over item will trigger highlight */\n highlightOnHover?: boolean\n /** Use this to compare objects by a particular field, or pass your own comparison function for complete control over how objects are compared. */\n by?: string | ((a: T, b: T) => boolean)\n}\n\nexport type ListboxRootEmits<T = AcceptableValue> = {\n /** Event handler called when the value changes. */\n 'update:modelValue': [value: T]\n /** Event handler when highlighted element changes. */\n 'highlight': [payload: { ref: HTMLElement, value: T } | undefined]\n /** Event handler called when container is being focused. Can be prevented. */\n 'entryFocus': [event: CustomEvent]\n /** Event handler called when the mouse leave the container */\n 'leave': [event: Event]\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends AcceptableValue = AcceptableValue\">\nimport type { EventHook } from '@vueuse/core'\nimport type { Ref } from 'vue'\nimport { createEventHook, useVModel } from '@vueuse/core'\nimport { nextTick, ref, toRefs, watch } from 'vue'\nimport { useCollection } from '@/Collection'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { compare } from './utils'\n\nconst props = withDefaults(defineProps<ListboxRootProps>(), {\n selectionBehavior: 'toggle',\n orientation: 'vertical',\n})\nconst emits = defineEmits<ListboxRootEmits>()\n\ndefineSlots<{\n default?: (props: {\n /** Current active value */\n modelValue: typeof modelValue.value\n }) => any\n}>()\n\nconst { multiple, highlightOnHover, orientation, disabled, selectionBehavior, dir: propDir } = toRefs(props)\nconst { getItems } = useCollection<{ value: T }>({ isProvider: true })\nconst { handleTypeaheadSearch } = useTypeahead()\nconst { primitiveElement, currentElement } = usePrimitiveElement()\nconst kbd = useKbd()\nconst dir = useDirection(propDir)\n\nconst isFormControl = useFormControl(currentElement)\n\nconst firstValue = ref<T>()\nconst isUserAction = ref(false)\nconst focusable = ref(true)\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue ?? (multiple.value ? [] : undefined),\n passive: (props.modelValue === undefined) as false,\n deep: true,\n}) as Ref<T | T[] | undefined>\n\nfunction onValueChange(val: T) {\n isUserAction.value = true\n if (props.multiple) {\n const modelArray = Array.isArray(modelValue.value) ? [...modelValue.value] : []\n const index = modelArray.findIndex(i => compare(i, val, props.by))\n if (props.selectionBehavior === 'toggle') {\n index === -1 ? modelArray.push(val) : modelArray.splice(index, 1)\n modelValue.value = modelArray\n }\n else {\n modelValue.value = [val]\n firstValue.value = val\n }\n }\n else {\n if (props.selectionBehavior === 'toggle') {\n if (compare(modelValue.value, val, props.by))\n modelValue.value = undefined\n else\n modelValue.value = val\n }\n else {\n modelValue.value = val\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nconst highlightedElement = ref<HTMLElement | null>(null)\nconst previousElement = ref<HTMLElement | null>(null)\nconst isVirtual = ref(false)\nconst isComposing = ref(false)\nconst virtualFocusHook = createEventHook<Event | null | undefined>()\nconst virtualKeydownHook = createEventHook<KeyboardEvent>()\nconst virtualHighlightHook = createEventHook<T>()\n\nfunction getCollectionItem() {\n return getItems().map(i => i.ref).filter(i => i.dataset.disabled !== '')\n}\n\nfunction changeHighlight(el: HTMLElement, scrollIntoView = true) {\n if (!el)\n return\n\n highlightedElement.value = el\n if (focusable.value)\n highlightedElement.value.focus()\n if (scrollIntoView)\n highlightedElement.value.scrollIntoView({ block: 'nearest' })\n\n const highlightedItem = getItems().find(i => i.ref === el)\n emits('highlight', highlightedItem)\n}\n\nfunction highlightItem(value: T) {\n if (isVirtual.value) {\n virtualHighlightHook.trigger(value)\n }\n else {\n const item = getItems().find(i => compare(i.value, value, props.by))\n if (item) {\n highlightedElement.value = item.ref\n changeHighlight(item.ref)\n }\n }\n}\n\nfunction onKeydownEnter(event: KeyboardEvent) {\n if (highlightedElement.value && highlightedElement.value.isConnected) {\n event.preventDefault()\n event.stopPropagation()\n\n if (!isComposing.value) {\n highlightedElement.value.click()\n }\n }\n}\n\nfunction onKeydownTypeAhead(event: KeyboardEvent) {\n if (!focusable.value)\n return\n isUserAction.value = true\n if (isVirtual.value) {\n virtualKeydownHook.trigger(event)\n }\n else {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n\n if (isMetaKey && event.key === 'a' && multiple.value) {\n const collection = getItems()\n const values = collection.map(i => i.value)\n modelValue.value = [...values]\n event.preventDefault()\n changeHighlight(collection[collection.length - 1].ref)\n }\n else if (!isMetaKey) {\n const el = handleTypeaheadSearch(event.key, getItems())\n if (el)\n changeHighlight(el)\n }\n }\n setTimeout(() => {\n isUserAction.value = false\n }, 1)\n}\n\nfunction onCompositionStart() {\n isComposing.value = true\n}\nfunction onCompositionEnd() {\n requestAnimationFrame(() => {\n isComposing.value = false\n })\n}\n\nfunction highlightFirstItem() {\n nextTick(() => {\n const event = new KeyboardEvent('keydown', { key: 'PageUp' })\n onKeydownNavigation(event)\n })\n}\n\nfunction onLeave(event: Event) {\n const el = highlightedElement.value\n\n if ((el as Node)?.isConnected) {\n previousElement.value = el\n }\n\n highlightedElement.value = null\n emits('leave', event)\n}\n\nfunction onEnter(event: Event) {\n const entryFocusEvent = new CustomEvent('listbox.entryFocus', { bubbles: false, cancelable: true })\n event.currentTarget?.dispatchEvent(entryFocusEvent)\n emits('entryFocus', entryFocusEvent)\n\n if (entryFocusEvent.defaultPrevented)\n return\n\n if (previousElement.value) {\n changeHighlight(previousElement.value)\n }\n else {\n const el = getCollectionItem()?.[0]\n changeHighlight(el)\n }\n}\n\nfunction onKeydownNavigation(event: KeyboardEvent) {\n const intent = getFocusIntent(event, orientation.value, dir.value)\n if (!intent)\n return\n\n let collection = getCollectionItem()\n if (highlightedElement.value) {\n if (intent === 'last') {\n collection.reverse()\n }\n else if (intent === 'prev' || intent === 'next') {\n if (intent === 'prev')\n collection.reverse()\n\n const currentIndex = collection.indexOf(highlightedElement.value)\n collection = collection.slice(currentIndex + 1)\n }\n handleMultipleReplace(event, collection[0])\n }\n\n if (collection.length) {\n const index = !highlightedElement.value && intent === 'prev' ? collection.length - 1 : 0\n changeHighlight(collection[index])\n }\n\n if (isVirtual.value)\n return virtualKeydownHook.trigger(event)\n}\n\nfunction handleMultipleReplace(event: KeyboardEvent, targetEl: HTMLElement) {\n if (isVirtual.value || props.selectionBehavior !== 'replace' || !multiple.value || !Array.isArray(modelValue.value))\n return\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey\n if (isMetaKey && !event.shiftKey)\n return\n\n if (event.shiftKey) {\n const collection = getItems().filter(i => i.ref.dataset.disabled !== '')\n let lastValue = collection.find(i => i.ref === targetEl)?.value\n\n if (event.key === kbd.END)\n lastValue = collection[collection.length - 1].value\n else if (event.key === kbd.HOME)\n lastValue = collection[0].value\n\n if (!lastValue || !firstValue.value)\n return\n\n const values = findValuesBetween(collection.map(i => i.value), firstValue.value, lastValue)\n modelValue.value = values\n }\n}\n\nasync function highlightSelected(event?: Event) {\n await nextTick()\n if (isVirtual.value) {\n // Trigger on nextTick for Virtualizer to be mounted\n virtualFocusHook.trigger(event)\n }\n else {\n const collection = getCollectionItem()\n const item = collection.find(i => i.dataset.state === 'checked')\n if (item)\n changeHighlight(item)\n else if (collection.length)\n changeHighlight(collection[0])\n }\n}\n\n// watch for only programmatic changes\nwatch(modelValue, () => {\n if (!isUserAction.value) {\n nextTick(() => {\n highlightSelected()\n })\n }\n}, { immediate: true, deep: true })\n\ndefineExpose({\n highlightedElement,\n highlightItem,\n highlightFirstItem,\n highlightSelected,\n getItems,\n})\n\nprovideListboxRootContext({\n modelValue,\n // @ts-expect-error ignoring\n onValueChange,\n multiple,\n orientation,\n dir,\n disabled,\n highlightOnHover,\n highlightedElement,\n isVirtual,\n virtualFocusHook,\n virtualKeydownHook,\n virtualHighlightHook,\n by: props.by,\n firstValue,\n selectionBehavior,\n\n focusable,\n onLeave,\n onEnter,\n changeHighlight,\n onKeydownEnter,\n onKeydownNavigation,\n onKeydownTypeAhead,\n onCompositionStart,\n onCompositionEnd,\n highlightFirstItem,\n})\n</script>\n\n<template>\n <Primitive\n ref=\"primitiveElement\"\n :as=\"as\"\n :as-child=\"asChild\"\n :dir=\"dir\"\n :data-disabled=\"disabled ? '' : undefined\"\n @pointerleave=\"onLeave\"\n @focusout=\"async (event: FocusEvent) => {\n const target = (event.relatedTarget || event.target) as HTMLElement | null\n await nextTick()\n if (highlightedElement && currentElement && !currentElement.contains(target)) {\n onLeave(event)\n }\n }\"\n >\n <slot :model-value=\"modelValue\" />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name\"\n :name=\"name\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </Primitive>\n</template>\n"],"names":["createContext","toRefs","useCollection","useTypeahead","usePrimitiveElement","useKbd","useDirection","useFormControl","ref","useVModel","compare","createEventHook","nextTick","getFocusIntent","findValuesBetween","watch"],"mappings":"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"}