react-aria
Version:
Spectrum UI components in React
185 lines (168 loc) • 7.95 kB
JavaScript
var $2f95486cfdaa743c$exports = require("../utils/chain.cjs");
var $b97366b6eabbb2cc$exports = require("../utils/filterDOMProps.cjs");
var $22ef0686d6af4fda$exports = require("../selection/ListKeyboardDelegate.cjs");
var $89b39774f3b79dbb$exports = require("../utils/mergeProps.cjs");
var $da02ee888921bc9e$exports = require("../utils/shadowdom/DOMFunctions.cjs");
var $d0df89f3abe2c2ca$exports = require("../interactions/useFocusVisible.cjs");
var $74751389dd0da9fc$exports = require("../i18n/useCollator.cjs");
var $e3486d9c44549186$exports = require("../label/useField.cjs");
var $7ac82d1fee77eb8a$exports = require("../utils/useId.cjs");
var $5b639fe010c6782f$exports = require("../menu/useMenuTrigger.cjs");
var $a6299e8d95fc8908$exports = require("../selection/useTypeSelect.cjs");
var $iVReG$react = require("react");
function $parcel$export(e, n, v, s) {
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
}
$parcel$export(module.exports, "selectData", function () { return $60b1d3323c1be9a0$export$703601b7e90536f8; });
$parcel$export(module.exports, "useSelect", function () { return $60b1d3323c1be9a0$export$e64b2f635402ca43; });
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
const $60b1d3323c1be9a0$export$703601b7e90536f8 = new WeakMap();
function $60b1d3323c1be9a0$export$e64b2f635402ca43(props, state, ref) {
let { keyboardDelegate: keyboardDelegate, isDisabled: isDisabled, isRequired: isRequired, name: name, form: form, validationBehavior: validationBehavior = 'aria' } = props;
// By default, a KeyboardDelegate is provided which uses the DOM to query layout information (e.g. for page up/page down).
// When virtualized, the layout object will be passed in as a prop and override this.
let collator = (0, $74751389dd0da9fc$exports.useCollator)({
usage: 'search',
sensitivity: 'base'
});
let delegate = (0, $iVReG$react.useMemo)(()=>keyboardDelegate || new (0, $22ef0686d6af4fda$exports.ListKeyboardDelegate)(state.collection, state.disabledKeys, ref, collator), [
keyboardDelegate,
state.collection,
state.disabledKeys,
collator,
ref
]);
let { menuTriggerProps: menuTriggerProps, menuProps: menuProps } = (0, $5b639fe010c6782f$exports.useMenuTrigger)({
isDisabled: isDisabled,
type: 'listbox'
}, state, ref);
let onKeyDown = (e)=>{
if (state.selectionManager.selectionMode === 'multiple') return;
switch(e.key){
case 'ArrowLeft':
{
// prevent scrolling containers
e.preventDefault();
let key = state.selectedKey != null ? delegate.getKeyAbove?.(state.selectedKey) : delegate.getFirstKey?.();
if (key != null) state.setSelectedKey(key);
break;
}
case 'ArrowRight':
{
// prevent scrolling containers
e.preventDefault();
let key = state.selectedKey != null ? delegate.getKeyBelow?.(state.selectedKey) : delegate.getFirstKey?.();
if (key != null) state.setSelectedKey(key);
break;
}
}
};
let { typeSelectProps: typeSelectProps } = (0, $a6299e8d95fc8908$exports.useTypeSelect)({
keyboardDelegate: delegate,
selectionManager: state.selectionManager,
onTypeSelect (key) {
state.setSelectedKey(key);
}
});
let { isInvalid: isInvalid, validationErrors: validationErrors, validationDetails: validationDetails } = state.displayValidation;
let { labelProps: labelProps, fieldProps: fieldProps, descriptionProps: descriptionProps, errorMessageProps: errorMessageProps } = (0, $e3486d9c44549186$exports.useField)({
...props,
labelElementType: 'span',
isInvalid: isInvalid,
errorMessage: props.errorMessage || validationErrors
});
if (state.selectionManager.selectionMode === 'multiple') typeSelectProps = {};
let domProps = (0, $b97366b6eabbb2cc$exports.filterDOMProps)(props, {
labelable: true
});
let triggerProps = (0, $89b39774f3b79dbb$exports.mergeProps)(typeSelectProps, menuTriggerProps, fieldProps);
let valueId = (0, $7ac82d1fee77eb8a$exports.useId)();
$60b1d3323c1be9a0$export$703601b7e90536f8.set(state, {
isDisabled: isDisabled,
isRequired: isRequired,
name: name,
form: form,
validationBehavior: validationBehavior
});
return {
labelProps: {
...labelProps,
onClick: ()=>{
if (!props.isDisabled) {
ref.current?.focus();
// Show the focus ring so the user knows where focus went
(0, $d0df89f3abe2c2ca$exports.setInteractionModality)('keyboard');
}
}
},
triggerProps: (0, $89b39774f3b79dbb$exports.mergeProps)(domProps, {
...triggerProps,
isDisabled: isDisabled,
onKeyDown: (0, $2f95486cfdaa743c$exports.chain)(triggerProps.onKeyDown, onKeyDown, props.onKeyDown),
onKeyUp: props.onKeyUp,
'aria-labelledby': [
valueId,
triggerProps['aria-labelledby'],
triggerProps['aria-label'] && !triggerProps['aria-labelledby'] ? triggerProps.id : null
].filter(Boolean).join(' '),
onFocus (e) {
if (state.isFocused) return;
if (props.onFocus) props.onFocus(e);
if (props.onFocusChange) props.onFocusChange(true);
state.setFocused(true);
},
onBlur (e) {
if (state.isOpen) return;
if (props.onBlur) props.onBlur(e);
if (props.onFocusChange) props.onFocusChange(false);
state.setFocused(false);
}
}),
valueProps: {
id: valueId
},
menuProps: {
...menuProps,
onAction: undefined,
autoFocus: state.focusStrategy || true,
shouldSelectOnPressUp: true,
shouldFocusOnHover: true,
disallowEmptySelection: true,
linkBehavior: 'selection',
onBlur: (e)=>{
if ((0, $da02ee888921bc9e$exports.nodeContains)(e.currentTarget, e.relatedTarget)) return;
if (props.onBlur) props.onBlur(e);
if (props.onFocusChange) props.onFocusChange(false);
state.setFocused(false);
},
'aria-labelledby': [
fieldProps['aria-labelledby'],
triggerProps['aria-label'] && !fieldProps['aria-labelledby'] ? triggerProps.id : null
].filter(Boolean).join(' ')
},
descriptionProps: descriptionProps,
errorMessageProps: errorMessageProps,
isInvalid: isInvalid,
validationErrors: validationErrors,
validationDetails: validationDetails,
hiddenSelectProps: {
isDisabled: isDisabled,
name: name,
label: props.label,
state: state,
triggerRef: ref,
form: form
}
};
}
//# sourceMappingURL=useSelect.cjs.map