reka-ui 2.9.0 → 2.9.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 (94) hide show
  1. package/dist/Calendar/CalendarGrid.cjs +1 -1
  2. package/dist/Calendar/CalendarGrid.js +1 -1
  3. package/dist/Combobox/ComboboxInput.cjs +10 -1
  4. package/dist/Combobox/ComboboxInput.cjs.map +1 -1
  5. package/dist/Combobox/ComboboxInput.js +10 -1
  6. package/dist/Combobox/ComboboxInput.js.map +1 -1
  7. package/dist/DismissableLayer/utils.cjs +1 -0
  8. package/dist/DismissableLayer/utils.cjs.map +1 -1
  9. package/dist/DismissableLayer/utils.js +1 -0
  10. package/dist/DismissableLayer/utils.js.map +1 -1
  11. package/dist/Menu/MenuGroup.cjs +13 -2
  12. package/dist/Menu/MenuGroup.cjs.map +1 -1
  13. package/dist/Menu/MenuGroup.js +8 -3
  14. package/dist/Menu/MenuGroup.js.map +1 -1
  15. package/dist/Menu/MenuItemImpl.cjs +1 -2
  16. package/dist/Menu/MenuItemImpl.cjs.map +1 -1
  17. package/dist/Menu/MenuItemImpl.js +1 -2
  18. package/dist/Menu/MenuItemImpl.js.map +1 -1
  19. package/dist/Menu/MenuLabel.cjs +4 -2
  20. package/dist/Menu/MenuLabel.cjs.map +1 -1
  21. package/dist/Menu/MenuLabel.js +5 -3
  22. package/dist/Menu/MenuLabel.js.map +1 -1
  23. package/dist/MonthPicker/MonthPickerGrid.cjs +1 -1
  24. package/dist/MonthPicker/MonthPickerGrid.js +1 -1
  25. package/dist/MonthRangePicker/MonthRangePickerGrid.cjs +1 -1
  26. package/dist/MonthRangePicker/MonthRangePickerGrid.js +1 -1
  27. package/dist/RangeCalendar/RangeCalendarGrid.cjs +1 -1
  28. package/dist/RangeCalendar/RangeCalendarGrid.js +1 -1
  29. package/dist/Splitter/SplitterGroup.cjs +30 -13
  30. package/dist/Splitter/SplitterGroup.cjs.map +1 -1
  31. package/dist/Splitter/SplitterGroup.js +30 -13
  32. package/dist/Splitter/SplitterGroup.js.map +1 -1
  33. package/dist/Toast/FocusProxy.cjs +0 -1
  34. package/dist/Toast/FocusProxy.cjs.map +1 -1
  35. package/dist/Toast/FocusProxy.js +0 -1
  36. package/dist/Toast/FocusProxy.js.map +1 -1
  37. package/dist/Toast/ToastRootImpl.cjs +1 -5
  38. package/dist/Toast/ToastRootImpl.cjs.map +1 -1
  39. package/dist/Toast/ToastRootImpl.js +1 -5
  40. package/dist/Toast/ToastRootImpl.js.map +1 -1
  41. package/dist/YearPicker/YearPickerGrid.cjs +1 -1
  42. package/dist/YearPicker/YearPickerGrid.js +1 -1
  43. package/dist/YearRangePicker/YearRangePickerGrid.cjs +1 -1
  44. package/dist/YearRangePicker/YearRangePickerGrid.js +1 -1
  45. package/dist/constant.d.cts.map +1 -1
  46. package/dist/date/useDateField.cjs +1 -0
  47. package/dist/date/useDateField.cjs.map +1 -1
  48. package/dist/date/useDateField.js +1 -0
  49. package/dist/date/useDateField.js.map +1 -1
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/index3.d.cts +1021 -1020
  53. package/dist/index3.d.cts.map +1 -1
  54. package/dist/index3.d.ts +1047 -1046
  55. package/dist/index3.d.ts.map +1 -1
  56. package/dist/internal.d.cts +2 -4
  57. package/dist/internal.d.ts +2 -4
  58. package/dist/internal.d.ts.map +1 -1
  59. package/dist/shared/useBodyScrollLock.cjs +1 -0
  60. package/dist/shared/useBodyScrollLock.cjs.map +1 -1
  61. package/dist/shared/useBodyScrollLock.js +1 -0
  62. package/dist/shared/useBodyScrollLock.js.map +1 -1
  63. package/dist/shared/useHideOthers.cjs +5 -1
  64. package/dist/shared/useHideOthers.cjs.map +1 -1
  65. package/dist/shared/useHideOthers.js +5 -1
  66. package/dist/shared/useHideOthers.js.map +1 -1
  67. package/dist/utils/callPanelCallbacks.cjs +10 -7
  68. package/dist/utils/callPanelCallbacks.cjs.map +1 -1
  69. package/dist/utils/callPanelCallbacks.js +10 -7
  70. package/dist/utils/callPanelCallbacks.js.map +1 -1
  71. package/dist/utils/units.cjs +5 -0
  72. package/dist/utils/units.cjs.map +1 -1
  73. package/dist/utils/units.js +5 -0
  74. package/dist/utils/units.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/Calendar/CalendarGrid.vue +1 -1
  77. package/src/Combobox/ComboboxInput.vue +19 -0
  78. package/src/DismissableLayer/utils.ts +4 -1
  79. package/src/Menu/MenuGroup.vue +12 -0
  80. package/src/Menu/MenuItemImpl.vue +1 -4
  81. package/src/Menu/MenuLabel.vue +7 -1
  82. package/src/MonthPicker/MonthPickerGrid.vue +1 -1
  83. package/src/MonthRangePicker/MonthRangePickerGrid.vue +1 -1
  84. package/src/RangeCalendar/RangeCalendarGrid.vue +1 -1
  85. package/src/Splitter/SplitterGroup.vue +46 -6
  86. package/src/Splitter/utils/callPanelCallbacks.ts +16 -8
  87. package/src/Splitter/utils/units.ts +12 -0
  88. package/src/Toast/FocusProxy.vue +0 -1
  89. package/src/Toast/ToastRootImpl.vue +0 -4
  90. package/src/YearPicker/YearPickerGrid.vue +1 -1
  91. package/src/YearRangePicker/YearRangePickerGrid.vue +1 -1
  92. package/src/shared/date/useDateField.ts +2 -1
  93. package/src/shared/useBodyScrollLock.ts +2 -0
  94. package/src/shared/useHideOthers.ts +8 -1
