reka-ui 2.6.0 → 2.6.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 (171) hide show
  1. package/dist/Accordion/AccordionItem.cjs +3 -2
  2. package/dist/Accordion/AccordionItem.cjs.map +1 -1
  3. package/dist/Accordion/AccordionItem.js +3 -2
  4. package/dist/Accordion/AccordionItem.js.map +1 -1
  5. package/dist/Calendar/useCalendar.cjs.map +1 -1
  6. package/dist/Calendar/useCalendar.js.map +1 -1
  7. package/dist/Combobox/ComboboxCancel.cjs +1 -1
  8. package/dist/Combobox/ComboboxCancel.cjs.map +1 -1
  9. package/dist/Combobox/ComboboxCancel.js +1 -1
  10. package/dist/Combobox/ComboboxCancel.js.map +1 -1
  11. package/dist/Combobox/ComboboxContentImpl.cjs +3 -1
  12. package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
  13. package/dist/Combobox/ComboboxContentImpl.js +3 -1
  14. package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
  15. package/dist/Combobox/ComboboxInput.cjs +2 -2
  16. package/dist/Combobox/ComboboxInput.cjs.map +1 -1
  17. package/dist/Combobox/ComboboxInput.js +2 -2
  18. package/dist/Combobox/ComboboxInput.js.map +1 -1
  19. package/dist/Combobox/ComboboxRoot.cjs +7 -5
  20. package/dist/Combobox/ComboboxRoot.cjs.map +1 -1
  21. package/dist/Combobox/ComboboxRoot.js +7 -5
  22. package/dist/Combobox/ComboboxRoot.js.map +1 -1
  23. package/dist/Combobox/ComboboxVirtualizer.cjs +1 -1
  24. package/dist/Combobox/ComboboxVirtualizer.js +1 -1
  25. package/dist/DateField/DateFieldRoot.cjs +6 -1
  26. package/dist/DateField/DateFieldRoot.cjs.map +1 -1
  27. package/dist/DateField/DateFieldRoot.js +6 -1
  28. package/dist/DateField/DateFieldRoot.js.map +1 -1
  29. package/dist/DatePicker/DatePickerRoot.cjs +0 -8
  30. package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
  31. package/dist/DatePicker/DatePickerRoot.js +0 -8
  32. package/dist/DatePicker/DatePickerRoot.js.map +1 -1
  33. package/dist/DateRangeField/DateRangeFieldRoot.cjs +2 -1
  34. package/dist/DateRangeField/DateRangeFieldRoot.cjs.map +1 -1
  35. package/dist/DateRangeField/DateRangeFieldRoot.js +2 -1
  36. package/dist/DateRangeField/DateRangeFieldRoot.js.map +1 -1
  37. package/dist/DateRangePicker/DateRangePickerRoot.cjs +0 -8
  38. package/dist/DateRangePicker/DateRangePickerRoot.cjs.map +1 -1
  39. package/dist/DateRangePicker/DateRangePickerRoot.js +0 -8
  40. package/dist/DateRangePicker/DateRangePickerRoot.js.map +1 -1
  41. package/dist/DismissableLayer/DismissableLayer.cjs +4 -3
  42. package/dist/DismissableLayer/DismissableLayer.cjs.map +1 -1
  43. package/dist/DismissableLayer/DismissableLayer.js +4 -3
  44. package/dist/DismissableLayer/DismissableLayer.js.map +1 -1
  45. package/dist/Editable/EditableRoot.cjs +1 -1
  46. package/dist/Editable/EditableRoot.js +1 -1
  47. package/dist/Listbox/ListboxVirtualizer.cjs +3 -2
  48. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  49. package/dist/Listbox/ListboxVirtualizer.js +3 -2
  50. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  51. package/dist/NavigationMenu/NavigationMenuContentImpl.cjs.map +1 -1
  52. package/dist/NavigationMenu/NavigationMenuContentImpl.js.map +1 -1
  53. package/dist/PinInput/PinInputInput.cjs +3 -0
  54. package/dist/PinInput/PinInputInput.cjs.map +1 -1
  55. package/dist/PinInput/PinInputInput.js +3 -0
  56. package/dist/PinInput/PinInputInput.js.map +1 -1
  57. package/dist/PinInput/PinInputRoot.cjs +1 -1
  58. package/dist/PinInput/PinInputRoot.js +1 -1
  59. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs +3 -3
  60. package/dist/RangeCalendar/RangeCalendarCellTrigger.cjs.map +1 -1
  61. package/dist/RangeCalendar/RangeCalendarCellTrigger.js +3 -3
  62. package/dist/RangeCalendar/RangeCalendarCellTrigger.js.map +1 -1
  63. package/dist/RangeCalendar/RangeCalendarRoot.cjs +10 -8
  64. package/dist/RangeCalendar/RangeCalendarRoot.cjs.map +1 -1
  65. package/dist/RangeCalendar/RangeCalendarRoot.js +10 -8
  66. package/dist/RangeCalendar/RangeCalendarRoot.js.map +1 -1
  67. package/dist/RangeCalendar/useRangeCalendar.cjs +1 -1
  68. package/dist/RangeCalendar/useRangeCalendar.cjs.map +1 -1
  69. package/dist/RangeCalendar/useRangeCalendar.js +1 -1
  70. package/dist/RangeCalendar/useRangeCalendar.js.map +1 -1
  71. package/dist/ScrollArea/ScrollAreaScrollbarImpl.cjs +3 -2
  72. package/dist/ScrollArea/ScrollAreaScrollbarImpl.cjs.map +1 -1
  73. package/dist/ScrollArea/ScrollAreaScrollbarImpl.js +3 -2
  74. package/dist/ScrollArea/ScrollAreaScrollbarImpl.js.map +1 -1
  75. package/dist/Select/SelectArrow.cjs +1 -3
  76. package/dist/Select/SelectArrow.cjs.map +1 -1
  77. package/dist/Select/SelectArrow.js +1 -3
  78. package/dist/Select/SelectArrow.js.map +1 -1
  79. package/dist/Select/SelectContent.cjs +4 -0
  80. package/dist/Select/SelectContent.cjs.map +1 -1
  81. package/dist/Select/SelectContent.js +4 -0
  82. package/dist/Select/SelectContent.js.map +1 -1
  83. package/dist/Select/SelectContentImpl.cjs +7 -2
  84. package/dist/Select/SelectContentImpl.cjs.map +1 -1
  85. package/dist/Select/SelectContentImpl.js +7 -2
  86. package/dist/Select/SelectContentImpl.js.map +1 -1
  87. package/dist/Select/SelectItem.cjs.map +1 -1
  88. package/dist/Select/SelectItem.js.map +1 -1
  89. package/dist/Splitter/SplitterGroup.cjs.map +1 -1
  90. package/dist/Splitter/SplitterGroup.js.map +1 -1
  91. package/dist/Tabs/TabsIndicator.cjs +18 -12
  92. package/dist/Tabs/TabsIndicator.cjs.map +1 -1
  93. package/dist/Tabs/TabsIndicator.js +19 -13
  94. package/dist/Tabs/TabsIndicator.js.map +1 -1
  95. package/dist/Tooltip/TooltipContentImpl.cjs +2 -13
  96. package/dist/Tooltip/TooltipContentImpl.cjs.map +1 -1
  97. package/dist/Tooltip/TooltipContentImpl.js +3 -14
  98. package/dist/Tooltip/TooltipContentImpl.js.map +1 -1
  99. package/dist/Tree/TreeRoot.cjs +1 -1
  100. package/dist/Tree/TreeRoot.cjs.map +1 -1
  101. package/dist/Tree/TreeRoot.js +1 -1
  102. package/dist/Tree/TreeRoot.js.map +1 -1
  103. package/dist/Tree/TreeVirtualizer.cjs +3 -2
  104. package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
  105. package/dist/Tree/TreeVirtualizer.js +3 -2
  106. package/dist/Tree/TreeVirtualizer.js.map +1 -1
  107. package/dist/date/useDateField.cjs +5 -6
  108. package/dist/date/useDateField.cjs.map +1 -1
  109. package/dist/date/useDateField.js +5 -6
  110. package/dist/date/useDateField.js.map +1 -1
  111. package/dist/index.d.cts +824 -819
  112. package/dist/index.d.cts.map +1 -1
  113. package/dist/index.d.ts +813 -808
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/shared/useFormControl.cjs +1 -1
  116. package/dist/shared/useFormControl.cjs.map +1 -1
  117. package/dist/shared/useFormControl.js +3 -3
  118. package/dist/shared/useFormControl.js.map +1 -1
  119. package/dist/shared/useForwardExpose.cjs +10 -1
  120. package/dist/shared/useForwardExpose.cjs.map +1 -1
  121. package/dist/shared/useForwardExpose.js +10 -1
  122. package/dist/shared/useForwardExpose.js.map +1 -1
  123. package/dist/shared/useGraceArea.cjs +3 -0
  124. package/dist/shared/useGraceArea.cjs.map +1 -1
  125. package/dist/shared/useGraceArea.js +4 -1
  126. package/dist/shared/useGraceArea.js.map +1 -1
  127. package/package.json +3 -3
  128. package/src/Accordion/AccordionItem.vue +7 -2
  129. package/src/Calendar/useCalendar.ts +3 -3
  130. package/src/Combobox/ComboboxCancel.vue +4 -3
  131. package/src/Combobox/ComboboxContentImpl.vue +3 -2
  132. package/src/Combobox/ComboboxInput.vue +3 -3
  133. package/src/Combobox/ComboboxRoot.vue +5 -6
  134. package/src/DateField/DateFieldRoot.vue +3 -0
  135. package/src/DatePicker/DatePickerRoot.vue +1 -1
  136. package/src/DateRangeField/DateRangeFieldRoot.vue +1 -0
  137. package/src/DateRangePicker/DateRangePickerRoot.vue +1 -1
  138. package/src/DismissableLayer/DismissableLayer.vue +5 -4
  139. package/src/Editable/EditableRoot.vue +1 -1
  140. package/src/Listbox/ListboxVirtualizer.vue +5 -2
  141. package/src/NavigationMenu/NavigationMenuContentImpl.vue +1 -1
  142. package/src/NumberField/NumberFieldRoot.vue +1 -1
  143. package/src/PinInput/PinInputInput.vue +6 -0
  144. package/src/PinInput/PinInputRoot.vue +3 -3
  145. package/src/Presence/usePresence.ts +1 -1
  146. package/src/Primitive/Primitive.ts +19 -19
  147. package/src/RangeCalendar/RangeCalendarCellTrigger.vue +8 -2
  148. package/src/RangeCalendar/RangeCalendarRoot.vue +10 -27
  149. package/src/RangeCalendar/useRangeCalendar.ts +1 -1
  150. package/src/ScrollArea/ScrollAreaScrollbarImpl.vue +4 -2
  151. package/src/ScrollArea/ScrollAreaScrollbarVisible.vue +1 -1
  152. package/src/Select/SelectArrow.vue +1 -3
  153. package/src/Select/SelectContentImpl.vue +6 -5
  154. package/src/Select/SelectItem.vue +1 -1
  155. package/src/Splitter/SplitterGroup.vue +7 -7
  156. package/src/Splitter/SplitterPanel.vue +1 -1
  157. package/src/Splitter/utils/registry.ts +1 -1
  158. package/src/Tabs/TabsIndicator.vue +18 -12
  159. package/src/Tooltip/TooltipContentImpl.vue +3 -20
  160. package/src/Tooltip/TooltipTrigger.vue +4 -4
  161. package/src/Tree/TreeRoot.vue +1 -1
  162. package/src/Tree/TreeVirtualizer.vue +5 -2
  163. package/src/index.ts +1 -0
  164. package/src/shared/date/useDateField.ts +12 -7
  165. package/src/shared/index.ts +1 -1
  166. package/src/shared/useFormControl.ts +2 -2
  167. package/src/shared/useForwardExpose.ts +17 -1
  168. package/src/shared/useGraceArea.ts +8 -2
  169. package/src/shared/useId.ts +1 -1
  170. package/src/shared/useStateMachine.ts +1 -1
  171. package/src/shared/withDefault.ts +1 -1
