@neo4j-ndl/react
Version:
React implementation of Neo4j Design System
86 lines • 3.45 kB
JavaScript
/**
*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { autoUpdate, flip, offset, shift, useClick, useDismiss, useFloating, useInteractions, useRole, useTransitionStyles, } from '@floating-ui/react';
import { tokens } from '@neo4j-ndl/base';
import { useMemo, useState } from 'react';
export function useSpotlight({ isInitialOpen = false, placement = 'bottom', isOpen: controlledOpen, onOpenChange: setControlledOpen, anchorElement, anchorElementAsPortalAnchor, initialFocus, closeOnClickOutside, strategy = 'absolute', } = {}) {
var _a;
const [isOpenUncontrolled, setIsOpenUncontrolled] = useState(isInitialOpen);
const [labelId, setLabelId] = useState();
const [descriptionId, setDescriptionId] = useState();
const isOpen = controlledOpen !== null && controlledOpen !== void 0 ? controlledOpen : isOpenUncontrolled;
const setIsOpen = setControlledOpen !== null && setControlledOpen !== void 0 ? setControlledOpen : setIsOpenUncontrolled;
const data = useFloating({
elements: {
reference: anchorElement,
},
middleware: [
offset(10),
flip({
crossAxis: placement.includes('-'),
fallbackAxisSideDirection: 'end',
padding: 5,
}),
shift({ padding: 5 }),
],
onOpenChange: (open, event) => {
setIsOpen(open);
setControlledOpen === null || setControlledOpen === void 0 ? void 0 : setControlledOpen(open, event);
},
open: isOpen,
placement: placement,
strategy,
whileElementsMounted: autoUpdate,
});
const context = data.context;
const click = useClick(context, {
enabled: controlledOpen === undefined,
});
const dismiss = useDismiss(context, {
outsidePress: closeOnClickOutside,
});
const role = useRole(context, {
role: 'dialog',
});
const interactions = useInteractions([click, dismiss, role]);
const { styles: transitionStyles } = useTransitionStyles(context, {
duration: (_a = Number.parseInt(tokens.transitions.values.duration.quick, 10)) !== null && _a !== void 0 ? _a : 0,
});
return useMemo(() => (Object.assign(Object.assign(Object.assign({ isOpen,
setIsOpen }, interactions), data), { transitionStyles,
labelId,
descriptionId,
setLabelId,
setDescriptionId,
anchorElementAsPortalAnchor,
initialFocus })), [
isOpen,
setIsOpen,
interactions,
data,
transitionStyles,
labelId,
descriptionId,
anchorElementAsPortalAnchor,
initialFocus,
]);
}
//# sourceMappingURL=use-spotlight.js.map