@jobber/components 9.4.0 → 9.5.0
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/Autocomplete/index.cjs +0 -1
- package/dist/Autocomplete/index.mjs +0 -1
- package/dist/Card/index.cjs +7 -7
- package/dist/Card/index.mjs +7 -7
- package/dist/Chip/index.cjs +0 -1
- package/dist/Chip/index.mjs +0 -1
- package/dist/Chips/InternalChipDismissible/hooks/index.cjs +0 -1
- package/dist/Chips/InternalChipDismissible/hooks/index.mjs +0 -1
- package/dist/Chips/InternalChipDismissible/index.cjs +0 -1
- package/dist/Chips/InternalChipDismissible/index.mjs +0 -1
- package/dist/Chips/index.cjs +0 -1
- package/dist/Chips/index.mjs +0 -1
- package/dist/ComboboxChipRemove-cjs.js +181 -184
- package/dist/ComboboxChipRemove-es.js +4 -7
- package/dist/ConfirmationModal/index.cjs +0 -1
- package/dist/ConfirmationModal/index.mjs +0 -1
- package/dist/DataDump/index.cjs +7 -7
- package/dist/DataDump/index.mjs +7 -7
- package/dist/DataList/components/DataListActions/index.cjs +0 -1
- package/dist/DataList/components/DataListActions/index.mjs +0 -1
- package/dist/DataList/components/DataListBulkActions/index.cjs +0 -1
- package/dist/DataList/components/DataListBulkActions/index.mjs +0 -1
- package/dist/DataList/components/DataListFilters/components/DataListSort/index.cjs +0 -1
- package/dist/DataList/components/DataListFilters/components/DataListSort/index.mjs +0 -1
- package/dist/DataList/components/DataListFilters/index.cjs +0 -1
- package/dist/DataList/components/DataListFilters/index.mjs +0 -1
- package/dist/DataList/components/DataListHeader/index.cjs +0 -1
- package/dist/DataList/components/DataListHeader/index.mjs +0 -1
- package/dist/DataList/components/DataListItem/index.cjs +0 -1
- package/dist/DataList/components/DataListItem/index.mjs +0 -1
- package/dist/DataList/components/DataListItemActions/index.cjs +0 -1
- package/dist/DataList/components/DataListItemActions/index.mjs +0 -1
- package/dist/DataList/components/DataListItemActionsOverflow/index.cjs +0 -1
- package/dist/DataList/components/DataListItemActionsOverflow/index.mjs +0 -1
- package/dist/DataList/components/DataListItems/index.cjs +0 -1
- package/dist/DataList/components/DataListItems/index.mjs +0 -1
- package/dist/DataList/components/DataListLayout/index.cjs +0 -1
- package/dist/DataList/components/DataListLayout/index.mjs +0 -1
- package/dist/DataList/components/DataListLayoutActions/index.cjs +0 -1
- package/dist/DataList/components/DataListLayoutActions/index.mjs +0 -1
- package/dist/DataList/index.cjs +0 -1
- package/dist/DataList/index.mjs +0 -1
- package/dist/DatePicker/index.cjs +0 -2
- package/dist/DatePicker/index.mjs +0 -2
- package/dist/DatePicker-cjs.js +19 -18
- package/dist/DatePicker-es.js +2 -1
- package/dist/Dialog/index.cjs +11 -6
- package/dist/Dialog/index.mjs +11 -6
- package/dist/DrawerDescription-cjs.js +7 -8
- package/dist/DrawerDescription-es.js +1 -2
- package/dist/DrawerTitle-cjs.js +4 -4
- package/dist/DrawerTitle-es.js +1 -1
- package/dist/FieldDescription-cjs.js +49 -49
- package/dist/FieldDescription-es.js +2 -2
- package/dist/FilterPicker/components/FilterPickerActivator/index.cjs +0 -1
- package/dist/FilterPicker/components/FilterPickerActivator/index.mjs +0 -1
- package/dist/FilterPicker/components/FilterPickerContent/index.cjs +0 -1
- package/dist/FilterPicker/components/FilterPickerContent/index.mjs +0 -1
- package/dist/FilterPicker/components/FilterPickerTrigger/index.cjs +0 -1
- package/dist/FilterPicker/components/FilterPickerTrigger/index.mjs +0 -1
- package/dist/FilterPicker/index.cjs +0 -1
- package/dist/FilterPicker/index.mjs +0 -1
- package/dist/FormatFile/index.cjs +0 -1
- package/dist/FormatFile/index.mjs +0 -1
- package/dist/Gallery/index.cjs +0 -1
- package/dist/Gallery/index.mjs +0 -1
- package/dist/HelperText-cjs.js +3 -2
- package/dist/HelperText-es.js +3 -2
- package/dist/InputDate/index.cjs +0 -2
- package/dist/InputDate/index.mjs +0 -2
- package/dist/InputNumber/InputNumber.d.ts +75 -5
- package/dist/InputNumber/index.cjs +27 -3
- package/dist/InputNumber/index.d.ts +2 -2
- package/dist/InputNumber/index.mjs +27 -3
- package/dist/{primitives/InputNumberExperimental → InputNumber}/types.d.ts +48 -35
- package/dist/InputNumber-cjs.js +267 -4986
- package/dist/InputNumber-es.js +268 -4987
- package/dist/LightBox/index.cjs +0 -1
- package/dist/LightBox/index.mjs +0 -1
- package/dist/Menu/index.cjs +7 -7
- package/dist/Menu/index.mjs +7 -7
- package/dist/Menu-cjs.js +4 -1
- package/dist/Menu-es.js +4 -1
- package/dist/MenuSubmenuTrigger-cjs.js +142 -143
- package/dist/MenuSubmenuTrigger-es.js +5 -6
- package/dist/Modal/index.cjs +0 -1
- package/dist/Modal/index.mjs +0 -1
- package/dist/NumberFieldInput-cjs.js +63 -63
- package/dist/NumberFieldInput-es.js +5 -5
- package/dist/Page/index.cjs +7 -8
- package/dist/Page/index.mjs +7 -8
- package/dist/Popover/index.cjs +0 -1
- package/dist/Popover/index.mjs +0 -1
- package/dist/ScrollAreaViewport-cjs.js +119 -121
- package/dist/ScrollAreaViewport-es.js +3 -5
- package/dist/Select/index.cjs +3 -9
- package/dist/Select/index.mjs +3 -9
- package/dist/SelectGroupLabel-cjs.js +117 -107
- package/dist/SelectGroupLabel-es.js +20 -12
- package/dist/Tooltip/index.cjs +0 -1
- package/dist/Tooltip/index.mjs +0 -1
- package/dist/dialogReturnFocus-cjs.js +4 -1
- package/dist/dialogReturnFocus-es.js +4 -1
- package/dist/docs/InputNumber/InputNumber.md +564 -56
- package/dist/docs/index.md +0 -1
- package/dist/floating-ui.react-cjs.js +34 -35
- package/dist/floating-ui.react-dom-cjs.js +64 -65
- package/dist/floating-ui.react-dom-es.js +1 -2
- package/dist/floating-ui.react-es.js +1 -2
- package/dist/floating-ui.utils-cjs.js +183 -0
- package/dist/floating-ui.utils-es.js +165 -1
- package/dist/index.cjs +10 -15
- package/dist/index.mjs +10 -15
- package/dist/primitives/BottomSheet/index.cjs +2 -5
- package/dist/primitives/BottomSheet/index.mjs +2 -5
- package/dist/primitives/ComboboxPrimitive/index.cjs +3 -7
- package/dist/primitives/ComboboxPrimitive/index.mjs +3 -7
- package/dist/primitives/HelperText/HelperText.d.ts +4 -1
- package/dist/primitives/HelperText/index.cjs +1 -1
- package/dist/primitives/HelperText/index.mjs +1 -1
- package/dist/primitives/SelectPrimitive/index.cjs +3 -9
- package/dist/primitives/SelectPrimitive/index.mjs +3 -9
- package/dist/primitives/index.cjs +2 -16
- package/dist/primitives/index.d.ts +0 -2
- package/dist/primitives/index.mjs +2 -15
- package/dist/scrollEdges-cjs.js +6 -2
- package/dist/scrollEdges-es.js +5 -2
- package/dist/styles.css +573 -902
- package/dist/unstyledPrimitives/index.cjs +105 -111
- package/dist/unstyledPrimitives/index.mjs +5 -11
- package/dist/useCompositeListItem-cjs.js +516 -90
- package/dist/useCompositeListItem-es.js +407 -6
- package/dist/useLabel-cjs.js +10 -10
- package/dist/useLabel-es.js +3 -3
- package/dist/useRenderElement-es.js +1 -1
- package/dist/useScrollLock-cjs.js +1332 -203
- package/dist/useScrollLock-es.js +1068 -5
- package/dist/utils/meta/meta.json +12 -0
- package/package.json +2 -3
- package/dist/InputNumber/InputNumber.types.d.ts +0 -20
- package/dist/InputNumberExperimental-cjs.js +0 -277
- package/dist/InputNumberExperimental-es.js +0 -275
- package/dist/clamp-cjs.js +0 -7
- package/dist/clamp-es.js +0 -5
- package/dist/clsx-cjs.js +0 -5
- package/dist/clsx-es.js +0 -3
- package/dist/docs/InputNumberExperimental/InputNumberExperimental.md +0 -578
- package/dist/floating-ui.utils.dom-cjs.js +0 -185
- package/dist/floating-ui.utils.dom-es.js +0 -165
- package/dist/isElementDisabled-cjs.js +0 -40
- package/dist/isElementDisabled-es.js +0 -18
- package/dist/primitives/InputNumberExperimental/InputNumberExperimental.d.ts +0 -77
- package/dist/primitives/InputNumberExperimental/index.cjs +0 -30
- package/dist/primitives/InputNumberExperimental/index.d.ts +0 -2
- package/dist/primitives/InputNumberExperimental/index.mjs +0 -24
- package/dist/resolveAriaLabelledBy-cjs.js +0 -200
- package/dist/resolveAriaLabelledBy-es.js +0 -166
- package/dist/useButton-cjs.js +0 -1164
- package/dist/useButton-es.js +0 -1071
- package/dist/useLabelableId-cjs.js +0 -278
- package/dist/useLabelableId-es.js +0 -247
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var useButton = require('./useButton-cjs.js');
|
|
5
|
-
var useRenderElement = require('./useRenderElement-cjs.js');
|
|
6
4
|
var useScrollLock = require('./useScrollLock-cjs.js');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var resolveAriaLabelledBy = require('./resolveAriaLabelledBy-cjs.js');
|
|
5
|
+
var useRenderElement = require('./useRenderElement-cjs.js');
|
|
6
|
+
var useCompositeListItem = require('./useCompositeListItem-cjs.js');
|
|
10
7
|
var scrollEdges = require('./scrollEdges-cjs.js');
|
|
11
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
12
|
-
var useCompositeListItem = require('./useCompositeListItem-cjs.js');
|
|
13
9
|
var floatingUi_utils = require('./floating-ui.utils-cjs.js');
|
|
14
|
-
var clamp = require('./clamp-cjs.js');
|
|
15
|
-
var floatingUi_utils_dom = require('./floating-ui.utils.dom-cjs.js');
|
|
16
10
|
var floatingUi_reactDom = require('./floating-ui.react-dom-cjs.js');
|
|
17
11
|
|
|
18
12
|
function _interopNamespaceDefault(e) {
|
|
@@ -34,6 +28,16 @@ function _interopNamespaceDefault(e) {
|
|
|
34
28
|
|
|
35
29
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
36
30
|
|
|
31
|
+
const ToolbarRootContext = /*#__PURE__*/React__namespace.createContext(undefined);
|
|
32
|
+
if (process.env.NODE_ENV !== "production") ToolbarRootContext.displayName = "ToolbarRootContext";
|
|
33
|
+
function useToolbarRootContext(optional) {
|
|
34
|
+
const context = React__namespace.useContext(ToolbarRootContext);
|
|
35
|
+
if (context === undefined && !optional) {
|
|
36
|
+
throw new Error(process.env.NODE_ENV !== "production" ? 'Base UI: ToolbarRootContext is missing. Toolbar parts must be placed within <Toolbar.Root>.' : useRenderElement.formatErrorMessage(69));
|
|
37
|
+
}
|
|
38
|
+
return context;
|
|
39
|
+
}
|
|
40
|
+
|
|
37
41
|
/**
|
|
38
42
|
* Returns a previous value of its argument.
|
|
39
43
|
* @param value Current value.
|
|
@@ -53,6 +57,10 @@ function usePreviousValue(value) {
|
|
|
53
57
|
return state.previous;
|
|
54
58
|
}
|
|
55
59
|
|
|
60
|
+
function isElementDisabled(element) {
|
|
61
|
+
return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';
|
|
62
|
+
}
|
|
63
|
+
|
|
56
64
|
const SelectRootContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
57
65
|
if (process.env.NODE_ENV !== "production") SelectRootContext.displayName = "SelectRootContext";
|
|
58
66
|
const SelectFloatingContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
@@ -94,10 +102,10 @@ const selectors = {
|
|
|
94
102
|
if (multiple && Array.isArray(value)) {
|
|
95
103
|
return value.length > 0;
|
|
96
104
|
}
|
|
97
|
-
return
|
|
105
|
+
return useCompositeListItem.stringifyAsValue(value, itemToStringValue) !== '';
|
|
98
106
|
}),
|
|
99
107
|
hasNullItemLabel: useScrollLock.createSelector((state, enabled) => {
|
|
100
|
-
return enabled ?
|
|
108
|
+
return enabled ? useCompositeListItem.hasNullItemLabel(state.items) : false;
|
|
101
109
|
}),
|
|
102
110
|
open: useScrollLock.createSelector(state => state.open),
|
|
103
111
|
mounted: useScrollLock.createSelector(state => state.mounted),
|
|
@@ -111,13 +119,13 @@ const selectors = {
|
|
|
111
119
|
const comparer = state.isItemEqualToValue;
|
|
112
120
|
const storeValue = state.value;
|
|
113
121
|
if (state.multiple) {
|
|
114
|
-
return Array.isArray(storeValue) && storeValue.some(selectedItem =>
|
|
122
|
+
return Array.isArray(storeValue) && storeValue.some(selectedItem => useCompositeListItem.compareItemEquality(itemValue, selectedItem, comparer));
|
|
115
123
|
}
|
|
116
124
|
|
|
117
125
|
// The value is the source of truth: a stale `selectedIndex` (e.g. the controlled
|
|
118
126
|
// value changes while the popup is open, where the index sync is deferred) must not
|
|
119
127
|
// keep a previously selected item marked as selected.
|
|
120
|
-
return
|
|
128
|
+
return useCompositeListItem.compareItemEquality(itemValue, storeValue, comparer);
|
|
121
129
|
}),
|
|
122
130
|
isSelectedByFocus: useScrollLock.createSelector((state, index) => {
|
|
123
131
|
return state.selectedIndex === index;
|
|
@@ -156,13 +164,13 @@ function SelectRoot(props) {
|
|
|
156
164
|
multiple = false,
|
|
157
165
|
itemToStringLabel,
|
|
158
166
|
itemToStringValue,
|
|
159
|
-
isItemEqualToValue =
|
|
167
|
+
isItemEqualToValue = useCompositeListItem.defaultItemEquality,
|
|
160
168
|
highlightItemOnHover = true,
|
|
161
169
|
children
|
|
162
170
|
} = props;
|
|
163
171
|
const {
|
|
164
172
|
clearErrors
|
|
165
|
-
} =
|
|
173
|
+
} = useCompositeListItem.useFormContext();
|
|
166
174
|
const {
|
|
167
175
|
setDirty,
|
|
168
176
|
setTouched,
|
|
@@ -173,19 +181,19 @@ function SelectRoot(props) {
|
|
|
173
181
|
disabled: fieldDisabled,
|
|
174
182
|
validation,
|
|
175
183
|
validationMode
|
|
176
|
-
} =
|
|
177
|
-
const generatedId =
|
|
184
|
+
} = useCompositeListItem.useFieldRootContext();
|
|
185
|
+
const generatedId = useCompositeListItem.useLabelableId({
|
|
178
186
|
id
|
|
179
187
|
});
|
|
180
188
|
const disabled = fieldDisabled || disabledProp;
|
|
181
189
|
const name = fieldName ?? nameProp;
|
|
182
|
-
const [value, setValueUnwrapped] =
|
|
190
|
+
const [value, setValueUnwrapped] = useScrollLock.useControlled({
|
|
183
191
|
controlled: valueProp,
|
|
184
192
|
default: multiple ? defaultValue ?? useRenderElement.EMPTY_ARRAY : defaultValue,
|
|
185
193
|
name: 'Select',
|
|
186
194
|
state: 'value'
|
|
187
195
|
});
|
|
188
|
-
const [open, setOpenUnwrapped] =
|
|
196
|
+
const [open, setOpenUnwrapped] = useScrollLock.useControlled({
|
|
189
197
|
controlled: openProp,
|
|
190
198
|
default: defaultOpen,
|
|
191
199
|
name: 'Select',
|
|
@@ -211,7 +219,7 @@ function SelectRoot(props) {
|
|
|
211
219
|
mounted,
|
|
212
220
|
setMounted,
|
|
213
221
|
transitionStatus
|
|
214
|
-
} =
|
|
222
|
+
} = useScrollLock.useTransitionStatus(open);
|
|
215
223
|
const {
|
|
216
224
|
openMethod,
|
|
217
225
|
triggerProps: interactionTypeProps
|
|
@@ -256,31 +264,31 @@ function SelectRoot(props) {
|
|
|
256
264
|
if (multiple) {
|
|
257
265
|
return '';
|
|
258
266
|
}
|
|
259
|
-
return
|
|
267
|
+
return useCompositeListItem.stringifyAsValue(value, itemToStringValue);
|
|
260
268
|
}, [multiple, value, itemToStringValue]);
|
|
261
269
|
const fieldStringValue = React__namespace.useMemo(() => {
|
|
262
270
|
if (multiple && Array.isArray(value)) {
|
|
263
|
-
return value.map(currentValue =>
|
|
271
|
+
return value.map(currentValue => useCompositeListItem.stringifyAsValue(currentValue, itemToStringValue));
|
|
264
272
|
}
|
|
265
|
-
return
|
|
273
|
+
return useCompositeListItem.stringifyAsValue(value, itemToStringValue);
|
|
266
274
|
}, [multiple, value, itemToStringValue]);
|
|
267
|
-
const controlRef =
|
|
268
|
-
const getStringifiedValueForForm =
|
|
269
|
-
|
|
275
|
+
const controlRef = useScrollLock.useValueAsRef(store.state.triggerElement);
|
|
276
|
+
const getStringifiedValueForForm = useScrollLock.useStableCallback(() => fieldStringValue);
|
|
277
|
+
useCompositeListItem.useRegisterFieldControl(controlRef, generatedId, value, getStringifiedValueForForm, !disabled, nameProp);
|
|
270
278
|
const initialValueRef = React__namespace.useRef(value);
|
|
271
279
|
// Mirror the `hasSelectedValue` store selector so the Field's filled state agrees with the
|
|
272
280
|
// trigger/value placeholder semantics (a value serializing to `''` counts as empty).
|
|
273
|
-
const hasSelectedValue = multiple ? Array.isArray(value) && value.length > 0 : value != null &&
|
|
274
|
-
|
|
281
|
+
const hasSelectedValue = multiple ? Array.isArray(value) && value.length > 0 : value != null && useCompositeListItem.stringifyAsValue(value, itemToStringValue) !== '';
|
|
282
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
275
283
|
// Ensure the values and labels are registered for programmatic value changes.
|
|
276
284
|
if (value !== initialValueRef.current) {
|
|
277
285
|
store.set('forceMount', true);
|
|
278
286
|
}
|
|
279
287
|
}, [store, value]);
|
|
280
|
-
|
|
288
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
281
289
|
setFilled(hasSelectedValue);
|
|
282
290
|
}, [hasSelectedValue, setFilled]);
|
|
283
|
-
|
|
291
|
+
useScrollLock.useIsoLayoutEffect(function syncSelectedIndex() {
|
|
284
292
|
const registry = valuesRef.current;
|
|
285
293
|
let nextIndex;
|
|
286
294
|
if (multiple) {
|
|
@@ -289,11 +297,11 @@ function SelectRoot(props) {
|
|
|
289
297
|
nextIndex = null;
|
|
290
298
|
} else {
|
|
291
299
|
const lastValue = currentValue[currentValue.length - 1];
|
|
292
|
-
const lastIndex =
|
|
300
|
+
const lastIndex = useCompositeListItem.findItemIndex(registry, lastValue, isItemEqualToValue);
|
|
293
301
|
nextIndex = lastIndex === -1 ? null : lastIndex;
|
|
294
302
|
}
|
|
295
303
|
} else {
|
|
296
|
-
const index =
|
|
304
|
+
const index = useCompositeListItem.findItemIndex(registry, value, isItemEqualToValue);
|
|
297
305
|
nextIndex = index === -1 ? null : index;
|
|
298
306
|
}
|
|
299
307
|
if (nextIndex === null) {
|
|
@@ -307,22 +315,22 @@ function SelectRoot(props) {
|
|
|
307
315
|
function isSelectedValueDirty(currentValue) {
|
|
308
316
|
const initialValue = validityData.initialValue;
|
|
309
317
|
if (Array.isArray(currentValue) && Array.isArray(initialValue)) {
|
|
310
|
-
return !
|
|
318
|
+
return !useCompositeListItem.areArraysEqual(currentValue, initialValue, (itemValue, initialItemValue) => useCompositeListItem.compareItemEquality(itemValue, initialItemValue, isItemEqualToValue));
|
|
311
319
|
}
|
|
312
320
|
return currentValue !== initialValue;
|
|
313
321
|
}
|
|
314
|
-
|
|
322
|
+
useScrollLock.useValueChanged(value, () => {
|
|
315
323
|
clearErrors(name);
|
|
316
324
|
setDirty(isSelectedValueDirty(value));
|
|
317
325
|
validation.change(value);
|
|
318
326
|
});
|
|
319
|
-
const setOpen =
|
|
327
|
+
const setOpen = useScrollLock.useStableCallback((nextOpen, eventDetails) => {
|
|
320
328
|
onOpenChange?.(nextOpen, eventDetails);
|
|
321
329
|
if (eventDetails.isCanceled) {
|
|
322
330
|
return;
|
|
323
331
|
}
|
|
324
332
|
setOpenUnwrapped(nextOpen);
|
|
325
|
-
if (!nextOpen && (eventDetails.reason ===
|
|
333
|
+
if (!nextOpen && (eventDetails.reason === useScrollLock.focusOut || eventDetails.reason === useScrollLock.outsidePress)) {
|
|
326
334
|
setTouched(true);
|
|
327
335
|
setFocused(false);
|
|
328
336
|
if (validationMode === 'onBlur') {
|
|
@@ -330,7 +338,7 @@ function SelectRoot(props) {
|
|
|
330
338
|
}
|
|
331
339
|
}
|
|
332
340
|
});
|
|
333
|
-
const handleUnmount =
|
|
341
|
+
const handleUnmount = useScrollLock.useStableCallback(() => {
|
|
334
342
|
setMounted(false);
|
|
335
343
|
store.update({
|
|
336
344
|
activeIndex: null,
|
|
@@ -338,7 +346,7 @@ function SelectRoot(props) {
|
|
|
338
346
|
});
|
|
339
347
|
onOpenChangeComplete?.(false);
|
|
340
348
|
});
|
|
341
|
-
|
|
349
|
+
useScrollLock.useOpenChangeComplete({
|
|
342
350
|
enabled: !actionsRef,
|
|
343
351
|
open,
|
|
344
352
|
ref: popupRef,
|
|
@@ -351,14 +359,14 @@ function SelectRoot(props) {
|
|
|
351
359
|
React__namespace.useImperativeHandle(actionsRef, () => ({
|
|
352
360
|
unmount: handleUnmount
|
|
353
361
|
}), [handleUnmount]);
|
|
354
|
-
const setValue =
|
|
362
|
+
const setValue = useScrollLock.useStableCallback((nextValue, eventDetails) => {
|
|
355
363
|
onValueChange?.(nextValue, eventDetails);
|
|
356
364
|
if (eventDetails.isCanceled) {
|
|
357
365
|
return;
|
|
358
366
|
}
|
|
359
367
|
setValueUnwrapped(nextValue);
|
|
360
368
|
});
|
|
361
|
-
const handleScrollArrowVisibility =
|
|
369
|
+
const handleScrollArrowVisibility = useScrollLock.useStableCallback(() => {
|
|
362
370
|
const scroller = store.state.listElement || popupRef.current;
|
|
363
371
|
if (!scroller) {
|
|
364
372
|
return;
|
|
@@ -412,12 +420,12 @@ function SelectRoot(props) {
|
|
|
412
420
|
// the disabled state from the element via the attribute-only `isElementDisabled` so the
|
|
413
421
|
// hidden, force-mounted items used for closed-trigger typeahead aren't dropped by the
|
|
414
422
|
// `elementsRef`/visibility filter that `disabledIndices` deliberately sidesteps.
|
|
415
|
-
disabledIndices: index => isElementDisabled
|
|
423
|
+
disabledIndices: index => isElementDisabled(listRef.current[index]),
|
|
416
424
|
onMatch(index) {
|
|
417
425
|
if (open) {
|
|
418
426
|
store.set('activeIndex', index);
|
|
419
427
|
} else {
|
|
420
|
-
setValue(valuesRef.current[index],
|
|
428
|
+
setValue(valuesRef.current[index], useScrollLock.createChangeEventDetails('none'));
|
|
421
429
|
}
|
|
422
430
|
},
|
|
423
431
|
onTyping(typing) {
|
|
@@ -439,7 +447,7 @@ function SelectRoot(props) {
|
|
|
439
447
|
triggerProps: mergedTriggerProps
|
|
440
448
|
});
|
|
441
449
|
});
|
|
442
|
-
|
|
450
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
443
451
|
store.update({
|
|
444
452
|
id: generatedId,
|
|
445
453
|
modal,
|
|
@@ -493,7 +501,7 @@ function SelectRoot(props) {
|
|
|
493
501
|
return null;
|
|
494
502
|
}
|
|
495
503
|
return value.map(v => {
|
|
496
|
-
const currentSerializedValue =
|
|
504
|
+
const currentSerializedValue = useCompositeListItem.stringifyAsValue(v, itemToStringValue);
|
|
497
505
|
return /*#__PURE__*/jsxRuntime.jsx("input", {
|
|
498
506
|
type: "hidden",
|
|
499
507
|
form: form,
|
|
@@ -523,7 +531,7 @@ function SelectRoot(props) {
|
|
|
523
531
|
return;
|
|
524
532
|
}
|
|
525
533
|
const nextValue = event.currentTarget.value;
|
|
526
|
-
const details =
|
|
534
|
+
const details = useScrollLock.createChangeEventDetails(useScrollLock.none, event.nativeEvent);
|
|
527
535
|
function handleChange() {
|
|
528
536
|
if (multiple) {
|
|
529
537
|
// Browser autofill only writes a single scalar value.
|
|
@@ -533,7 +541,7 @@ function SelectRoot(props) {
|
|
|
533
541
|
// Preserve the original serialized matching, then fall back to rendered text,
|
|
534
542
|
// which browsers can autofill for primitive values like `value="US">United States`.
|
|
535
543
|
const nextValueLower = nextValue.toLowerCase();
|
|
536
|
-
let matchingIndex = valuesRef.current.findIndex(candidate =>
|
|
544
|
+
let matchingIndex = valuesRef.current.findIndex(candidate => useCompositeListItem.stringifyAsValue(candidate, itemToStringValue).toLowerCase() === nextValueLower || useCompositeListItem.stringifyAsLabel(candidate, itemToStringLabel).toLowerCase() === nextValueLower);
|
|
537
545
|
if (matchingIndex === -1) {
|
|
538
546
|
matchingIndex = valuesRef.current.findIndex((_, index) => {
|
|
539
547
|
const renderedLabel = labelsRef.current[index];
|
|
@@ -560,7 +568,7 @@ function SelectRoot(props) {
|
|
|
560
568
|
required: required && !hasMultipleSelection,
|
|
561
569
|
readOnly: readOnly,
|
|
562
570
|
ref: ref,
|
|
563
|
-
style: name ?
|
|
571
|
+
style: name ? useScrollLock.visuallyHiddenInput : useScrollLock.visuallyHidden,
|
|
564
572
|
tabIndex: -1,
|
|
565
573
|
"aria-hidden": true,
|
|
566
574
|
suppressHydrationWarning: true
|
|
@@ -573,7 +581,7 @@ const BOUNDARY_OFFSET = 2;
|
|
|
573
581
|
const SELECTED_DELAY = 400;
|
|
574
582
|
const stateAttributesMapping$2 = {
|
|
575
583
|
...useScrollLock.pressableTriggerOpenStateMapping,
|
|
576
|
-
...
|
|
584
|
+
...useCompositeListItem.fieldValidityMapping,
|
|
577
585
|
popupSide: side => side ? {
|
|
578
586
|
'data-popup-side': side
|
|
579
587
|
} : null,
|
|
@@ -602,10 +610,10 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
602
610
|
validationMode,
|
|
603
611
|
state: fieldState,
|
|
604
612
|
disabled: fieldDisabled
|
|
605
|
-
} =
|
|
613
|
+
} = useCompositeListItem.useFieldRootContext();
|
|
606
614
|
const {
|
|
607
615
|
labelId: fieldLabelId
|
|
608
|
-
} =
|
|
616
|
+
} = useCompositeListItem.useLabelableContext();
|
|
609
617
|
const {
|
|
610
618
|
store,
|
|
611
619
|
setOpen,
|
|
@@ -629,25 +637,25 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
629
637
|
const hasSelectedValue = useScrollLock.useStore(store, selectors.hasSelectedValue);
|
|
630
638
|
const popupSide = mounted && positionerElement ? popupSideValue : null;
|
|
631
639
|
const id = idProp ?? rootId;
|
|
632
|
-
const ariaLabelledBy =
|
|
633
|
-
|
|
640
|
+
const ariaLabelledBy = useCompositeListItem.resolveAriaLabelledBy(fieldLabelId, selectLabelId);
|
|
641
|
+
useCompositeListItem.useLabelableId({
|
|
634
642
|
id
|
|
635
643
|
});
|
|
636
|
-
const positionerRef =
|
|
644
|
+
const positionerRef = useScrollLock.useValueAsRef(positionerElement);
|
|
637
645
|
const triggerRef = React__namespace.useRef(null);
|
|
638
646
|
const {
|
|
639
647
|
getButtonProps,
|
|
640
648
|
buttonRef
|
|
641
|
-
} =
|
|
649
|
+
} = useScrollLock.useButton({
|
|
642
650
|
disabled,
|
|
643
651
|
native: nativeButton
|
|
644
652
|
});
|
|
645
|
-
const setTriggerElement =
|
|
653
|
+
const setTriggerElement = useScrollLock.useStableCallback(element => {
|
|
646
654
|
store.set('triggerElement', element);
|
|
647
655
|
});
|
|
648
|
-
const timeoutFocus =
|
|
649
|
-
const timeoutMouseDown =
|
|
650
|
-
const selectedDelayTimeout =
|
|
656
|
+
const timeoutFocus = useScrollLock.useTimeout();
|
|
657
|
+
const timeoutMouseDown = useScrollLock.useTimeout();
|
|
658
|
+
const selectedDelayTimeout = useScrollLock.useTimeout();
|
|
651
659
|
React__namespace.useEffect(() => {
|
|
652
660
|
if (open) {
|
|
653
661
|
// A mousedown on the trigger can open the popup under the cursor. Keep mouseup selection
|
|
@@ -685,7 +693,7 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
685
693
|
|
|
686
694
|
// The popup element shouldn't obscure the focused trigger.
|
|
687
695
|
if (open && alignItemWithTriggerActiveRef.current) {
|
|
688
|
-
setOpen(false,
|
|
696
|
+
setOpen(false, useScrollLock.createChangeEventDetails(useScrollLock.none, event.nativeEvent));
|
|
689
697
|
}
|
|
690
698
|
|
|
691
699
|
// Saves a re-render on initial click: `forceMount === true` mounts
|
|
@@ -697,7 +705,7 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
697
705
|
},
|
|
698
706
|
onBlur(event) {
|
|
699
707
|
// If focus is moving into the popup, don't count it as a blur.
|
|
700
|
-
if (
|
|
708
|
+
if (useScrollLock.contains(positionerElement, event.relatedTarget)) {
|
|
701
709
|
return;
|
|
702
710
|
}
|
|
703
711
|
setTouched(true);
|
|
@@ -710,7 +718,7 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
710
718
|
if (open) {
|
|
711
719
|
return;
|
|
712
720
|
}
|
|
713
|
-
const doc =
|
|
721
|
+
const doc = useScrollLock.ownerDocument(event.currentTarget);
|
|
714
722
|
function handleMouseUp(mouseEvent) {
|
|
715
723
|
if (!triggerRef.current) {
|
|
716
724
|
return;
|
|
@@ -719,14 +727,14 @@ const SelectTrigger = /*#__PURE__*/React__namespace.forwardRef(function SelectTr
|
|
|
719
727
|
|
|
720
728
|
// Don't treat the release as an outside press when it lands on the trigger or inside
|
|
721
729
|
// the popup positioner (or their children).
|
|
722
|
-
if (
|
|
730
|
+
if (useScrollLock.contains(triggerRef.current, mouseUpTarget) || useScrollLock.contains(positionerRef.current, mouseUpTarget)) {
|
|
723
731
|
return;
|
|
724
732
|
}
|
|
725
733
|
const bounds = useCompositeListItem.getPseudoElementBounds(triggerRef.current);
|
|
726
734
|
if (mouseEvent.clientX >= bounds.left - BOUNDARY_OFFSET && mouseEvent.clientX <= bounds.right + BOUNDARY_OFFSET && mouseEvent.clientY >= bounds.top - BOUNDARY_OFFSET && mouseEvent.clientY <= bounds.bottom + BOUNDARY_OFFSET) {
|
|
727
735
|
return;
|
|
728
736
|
}
|
|
729
|
-
setOpen(false,
|
|
737
|
+
setOpen(false, useScrollLock.createChangeEventDetails(useScrollLock.cancelOpen, mouseEvent));
|
|
730
738
|
}
|
|
731
739
|
|
|
732
740
|
// Firefox can fire this upon mousedown
|
|
@@ -801,9 +809,9 @@ const SelectValue = /*#__PURE__*/React__namespace.forwardRef(function SelectValu
|
|
|
801
809
|
} else if (!hasSelectedValue && placeholder != null && !hasNullLabel) {
|
|
802
810
|
children = placeholder;
|
|
803
811
|
} else if (Array.isArray(value)) {
|
|
804
|
-
children =
|
|
812
|
+
children = useCompositeListItem.resolveMultipleLabels(value, items, itemToStringLabel);
|
|
805
813
|
} else {
|
|
806
|
-
children =
|
|
814
|
+
children = useCompositeListItem.resolveSelectedLabel(value, items, itemToStringLabel);
|
|
807
815
|
}
|
|
808
816
|
const element = useRenderElement.useRenderElement('span', componentProps, {
|
|
809
817
|
state,
|
|
@@ -920,7 +928,7 @@ const SelectPositioner = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
920
928
|
if (!mounted && controlledAlignItemWithTrigger !== alignItemWithTrigger) {
|
|
921
929
|
setControlledAlignItemWithTrigger(alignItemWithTrigger);
|
|
922
930
|
}
|
|
923
|
-
|
|
931
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
924
932
|
if (!mounted) {
|
|
925
933
|
if (selectors.scrollUpArrowVisible(store.state)) {
|
|
926
934
|
store.set('scrollUpArrowVisible', false);
|
|
@@ -957,10 +965,10 @@ const SelectPositioner = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
957
965
|
align: positioning.align,
|
|
958
966
|
anchorHidden: positioning.anchorHidden
|
|
959
967
|
};
|
|
960
|
-
|
|
968
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
961
969
|
store.set('popupSide', positioning.side);
|
|
962
970
|
}, [store, positioning.side]);
|
|
963
|
-
const setPositionerElement =
|
|
971
|
+
const setPositionerElement = useScrollLock.useStableCallback(element => {
|
|
964
972
|
store.set('positionerElement', element);
|
|
965
973
|
});
|
|
966
974
|
const element = useCompositeListItem.usePositioner(componentProps, state, {
|
|
@@ -972,7 +980,7 @@ const SelectPositioner = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
972
980
|
inert: !open
|
|
973
981
|
});
|
|
974
982
|
const prevMapSizeRef = React__namespace.useRef(0);
|
|
975
|
-
const onMapChange =
|
|
983
|
+
const onMapChange = useScrollLock.useStableCallback(map => {
|
|
976
984
|
if (map.size === 0 && prevMapSizeRef.current === 0) {
|
|
977
985
|
return;
|
|
978
986
|
}
|
|
@@ -984,12 +992,12 @@ const SelectPositioner = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
984
992
|
if (map.size === prevSize) {
|
|
985
993
|
return;
|
|
986
994
|
}
|
|
987
|
-
const eventDetails =
|
|
995
|
+
const eventDetails = useScrollLock.createChangeEventDetails(useScrollLock.none);
|
|
988
996
|
if (prevSize !== 0 && !store.state.multiple && value !== null) {
|
|
989
|
-
const selectedValueIndex =
|
|
997
|
+
const selectedValueIndex = useCompositeListItem.findItemIndex(valuesRef.current, value, isItemEqualToValue);
|
|
990
998
|
if (selectedValueIndex === -1) {
|
|
991
999
|
const initialSelectedValue = initialValueRef.current;
|
|
992
|
-
const hasInitial = initialSelectedValue != null &&
|
|
1000
|
+
const hasInitial = initialSelectedValue != null && useCompositeListItem.findItemIndex(valuesRef.current, initialSelectedValue, isItemEqualToValue) !== -1;
|
|
993
1001
|
const nextValue = hasInitial ? initialSelectedValue : null;
|
|
994
1002
|
setValue(nextValue, eventDetails);
|
|
995
1003
|
if (nextValue === null) {
|
|
@@ -999,9 +1007,9 @@ const SelectPositioner = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
999
1007
|
}
|
|
1000
1008
|
}
|
|
1001
1009
|
if (prevSize !== 0 && store.state.multiple && Array.isArray(value)) {
|
|
1002
|
-
const hasVisibleItem = selectedItemValue =>
|
|
1010
|
+
const hasVisibleItem = selectedItemValue => useCompositeListItem.findItemIndex(valuesRef.current, selectedItemValue, isItemEqualToValue) !== -1;
|
|
1003
1011
|
const nextValue = value.filter(selectedItemValue => hasVisibleItem(selectedItemValue));
|
|
1004
|
-
if (nextValue.length !== value.length || nextValue.some(selectedItemValue => !
|
|
1012
|
+
if (nextValue.length !== value.length || nextValue.some(selectedItemValue => !useCompositeListItem.selectedValueIncludes(value, selectedItemValue, isItemEqualToValue))) {
|
|
1005
1013
|
setValue(nextValue, eventDetails);
|
|
1006
1014
|
if (nextValue.length === 0) {
|
|
1007
1015
|
store.set('selectedIndex', null);
|
|
@@ -1046,7 +1054,7 @@ if (process.env.NODE_ENV !== "production") SelectPositioner.displayName = "Selec
|
|
|
1046
1054
|
|
|
1047
1055
|
const stateAttributesMapping = {
|
|
1048
1056
|
...useScrollLock.popupStateMapping,
|
|
1049
|
-
...
|
|
1057
|
+
...useScrollLock.transitionStatusMapping
|
|
1050
1058
|
};
|
|
1051
1059
|
|
|
1052
1060
|
/**
|
|
@@ -1084,7 +1092,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1084
1092
|
isPositioned,
|
|
1085
1093
|
setControlledAlignItemWithTrigger
|
|
1086
1094
|
} = useSelectPositionerContext();
|
|
1087
|
-
const insideToolbar =
|
|
1095
|
+
const insideToolbar = useToolbarRootContext(true) != null;
|
|
1088
1096
|
const floatingRootContext = useSelectFloatingContext();
|
|
1089
1097
|
const direction = useScrollLock.useDirection();
|
|
1090
1098
|
const {
|
|
@@ -1103,8 +1111,8 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1103
1111
|
const reachedMaxHeightRef = React__namespace.useRef(false);
|
|
1104
1112
|
const initialPlacedRef = React__namespace.useRef(false);
|
|
1105
1113
|
const originalPositionerStylesRef = React__namespace.useRef({});
|
|
1106
|
-
const scrollArrowFrame =
|
|
1107
|
-
const handleScroll =
|
|
1114
|
+
const scrollArrowFrame = useScrollLock.useAnimationFrame();
|
|
1115
|
+
const handleScroll = useScrollLock.useStableCallback(scroller => {
|
|
1108
1116
|
if (!positionerElement || !popupRef.current || !initialPlacedRef.current) {
|
|
1109
1117
|
return;
|
|
1110
1118
|
}
|
|
@@ -1120,8 +1128,8 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1120
1128
|
}
|
|
1121
1129
|
const scale = getScale(positionerElement);
|
|
1122
1130
|
const currentHeight = normalizeSize(positionerElement.getBoundingClientRect().height, 'y', scale);
|
|
1123
|
-
const doc =
|
|
1124
|
-
const win =
|
|
1131
|
+
const doc = useScrollLock.ownerDocument(positionerElement);
|
|
1132
|
+
const win = floatingUi_utils.getWindow(positionerElement);
|
|
1125
1133
|
const positionerStyles = win.getComputedStyle(positionerElement);
|
|
1126
1134
|
const marginTop = parseFloat(positionerStyles.marginTop);
|
|
1127
1135
|
const marginBottom = parseFloat(positionerStyles.marginBottom);
|
|
@@ -1137,7 +1145,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1137
1145
|
positionerElement.style.height = `${height}px`;
|
|
1138
1146
|
};
|
|
1139
1147
|
const handleSmallDiff = (diff, targetScrollTop) => {
|
|
1140
|
-
const heightDelta =
|
|
1148
|
+
const heightDelta = scrollEdges.clamp(diff, 0, maxAvailableHeight - currentHeight);
|
|
1141
1149
|
if (heightDelta > 0) {
|
|
1142
1150
|
// Consume the remaining scroll in height.
|
|
1143
1151
|
setHeight(currentHeight + heightDelta);
|
|
@@ -1175,7 +1183,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1175
1183
|
if (scrollToMax || nextScrollTop != null) {
|
|
1176
1184
|
// Recompute bounds after resizing (clientHeight likely changed).
|
|
1177
1185
|
const nextMaxScrollTop = getMaxScrollTop(scroller);
|
|
1178
|
-
const target = scrollToMax ? nextMaxScrollTop :
|
|
1186
|
+
const target = scrollToMax ? nextMaxScrollTop : scrollEdges.clamp(nextScrollTop, 0, nextMaxScrollTop);
|
|
1179
1187
|
|
|
1180
1188
|
// Avoid adjustments that re-trigger scroll events forever.
|
|
1181
1189
|
if (Math.abs(scroller.scrollTop - target) > scrollEdges.SCROLL_EDGE_TOLERANCE_PX) {
|
|
@@ -1188,7 +1196,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1188
1196
|
handleScrollArrowVisibility();
|
|
1189
1197
|
});
|
|
1190
1198
|
React__namespace.useImperativeHandle(scrollHandlerRef, () => handleScroll, [handleScroll]);
|
|
1191
|
-
|
|
1199
|
+
useScrollLock.useOpenChangeComplete({
|
|
1192
1200
|
open,
|
|
1193
1201
|
ref: popupRef,
|
|
1194
1202
|
onComplete() {
|
|
@@ -1203,7 +1211,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1203
1211
|
side,
|
|
1204
1212
|
align
|
|
1205
1213
|
};
|
|
1206
|
-
|
|
1214
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1207
1215
|
if (!positionerElement || !popupRef.current || Object.keys(originalPositionerStylesRef.current).length) {
|
|
1208
1216
|
return;
|
|
1209
1217
|
}
|
|
@@ -1219,7 +1227,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1219
1227
|
marginBottom: positionerElement.style.marginBottom
|
|
1220
1228
|
};
|
|
1221
1229
|
}, [popupRef, positionerElement]);
|
|
1222
|
-
|
|
1230
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1223
1231
|
if (open || alignItemWithTriggerActive) {
|
|
1224
1232
|
return;
|
|
1225
1233
|
}
|
|
@@ -1227,7 +1235,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1227
1235
|
reachedMaxHeightRef.current = false;
|
|
1228
1236
|
clearStyles(positionerElement, originalPositionerStylesRef.current);
|
|
1229
1237
|
}, [open, alignItemWithTriggerActive, positionerElement, popupRef]);
|
|
1230
|
-
|
|
1238
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1231
1239
|
const popupElement = popupRef.current;
|
|
1232
1240
|
|
|
1233
1241
|
// Wait for Floating UI's first positioning pass before reading DOM geometry.
|
|
@@ -1254,10 +1262,10 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1254
1262
|
textElement = !hasSelectedValue && firstItemTextRef.current?.isConnected ? firstItemTextRef.current : null;
|
|
1255
1263
|
}
|
|
1256
1264
|
const valueElement = valueRef.current;
|
|
1257
|
-
const win =
|
|
1265
|
+
const win = floatingUi_utils.getWindow(positionerElement);
|
|
1258
1266
|
const positionerStyles = win.getComputedStyle(positionerElement);
|
|
1259
1267
|
const popupStyles = win.getComputedStyle(popupElement);
|
|
1260
|
-
const doc =
|
|
1268
|
+
const doc = useScrollLock.ownerDocument(triggerElement);
|
|
1261
1269
|
const scale = getScale(triggerElement);
|
|
1262
1270
|
const triggerRect = normalizeRect(triggerElement.getBoundingClientRect(), scale);
|
|
1263
1271
|
const positionerRect = normalizeRect(positionerElement.getBoundingClientRect(), scale);
|
|
@@ -1294,7 +1302,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1294
1302
|
const maxHeight = viewportHeight - marginTop - marginBottom;
|
|
1295
1303
|
const scrollTop = idealHeight - height;
|
|
1296
1304
|
const maxRight = viewportWidth - paddingRight;
|
|
1297
|
-
positionerElement.style.left = `${
|
|
1305
|
+
positionerElement.style.left = `${scrollEdges.clamp(alignedLeft, paddingLeft, maxRight - positionerRect.width)}px`;
|
|
1298
1306
|
positionerElement.style.height = `${height}px`;
|
|
1299
1307
|
// `none` (not the invalid `auto`) so the explicit height governs in align mode and isn't
|
|
1300
1308
|
// clamped by a `max-height` from user CSS.
|
|
@@ -1335,7 +1343,7 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1335
1343
|
const popupHeight = positionerRect.height;
|
|
1336
1344
|
const textCenterY = textRect.top + textRect.height / 2;
|
|
1337
1345
|
const transformOriginY = popupHeight > 0 ? (textCenterY - popupTop) / popupHeight * 100 : 50;
|
|
1338
|
-
const clampedY =
|
|
1346
|
+
const clampedY = scrollEdges.clamp(transformOriginY, 0, 100);
|
|
1339
1347
|
popupElement.style.setProperty('--transform-origin', `50% ${clampedY}%`);
|
|
1340
1348
|
}
|
|
1341
1349
|
if (initialHeight === viewportHeight || height >= maxPopupHeight) {
|
|
@@ -1354,11 +1362,11 @@ const SelectPopup = /*#__PURE__*/React__namespace.forwardRef(function SelectPopu
|
|
|
1354
1362
|
if (!alignItemWithTriggerActive || !positionerElement || !open) {
|
|
1355
1363
|
return undefined;
|
|
1356
1364
|
}
|
|
1357
|
-
const win =
|
|
1365
|
+
const win = floatingUi_utils.getWindow(positionerElement);
|
|
1358
1366
|
function handleResize(event) {
|
|
1359
|
-
setOpen(false,
|
|
1367
|
+
setOpen(false, useScrollLock.createChangeEventDetails(useScrollLock.windowResize, event));
|
|
1360
1368
|
}
|
|
1361
|
-
return
|
|
1369
|
+
return useScrollLock.addEventListener(win, 'resize', handleResize);
|
|
1362
1370
|
}, [setOpen, alignItemWithTriggerActive, positionerElement, open]);
|
|
1363
1371
|
const defaultProps = {
|
|
1364
1372
|
...(listElement ? {
|
|
@@ -1487,7 +1495,7 @@ const SelectList = /*#__PURE__*/React__namespace.forwardRef(function SelectList(
|
|
|
1487
1495
|
}),
|
|
1488
1496
|
className: hasScrollArrows && openMethod !== 'touch' ? scrollEdges.styleDisableScrollbar.className : undefined
|
|
1489
1497
|
};
|
|
1490
|
-
const setListElement =
|
|
1498
|
+
const setListElement = useScrollLock.useStableCallback(element => {
|
|
1491
1499
|
store.set('listElement', element);
|
|
1492
1500
|
});
|
|
1493
1501
|
return useRenderElement.useRenderElement('div', componentProps, {
|
|
@@ -1545,7 +1553,7 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1545
1553
|
const index = listItem.index;
|
|
1546
1554
|
const hasRegistered = index !== -1;
|
|
1547
1555
|
const itemRef = React__namespace.useRef(null);
|
|
1548
|
-
|
|
1556
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1549
1557
|
if (!hasRegistered) {
|
|
1550
1558
|
return undefined;
|
|
1551
1559
|
}
|
|
@@ -1555,7 +1563,7 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1555
1563
|
delete values[index];
|
|
1556
1564
|
};
|
|
1557
1565
|
}, [hasRegistered, index, itemValue, valuesRef]);
|
|
1558
|
-
|
|
1566
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1559
1567
|
if (!hasRegistered) {
|
|
1560
1568
|
return;
|
|
1561
1569
|
}
|
|
@@ -1566,7 +1574,7 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1566
1574
|
// the raw array, which a custom `isItemEqualToValue` isn't expected to receive.
|
|
1567
1575
|
selectedCandidate = selectedValue.length > 0 ? selectedValue[selectedValue.length - 1] : undefined;
|
|
1568
1576
|
}
|
|
1569
|
-
if (selectedCandidate !== undefined &&
|
|
1577
|
+
if (selectedCandidate !== undefined && useCompositeListItem.compareItemEquality(itemValue, selectedCandidate, isItemEqualToValue)) {
|
|
1570
1578
|
store.set('selectedIndex', index);
|
|
1571
1579
|
// Make sure SelectPopup can measure the selected item on first open.
|
|
1572
1580
|
// SelectItemText can still update this ref later when focus moves.
|
|
@@ -1581,7 +1589,7 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1581
1589
|
const {
|
|
1582
1590
|
getButtonProps,
|
|
1583
1591
|
buttonRef
|
|
1584
|
-
} =
|
|
1592
|
+
} = useScrollLock.useButton({
|
|
1585
1593
|
disabled,
|
|
1586
1594
|
focusableWhenDisabled: true,
|
|
1587
1595
|
native: nativeButton,
|
|
@@ -1601,11 +1609,11 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1601
1609
|
const selectedValue = store.state.value;
|
|
1602
1610
|
if (multiple) {
|
|
1603
1611
|
const currentValue = Array.isArray(selectedValue) ? selectedValue : [];
|
|
1604
|
-
const nextValue = selected ?
|
|
1605
|
-
setValue(nextValue,
|
|
1612
|
+
const nextValue = selected ? useCompositeListItem.removeItem(currentValue, itemValue, isItemEqualToValue) : [...currentValue, itemValue];
|
|
1613
|
+
setValue(nextValue, useScrollLock.createChangeEventDetails(useScrollLock.itemPress, event));
|
|
1606
1614
|
} else {
|
|
1607
|
-
setValue(itemValue,
|
|
1608
|
-
setOpen(false,
|
|
1615
|
+
setValue(itemValue, useScrollLock.createChangeEventDetails(useScrollLock.itemPress, event));
|
|
1616
|
+
setOpen(false, useScrollLock.createChangeEventDetails(useScrollLock.itemPress, event));
|
|
1609
1617
|
}
|
|
1610
1618
|
}
|
|
1611
1619
|
function resetDragMovement() {
|
|
@@ -1625,7 +1633,7 @@ const SelectItem = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namesp
|
|
|
1625
1633
|
onClick(event) {
|
|
1626
1634
|
const isMouseClick = event.type === 'click' && pointerTypeRef.current !== 'touch';
|
|
1627
1635
|
const clickPointerType = event.nativeEvent.pointerType;
|
|
1628
|
-
const isVirtualMouseClick = isMouseClick &&
|
|
1636
|
+
const isVirtualMouseClick = isMouseClick && useScrollLock.isVirtualClick(event.nativeEvent) && (
|
|
1629
1637
|
// Generic no-pointer `detail === 0` clicks stay tied to highlight state. Virtual
|
|
1630
1638
|
// clicks that carry browser pointer data, including an empty string from assistive
|
|
1631
1639
|
// technology, can activate unhighlighted items.
|
|
@@ -1736,7 +1744,7 @@ const Inner = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namespace.f
|
|
|
1736
1744
|
const {
|
|
1737
1745
|
transitionStatus,
|
|
1738
1746
|
setMounted
|
|
1739
|
-
} =
|
|
1747
|
+
} = useScrollLock.useTransitionStatus(selected);
|
|
1740
1748
|
const state = {
|
|
1741
1749
|
selected,
|
|
1742
1750
|
transitionStatus
|
|
@@ -1748,9 +1756,9 @@ const Inner = /*#__PURE__*/React__namespace.memo(/*#__PURE__*/React__namespace.f
|
|
|
1748
1756
|
'aria-hidden': true,
|
|
1749
1757
|
children: '✔️'
|
|
1750
1758
|
}, elementProps],
|
|
1751
|
-
stateAttributesMapping:
|
|
1759
|
+
stateAttributesMapping: useScrollLock.transitionStatusMapping
|
|
1752
1760
|
});
|
|
1753
|
-
|
|
1761
|
+
useScrollLock.useOpenChangeComplete({
|
|
1754
1762
|
open: selected,
|
|
1755
1763
|
ref: indicatorRef,
|
|
1756
1764
|
onComplete() {
|
|
@@ -1858,8 +1866,8 @@ const SelectGroupLabel = /*#__PURE__*/React__namespace.forwardRef(function Selec
|
|
|
1858
1866
|
const {
|
|
1859
1867
|
setLabelId
|
|
1860
1868
|
} = useSelectGroupContext();
|
|
1861
|
-
const id =
|
|
1862
|
-
|
|
1869
|
+
const id = useScrollLock.useBaseUiId(idProp);
|
|
1870
|
+
useScrollLock.useIsoLayoutEffect(() => {
|
|
1863
1871
|
setLabelId(id);
|
|
1864
1872
|
}, [id, setLabelId]);
|
|
1865
1873
|
const element = useRenderElement.useRenderElement('div', componentProps, {
|
|
@@ -1884,7 +1892,9 @@ exports.SelectPositioner = SelectPositioner;
|
|
|
1884
1892
|
exports.SelectRoot = SelectRoot;
|
|
1885
1893
|
exports.SelectTrigger = SelectTrigger;
|
|
1886
1894
|
exports.SelectValue = SelectValue;
|
|
1895
|
+
exports.isElementDisabled = isElementDisabled;
|
|
1887
1896
|
exports.selectors = selectors;
|
|
1888
1897
|
exports.usePreviousValue = usePreviousValue;
|
|
1889
1898
|
exports.useSelectPositionerContext = useSelectPositionerContext;
|
|
1890
1899
|
exports.useSelectRootContext = useSelectRootContext;
|
|
1900
|
+
exports.useToolbarRootContext = useToolbarRootContext;
|