@@ -109,11 +109,13 @@ function handleSizeChange() {
109
109
  viewport: rootContext.viewport.value?.offsetHeight ?? 0,
110
110
  scrollbar: {
111
111
  size: scrollbar.value?.clientHeight ?? 0,
112
- paddingStart: toInt(getComputedStyle(scrollbar.value!).paddingLeft),
113
- paddingEnd: toInt(getComputedStyle(scrollbar.value!).paddingRight),
112
+ paddingStart: toInt(getComputedStyle(scrollbar.value!).paddingTop),
113
+ paddingEnd: toInt(getComputedStyle(scrollbar.value!).paddingBottom),
114
114
  },
115
115
  })
116
116
  }
117
+
118
+ scrollbarVisibleContext.onThumbPositionChange()
117
119
  }
118
120
 
119
121
  useResizeObserver(scrollbar, handleSizeChange)
@@ -9,7 +9,7 @@ export interface ScrollAreaScrollbarVisibleContext {
9
9
  handleWheelScroll: (event: WheelEvent, payload: number) => void
10
10
  handleThumbDown: (
11
11
  event: MouseEvent,
12
- payload: { x: number, y: number }
12
+ payload: { x: number, y: number },
13
13
  ) => void
14
14
  handleThumbUp: (event: MouseEvent) => void
15
15
  handleSizeChange: (payload: Sizes) => void
@@ -7,20 +7,18 @@ export interface SelectArrowProps extends PopperArrowProps {}
7
7
  <script setup lang="ts">
8
8
  import { PopperArrow } from '@/Popper'
9
9
  import { injectSelectContentContext, SelectContentDefaultContextValue } from './SelectContentImpl.vue'
10
- import { injectSelectRootContext } from './SelectRoot.vue'
11
10
 
12
11
  const props = withDefaults(defineProps<SelectArrowProps>(), {
13
12
  width: 10,
14
13
  height: 5,
15
14
  as: 'svg',
16
15
  })
17
- const rootContext = injectSelectRootContext()
18
16
  const contentContext = injectSelectContentContext(SelectContentDefaultContextValue)
19
17
  </script>
20
18
 
21
19
  <template>
22
20
  <PopperArrow
23
- v-if="rootContext.open.value && contentContext.position === 'popper'"
21
+ v-if="contentContext.position === 'popper'"
24
22
  v-bind="props"
25
23
  >
26
24
  <slot />
@@ -3,7 +3,7 @@ import type {
3
3
  ComponentPublicInstance,
4
4
  Ref,
5
5
  } from 'vue'
6
- import type { PointerDownOutsideEvent } from '@/DismissableLayer'
6
+ import type { DismissableLayerProps, PointerDownOutsideEvent } from '@/DismissableLayer'
7
7
  import type { PopperContentProps } from '@/Popper'
8
8
  import type { AcceptableValue } from '@/shared/types'
9
9
  import { useCollection } from '@/Collection'
@@ -24,14 +24,14 @@ export interface SelectContentContext {
24
24
  itemRefCallback: (
25
25
  node: HTMLElement | undefined,
26
26
  value: AcceptableValue,
27
- disabled: boolean
27
+ disabled: boolean,
28
28
  ) => void
29
29
  selectedItem?: Ref<HTMLElement | undefined>
30
30
  onItemLeave?: () => void
31
31
  itemTextRefCallback: (
32
32
  node: HTMLElement | undefined,
33
33
  value: AcceptableValue,
34
- disabled: boolean
34
+ disabled: boolean,
35
35
  ) => void
36
36
  focusSelectedItem?: () => void
37
37
  selectedItemText?: Ref<HTMLElement | undefined>
@@ -60,7 +60,7 @@ export type SelectContentImplEmits = {
60
60
  pointerDownOutside: [event: PointerDownOutsideEvent]
61
61
  }
62
62
 
63
- export interface SelectContentImplProps extends PopperContentProps {
63
+ export interface SelectContentImplProps extends PopperContentProps, DismissableLayerProps {
64
64
  /**
65
65
  * The positioning mode to use
66
66
  *
@@ -99,6 +99,7 @@ const props = withDefaults(defineProps<SelectContentImplProps>(), {
99
99
  align: 'start',
100
100
  position: 'item-aligned',
101
101
  bodyLock: true,
102
+ disableOutsidePointerEvents: true,
102
103
  })
103
104
  const emits = defineEmits<SelectContentImplEmits>()
104
105
 
@@ -285,7 +286,7 @@ provideSelectContentContext({
285
286
  >
286
287
  <DismissableLayer
287
288
  as-child
288
- disable-outside-pointer-events
289
+ :disable-outside-pointer-events="disableOutsidePointerEvents"
289
290
  @focus-outside.prevent
290
291
  @dismiss="rootContext.onOpenChange(false)"
291
292
  @escape-key-down="emits('escapeKeyDown', $event)"
@@ -14,7 +14,7 @@ interface SelectItemContext<T = AcceptableValue> {
14
14
  }
15
15
 
16
16
  export const [injectSelectItemContext, provideSelectItemContext]
17
- = createContext<SelectItemContext>('SelectItem')
17
+ = createContext<SelectItemContext>('SelectItem')
18
18
 
19
19
  export type SelectEvent<T> = CustomEvent<{ originalEvent: PointerEvent | KeyboardEvent, value?: T }>
20
20
 
@@ -532,8 +532,8 @@ function collapsePanel(panelData: PanelData) {
532
532
  panelSizeBeforeCollapseRef.value.set(panelData.id, panelSize)
533
533
 
534
534
  const isLastPanel
535
- = findPanelDataIndex(panelDataArray, panelData)
536
- === panelDataArray.length - 1
535
+ = findPanelDataIndex(panelDataArray, panelData)
536
+ === panelDataArray.length - 1
537
537
  const delta = isLastPanel
538
538
  ? panelSize - collapsedSize
539
539
  : collapsedSize - panelSize
@@ -585,13 +585,13 @@ function expandPanel(panelData: PanelData) {
585
585
  )
586
586
 
587
587
  const baseSize
588
- = prevPanelSize != null && prevPanelSize >= minSize
589
- ? prevPanelSize
590
- : minSize
588
+ = prevPanelSize != null && prevPanelSize >= minSize
589
+ ? prevPanelSize
590
+ : minSize
591
591
 
592
592
  const isLastPanel
593
- = findPanelDataIndex(panelDataArray, panelData)
594
- === panelDataArray.length - 1
593
+ = findPanelDataIndex(panelDataArray, panelData)
594
+ === panelDataArray.length - 1
595
595
  const delta = isLastPanel ? panelSize - baseSize : baseSize - panelSize
596
596
 
597
597
  const nextLayout = adjustLayoutByDelta({
@@ -33,7 +33,7 @@ export type PanelOnCollapse = () => void
33
33
  export type PanelOnExpand = () => void
34
34
  export type PanelOnResize = (
35
35
  size: number,
36
- prevSize: number | undefined
36
+ prevSize: number | undefined,
37
37
  ) => void
38
38
 
39
39
  export type PanelCallbacks = {
@@ -9,7 +9,7 @@ export type ResizeHandlerAction = 'down' | 'move' | 'up'
9
9
  export type SetResizeHandlerState = (
10
10
  action: ResizeHandlerAction,
11
11
  isActive: boolean,
12
- event: ResizeEvent
12
+ event: ResizeEvent,
13
13
  ) => void
14
14
 
15
15
  export type PointerHitAreaMargins = {
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { PrimitiveProps } from '@/Primitive'
3
- import { nextTick, ref, watch } from 'vue'
3
+ import { computed, ref, watch, watchPostEffect } from 'vue'
4
4
  import { useForwardExpose } from '@/shared'
5
5
  import { injectTabsRootContext } from './TabsRoot.vue'
6
6
 
@@ -13,41 +13,47 @@ import { Primitive } from '@/Primitive'
13
13
 
14
14
  const props = defineProps<TabsIndicatorProps>()
15
15
  const context = injectTabsRootContext()
16
+ defineExpose({
17
+ updateIndicatorStyle,
18
+ })
16
19
  useForwardExpose()
17
20
 
18
21
  interface IndicatorStyle {
19
22
  size: number | null
20
23
  position: number | null
21
24
  }
22
- const activeTab = ref<HTMLElement | null>()
23
25
  const indicatorStyle = ref<IndicatorStyle>({
24
26
  size: null,
25
27
  position: null,
26
28
  })
29
+ const tabs = ref<Array<HTMLElement>>([])
27
30
 
28
- watch(() => [context.modelValue.value, context?.dir.value], async () => {
29
- await nextTick()
31
+ watch(() => [context.modelValue.value, context?.dir.value], () => {
30
32
  updateIndicatorStyle()
31
- }, { immediate: true })
33
+ }, { immediate: true, flush: 'post' })
34
+
35
+ watchPostEffect(() => {
36
+ tabs.value = Array.from(context.tabsList.value?.querySelectorAll<HTMLElement>('[role="tab"]') || [])
37
+ })
32
38
 
33
- useResizeObserver([context.tabsList, activeTab], updateIndicatorStyle)
39
+ useResizeObserver(computed(() => [context.tabsList.value, ...tabs.value]), updateIndicatorStyle)
34
40
 
35
41
  function updateIndicatorStyle() {
36
- activeTab.value = context.tabsList.value?.querySelector<HTMLButtonElement>('[role="tab"][data-state="active"]')
42
+ const activeTab = context.tabsList.value?.querySelector<HTMLButtonElement>('[role="tab"][data-state="active"]')
37
43
 
38
- if (!activeTab.value)
44
+ if (!activeTab)
39
45
  return
40
46
 
41
47
  if (context.orientation.value === 'horizontal') {
42
48
  indicatorStyle.value = {
43
- size: activeTab.value.offsetWidth,
44
- position: activeTab.value.offsetLeft,
49
+ size: activeTab.offsetWidth,
50
+ position: activeTab.offsetLeft,
45
51
  }
46
52
  }
47
53
  else {
48
54
  indicatorStyle.value = {
49
- size: activeTab.value.offsetHeight,
50
- position: activeTab.value.offsetTop,
55
+ size: activeTab.offsetHeight,
56
+ position: activeTab.offsetTop,
51
57
  }
52
58
  }
53
59
  }
@@ -1,5 +1,4 @@
1
1
  <script lang="ts">
2
- import type { VNode } from 'vue'
3
2
  import type { PopperContentProps } from '@/Popper'
4
3
  import type { PrimitiveProps } from '@/Primitive'
5
4
  import { useForwardExpose } from '@/shared'
@@ -42,7 +41,7 @@ export interface TooltipContentImplProps
42
41
 
43
42
  <script setup lang="ts">
44
43
  import { useEventListener } from '@vueuse/core'
45
- import { Comment, computed, onMounted, useSlots } from 'vue'
44
+ import { computed, onMounted } from 'vue'
46
45
  import { DismissableLayer } from '@/DismissableLayer'
47
46
  import { PopperContent } from '@/Popper'
48
47
  import { VisuallyHidden } from '@/VisuallyHidden'
@@ -64,24 +63,8 @@ const emits = defineEmits<TooltipContentImplEmits>()
64
63
 
65
64
  const rootContext = injectTooltipRootContext()
66
65
 
67
- const { forwardRef } = useForwardExpose()
68
- const slot = useSlots()
69
- const defaultSlot = computed(() => slot.default?.({}))
70
- const ariaLabel = computed(() => {
71
- if (props.ariaLabel)
72
- return props.ariaLabel
73
- let content = ''
74
-
75
- function recursiveTextSearch(node: VNode) {
76
- if (typeof node.children === 'string' && node.type !== Comment)
77
- content += node.children
78
- else if (Array.isArray(node.children))
79
- node.children.forEach(child => recursiveTextSearch(child as VNode))
80
- }
81
-
82
- defaultSlot.value?.forEach((node: VNode) => recursiveTextSearch(node))
83
- return content
84
- })
66
+ const { forwardRef, currentElement } = useForwardExpose()
67
+ const ariaLabel = computed(() => props.ariaLabel || currentElement.value?.textContent)
85
68
 
86
69
  const popperContentProps = computed(() => {
87
70
  const { ariaLabel: _, ...restProps } = props
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { useForwardExpose, useId } from '@/shared'
3
3
 
4
- export type TooltipTriggerDataState =
5
- | 'closed'
6
- | 'delayed-open'
7
- | 'instant-open'
4
+ export type TooltipTriggerDataState
5
+ = | 'closed'
6
+ | 'delayed-open'
7
+ | 'instant-open'
8
8
 
9
9
  export interface TooltipTriggerProps extends PopperAnchorProps {}
10
10
  </script>
@@ -254,7 +254,7 @@ provideTreeRootContext({
254
254
  if (expanded.value.includes(key))
255
255
  expanded.value = expanded.value.filter(val => val !== key)
256
256
  else
257
- expanded.value.push(key)
257
+ expanded.value = [...expanded.value, key]
258
258
  },
259
259
  getKey: props.getKey,
260
260
  getChildren: props.getChildren,
@@ -3,7 +3,7 @@ export interface TreeVirtualizerProps {
3
3
  /** Number of items rendered outside the visible area */
4
4
  overscan?: number
5
5
  /** Estimated size (in px) of each item */
6
- estimateSize?: number
6
+ estimateSize?: number | ((index: number) => number)
7
7
  /** Text content for each item to achieve type-ahead feature */
8
8
  textContent?: (item: Record<string, any>) => string
9
9
  }
@@ -79,7 +79,10 @@ const virtualizer = useVirtualizer(
79
79
  getItemKey(index) {
80
80
  return index + rootContext.getKey(rootContext.expandedItems.value[index].value)
81
81
  },
82
- estimateSize() {
82
+ estimateSize(index) {
83
+ if (typeof props.estimateSize === 'function')
84
+ return props.estimateSize(index)
85
+
83
86
  return props.estimateSize ?? 28
84
87
  },
85
88
  getScrollElement() { return parentEl.value },
package/src/index.ts CHANGED
@@ -41,6 +41,7 @@ export {
41
41
  type DateRange,
42
42
  type DateValue,
43
43
  type Formatter,
44
+ type SegmentPart,
44
45
  useBodyScrollLock,
45
46
  useDateFormatter,
46
47
  useDirection,
@@ -46,7 +46,15 @@ function commonSegmentAttrs(props: SegmentAttrProps) {
46
46
  function daySegmentAttrs(props: SegmentAttrProps) {
47
47
  const { segmentValues, placeholder } = props
48
48
  const isEmpty = segmentValues.day === null
49
- const date = segmentValues.day ? placeholder.set({ day: segmentValues.day }) : placeholder
49
+
50
+ // Include month from segmentValues to ensure correct max days calculation
51
+ const dateFields: { day?: number, month?: number } = {}
52
+ if (segmentValues.day)
53
+ dateFields.day = segmentValues.day
54
+ if (segmentValues.month)
55
+ dateFields.month = segmentValues.month
56
+
57
+ const date = Object.keys(dateFields).length > 0 ? placeholder.set(dateFields) : placeholder
50
58
 
51
59
  const valueNow = date.day
52
60
  const valueMin = 1
@@ -864,12 +872,9 @@ export function useDateField(props: UseDateFieldProps) {
864
872
  if (Object.values(props.segmentValues.value).every(item => item !== null)) {
865
873
  const updateObject = { ...props.segmentValues.value as Record<AnyExceptLiteral, number> }
866
874
 
867
- let dateRef = props.placeholder.value.copy()
868
-
869
- Object.keys(updateObject).forEach((part) => {
870
- const value = updateObject[part as AnyExceptLiteral]
871
- dateRef = dateRef.set({ [part]: value })
872
- })
875
+ // Set all date fields at once to avoid order-dependent constraints
876
+ // (e.g., setting day: 31 before month: 3 would incorrectly constrain the day)
877
+ const dateRef = props.placeholder.value.set(updateObject)
873
878
 
874
879
  props.modelValue.value = dateRef.copy()
875
880
  }
@@ -2,7 +2,7 @@ export * from './arrays'
2
2
  export * from './browser'
3
3
  export * from './clamp'
4
4
  export { createContext } from './createContext'
5
- export { type DateRange, type DateStep, type DateValue } from './date'
5
+ export { type DateRange, type DateStep, type DateValue, type SegmentPart } from './date'
6
6
  export { getActiveElement } from './getActiveElement'
7
7
  export { handleAndDispatchCustomEvent } from './handleAndDispatchCustomEvent'
8
8
  export { isValidVNodeElement } from './isValidVNodeElement'
@@ -1,6 +1,6 @@
1
1
  import type { MaybeElementRef } from '@vueuse/core'
2
- import { toValue, unrefElement } from '@vueuse/core'
3
- import { computed } from 'vue'
2
+ import { unrefElement } from '@vueuse/core'
3
+ import { computed, toValue } from 'vue'
4
4
 
5
5
  export function useFormControl(el: MaybeElementRef) {
6
6
  // We set this to true by default so that events bubble to forms without JS (SSR)
@@ -59,7 +59,23 @@ export function useForwardExpose<T extends ComponentPublicInstance>() {
59
59
  get: () => (ref instanceof Element ? ref : ref.$el),
60
60
  })
61
61
 
62
- instance.exposed = ret
62
+ // ref not is Element
63
+ // and `useForwardExpose.test.ts > useForwardRef > should forward plain DOM element ref - 2` Passing in `$el`
64
+ if (!(ref instanceof Element) && !Object.hasOwn(ref, '$el')) {
65
+ // Retrieves the `exposed` data that has not been unwrapped by `vue` from `$.exposed`.
66
+ const childExposed = ref.$.exposed
67
+ const merged = Object.assign({}, ret)
68
+
69
+ for (const key in childExposed) {
70
+ Object.defineProperty(merged, key, {
71
+ enumerable: true,
72
+ configurable: true,
73
+ get: () => childExposed[key],
74
+ })
75
+ }
76
+
77
+ instance.exposed = merged
78
+ }
63
79
  }
64
80
 
65
81
  return { forwardRef, currentRef, currentElement }
@@ -1,11 +1,17 @@
1
1
  import type { Ref } from 'vue'
2
2
  import type { Side } from '@/Popper/utils'
3
- import { createEventHook, refAutoReset } from '@vueuse/shared'
3
+ import { createEventHook, refAutoReset, tryOnScopeDispose } from '@vueuse/shared'
4
4
  import { ref, watchEffect } from 'vue'
5
5
 
6
6
  export function useGraceArea(triggerElement: Ref<HTMLElement | undefined>, containerElement: Ref<HTMLElement | undefined>) {
7
7
  // Reset the inTransit state if idle/scrolled.
8
8
  const isPointerInTransit = refAutoReset(false, 300)
9
+ // `refAutoReset` will clear timeout-based resets on scope dispose (e.g., component unmount),
10
+ // thus leaving the state as-is without resetting it.
11
+ // So we need to manually reset it in such cases.
12
+ tryOnScopeDispose(() => {
13
+ isPointerInTransit.value = false
14
+ })
9
15
 
10
16
  const pointerGraceArea = ref<Polygon | null>(null)
11
17
  const pointerExit = createEventHook<void>()
@@ -74,7 +80,7 @@ export function useGraceArea(triggerElement: Ref<HTMLElement | undefined>, conta
74
80
  }
75
81
 
76
82
  interface Point { x: number, y: number }
77
- type Polygon = Point[]
83
+ type Polygon = Point[]
78
84
 
79
85
  function getExitSideFromRect(point: Point, rect: DOMRect): Side {
80
86
  const top = Math.abs(rect.top - point.y)
@@ -21,7 +21,7 @@ export function useId(deterministicId?: string | null | undefined, prefix = 'rek
21
21
  }
22
22
 
23
23
  const configProviderContext = injectConfigProviderContext({ useId: undefined })
24
-
24
+
25
25
  if (configProviderContext.useId) {
26
26
  return `${prefix}-${configProviderContext.useId()}`
27
27
  }
@@ -9,7 +9,7 @@ type MachineEvent<T> = keyof UnionToIntersection<T[keyof T]>
9
9
 
10
10
  // 🤯 https://fettblog.eu/typescript-union-to-intersection/
11
11
  type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (
12
- x: infer R
12
+ x: infer R,
13
13
  ) => any
14
14
  ? R
15
15
  : never
@@ -41,7 +41,7 @@ export function withDefault<
41
41
  P extends ComponentProps<C> = ComponentProps<C>,
42
42
  >(
43
43
  originalComponent: T,
44
- options?: MountingOptions<P>
44
+ options?: MountingOptions<P>,
45
45
  ): T
46
46
 
47
47
  export function withDefault<T extends ComponentOptionsBase<{}, {}, {}, any, any, any, any, any>>(WrappedComponent: T, options?: MountingOptions<any>) {