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.
- package/dist/Calendar/CalendarGrid.cjs +1 -1
- package/dist/Calendar/CalendarGrid.js +1 -1
- package/dist/Combobox/ComboboxInput.cjs +10 -1
- package/dist/Combobox/ComboboxInput.cjs.map +1 -1
- package/dist/Combobox/ComboboxInput.js +10 -1
- package/dist/Combobox/ComboboxInput.js.map +1 -1
- package/dist/DismissableLayer/utils.cjs +1 -0
- package/dist/DismissableLayer/utils.cjs.map +1 -1
- package/dist/DismissableLayer/utils.js +1 -0
- package/dist/DismissableLayer/utils.js.map +1 -1
- package/dist/Menu/MenuGroup.cjs +13 -2
- package/dist/Menu/MenuGroup.cjs.map +1 -1
- package/dist/Menu/MenuGroup.js +8 -3
- package/dist/Menu/MenuGroup.js.map +1 -1
- package/dist/Menu/MenuItemImpl.cjs +1 -2
- package/dist/Menu/MenuItemImpl.cjs.map +1 -1
- package/dist/Menu/MenuItemImpl.js +1 -2
- package/dist/Menu/MenuItemImpl.js.map +1 -1
- package/dist/Menu/MenuLabel.cjs +4 -2
- package/dist/Menu/MenuLabel.cjs.map +1 -1
- package/dist/Menu/MenuLabel.js +5 -3
- package/dist/Menu/MenuLabel.js.map +1 -1
- package/dist/MonthPicker/MonthPickerGrid.cjs +1 -1
- package/dist/MonthPicker/MonthPickerGrid.js +1 -1
- package/dist/MonthRangePicker/MonthRangePickerGrid.cjs +1 -1
- package/dist/MonthRangePicker/MonthRangePickerGrid.js +1 -1
- package/dist/RangeCalendar/RangeCalendarGrid.cjs +1 -1
- package/dist/RangeCalendar/RangeCalendarGrid.js +1 -1
- package/dist/Splitter/SplitterGroup.cjs +30 -13
- package/dist/Splitter/SplitterGroup.cjs.map +1 -1
- package/dist/Splitter/SplitterGroup.js +30 -13
- package/dist/Splitter/SplitterGroup.js.map +1 -1
- package/dist/Toast/FocusProxy.cjs +0 -1
- package/dist/Toast/FocusProxy.cjs.map +1 -1
- package/dist/Toast/FocusProxy.js +0 -1
- package/dist/Toast/FocusProxy.js.map +1 -1
- package/dist/Toast/ToastRootImpl.cjs +1 -5
- package/dist/Toast/ToastRootImpl.cjs.map +1 -1
- package/dist/Toast/ToastRootImpl.js +1 -5
- package/dist/Toast/ToastRootImpl.js.map +1 -1
- package/dist/YearPicker/YearPickerGrid.cjs +1 -1
- package/dist/YearPicker/YearPickerGrid.js +1 -1
- package/dist/YearRangePicker/YearRangePickerGrid.cjs +1 -1
- package/dist/YearRangePicker/YearRangePickerGrid.js +1 -1
- package/dist/constant.d.cts.map +1 -1
- package/dist/date/useDateField.cjs +1 -0
- package/dist/date/useDateField.cjs.map +1 -1
- package/dist/date/useDateField.js +1 -0
- package/dist/date/useDateField.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index3.d.cts +1021 -1020
- package/dist/index3.d.cts.map +1 -1
- package/dist/index3.d.ts +1047 -1046
- package/dist/index3.d.ts.map +1 -1
- package/dist/internal.d.cts +2 -4
- package/dist/internal.d.ts +2 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/shared/useBodyScrollLock.cjs +1 -0
- package/dist/shared/useBodyScrollLock.cjs.map +1 -1
- package/dist/shared/useBodyScrollLock.js +1 -0
- package/dist/shared/useBodyScrollLock.js.map +1 -1
- package/dist/shared/useHideOthers.cjs +5 -1
- package/dist/shared/useHideOthers.cjs.map +1 -1
- package/dist/shared/useHideOthers.js +5 -1
- package/dist/shared/useHideOthers.js.map +1 -1
- package/dist/utils/callPanelCallbacks.cjs +10 -7
- package/dist/utils/callPanelCallbacks.cjs.map +1 -1
- package/dist/utils/callPanelCallbacks.js +10 -7
- package/dist/utils/callPanelCallbacks.js.map +1 -1
- package/dist/utils/units.cjs +5 -0
- package/dist/utils/units.cjs.map +1 -1
- package/dist/utils/units.js +5 -0
- package/dist/utils/units.js.map +1 -1
- package/package.json +2 -2
- package/src/Calendar/CalendarGrid.vue +1 -1
- package/src/Combobox/ComboboxInput.vue +19 -0
- package/src/DismissableLayer/utils.ts +4 -1
- package/src/Menu/MenuGroup.vue +12 -0
- package/src/Menu/MenuItemImpl.vue +1 -4
- package/src/Menu/MenuLabel.vue +7 -1
- package/src/MonthPicker/MonthPickerGrid.vue +1 -1
- package/src/MonthRangePicker/MonthRangePickerGrid.vue +1 -1
- package/src/RangeCalendar/RangeCalendarGrid.vue +1 -1
- package/src/Splitter/SplitterGroup.vue +46 -6
- package/src/Splitter/utils/callPanelCallbacks.ts +16 -8
- package/src/Splitter/utils/units.ts +12 -0
- package/src/Toast/FocusProxy.vue +0 -1
- package/src/Toast/ToastRootImpl.vue +0 -4
- package/src/YearPicker/YearPickerGrid.vue +1 -1
- package/src/YearRangePicker/YearRangePickerGrid.vue +1 -1
- package/src/shared/date/useDateField.ts +2 -1
- package/src/shared/useBodyScrollLock.ts +2 -0
- 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 ||
|
|
19
|
-
panelIdToLastNotifiedSizeMap[panelId] =
|
|
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(
|
|
32
|
+
onResize(displaySize, lastNotifiedSize)
|
|
25
33
|
|
|
26
34
|
if (collapsible && (onCollapse || onExpand)) {
|
|
27
35
|
if (
|
|
28
36
|
onExpand
|
|
29
|
-
&& (lastNotifiedSize == null || lastNotifiedSize
|
|
30
|
-
&&
|
|
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
|
|
38
|
-
&&
|
|
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
|
}
|
package/src/Toast/FocusProxy.vue
CHANGED
|
@@ -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="
|
|
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="
|
|
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
|
|
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()
|