@@ -1,41 +1,49 @@
1
1
  import type { PanelData } from '../SplitterPanel.vue'
2
2
  import { assert } from './assert'
3
+ import { fuzzyNumbersEqual } from './compare'
3
4
 
4
5
  // Layout should be pre-converted into percentages
5
6
  export function callPanelCallbacks(
6
7
  panelsArray: PanelData[],
7
8
  layout: number[],
8
9
  panelIdToLastNotifiedSizeMap: Record<string, number>,
10
+ groupSizeInPixels?: number | null,
9
11
  ) {
10
12
  layout.forEach((size, index) => {
11
13
  const panelData = panelsArray[index]
12
14
  assert(panelData)
13
15
 
14
16
  const { callbacks, constraints, id: panelId } = panelData
15
- const { collapsedSize = 0, collapsible } = constraints
17
+ const { collapsedSize = 0, collapsible, sizeUnit } = constraints
18
+
19
+ // Convert size to native units for px panels
20
+ let displaySize = size
21
+ if (sizeUnit === 'px' && groupSizeInPixels != null) {
22
+ displaySize = (size / 100) * groupSizeInPixels
23
+ }
16
24
 
17
25
  const lastNotifiedSize = panelIdToLastNotifiedSizeMap[panelId]
18
- if (lastNotifiedSize == null || size !== lastNotifiedSize) {
19
- panelIdToLastNotifiedSizeMap[panelId] = size
26
+ if (lastNotifiedSize == null || !fuzzyNumbersEqual(displaySize, lastNotifiedSize)) {
27
+ panelIdToLastNotifiedSizeMap[panelId] = displaySize
20
28
 
21
29
  const { onCollapse, onExpand, onResize } = callbacks
22
30
 
23
31
  if (onResize)
24
- onResize(size, lastNotifiedSize)
32
+ onResize(displaySize, lastNotifiedSize)
25
33
 
26
34
  if (collapsible && (onCollapse || onExpand)) {
27
35
  if (
28
36
  onExpand
29
- && (lastNotifiedSize == null || lastNotifiedSize === collapsedSize)
30
- && size !== collapsedSize
37
+ && (lastNotifiedSize == null || fuzzyNumbersEqual(lastNotifiedSize, collapsedSize))
38
+ && !fuzzyNumbersEqual(displaySize, collapsedSize)
31
39
  ) {
32
40
  onExpand()
33
41
  }
34
42
 
35
43
  if (
36
44
  onCollapse
37
- && (lastNotifiedSize == null || lastNotifiedSize !== collapsedSize)
38
- && size === collapsedSize
45
+ && (lastNotifiedSize == null || !fuzzyNumbersEqual(lastNotifiedSize, collapsedSize))
46
+ && fuzzyNumbersEqual(displaySize, collapsedSize)
39
47
  ) {
40
48
  onCollapse()
41
49
  }
@@ -157,5 +157,17 @@ export function recalculateLayoutForPixelPanels({
157
157
  nextLayout[index] = prevSize * scaleFactor
158
158
  }
159
159
 
160
+ // Normalize to ensure percentages always sum to exactly 100.
161
+ // Floating-point arithmetic in the px→% conversions above can cause drift
162
+ // (e.g. 99.89% instead of 100%) that gets persisted to localStorage and
163
+ // triggers validation warnings on every subsequent page load.
164
+ const total = nextLayout.reduce((sum, size) => sum + size, 0)
165
+ if (total > 0 && Math.abs(total - 100) > 1e-9) {
166
+ const factor = 100 / total
167
+ for (let index = 0; index < nextLayout.length; index++) {
168
+ nextLayout[index] = (nextLayout[index] ?? 0) * factor
169
+ }
170
+ }
171
+
160
172
  return nextLayout
161
173
  }
@@ -11,7 +11,6 @@ const providerContext = injectToastProviderContext()
11
11
 
12
12
  <template>
13
13
  <VisuallyHidden
14
- aria-hidden="true"
15
14
  tabindex="0"
16
15
  style="position: fixed"
17
16
  @focus="(event: FocusEvent) => {
@@ -182,7 +182,6 @@ provideToastRootContext({ onClose: handleClose })
182
182
  v-if="announceTextContent"
183
183
  role="alert"
184
184
  :aria-live="type === 'foreground' ? 'assertive' : 'polite'"
185
- aria-atomic="true"
186
185
  >
187
186
  {{ announceTextContent }}
188
187
  </ToastAnnounce>
@@ -194,9 +193,6 @@ provideToastRootContext({ onClose: handleClose })
194
193
  <CollectionItem>
195
194
  <Primitive
196
195
  :ref="forwardRef"
197
- role="alert"
198
- aria-live="off"
199
- aria-atomic="true"
200
196
  tabindex="0"
201
197
  v-bind="$attrs"
202
198
  :as="as"
@@ -20,7 +20,7 @@ const readonly = computed(() => rootContext.readonly.value ? true : undefined)
20
20
  <Primitive
21
21
  v-bind="props"
22
22
  tabindex="-1"
23
- role="grid"
23
+ role="application"
24
24
  :aria-labelledby="rootContext.headingId"
25
25
  :aria-readonly="readonly"
26
26
  :aria-disabled="disabled"
@@ -20,7 +20,7 @@ const readonly = computed(() => rootContext.readonly.value ? true : undefined)
20
20
  <Primitive
21
21
  v-bind="props"
22
22
  tabindex="-1"
23
- role="grid"
23
+ role="application"
24
24
  :aria-labelledby="rootContext.headingId"
25
25
  :aria-readonly="readonly"
26
26
  :aria-disabled="disabled"
@@ -874,9 +874,10 @@ export function useDateField(props: UseDateFieldProps) {
874
874
  function handleSegmentKeydown(e: KeyboardEvent) {
875
875
  const disabled = props.disabled.value
876
876
  const readonly = props.readonly.value
877
-
878
877
  if (disabled || readonly)
879
878
  return
879
+ if (e.key !== kbd.TAB)
880
+ e.preventDefault()
880
881
  const segmentKeydownHandlers = {
881
882
  day: handleDaySegmentKeydown,
882
883
  month: handleMonthSegmentKeydown,
@@ -80,6 +80,8 @@ const useBodyLockStackCount = createSharedComposable(() => {
80
80
 
81
81
  // let dismissibleLayer set previous pointerEvent first
82
82
  nextTick(() => {
83
+ if (!locked.value)
84
+ return
83
85
  document.body.style.pointerEvents = 'none'
84
86
  document.body.style.overflow = 'hidden'
85
87
  })
@@ -16,7 +16,14 @@ export function useHideOthers(target: MaybeElementRef) {
16
16
  // disable hideOthers on test mode
17
17
  if (import.meta.env.MODE === 'test')
18
18
  return
19
- if (el)
19
+ // Skip if inside a closed native popover
20
+ // Use try/catch as `:popover-open` pseudo-class is not supported in all browsers (e.g. Safari 18)
21
+ let isInsideClosedPopover = false
22
+ try {
23
+ isInsideClosedPopover = !!el?.closest('[popover]:not(:popover-open)')
24
+ }
25
+ catch {}
26
+ if (el && !isInsideClosedPopover)
20
27
  undo = hideOthers(el)
21
28
  else if (undo)
22
29
  undo()